iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >TC集群Seata1.6高可用架构源码解析
  • 163
分享到

TC集群Seata1.6高可用架构源码解析

TC集群Seata高可用架构TC集群架构 2022-12-26 12:12:31 163人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景二、环境配置三、从配置中心获取TC集群四、刷新TC集群一、背景 TC 集群具有高可用架构,应用到集群是这样一个间接的关系:应用 -》事务分组 -》TC 集群,应用启动后所

一、背景

TC 集群具有高可用架构,应用到集群是这样一个间接的关系:应用 -》事务分组 -》TC 集群,应用启动后所指定的事务分组不能变,可通过配置中心变更事务分组所属的 TC 集群,Seata 客户端监听到这个变更后,会切换到新的 TC 集群。

本篇从源码梳理这个高可用能力是如何实现的。

二、环境配置

客户端配置使用Nacos配置中心和nacos注册中心,

seata:
  enabled: true
  # Seata 应用编号
  application-id: seataclistock
  # Seata 事务组编号,用于 TC 集群名。该配置需要与服务端提到的group相对应,也需要与下面的相对应
  tx-service-group: tx_group_stock
  # 关闭自动代理
  enable-auto-data-source-proxy: false
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      serverAddr: 
      namespace: seata # 需要与服务端添加的配置文件相同
      group: SEATA_GROUP_ROCKTEST
      username: seata
      passWord: seata
      data-id: seataClient.tx_group_busin.properties
  reGIStry:
    # support: nacos, eureka, Redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      serverAddr: 
      namespace: seata  # 需要与服务端添加的配置文件相同
      group: SEATA_GROUP_ROCKTEST   # 需要与服务端添加的配置文件相同
      username: seata
      password: seata

三、从配置中心获取TC集群

服务注册的能力要依赖配置中心,从nacos的配置中心获取配置NacosConfiguration#initSeataConfig

  • Data Id:seataClient.tx_group_stock.properties
  • Group:SEATA_GROUP_LWKTEST

其中的service.vgroupMapping.tx_group_stock的值是dev_cluster_1,接下来注册能力就要使用这个集群来工作。

private static void initSeataConfig() {
    try {
        String nacosDataid = getNacosDataId();
        String config = configService.getConfig(nacosDataId, getNacosGroup(), DEFAULT_CONFIG_TIMEOUT);
        if (StringUtils.isNotBlank(config)) {
            seataConfig = ConfigProcessor.processConfig(config, getNacosDataType());
            NacosListener nacosListener = new NacosListener(nacosDataId, null);
            configService.addListener(nacosDataId, getNacosGroup(), nacosListener);
        }
    } catch (NacosException | IOException e) {
        LOGGER.error("init config properties error", e);
    }
}

RegistryFactory#getInstance()这是个单例机制,所以源码梳理起来很简单,下边获取TC服务的时候会调用此单例方法做初始化。

  • 读取配置文件中registry.type,
  • 配置的值是nacos,所以读出的值是nacos
  • 通过SPI加载并实例化 NacosRegistryProvider
public class RegistryFactory {
    
    public static RegistryService getInstance() {
        return RegistryFactoryHolder.INSTANCE;
    }
    private static RegistryService buildRegistryService() {
        RegistryType registryType;
        //registryTypeName = "registry.type"
        String registryTypeName = ConfigurationFactory.CURRENT_FILE_INSTANCE.getConfig(
            ConfigurationKeys.FILE_ROOT_REGISTRY + ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR
                + ConfigurationKeys.FILE_ROOT_TYPE);
        try {
            // nacos
            registryType = RegistryType.getType(registryTypeName);
        } catch (Exception exx) {
            throw new NotSupportYetException("not support registry type: " + registryTypeName);
        }
        // 通过SPI 加载并实例化 NacosRegistryProvider
        return EnhancedServiceLoader.load(RegistryProvider.class, Objects.requireNonNull(registryType).name()).provide();
    }
    private static class RegistryFactoryHolder {
        private static final RegistryService INSTANCE = buildRegistryService();
    }
}

TM、RM 客户端需要与TC通信,所以在其初始化时必然会有获取TC集群的逻辑,对应在源码TmNettyRemotinGClient#init 中的reconnect方法。

@Override
public void init() {
    // registry processor
    registerProcessor();
    if (initialized.compareAndSet(false, true)) {
        //父类中会开启定时任务来执行 getClientChannelManager().reconnect(transactionServiceGroup)
        super.init();
        if (io.seata.common.util.StringUtils.isNotBlank(transactionServiceGroup)) {
            getClientChannelManager().reconnect(transactionServiceGroup);
        }
    }
}

