Seata客户端使用配置中心
Seata-0.8.1客户端启动过程分析
1. 加载registry配置
transactionServiceGroup默认为${spring.application.name}-fescar-service-group
可以通过spring.cloud.alibaba.seata.txServiceGroup指定
-
加载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启动
-
获取TmRpcClient实例
-
初始化NettyClientConfig
-
从{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
-
-
启动客户端与相关定时器
-
获取是否降级配置service.enableDegrade
-
初始化netty的bootstrap
-
启动定时重连定时器(连接seata-server)
-
启动合并消息定时器,并运行合并消息任务()
-
-
连接seata-server
- 先从{registryConfiguration}对象中registry.type的value
- 从{configConfiguration} 对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- 通过service.{clusterName}.grouplist查找ip:port列表用;分隔
- 通过ip:port连接seata-server
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- 如果本地缓存{CLUSTER_ADDRESS_MAP}中存在{clusterName}对应的ip:port列表,直接进行3.3步
- 不存在
- 创建nacos的NamingInstance
- 读取nacos serverAddr, 先从System.getProperty的value{nacosServerAddr} 为null则从{configConfiguration}对象中读取registry.nacos.serverAddr的value{nacosServerAddr}
- 读取namespce, 先从System.getProperty的value{namespace} 为null则从{configConfiguration}对象中读取registry.nacos.namespace的value{namespace}
- 获取所有的server实例
- 根据serverAddr(这里就是一个字符串)和{clusterName}请求nacos server获取所有的seata-server ip:port列表,并缓存到本地
- 开启nacos的subscribe监听,刷新{CLUSTER_ADDRESS_MAP}
- 通过ip:port连接seata-server
- 创建nacos的NamingInstance
-
Eureka模式
- 根据registry.eureka.serviceUrl, registry.eureka.weight创建eurekaClient实例
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- 获取eureka上所有注册的application
- 返回名称为{clusterName}的ip:port列表
- 通过ip:port连接seata-server
-
Consul模式
- 根据registry.consul.serverAddr创建ConsulClient实例
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- ConsulClient实例根据registry.consul.cluster获取说有的ip:port列表
- 返回名称为{clusterName}的ip:port列表
- 通过ip:port连接seata-server
-
Etcd模式
- 根据registry.etcd3.serverAddr创建Etcd实例
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- Etcd实例根据registry-seata-{registry.etcd3.cluster}获取说有的ip:port列表
- 返回名称为{clusterName}的ip:port列表
- 通过ip:port连接seata-server
-
Redis模式(目前只有单机模式)
-
根据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)
-
从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
-
从JedisPool实例中回去Jedis对象,从jedis对象中hgetAll({registry.redis.cluster})拿到所有的ip:port列表
-
返回名称为{clusterName}的ip:port列表
-
通过ip:port连接seata-server
-
-
Zookeeper模式
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- 根据registry.zk.serverAddr, registry.zk.session.timeout, registry.zk.connect.timeout创建zkClient实例
- 从/registry/zk/{clusterName}获取所有的ip:port列表
- 通过ip:port连接seata-server
-
sofa模式
- 初始化sofa配置, 优先从System.getProperty中获取registry.sofa.serverAddr, registry.sofa.region, registry.sofa.datacenter, registry.sofa.group, registry.sofa.cluster, registry.sofa.addressWaitTime, 获取不到从{configConfiguration}中获取相应的配置
- 从{configConfiguration}对象中,读取service.vgroup_mapping.{transactionServiceGroup}的value{clusterName}
- 获取sofaRegistry实例并注册监听器,监听器根据{clusterName}获取ip:port列表
- 通过ip:port连接seata-server
3. RM启动
- 获取RmRpcClient实例
- 设置资源管理器(ResourceManager)
- 设置客户端消息监听器
- 连接seata-server(与TM相同)
PS:如有错误,请留言纠正
下一篇: C++ 高精度计时