Seata客户端使用配置中心

Posted xxzblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Seata客户端使用配置中心相关的知识,希望对你有一定的参考价值。

Seata-0.8.1~1.0.0客户端启动过程分析

1. 加载registry配置

transactionServiceGroup默认为$spring.application.name-fescar-service-group
可以通过spring.cloud.alibaba.seata.txServiceGroup指定

核心类:io.seata.config.ConfigurationFactory static 初始化CURRENT_FILE_INSTANCE

  1. 加载registry(环境隔离)

    • 先从System.getProperty读取seata.config.name的valueseataConfigName

    • 如果seataConfigName为null再从System.getenv获取SEATA_CONFIG_NAME的valueseataConfigName

    • 如果seataConfigName为null,则seataConfigName为默认值registry

    • 先从System.getProperty读取seataEnv的valueseataEnv

    • 如果seataEnv为null,再从System.getenv获取SEATA_ENV的valueseataEnv

    • 如果seataEnv为null读取seataConfigName.conf,否则读取seataConfigName-seataEnv.conf

    • 得到registryConfiguration

    • 加载registry后,读取config.type的valueconfigType

    • configType为file时,加载file-seataEnv.conf(FileConfiguration),否则创建对应类型的Configuration(NacosConfiguration, ApolloConfiguration, ConsulConfiguration, EtcdConfiguration, ZookeeperConfiguration)

    • 得到configConfiguration

PS:使用nacos做配置中心时,如果namespace是public应该这么配置namespace = “”

2. TM启动

  1. 获取TmRpcClient实例

    1. 初始化NettyClientConfig

      1. 从configConfiguration中获取与NettyClientConfig类相关的配置有

        transport.thread-factory.client-selector-thread-size
        transport.thread-factory.client-selector-thread-prefix
        transport.thread-factory.client-worker-thread-prefix
        
        transport.thread-factory.worker-thread-size
        
        transport.type
        transport.server
        transport.heartbeat
        
        # rpc通讯配置
        transport.serialization
        transport.compressor
        
    2. 启动客户端与相关定时器

      1. 获取是否降级配置service.enableDegrade

      2. 初始化netty的bootstrap

      3. 启动定时重连定时器(连接seata-server)

      4. 启动合并消息定时器,并运行合并消息任务()

连接seata-server

