版本信息
SpringCloudAlibaba:2021.0.5.0
SpringBoot:2.7.14
Nacos(配置注册中心)
Nacos(Dynamic Naming and Configuration Service)是服务中心的另外一种实现。从注册中心的功能实现角度,与Eureka等价,只是实现方式有所差异。与Eureka不同的是,Nacos注册中心类似于Tomcat,是独立启动的服务器。因此在我们的代码中,无需在专门创建一个工程用于启动注册中心。
相关概念
nacos用来做什么这里不做过多介绍,一般大多数项目使用其来做服务发现及同台配置,这里主要提一些概念:
- 命名空间:
- 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
- 配置项
- 一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
- 配置集
- 一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
- 配置分组
- Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
服务注册与发现(Nacos注册中心)
在微服务架构下,多个服务之间的调用属于跨主机的服务调用,如何让这个服务之间能互相发现像单体式应用一样提供统一对外的服务调用能力是微服务框架层面需要重点解决的核心问题之一。 在 Spring Cloud 生态中,采用了如下服务注册与发现模型,来实现微服务之间的互相发现与调用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yk93p2bh-1691252282296)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230803163205848.png)]
如上图所示,通过在微服务系统中引入一个叫做注册中心的组件,来作为协调者。其最简化的过程是,所有的微服务应用在启动过程中会将自身包含服务名称、主机IP地址和端口号等信息发送到注册中心中,然后上游的微服务在处理请求过程中,根据服务名称到注册中心中查找对应服务的所有实例IP地址和端口号来进行服务调用,整个过程如图中虚线所示。从而让分散的微服务系统之间能像一个整体一样对外提供请求处理能力。
服务注册示例代码
provider
配置文件:
server: port: 8004 spring: application: name: nacos-provider2 cloud: nacos: discovery: # nacos服务器地址 server-addr: localhost:8848
在启动类上增加注解:@EnableDiscoveryClient
即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CIOIRIVY-1691252282297)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804172605401.png)]
consumer
配置同上
主要是从nacos获取服务信息需要用到DiscoveryClient接口
最基础用法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZTbr8zQ-1691252282297)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804172738119.png)]
项目中不会这样用,需要考虑到服务的选择问题,需要加入负载均衡策略
在SpringCloud中有一个由Ribbon帮我们完成这一选择过程
Ribbon负载均衡
Ribbon是一个客户端负载均衡器,能够给HTTP客户端带来灵活的控制。其实现的核心功能,就是一组选择策略,帮助我们在一个服务集群中,选择一个服务实例,并向该实例发起调用请求。它所支持的负载均衡策略如下:
策略 实现类 描述 随机策略 RandomRule 随机选择server 轮训策略 RoundRobinRule 轮询选择 重试策略 RetryRule 对选定的负载均衡策略(轮训)之上的重试机制,在一个配置时间段内当选择服务不成功,则一直尝试使用该策略选择一个可用的服务; 最低并发策略 BestAvailableRule 逐个考察服务,如果服务断路器打开,则忽略,再选择其中并发连接最低的服务 可用过滤策略 AvailabilityFilteringRule 过滤掉因一直失败并被标记为circuit tripped的服务,过滤掉那些高并发链接的服务(active connections超过配置的阈值) 响应时间加权重策略 WeightedResponseTimeRule 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 区域权重策略 ZoneAvoidanceRule 综合判断服务所在区域的性能,和服务的压力,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server
RestTemplate整合Ribbon
nacos-discovery已经自己整合了ribbon依赖
在RestTemplate的配置类里添加@LoadBalance注解
@Configuration public class ClientConfig { @Bean @LoadBalanced public RestTemplate template() { return new RestTemplate(); } }
然后在使用RestTemplate发起调用的时候,直接使用服务名进行调用即可
@RestController @RequestMapping("/call") public class RegistryConsumerController { @Autowired RestTemplate template; @GetMapping("/nacos") public String consumeNacos(String name) { // 注意这里调用的ip地址,使用的是服务名称,而不是真实的ip ResponseEntity<String> response = template.getForEntity( "http://nacos-provider-8002/nacos/registry/hello?name={1}", String.class, name); String result = response.getBody(); return result; } }
指定负载均衡策略
Ribbon中包含多种负载均衡策略,我们在使用Ribbon的时候,可以指定其负载均衡策略,指定的方式有两种,即配置文件和配置类。
配置文件形式:
# 这里的users是我们的服务名称 users: ribbon: # 这一行配置的就是实现具体负载均衡策略实现类的全类名 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon和Nginx的区别
服务器端负载均衡 Nginx
nginx 是客户端所有请求统一交给 nginx,由 nginx 进行实现负载均衡请求转发,属于服务器端负载均衡。
既请求由 nginx 服务器端进行转发。
2.客户端负载均衡 Ribbon
Ribbon 是从 eureka/nacos 注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡策略。
既在客户端实现负载均衡。
应用场景的区别:
(1)Nginx适合于服务器端实现负载均衡比如 Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如 Dubbo、SpringCloud 中都是采用本地负载均衡。
spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign。
(2)Ribbon
是一个基于 HTTP 和 TCP 客户端的负载均衡器
它可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载。
springcloud的ribbon和nginx有什么区别?哪个性能好?
nginx性能好,但ribbon可以剔除不健康节点,nginx剔除节点比较复杂。ribbon还可以配合熔断器一起工作
ribbon是客户端负载均衡,nginx是服务端负载均衡。客户端负载均衡,所有客户端节点都维护自己要访问的服务端清单。服务端负载均衡的软件模块会维护一个可用的服务清单
ribbon 是一个客户端负载均衡器,可以简单的理解成类似于 nginx的负载均衡模块的功能。
配置中心
使用Nacos作为配置中心的好处是什么?
支持profile粒度的配置,这个很重要
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 {spring.application.name}.{file-extension:properties} 为前缀的基础配置,还加载了dataid为 {spring.application.name}-{profile}.{file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 {spring.profiles.active} 这个配置项来配置
示例代码
配置文件
server: port: 8005 spring: application: name: config cloud: nacos: config: server-addr: localhost:8848 # 写明配置文件类型 # file-extension: yaml # 配置所属分组 group: DEFAULT_GROUP config: import: - optional:nacos:config.yml - nacos:config.yaml
在配置中心里写好配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3kXPvz5-1691252282298)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804173916272.png)]
通过@value注解来拿配置中心中的数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1l8R3vJs-1691252282299)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804173815141.png)]
关于配置文件的细节
对于2021.0.5.0版本来说,配置文件可以不使用bootstrap.yml方式来配置,而是直接写在application.yml里,当然具体写法上会存在一些差别,接下来分别举个🌰
使用bootstrap.yml方式
首先需要另外导入相关依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-we90oSOH-1691252282299)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230805232314776.png)]
创建一个测试的配置文件:
bootstrap.yml:
controller:
测试结果:
使用application.yml方式
对比上面的方式,最显著的区别是使用到了import方式导入配置:
profile 粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载服务配置时:
不仅仅加载了以 dataId 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,
还加载了dataId为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置。
在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项选择不同情况下的配置。
spring.profiles.active=develop
其他一些常见的配置项
配置项 key 默认值 说明 服务端地址 spring.cloud.nacos.config.server-addr 服务器ip和端口 DataId前缀 spring.cloud.nacos.config.prefix ${spring.application.name} DataId的前缀,默认值为应用名称 Group spring.cloud.nacos.config.group DEFAULT_GROUP DataId后缀及内容文件格式 spring.cloud.nacos.config.file-extension properties DataId的后缀,同时也是配置内容的文件格式,目前只支持 properties 配置内容的编码方式 spring.cloud.nacos.config.encode UTF-8 配置的编码 获取配置的超时时间 spring.cloud.nacos.config.timeout 3000 单位为 ms 配置的命名空间 spring.cloud.nacos.config.namespace 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。 AccessKey spring.cloud.nacos.config.access-key SecretKey spring.cloud.nacos.config.secret-key 相对路径 spring.cloud.nacos.config.context-path 服务端 API 的相对路径 接入点 spring.cloud.nacos.config.endpoint 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 是否开启监听和自动刷新 spring.cloud.nacos.config.refresh-enabled true 集群服务名 spring.cloud.nacos.config.cluster-name
Seata(分布式事务)todo
背景
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
简单的说,在分布式系统中一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
举个例子:在电商网站中,用户对商品进行下单,需要在订单表中创建一条订单数据,同时需要在库存表中修改当前商品的剩余库存数量,两步操作一个添加,一个修改,一定要保证这两步操作一定同时操作成功或失败,否则业务就会出现问题。
任何事务机制在实现时,都应该考虑事务的 ACID 特性,包括:本地事务、分布式事务。对于分布式事务而言,即使不能都很好的满足,也要考虑支持到什么程度。
典型的分布式事务场景:跨库事务、分库分表、微服务化。
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色,帮助经济体平稳的度过历年的双11,对上层业务进行了有力的技术支撑。经过多年沉淀与积累,其商业化产品先后在阿里云、金融云上售卖。2019年1月 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助用户快速落地分布式事务解决方案。
理论 todo
涉及CAP定理:
- Consistency一致性:通过服务间数据同步来实现(mq?)
- Availability可用性:
- Partition tolerance分区容错性:意思是不管集群有没有出现分区,整个系统也要持续对外提供服务
这三者没办法同时满足
简单来说:
分布式系统节点通过网络连接,一定会出现分区问题(P)当分区出现时,系统的一致性(C)和可用性(A)就无法同时满足
❗ES集群出现分区时,故障节点会被剔除集群,数据分片会重新分配到其它节点,保证数据一致。因此是低可用性,高一致性,属于CP
- BASE理论:对CAP理论的一种解决思路
- Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
- Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
- Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。
而分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴CAP定理和BASE理论:
- AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。
- CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5P82Ocs-1691252282300)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804162053645.png)]
Seata架构 todo
- TC
- TM
- RM
seata的部署和集成
部署Seata的tc-server
1.下载
首先我们要下载seata-server包,地址在http😕/seata.io/zh-cn/blog/download.html
当然,课前资料也准备好了:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYUd7pzu-1691252282300)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622202357640.png)]
2.解压
在非中文目录解压缩这个zip包,其目录结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z7oFRw1r-1691252282301)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622202515014.png)]
3.修改配置
修改conf目录下的registry.conf文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXomK5Tu-1691252282302)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622202622874.png)]
内容如下:
registry {
# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
# 默认是file,需要改
type = "nacos" ❗为什么要配置注册中心?因为TC服务本身也是一个服务啊,RM和TM也一样需要通过注册中心查找TC服务
nacos {
# seata tc 服务注册到 nacos的服务名称,可以自定义
application = "seata-tc-server" #名称
serverAddr = "127.0.0.1:8848" # nacos地址
group = "DEFAULT_GROUP" # nacos分组
namespace = "" # 无所谓
cluster = "SH" # 簇,即集群名称
username = "nacos"
password = "nacos"
}
}
config {
# 配置中心,把配置文件也放到nacos里交由其来管理
# 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
type = "nacos"
# 配置nacos地址等信息
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
}
4.在nacos添加配置
特别注意,为了让tc服务的集群可以共享配置,我们选择了nacos作为统一配置中心。因此服务端配置文件seataServer.properties文件需要在nacos中配好。
格式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0zYrUHH-1691252282302)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622203609227.png)]
配置内容如下:
# ❗数据存储方式,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=123
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
其中的数据库地址、用户名、密码都需要修改成自己的数据库信息。
5.创建数据库表
特别注意:tc服务在管理分布式事务时,需要记录事务相关数据到数据库中,你需要提前创建好这些表。
新建一个名为seata的数据库,运行课前资料提供的sql文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quVEdNWV-1691252282303)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622204145159.png)]
这些表主要记录全局事务、分支事务、全局锁信息:
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即可:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4rjB2r4-1691252282305)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622205427318.png)]
启动成功后,seata-server应该已经注册到nacos注册中心了。
打开浏览器,访问nacos地址:http://localhost:8848,然后进入服务列表页面,可以看到seata-tc-server的信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSn4vGdJ-1691252282305)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210622205901450.png)]
微服务集成seata
1.引入依赖
首先,我们需要在微服务中引入seata依赖:
<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>
2.修改配置文件
需要修改application.yml文件,添加一些配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKDL55dx-1691252282306)(C:\Users\ZIUPAN\AppData\Roaming\Typora\typora-user-images\image-20230804170537602.png)]
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
# 参考tc服务自己的registry.conf中的配置
type: nacos
nacos: # tc
server-addr: 127.0.0.1:8848
namespace: ""
group: DEFAULT_GROUP
application: seata-tc-server # tc服务在nacos中的服务名称
cluster: SH
tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
service:
vgroup-mapping: # 事务组与TC服务cluster的映射关系
seata-demo: SH
TC服务的高可用和异地容灾
1.模拟异地容灾的TC集群
计划启动两台seata的tc服务节点:
节点名称 | ip地址 | 端口号 | 集群名称 |
---|---|---|---|
seata | 127.0.0.1 | 8091 | SH |
seata2 | 127.0.0.1 | 8092 | HZ |
之前我们已经启动了一台seata服务,端口是8091,集群名为SH。
现在,将seata目录复制一份,起名为seata2
修改seata2/conf/registry.conf内容如下:
registry {
# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
type = "nacos"
nacos {
# seata tc 服务注册到 nacos的服务名称,可以自定义
application = "seata-tc-server"
serverAddr = "127.0.0.1:8848"
group = "DEFAULT_GROUP"
namespace = ""
cluster = "HZ"
username = "nacos"
password = "nacos"
}
}
config {
# 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
type = "nacos"
# 配置nacos地址等信息
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
}
进入seata2/bin目录,然后运行命令:
seata-server.bat -p 8092
打开nacos控制台,查看服务列表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMwAgxsW-1691252282307)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210624151150840.png)]
点进详情查看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i22A4ewz-1691252282307)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210624151221747.png)]
2.将事务组映射配置到nacos
接下来,我们需要将tx-service-group与cluster的映射关系都配置到nacos配置中心。
新建一个配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yg24XeH-1691252282308)(D:\BaiduNetdiskDownload\day02-分布式事务\资料\assets\image-20210624151507072.png)]
配置的内容如下:
# 事务组映射关系
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配置
接下来,需要修改每一个微服务的application.yml文件,让微服务读取nacos中的client.properties文件:
seata:
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP
data-id: client.properties
重启微服务,现在微服务到底是连接tc的SH集群,还是tc的HZ集群,都统一由nacos的client.properties来决定了。