Seata 的 AT 模式最佳实践
1.拉去 seata 官方的 seata-server (github 地址)
https://github.com/seata/seata/releases/download/v0.9.0/seata-server-0.9.0.tar.gz
2.解压 seata-server-0.9.0.tar.gz
tar -zxvf seata-server-0.9.0.tar.gz
3.进入 seata/conf 目录修改 register.conf 配置文件
registry { #基于naocs serverAdd配置对应的nacos地址 namespace命名空间 #另外还可以基于file 、eureka、redis、zk、consul、etcd3、sofa等可以做相关配置,这里就不一一操作了 type = "nacos" nacos { serverAddr = "192.168.1.19:8848" namespace = "public" cluster = "default" } } config { type = "nacos" nacos { serverAddr = "192.168.1.19:8848" namespace = "public" cluster = "default" } }
4.修改 nacos-config.txt
service.vgroup_mapping.vendor-system-fescar-service=default #vendor-system-fescar-service配置事务组名,跟应用服务上配置一致,后面会提到 service.vgroup_mapping.vendor-position-fescar-service=default
5.进入 bin 目录,修改启动脚本 seata-server.sh ,防止发生内存泄漏问题
-XX:MaxDirectMemorySize=2048m
6.在 naocs 服务页面添加,值默认 default(或者执行 nacos-conf.sh 脚本)
7.启动脚本文件,注意 seata 默认取的是服务器的内网 ip,那么外部服务无法注册到 seata-server 上。那么就必须在启动参数指定外网 ip "-h 47.125.114.58"
sh seata-server.sh -h 47.125.114.58
服务启动成功
8.可以在 nacos 服务页面看到,seata 服务注册成功
9.项目 vendor-system 配置 添加依赖
<!--seata事务组件--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
10.配置事务组
spring: cloud: alibaba: seata: tx-service-group: vendor-system-fescar-servic
11.配置代理数据源,
@Configuration @Import(DataSourcesProperties.class) public class DataSourceProxyAutoConfiguration { private DataSourcesProperties dataSourcesProperties; public DataSourceProxyAutoConfiguration(DataSourcesProperties dataSourcesProperties) { this.dataSourcesProperties = dataSourcesProperties; } /** * create proxy datasource * @return */ @Primary @Bean(name = "dataSource") public DataSource getDatasource(){ HikariDataSource build = DataSourceBuilder.create().url(dataSourcesProperties.getUrl()) .password(dataSourcesProperties.getPassword()) .username(dataSourcesProperties.getUsername()) .type(dataSourcesProperties.getType()) .driverClassName(dataSourcesProperties.getDriverClassName()).build(); return new DataSourceProxy(build); } }
12.配置 fegin 远程调用时 xid 的传输
public class FescarRequestInterceptor implements RequestInterceptor { private static final String FESCAR_HEADER_NAME = "Fescar-Xid"; @Override public void apply(RequestTemplate requestTemplate) { String xid = RootContext.getXID(); if(StringUtils.isNoneBlank(xid)){ requestTemplate.header(FESCAR_HEADER_NAME,xid); } } }
13.复制上面的 registry.conf 文件到应用的 resources 目录,并且将 seata\conf 中的 db_uodo_log.sql 中的表初始化到每个应用的数据库中,做回滚的日志表
14.测试在需要配置事务的方法上加 @GlobalTransactional 注解就可以了
15.启动应用,控制台
16.seata-server 服务端控制台 RM 注册成功
记住:牛逼的技术虽然不是你的,但是你会了,就是你的
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于