seata的部署与微服务集成(包含多集群异地容灾配置)

seata的部署与微服务集成

  • 一、部署Seata的tc-server
    • 1.下载与安装
    • 2.配置文件详细讲解
    • 3.创建数据库表
    • 4.启动
  • 二、微服务集成seata
    • 1.引入依赖
    • 2.修改配置文件
    • 3.启动服务
  • 三、TC服务的高可用和异地容灾
    • 1.TC的异地多机房容灾架构
    • 2.多集群的配置与切换
      • 1.多集群的配置
      • 2.将事务组映射配置到nacos
      • 3.微服务读取nacos配置
    • 3.测试切换集群

一、部署Seata的tc-server

1.下载与安装

首先我们要下载seata-server包,地址在https://seata.io/zh-cn/blog/download.html

在非中文目录解压下载下来的zip包,其目录结构如下:

seata的部署与微服务集成(包含多集群异地容灾配置)_第1张图片

接下来,我们要修改他的配置

2.配置文件详细讲解

conf下的registry.conf

seata的部署与微服务集成(包含多集群异地容灾配置)_第2张图片

我们打开这个文件,其实里面整体就包括两个部分,一个是registry,一个是config

我们先展示registry里面的内容,顾名思义,registry代表着注册的意思。

seata的部署与微服务集成(包含多集群异地容灾配置)_第3张图片

这里我选择的还是我比较熟悉的nacos注册中心。(其他的也是可以的,大家可以选择自己熟悉的)所以我修改好的配置文件如下:

seata的部署与微服务集成(包含多集群异地容灾配置)_第4张图片

配置config: 其实就是我们上面注册到nacos上的seata-tc-server服务的配置文件。

seata的部署与微服务集成(包含多集群异地容灾配置)_第5张图片

因为上面我们配置文件在nacos中还没有,所以我们需要去Nacos中添加配置文件。

seata的部署与微服务集成(包含多集群异地容灾配置)_第6张图片

配置内容如下:

# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000

# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息。

3.创建数据库表

特别注意:tc服务在管理分布式事务时,需要记录事务相关数据到数据库中,你需要提前创建好这些表。分别为分支事务表,全局事务表

