秦皇岛网站制作小程序开发,宁波网站建设 网络服务,中国建设监理官方网站,行业数据网站文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos… 文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos配置 seata的部署和集成
一、部署Seata的tc-server
1.下载 链接https://pan.baidu.com/s/1MsbbF0rseNy74r7lLPbpwQ 提取码hzan 首先我们要下载seata-server包地址在http/seata.io/zh-cn/blog/download.html
当然课前资料也准备好了 2.解压
在非中文目录解压缩这个zip包其目录结构如下 3.修改配置
修改conf目录下的registry.conf文件 内容如下修改大量删除
registry {# tc服务的注册中心类型这里选择nacos也可以是eureka、zookeeper等type nacosnacos {# seata tc 服务注册到 nacos的服务名称可以自定义application seata-tc-serverserverAddr 192.168.59.1:8848group DEFAULT_GROUPnamespace cluster SHusername nacospassword nacos}
}config {# 读取tc服务端的配置文件的方式这里是从nacos配置中心读取这样如果tc是集群可以共享配置type nacos# 配置nacos地址等信息nacos {serverAddr 172.0.0.1:8848namespace group SEATA_GROUPusername nacospassword nacosdataId seataServer.properties}
}注意nacos地址默认127.0.0.1可以都是本地IP端口是8848没错就行 名称换了下中间加了一个-tc- 待会儿nacos控制台显示的就是这个名称 nacos组的名称直接到nacos控制台查看 注册中心是nacos配置文件也给中心去管理方便集群下的共享 4.在nacos添加配置
特别注意为了让tc服务的集群可以共享配置我们选择了nacos作为统一配置中心。因此服务端配置文件seataServer.properties文件需要在nacos中配好。 dataId “seataServer.properties” 上面配置文件配置的一个文件名称 格式如下 配置内容如下
# 数据存储方式db代表数据库 (这里的数据指的是分支事务全局事务的信息)
store.modedb
store.db.datasourcedruid
store.db.dbTypemysql
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetruerewriteBatchedStatementstrue
store.db.userroot
store.db.password1234
store.db.minConn5
store.db.maxConn30
store.db.globalTableglobal_table
store.db.branchTablebranch_table
store.db.queryLimit100
store.db.lockTablelock_table
store.db.maxWait5000
# 事务、日志等配置
server.recovery.committingRetryPeriod1000
server.recovery.asynCommittingRetryPeriod1000
server.recovery.rollbackingRetryPeriod1000
server.recovery.timeoutRetryPeriod1000
server.maxCommitRetryTimeout-1
server.maxRollbackRetryTimeout-1
server.rollbackRetryTimeoutUnlockEnablefalse
server.undo.logSaveDays7
server.undo.logDeletePeriod86400000# 客户端与服务端传输方式
transport.serializationseata
transport.compressornone
# 关闭metrics功能提高性能
metrics.enabledfalse
metrics.registryTypecompact
metrics.exporterListprometheus
metrics.exporterPrometheusPort9898其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息。 5.创建数据库表
特别注意tc服务在管理分布式事务时需要记录事务相关数据到数据库中你需要提前创建好这些表。
新建一个名为seata的数据库运行课前资料提供的sql文件 上面nacos新增的配置项seataServer.properties里面的数据库地址数据库名称就是 seata 先创建数据库
create database seata;
use seata;再执行sql文件 这些表主要记录全局事务、分支事务、全局锁信息 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;6.启动TC服务
进入bin目录运行其中的seata-server.bat即可 启动成功后seata-server应该已经注册到nacos注册中心了。
打开浏览器访问nacos地址http://192.168.59.1:8848/nacos/index.html然后进入服务列表页面可以看到seata-tc-server的信息 启动nacos的黑窗口有nacos控制台地址 点击详情查看详细信息
二、微服务集成seata 注意参与全局事务的每个微服务都要做下面这几步 下面3个微服务都要做下面两步 配置好了各个微服务集成seata将来各个微服务之间的分布式事务就有中心化机构能够自动管理了 1.引入依赖
首先我们需要在微服务中引入seata依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdexclusions!--版本较低1.3.0因此排除--exclusionartifactIdseata-spring-boot-starter/artifactIdgroupIdio.seata/groupId/exclusion/exclusions
/dependency
!--seata starter 采用1.4.2版本--
dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion${seata.version}/version
/dependency${seata.version} 是父工程的pom.xml里配置的变量 2.修改配置文件
需要修改application.yml文件添加一些配置
seata:registry: # TC服务注册中心的配置微服务根据这些信息去注册中心获取tc服务地址# 参考tc服务自己的registry.conf中的配置type: nacosnacos: # tcserver-addr: 127.0.0.1:8848 # 127.0.0.1就是localhostnamespace: group: DEFAULT_GROUPapplication: seata-tc-server # tc服务在nacos中的服务名称cluster: SHtx-service-group: seata-demo # 事务组根据这个获取tc服务的cluster名称service:vgroup-mapping: # 事务组与TC服务cluster的映射关系seata-demo: SH配完后nacos配置了两份seata一份springCloud一份这是因为seata框架目前做得还不好没有做好和springCloud的集成关系所以还得独立再去配一次nacos . 配置文件的配置除了集群名称cluster其他完全按照TC的配置文件conf/registry.conf来配 TC已经作为一个独立的软件, 以微服务的形式注册到nacos注册中心去了 现在TM、RM需要和TC进行交流也就是让他们找到TC微服务就行了。配置好让他们找到后面就不需要我们操心了 那么要找到一个微服务得同时知道这四个信息 仔细一看配置文件里都有 namespace: “” 这里的空就是默认配置public这里集群的名称配置也有点特别因为有一个事务组的概念后面详细介绍现在只需要知道订单、商品、库存3个微服务的3个分支事务都在一个事务组里被管理即可。 事务组和集群有个映射关系所以集群名称SH在事务组下面配置的 四个配置图示 (找到一个微服务必备的四个配置信息) 修改完成后重启若报错
Error creating bean with name globalTransactionScanner defined in class path resource [io/seata/spring/boot/autoconfigure/SeataAutoConfiguration.class]: Bean instantiation via factory method failed; nested 请切换到jdk8。不要用jdk17很多类被弃用了 正常重启后seata黑窗口能看到服务的注册信息说明该微服务确实创建的RM和TM并且确实都和TC中心连接上了
21:48:30.657 INFO --- [rverHandlerThread_1_1_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIdsjdbc:mysql:///seata_demo, applicationIdstorage-service, transactionServiceGroupseata-demo},channel:[id: 0x01e2d561, L:/2.0.0.1:8091 - R:/2.0.0.1:51715],client version:1.4.2
21:49:29.798 INFO --- [ttyServerNIOWorker_1_2_40] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationIdstorage-service, transactionServiceGroupseata-demo},channel:[id: 0x98e48203, L:/2.0.0.1:8091 - R:/2.0.0.1:52226],client version:1.4.2同时重启3个微服务会看到3个RM和3个TM的注册信息TM注册比较慢请耐心等待
TODO
三、TC服务的高可用和异地容灾
1.模拟异地容灾的TC集群
计划启动两台seata的tc服务节点
节点名称ip地址端口号集群名称seata127.0.0.18091SHseata2127.0.0.18092HZ
之前我们已经启动了一台seata服务端口是8091集群名为SH。
现在将seata目录复制一份起名为seata2
修改seata2/conf/registry.conf内容如下
registry {# tc服务的注册中心类这里选择nacos也可以是eureka、zookeeper等type nacosnacos {# seata tc 服务注册到 nacos的服务名称可以自定义application seata-tc-serverserverAddr 127.0.0.1:8848group DEFAULT_GROUPnamespace cluster HZusername nacospassword nacos}
}config {# 读取tc服务端的配置文件的方式这里是从nacos配置中心读取这样如果tc是集群可以共享配置type nacos# 配置nacos地址等信息nacos {serverAddr 127.0.0.1:8848namespace group SEATA_GROUPusername nacospassword nacosdataId seataServer.properties}
}进入seata2/bin目录然后运行命令
seata-server.bat -p 8092打开nacos控制台查看服务列表 点进详情查看 2.将事务组映射配置到nacos
接下来我们需要将tx-service-group与cluster的映射关系都配置到nacos配置中心。
新建一个配置 配置的内容如下
# 事务组映射关系
service.vgroupMapping.seata-demoSHservice.enableDegradefalse
service.disableGlobalTransactionfalse
# 与TC服务的通信配置
transport.typeTCP
transport.serverNIO
transport.heartbeattrue
transport.enableClientBatchSendRequestfalse
transport.threadFactory.bossThreadPrefixNettyBoss
transport.threadFactory.workerThreadPrefixNettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefixNettyServerBizHandler
transport.threadFactory.shareBossWorkerfalse
transport.threadFactory.clientSelectorThreadPrefixNettyClientSelector
transport.threadFactory.clientSelectorThreadSize1
transport.threadFactory.clientWorkerThreadPrefixNettyClientWorkerThread
transport.threadFactory.bossThreadSize1
transport.threadFactory.workerThreadSizedefault
transport.shutdown.wait3
# RM配置
client.rm.asyncCommitBufferLimit10000
client.rm.lock.retryInterval10
client.rm.lock.retryTimes30
client.rm.lock.retryPolicyBranchRollbackOnConflicttrue
client.rm.reportRetryCount5
client.rm.tableMetaCheckEnablefalse
client.rm.tableMetaCheckerInterval60000
client.rm.sqlParserTypedruid
client.rm.reportSuccessEnablefalse
client.rm.sagaBranchRegisterEnablefalse
# TM配置
client.tm.commitRetryCount5
client.tm.rollbackRetryCount5
client.tm.defaultGlobalTransactionTimeout60000
client.tm.degradeCheckfalse
client.tm.degradeCheckAllowTimes10
client.tm.degradeCheckPeriod2000# undo日志配置
client.undo.dataValidationtrue
client.undo.logSerializationjackson
client.undo.onlyCareUpdateColumnstrue
client.undo.logTableundo_log
client.undo.compress.enabletrue
client.undo.compress.typezip
client.undo.compress.threshold64k
client.log.exceptionRate1003.微服务读取nacos配置
接下来需要修改每一个微服务的application.yml文件让微服务读取nacos中的client.properties文件
seata:config:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUPdata-id: client.properties重启微服务现在微服务到底是连接tc的SH集群还是tc的HZ集群都统一由nacos的client.properties来决定了。