seata集群部署_Seata 配置中心实现原理

Seata 可以支持多个第三方配置中心,那么 Seata 是如何同时兼容那么多个配置中心的呢?下面我给大家详细介绍下 Seata 配置中心的实现原理。

配置中心属性加载

在 Seata 配置中心,有两个默认的配置文件:

c9fead20cf1b480d9fd647c312c526da.png

file.conf 是默认的配置属性,registry.conf 主要存储第三方注册中心与配置中心的信息,主要有两大块:

registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
# ...
}

config {
# file、nacos 、apollo、zk、consul、etcd3
type = "file"
nacos {
serverAddr = "localhost"
namespace = ""
}
file {
name = "file.conf"
}
# ...
}

其中 registry 为注册中心的配置属性,这里先不讲,config 为配置中心的属性值,默认为 file 类型,即会加载本地的 file.conf 里面的属性,如果 type 为其它类型,那么会从第三方配置中心加载配置属性值。

在 config 模块的 core 目录中,有个配置工厂类 ConfigurationFactory,它的结构如下:

8089fbd5195a97408ce2a861ba90d3f7.png

可以看到都是一些配置的静态常量:

REGISTRY_CONF_PREFIX、REGISTRY_CONF_SUFFIX:配置文件名、默认配置文件类型;

SYSTEM_PROPERTY_SEATA_CONFIG_NAME、ENV_SEATA_CONFIG_NAME、ENV_SYSTEM_KEY、ENV_PROPERTY_KEY:自定义文件名配置变量,也说明我们可以自定义配置中心的属性文件。

ConfigurationFactory 里面有一处静态代码块,如下:

io.seata.config.ConfigurationFactory

048b4e7f0cb455e6b0df58dfea6f372c.png

根据自定义文件名配置变量找出配置文件名称与类型,如果没有配置,默认使用 registry.conf,FileConfiguration 是 Seata 默认的配置实现类,如果为默认值,则会更具  registry.conf 配置文件生成 FileConfiguration 默认配置对象,这里也可以利用 SPI 机制支持第三方扩展配置实现,具体实现是继承 ExtConfigurationProvider 接口,在META-INF/services/创建一个文件并填写实现类的全路径名,如下所示:

26c26ced3e9e318f49458675872bbce0.png

第三方配置中心实现类加载

在静态代码块逻辑加载完配置中心属性之后,Seata 是如何选择配置中心并获取配置中心的属性值的呢?

我们刚刚也说了 FileConfiguration 是 Seata 的默认配置实现类,它继承了 AbstractConfiguration,它的基类为 Configuration,提供了获取参数值的方法:

short getShort(String dataId, int defaultValue, long timeoutMills);
int getInt(String dataId, int defaultValue, long timeoutMills);
long getLong(String dataId, long defaultValue, long timeoutMills);
// ....

那么意味着只需要第三方配置中心实现该接口,就可以整合到 Seata 配置中心了,下面我拿 zk 来做例子:

首先,第三方配置中心需要实现一个 Provider 类:

bce0f621d48a8cfe99db59ec2aeb61a6.png

实现的 provider 方法如其名,主要是输出具体的 Configuration 实现类。

那么我们是如何获取根据配置去获取对应的第三方配置中心实现类呢?

在 Seata 项目中,获取一个第三方配置中心实现类通常是这么做的:

Configuration CONFIG = ConfigurationFactory.getInstance();

在 getInstance() 方法中主要是使用了单例模式构造配置实现类,它的构造具体实现如下:

io.seata.config.ConfigurationFactory#buildConfiguration:

444410a1876009be82a5ee7da63be55d.png

首先从 ConfigurationFactory 中的静态代码块根据 registry.conf 创建的 CURRENT_FILE_INSTANCE 中获取当前环境使用的配置中心,默认为为 File 类型,我们也可以在 registry.conf 配置其它第三方配置中心,这里也是利用了 SPI 机制去加载第三方配置中心的实现类,具体实现如下:

