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

2019-11-07  本文已影响0人  我叫王也道长

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

1. 加载registry配置

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

  1. 加载registry(环境隔离)

    • 先从System.getProperty读取seata.config.name的value{seataConfigName}

    • 如果seataConfigName为null再从System.getenv获取SEATA_CONFIG_NAME的value{seataConfigName}

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

    • 先从System.getProperty读取seataEnv的value{seataEnv}

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

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

    • 得到{registryConfiguration}

    • 加载registry后,读取config.type的value{configType}

    • 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
        
  1. 启动客户端与相关定时器

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

    2. 初始化netty的bootstrap

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

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

连接seata-server

  1. 先从{registryConfiguration}对象中registry.type的value
  1. 从{configConfiguration} 对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
  2. 通过service.{clusterName}.grouplist查找ip:port列表用;分隔
  3. 通过ip:port连接seata-server
  1. 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
  2. 如果本地缓存{CLUSTER_ADDRESS_MAP}中存在{clusterName}对应的ip:port列表,直接进行3.3步
  3. 不存在
    1. 创建nacos的NamingInstance
      1. 读取nacos serverAddr, 先从System.getProperty的value{nacosServerAddr} 为null则从{configConfiguration}对象中读取registry.nacos.serverAddr的value{nacosServerAddr}
      2. 读取namespce, 先从System.getProperty的value{namespace} 为null则从{configConfiguration}对象中读取registry.nacos.namespace的value{namespace}
    2. 获取所有的server实例
      1. 根据serverAddr(这里就是一个字符串)和{clusterName}请求nacos server获取所有的seata-server ip:port列表,并缓存到本地
      2. 开启nacos的subscribe监听,刷新{CLUSTER_ADDRESS_MAP}
    3. 通过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:如有错误,请留言纠正

上一篇 下一篇

猜你喜欢

热点阅读