mysql语句,注意要在你配置文件里配好的数据库里执行。


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- 分支事务表
-- ----------------------------
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table`  (
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `status` tinyint(4) NULL DEFAULT NULL,
  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime(6) NULL DEFAULT NULL,
  `gmt_modified` datetime(6) NULL DEFAULT NULL,
  PRIMARY KEY (`branch_id`) USING BTREE,
  INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- 全局事务表
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (
  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `timeout` int(11) NULL DEFAULT NULL,
  `begin_time` bigint(20) NULL DEFAULT NULL,
  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime NULL DEFAULT NULL,
  `gmt_modified` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`xid`) USING BTREE,
  INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
  INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

到现在为止,我们所有的准备工作已经完成。可以开始启动服务了。

4.启动

进入bin目录,运行其中的seata-server.bat即可:

seata的部署与微服务集成(包含多集群异地容灾配置)_第7张图片

启动成功后,seata-server应该已经注册到nacos注册中心了。

打开浏览器,访问nacos地址:http://localhost:8848,然后进入服务列表页面,可以看到seata-tc-server的信息:

seata的部署与微服务集成(包含多集群异地容灾配置)_第8张图片

这样我们的TC服务就搭建并启动好了

二、微服务集成seata

1.引入依赖

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-seataartifactId>
    <exclusions>
        
        <exclusion>
            <artifactId>seata-spring-boot-starterartifactId>
            <groupId>io.seatagroupId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>io.seatagroupId>
    <artifactId>seata-spring-boot-starterartifactId>
    <version>${seata.version}version>
dependency>

我这里version引用的是夫工程里面配置好的版本信息

seata的部署与微服务集成(包含多集群异地容灾配置)_第9张图片

2.修改配置文件

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    # 参考tc服务自己的registry.conf中的配置(文章中的第一节的第2步)
    type: nacos
    nacos: # tc
      server-addr: 127.0.0.1:8848
      namespace: ""
      group: DEFAULT_GROUP
      application: seata-tc-server # tc服务在nacos中的服务名称
      username: nacos
      password: nacos
  tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
  service:
    vgroup-mapping: # 事务组与TC服务cluster的映射关系
      seata-demo: SH

其中的集群,我们得通过事务组得映射关系来配置。也就是配置文件中得tx-service-group(事务组),vgroup-mapping(映射关系),通过事务组找到对应得集群地址。这里我配置得是seata-demo事务组,对应集群SH。

3.启动服务

这里我是创建了一个seata-demo的工程,里面分别写了三个服务,一个订单服务,一个库存服务,一个余额服务。关于分布式事务的知识点,我会梳理到另一篇文章。想了解的小伙伴,可以点击分布式事务(基于Seata解决分布式事务的四种模式)这里只是演示一下,启动服务后的状态。我是在order-service上引入依赖以及修改配置文件(要做分布式,则这三个都要做一样的步骤:1.引入依赖,2.修改配置)

当我们完成了依赖的引入,以及配置文件的修改,我们启动order-service服务。这时候,我们可以查看seata-tc-service服务的窗口:

在这里插入图片描述

这样我们的微服务集成seata就完成了。

三、TC服务的高可用和异地容灾

1.TC的异地多机房容灾架构

TC服务作为Seata的核心服务,一定要保证高可用与异地容灾。

高可用我们可以通过配置集群来达到效果,而异地容灾,我们就需要通过多集群来达到效果。比如在上海配置一个集群,杭州也配置一个集群。如图:

seata的部署与微服务集成(包含多集群异地容灾配置)_第10张图片

如果上海的集群全没用了,或者被意外销毁了。我们只需要将微服务的配置文件中的集群进行修改即可。(这个是需要重启服务的办法)

seata的部署与微服务集成(包含多集群异地容灾配置)_第11张图片

不需要重启服务的办法,则是将这段配置,配置到nacos的配置中心上,到时候,我们只需要进行修改nacos的配置,而在微服务中只需要配置读取nacos中的事务组映射配置,从而不用重启服务也可以切换集群,实现热更新。

接下来,我来演示搭建多集群以及更换集群。方法用的是nacos的热更新。

2.多集群的配置与切换

1.多集群的配置

首先我们准备两个seata,配置文件跟上面部署tc-server一样,seata2不一样的地方在于他的集群配置的是在HZ

在这里插入图片描述

我们分别进入他们的bin目录,执行他们的seata-server.bat文件,就完成了启动。

这里要注意的是,启动第二个服务的时候,要修改端口号启动,不然会端口冲突

进入seata2/bin目录,然后运行命令:

seata-server.bat -p 8092

seata的部署与微服务集成(包含多集群异地容灾配置)_第12张图片

启动完成后,打开nacos控制台,查看服务列表:

在这里插入图片描述

点击操作列表里面的详情,我们就能看到集群状态:

seata的部署与微服务集成(包含多集群异地容灾配置)_第13张图片

2.将事务组映射配置到nacos

现在我们还需要将事务组映射配置到nacos,这样,在微服务中只需要配置读取nacos中的事务组映射配置,从而不用重启服务也可以切换集群,实现热更新。

选择新建配置

**注意要选择properties类型

seata的部署与微服务集成(包含多集群异地容灾配置)_第14张图片

配置的内容如下:

# 事务组映射关系
service.vgroupMapping.seata-demo=SH

service.enableDegrade=false
service.disableGlobalTransaction=false
# 与TC服务的通信配置
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
# RM配置
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
# TM配置
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000

# undo日志配置
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
client.log.exceptionRate=100

3.微服务读取nacos配置

我们只需要将一开始在微服务上配置的事务组映射关系,换成读取nacos配置即可,如图:

seata的部署与微服务集成(包含多集群异地容灾配置)_第15张图片

3.测试切换集群

这样我们就配置好了。只需要重启服务。

我们启动服务后,查看控制后台,可以发现。默认配置的SH集群(8091端口)的连接上了。

在这里插入图片描述

然后这个时候,我们不用重启服务,直接去nacos中,修改client.properties配置文件

在这里插入图片描述

这时候,我把8091端口的服务停止掉(SH集群)。

这时候我们检查我们启动的order-service服务的控制台日志。可以发现,他连接到8092端口的集群,并且不用重启服务就可以切换集群。

在这里插入图片描述

恭喜,这样说明我们就已经成功啦!!!

你可能感兴趣的:(分布式,微服务,java,spring,cloud,中间件)