reconnect中的.nettyClientChannelManager#getAvailServerList 是根据seata.tx-service-group的值来检索TC集群信息。直接提供出来调用堆栈,方便大家快速熟悉调用链路:

getServiceGroup:111, RegistryService (io.seata.discovery.registry)
lookup:145, NacosRegistryServiceImpl (io.seata.discovery.registry.nacos)
getAvailServerList:257, NettyClientChannelManager (io.seata.core.rpc.netty)
reconnect:171, NettyClientChannelManager (io.seata.core.rpc.netty)
init:198, TmNettyRemotingClient (io.seata.core.rpc.netty)
init:47, TMClient (io.seata.tm)
initClient:220, GlobalTransactionScanner (io.seata.spring.annotation)
afterPropertiesSet:512, GlobalTransactionScanner (io.seata.spring.annotation)

这里便是通过Seata客户端 seata.tx-service-group的值,找到最终TC集群的关键之处。在getServiceGroup中从nacos中获取service.vgroupMapping.tx_group_stock的值,即dev_cluster_1

default String getServiceGroup(String key) {
    //key = service.vgroupMapping.tx_group_stock
    key = PREFIX_SERVICE_ROOT + CONFIG_SPLIT_CHAR + PREFIX_SERVICE_MAPPING + key;
    if (!SERVICE_GROUP_NAME.contains(key)) {
        ConfigurationCache.addConfigListener(key);
        SERVICE_GROUP_NAME.add(key);
    }
    return ConfigurationFactory.getInstance().getConfig(key);
}

然后NettyClientChannelManager#reconnect中获取 TC 集群中的所有 TC 服务节点,对每个TC 服务节点建连。

for (String serverAddress : availList) {
    try {
        acquireChannel(serverAddress);
        channelAddress.add(serverAddress);
    } catch (Exception e) {
        LOGGER.error("{} can not connect to {} cause:{}", FrameworkErrorCode.NetConnect.getErrCode(),
            serverAddress, e.getMessage(), e);
    }
}

再梳理一下,梳理这么多的关键就是通过tx_group_stock 找到 TC 集群 dev_cluster_1

客户端:

seata:
  # 默认关闭,如需启用spring.datasource.dynami.seata需要同时开启
  enabled: true
  # Seata 事务组编号,用于 TC 集群名。该配置需要与服务端提到的group相对应,也需要与下面的相对应
  tx-service-group: tx_group_stock

nacos:

Data ID: seataClient.tx_group_stock.properties
Group: SEATA_GROUP_ROCKTEST
配置内容:
    ...
    service.vgroupMapping.tx_group_stock=dev_cluster_1
    ...

TC服务端:

registry:
  # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa
  type: nacos
  preferred-networks: 30.240.*
  nacos:
    application: seata-server
    cluster: dev_cluster_1

RegistryService#getServiceGroup中从nacos获取值的时候,有个细节需要注意:通过namespace + Group + Key(Data Id) 三维来唯一标示一个Key。

四、刷新TC集群

AbstractNettyRemotingClient#init中默认会每隔10s进行一次 TC 服务清单刷新与重连

timerExecutor.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        clientChannelManager.reconnect(getTransactionServiceGroup());
    }
}, SCHEDULE_DELAY_MILLS, SCHEDULE_INTERVAL_MILLS, TimeUnit.MILLISECONDS);

以上就是TC 集群Seata1.6高可用架构源码解析的详细内容,更多关于TC 集群Seata高可用架构的资料请关注编程网其它相关文章!

--结束END--

本文标题: TC集群Seata1.6高可用架构源码解析