核心类:io.seata.discovery.registry.RegistryFactory#getInstance() 获取注册中心实例

  1. 先从registryConfiguration对象中registry.type的value
  • file模式

  1. 从configConfiguration 对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
  2. 通过service.clusterName.grouplist查找ip:port列表用;分隔
  3. 通过ip:port连接seata-server
  • nacos模式

  1. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
  2. 如果本地缓存CLUSTER_ADDRESS_MAP中存在clusterName对应的ip:port列表,直接进行3.3步
  3. 不存在
    1. 创建nacos的NamingInstance
      1. 读取nacos serverAddr, 先从System.getProperty的valuenacosServerAddr 为null则从configConfiguration对象中读取registry.nacos.serverAddr的valuenacosServerAddr
      2. 读取namespce, 先从System.getProperty的valuenamespace 为null则从configConfiguration对象中读取registry.nacos.namespace的valuenamespace
    2. 获取所有的server实例
      1. 根据serverAddr(这里就是一个字符串)和clusterName请求nacos server获取所有的seata-server ip:port列表,并缓存到本地
      2. 开启nacos的subscribe监听,刷新CLUSTER_ADDRESS_MAP
    3. 通过ip:port连接seata-server
  • Eureka模式

    1. 根据registry.eureka.serviceUrl, registry.eureka.weight创建eurekaClient实例
    2. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
    3. 获取eureka上所有注册的application
    4. 返回名称为clusterName的ip:port列表
    5. 通过ip:port连接seata-server
  • Consul模式

    1. 根据registry.consul.serverAddr创建ConsulClient实例
    2. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
    3. ConsulClient实例根据registry.consul.cluster获取说有的ip:port列表
    4. 返回名称为clusterName的ip:port列表
    5. 通过ip:port连接seata-server
  • Etcd模式

    1. 根据registry.etcd3.serverAddr创建Etcd实例
    2. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
    3. Etcd实例根据registry-seata-registry.etcd3.cluster获取说有的ip:port列表
    4. 返回名称为clusterName的ip:port列表
    5. 通过ip:port连接seata-server
  • Redis模式(目前只有单机模式)

    1. 根据registry.redis.serverAddr, registry.redis.db创建JedisPool实例

      (可选配置registry.redis.password, registry.redis.test.on.borrow, registry.redis.test.on.return, registry.redis.test.while.idle, registry.redis.max.idle, registry.redis.min.idle, registry.redis.max.active, registry.redis.max.total, registry.redis.max.wait, registry.redis.timeout, registry.redis.num.tests.per.eviction.run, registry.redis.time.between.eviction.runs.millis, registry.redis.min.evictable.idle.time.millis)

    2. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName

    3. 从JedisPool实例中回去Jedis对象,从jedis对象中hgetAll(registry.redis.cluster)拿到所有的ip:port列表

    4. 返回名称为clusterName的ip:port列表

    5. 通过ip:port连接seata-server

  • Zookeeper模式

    1. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
    2. 根据registry.zk.serverAddr, registry.zk.session.timeout, registry.zk.connect.timeout创建zkClient实例
    3. 从/registry/zk/clusterName获取所有的ip:port列表
    4. 通过ip:port连接seata-server
  • sofa模式

    1. 初始化sofa配置, 优先从System.getProperty中获取registry.sofa.serverAddr, registry.sofa.region, registry.sofa.datacenter, registry.sofa.group, registry.sofa.cluster, registry.sofa.addressWaitTime, 获取不到从configConfiguration中获取相应的配置
    2. 从configConfiguration对象中,读取service.vgroup_mapping.transactionServiceGroup的valueclusterName
    3. 获取sofaRegistry实例并注册监听器,监听器根据clusterName获取ip:port列表
    4. 通过ip:port连接seata-server

PS:当获取不到ip:port列表时,会报no available server to connect,此时需要检查一下配置中心上是否配置了service.vgroup_mapping.transactionServiceGroup

优先从System.getProperty中读取,读取不到再从对应的配置类中读取。

FileConfiguration: 读取file-seataEnv.conf中service.vgroup_mapping.transactionServiceGroup

NacosConfiguration: 读取对应namespace中service.vgroup_mapping.transactionServiceGroup的值

ApolloConfiguration: 读取service.vgroup_mapping.transactionServiceGroup的值

ConsulConfiguration: 读取service.vgroup_mapping.transactionServiceGroup的值

EtcdConfiguration: 读取service.vgroup_mapping.transactionServiceGroup的值

ZookeeperConfiguration: 会从zookeeper的/config/service.vgroup_mapping.transactionServiceGroup读取

3. RM启动

  1. 获取RmRpcClient实例
  2. 设置资源管理器(ResourceManager)
  3. 设置客户端消息监听器
  4. 连接seata-server(与TM相同)

PS:如有错误,请留言纠正

以上是关于Seata客户端使用配置中心的主要内容,如果未能解决你的问题,请参考以下文章

1.4.2 Seata以nacos作为注册中心的配置和使用

1.4.2 Seata以nacos作为注册中心的配置和使用

Seata 配置中心实现原理

Spring Cloud Alibaba Seata 分布式事务使用快速入门,Nacos做Seata的注册中心和配置中心

Spring Cloud Alibaba Seata 分布式事务使用快速入门,Nacos做Seata的注册中心和配置中心

Spring Cloud Alibaba Seata 分布式事务使用快速入门,Nacos做Seata的注册中心和配置中心