bfeb30b8676a1519dcfe739899e2a31c.png

如上,即是刚刚我所说的 ZookeeperConfigurationProvider 配置实现输出类,我们再来看看这行代码:

EnhancedServiceLoader.load(ConfigurationProvider.class,Objects.requireNonNull(configType).name()).provide();

EnhancedServiceLoader 是 Seata SPI 实现核心类,这行代码会加载 META-INF/services/META-INF/seata/目录中文件填写的类名,那么如果其中有多个配置中心实现类都被加载了怎么办呢?

我们注意到 ZookeeperConfigurationProvider 类的上面有一个注解:

@LoadLevel(name = "ZK", order = 1)

在加载多个配置中心实现类时,会根据 order 进行排序:

io.seata.common.loader.EnhancedServiceLoader#findAllExtensionClass:

d854e983e3a7e454c0efc227a5483de6.png

io.seata.common.loader.EnhancedServiceLoader#loadFile:

59389792b515a4f1f8880e377a2ecbd3.png

这样,就不会产生冲突了。

但是我们发现 Seata 还可以用这个方法进行选择,Seata 在调用 load 方法时,还传了一个参数:

Objects.requireNonNull(configType).name()

ConfigType 为配置中心类型,是个枚举类:

public enum ConfigType {
File, ZK, Nacos, Apollo, Consul, Etcd3, SpringCloudConfig, Custom;
}

我们注意到,LoadLevel 注解上还有一个 name 属性,在进行筛选实现类时,Seata 还做了这个操作:

31ad1a79821b7cf35fd8ac28cc6f40f1.png

根据当前 configType 来判断是否等于 LoadLevel 的 name 属性,如果相等,那么就是当前配置的第三方配置中心实现类。

第三方配置中心实现类

ZookeeperConfiguration 继承了 AbstractConfiguration,它的构造方法如下:

3a95f288e267e2686d66c95aaf376d99.png

构造方法创建了一个 zkClient 对象,这里的 FILE_CONFIG 是什么呢?

private static final Configuration FILE_CONFIG = ConfigurationFactory.CURRENT_FILE_INSTANCE;

原来就是刚刚静态代码块中创建的 registry.conf 配置实现类,从该配置实现类拿到第三方配置中心的相关属性,构造第三方配置中心客户端,然后实现 Configuration 接口时:

f48047317aa1c060eccfa84dcde297ad.png

就可以利用客户端相关方法去第三方配置获取对应的参数值了。

第三方配置中心同步脚本

上周末才写好,已经提交 PR 上去了,还处于 review 中,预估会在 Seata 1.0 版本提供给大家使用,敬请期待。

具体位置在 Seata 项目的 script 目录中:

ebc506d70c218ee44317d0af915c9b84.png

config.txt 为本地配置好的值,搭建好第三方配置中心之后,运行脚本会将 config.txt 的配置同步到第三方配置中心。

近期热文

Seata AT 模式启动源码分析

我对支付平台架构设计的一些思考

分布式事务中间件Seata的设计原理

聊聊Tomcat的架构设计

关于 Kafka 的一些面试题目

基于Jenkins Pipeline自动化部署

图解:Kafka 水印备份机制

记一次 Kafka 集群线上扩容

Kafka重平衡机制

Kafka消息体大小设置的一些细节

RocketMQ为什么要保证订阅关系的一致性?

RocketMQ消息发送的高可用设计

深度解析RocketMQ Topic的创建机制

mybatis-plus源码分析之sql注入器

Mybatis源码分析之Mapper注册与绑定

Mybatis-spring源码分析之注册Mapper Bean

从源码的角度解析线程池运行原理

关于线程池你不得不知道的一些设置

你都理解创建线程池的参数吗?

Java并发之AQS源码分析(二)

Java并发之AQS源码分析(一)

