赞
踩
首先我们要下载seata-server包,地址在https://seata.io/zh-cn/blog/download.html
在非中文目录解压下载下来的zip包,其目录结构如下:
接下来,我们要修改他的配置
在conf下的registry.conf
我们打开这个文件,其实里面整体就包括两个部分,一个是registry,一个是config。
我们先展示registry里面的内容,顾名思义,registry代表着注册的意思。
这里我选择的还是我比较熟悉的nacos注册中心。(其他的也是可以的,大家可以选择自己熟悉的)所以我修改好的配置文件如下:
配置config: 其实就是我们上面注册到nacos上的seata-tc-server服务的配置文件。
因为上面我们配置文件在nacos中还没有,所以我们需要去Nacos中添加配置文件。
配置内容如下:
# 数据存储方式,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
其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息。
特别注意: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;
到现在为止,我们所有的准备工作已经完成。可以开始启动服务了。
进入bin目录,运行其中的seata-server.bat即可:
启动成功后,seata-server应该已经注册到nacos注册中心了。
打开浏览器,访问nacos地址:http://localhost:8848,然后进入服务列表页面,可以看到seata-tc-server的信息:
这样我们的TC服务就搭建并启动好了
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <!--版本较低,1.3.0,因此排除--> <exclusion> <artifactId>seata-spring-boot-starter</artifactId> <groupId>io.seata</groupId> </exclusion> </exclusions> </dependency> <!--seata starter 采用1.4.2版本--> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>${seata.version}</version> </dependency>
我这里version引用的是夫工程里面配置好的版本信息
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。
这里我是创建了一个seata-demo的工程,里面分别写了三个服务,一个订单服务,一个库存服务,一个余额服务。关于分布式事务的知识点,我会梳理到另一篇文章。想了解的小伙伴,可以点击分布式事务(基于Seata解决分布式事务的四种模式)这里只是演示一下,启动服务后的状态。我是在order-service上引入依赖以及修改配置文件(要做分布式,则这三个都要做一样的步骤:1.引入依赖,2.修改配置)
当我们完成了依赖的引入,以及配置文件的修改,我们启动order-service服务。这时候,我们可以查看seata-tc-service服务的窗口:
这样我们的微服务集成seata就完成了。
TC服务作为Seata的核心服务,一定要保证高可用与异地容灾。
高可用我们可以通过配置集群来达到效果,而异地容灾,我们就需要通过多集群来达到效果。比如在上海配置一个集群,杭州也配置一个集群。如图:
如果上海的集群全没用了,或者被意外销毁了。我们只需要将微服务的配置文件中的集群进行修改即可。(这个是需要重启服务的办法)
不需要重启服务的办法,则是将这段配置,配置到nacos的配置中心上,到时候,我们只需要进行修改nacos的配置,而在微服务中只需要配置读取nacos中的事务组映射配置,从而不用重启服务也可以切换集群,实现热更新。
接下来,我来演示搭建多集群以及更换集群。方法用的是nacos的热更新。
首先我们准备两个seata,配置文件跟上面部署tc-server一样,seata2不一样的地方在于他的集群配置的是在HZ
我们分别进入他们的bin目录,执行他们的seata-server.bat文件,就完成了启动。
这里要注意的是,启动第二个服务的时候,要修改端口号启动,不然会端口冲突
进入seata2/bin目录,然后运行命令:
seata-server.bat -p 8092
启动完成后,打开nacos控制台,查看服务列表:
点击操作列表里面的详情,我们就能看到集群状态:
现在我们还需要将事务组映射配置到nacos,这样,在微服务中只需要配置读取nacos中的事务组映射配置,从而不用重启服务也可以切换集群,实现热更新。
选择新建配置
**注意要选择properties类型
配置的内容如下:
# 事务组映射关系 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
我们只需要将一开始在微服务上配置的事务组映射关系,换成读取nacos配置即可,如图:
这样我们就配置好了。只需要重启服务。
我们启动服务后,查看控制后台,可以发现。默认配置的SH集群(8091端口)的连接上了。
然后这个时候,我们不用重启服务,直接去nacos中,修改client.properties配置文件
这时候,我把8091端口的服务停止掉(SH集群)。
这时候我们检查我们启动的order-service服务的控制台日志。可以发现,他连接到8092端口的集群,并且不用重启服务就可以切换集群。
恭喜,这样说明我们就已经成功啦!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。