本文链接: https://www.lsjlt.com/news/175805.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TC集群Seata1.6高可用架构源码解析
    目录一、背景二、环境配置三、从配置中心获取TC集群四、刷新TC集群一、背景 TC 集群具有高可用架构,应用到集群是这样一个间接的关系:应用 -》事务分组 -》TC 集群,应用启动后所...
    99+
    2022-12-26
    TC 集群Seata高可用架构 TC 集群架构
  • 如何分析Java高可用集群架构与微服务架构
    这篇文章将为大家详细讲解有关如何分析Java高可用集群架构与微服务架构,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 序可能大部分读者都在想,为什么在这以 dubbo、spring...
    99+
    2023-06-16
  • MHA实现MySQL高可用集群架构
    转转连接 https://www.cnblogs.com/tanxiaojun/p/10424699.html MHA简介 MHA(Master HighAvailability)目前在MySQL高可...
    99+
    2024-04-02
  • MySQL中怎么实现集群高可用架构
    今天就跟大家聊聊有关MySQL中怎么实现集群高可用架构,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL+DRDB架构通过DRBD基于bloc...
    99+
    2024-04-02
  • Galera高可用集群项目实施与维护(PXC)_MySQL高可用复制与分布式集群架构06
    Galera高可用集群项目实施与维护(PXC)_MySQL高可用复制与分布式集群架构06视频教程学习地址    http://edu.51cto.com/course/1436...
    99+
    2024-04-02
  • 构建双vip的高可用MySQL集群
    目录一、 项目描述:二、项目环境:二、项目步骤:三、项目概念图:四、部署zabbix监控系统4.1 准备:4.2 步骤:五、项目心得:一、 项目描述:     本项目的目的是: 构...
    99+
    2024-04-02
  • 怎么构建Mysql高可用集群系统
    本篇内容主要讲解“怎么构建Mysql高可用集群系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么构建Mysql高可用集群系统”吧!一、 MySQL复制的实现...
    99+
    2024-04-02
  • 怎么在MySQL数据库中实现MMM高可用群集架构
    这篇文章给大家介绍怎么在MySQL数据库中实现MMM高可用群集架构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MMM高可用架构说明mmm_mond:监控进程,负责所有的监控工作,决定...
    99+
    2024-04-02
  • 微前端架构ModuleFederationPlugin源码解析
    目录序言背景MF 基本介绍应用场景微前端架构服务化的 library 和 componentsModuleFederationPlugin 源码解析入口源码ExposesRemote...
    99+
    2022-11-13
    微前端架构ModuleFederationPlugin ModuleFederationPlugin 解析
  • Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
    1、组件及实现的功能 Keepalived:实现对Haproxy服务的高可用,并采用双主模型配置; Haproxy:实现对Nginx的负载均衡和读写分离; Nginx:实现对HTTP...
    99+
    2024-04-02
  • Redis高可用集群redis-cluster详解
    哨兵模式主要解决了手动切换主从节点的问题 1 , 哨兵模式的缺陷 .主从节点切换的时候存在访问瞬断,等待时间较长, .只有一个master节点提供写,slave节点提供读,尽管写的效...
    99+
    2024-04-02
  • MySQL高可用架构之MHA架构全解
    目录一、介绍二、组成三、工作过程四、架构五、实例展示MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating m...
    99+
    2024-04-02
  • HBase高可用集群运维举例分析
    本篇内容主要讲解“HBase高可用集群运维举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HBase高可用集群运维举例分析”吧!1、控制隔离——rsgroup在94版本中,经常困扰我们的一...
    99+
    2023-06-19
  • 运用.net core中实例讲解RabbitMQ高可用集群构建
    目录一、集群架构简介二、普通集群搭建2.1 各个节点分别安装RabbitMQ2.2 把节点加入集群2.3 代码演示普通集群的问题三、镜像集群四、HAProxy环境搭建。五、KeepA...
    99+
    2024-04-02
  • spring cloud之eureka高可用集群和服务分区解析
    目录准备搭建验证解释准备 1.首先,在C:\WINDOWS\System32\drivers\etc\hosts文件里面添加一下映射,如果不添加也没关系,只是如果是单机环境,在eur...
    99+
    2024-04-02
  • MySQL之高可用架构详解
    目录引言MySQL高可用一主一备:MySQL主从同步的几种模式:总结引言 “高可用”是互联网一个永恒的话题,先避开MySQL不谈,为了保证各种服务的高可用有几种常用的解决方案。 服务...
    99+
    2024-04-02
  • 如何使用Lvs+Nginx集群搭建高并发架构
    这篇文章主要介绍“如何使用Lvs+Nginx集群搭建高并发架构”,在日常操作中,相信很多人在如何使用Lvs+Nginx集群搭建高并发架构问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Lvs+Nginx...
    99+
    2023-06-22
  • heartbeat+lvs怎么构建高可用负载均衡集群
    小编给大家分享一下heartbeat+lvs怎么构建高可用负载均衡集群,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!heartb...
    99+
    2024-04-02
  • MySQL之高可用架构的示例分析
    小编给大家分享一下MySQL之高可用架构的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL高可用MySQL的高可用也是同样的思路,首先要有多个MySQL实例提供服务,其次就是当某个实例挂掉时,可以自动切换流...
    99+
    2023-06-22
  • 解析高可用Redis服务架构分析与搭建方案
    基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysq...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作