0eaa4ad53d747ff2e6597d8328a5cfd8.png

长按可以订阅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答: 部署K8S集群中的Seata需要按照以下步骤进行:1)准备好所需的资源,包括存储空间、网络资源等;2)利用Kubernetes的配置管理工具Helm将Seata部署到Kubernetes集群中;3)根据需要进行Seata的配置;4)启动Seata集群;5)部署测试程序,验证Seata集群是否正常工作。 ### 回答2: Kubernetes(简称K8s)是一个开源的容器编排平台,它能够自动化地部署、扩展和管理应用程序容器。Seata是一种用于解决分布式事务问题的开源框架,可以保证分布式事务的一致性和隔离性。 在Kubernetes中部署Seata集群需要以下步骤: 1. 准备Kubernetes集群:首先需要搭建一个稳定运行的Kubernetes集群。可以选择自建集群或使用云服务提供商的托管服务(如GKE、EKS等)。 2. 创建Seata集群所需的命名空间(Namespace):在Kubernetes中,命名空间用于隔离不同的应用。可以使用kubectl命令或者在yaml文件中定义命名空间。 3. 创建Seata集群所需的持久化存储:Seata集群需要使用持久化存储来保存事务数据和日志。可以选择使用Kubernetes提供的存储卷(Persistent Volume)或者外部存储(如云存储)。 4. 创建Seata集群所需的配置文件:Seata集群需要配置文件来指定各个组件的参数。可以在Kubernetes中使用ConfigMap或Secret来存储和管理配置文件。 5. 配置Seata Server:在Kubernetes中,可以使用Deployment来创建和管理Seata Server的实例。在Deployment中可以指定应用容器的镜像、资源限制以及其他参数。 6. 配置Seata Registry:Seata集群需要使用Registry来进行服务发现和注册。可以选择使用Kubernetes的Service或者其他服务注册中心(如Etcd、Consul等)作为Registry。 7. 配置Seata Client:在应用程序中使用Seata时,需要配置Seata Client来连接Seata集群。可以使用ConfigMap或者环境变量来指定Seata集群的地址和其他参数。 8. 部署应用程序:最后,在Kubernetes中部署应用程序,并将应用程序与Seata集群连接起来。可以使用Deployment或者其他资源对象(如Pod、ReplicaSet)来管理应用程序。 通过以上步骤,就可以在Kubernetes上成功部署Seata集群。这样就可以使用Seata来保证分布式事务的一致性和隔离性,并且通过Kubernetes的自动化和扩展能力,可以实现高可用和高性能的分布式事务处理。 ### 回答3: k8s(Kubernetes)是一个开源的容器编排平台,可用于部署和管理容器化的应用程序。seata是一种分布式事务解决方案,可以帮助开发者实现基于微服务架构的分布式事务管理。在k8s上部署seata集群需要以下步骤: 1. 准备seata配置文件:在部署seata之前,需要准备seata的配置文件。这些配置文件通常包括seata的事务协调器(TC)配置、存储模式、数据库连接配置等。 2. 创建k8s部署文件:根据seata的配置文件,创建k8s的部署文件。这些部署文件通常包括seata事务协调器的Deployment、Service配置,以及其他相关的资源配置。 3. 部署seata集群:使用kubectl命令将seata集群部署文件应用到k8s集群中。kubectl命令可以创建、更新、删除k8s资源。 4. 验证seata集群部署:使用kubectl命令查看seata集群的运行状态,确保seata事务协调器部署成功。 5. 测试分布式事务功能:通过在微服务中添加seata的相关代码,实现分布式事务功能,并进行测试。可以模拟跨多个微服务的事务操作,验证seata的分布式事务管理能力。 总结:在k8s上部署seata集群需要准备seata配置文件,创建k8s的部署文件,部署seata集群,并测试分布式事务功能。通过k8s的弹性扩展和自动化管理能力,可以更方便地部署和管理seata集群,提高系统的可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值