seata解决多服务分布式事务(下)

接下来配置客户端(业务代码)

上篇:seata解决多服务分布式事务(上)

一、引入maven依赖

<!--注册中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <!--配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
        <!--引入seata相关依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

二、配置文件application.yml

 1 server:
 2   port: 4000
 3 
 4 spring:
 5   application:
 6     name: @artifactId@
 7   cloud:
 8     nacos:
 9       discovery:
10         server-addr: 127.0.0.1:8848
11         #保证和seata在同一个nacos注册分组下面
12         group: SEATA_GROUP
13         namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166
14       config:
15         server-addr: 127.0.0.1:8848
16         #保证和seata在同一个nacos配置分组下面
17         group: SEATA_GROUP
18         namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166
19         file-extension: yml
20   datasource:
21     url: jdbc:postgresql://127.0.0.1:5432/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&pinGlobalTxToPhysicalConnection=true
22     username: test
23     password: 123456
24 seata:
25   enabled: true #开启seata支持
26   tx-service-group: default_tx_group #这里需要和config.txt 文件中的service.vgroupMapping.my_test_tx_group=default一致
27   enable-auto-data-source-proxy: true #是否动态代理数据源
28   #seata整合nacos配置中心,读取seta-client中的一些配置
29   config:
30     type: nacos
31     nacos:
32       server-addr: 127.0.0.1:8848
33       group: SEATA_GROUP #seata服务注册到nacos的组名SEATA_GROUP
34       namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166
35   #seata整合nacos注册中心
36   registry:
37     type: nacos #配置微服务(业务代码 client)如何去访问seata服务端(事务协调者)
38     nacos:
39       server-addr: 127.0.0.1:8848
40       namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166
View Code

备注:复制一份项目,配置相似。

三、在业务库中添加表undo_log

打开seata服务端中的文件README-zh.md

 

 下载或拷贝对应类型的数据库文件,在需要分布式事务的业务数据库中执行。

四、业务代码编写

实体类略

@Service
public class Test1ServiceImpl extends ServiceImpl<Test1Mapper, Test1> implements ITest1Service {
    @Autowired
    private SeatabFeign seatabFeign;
    @Autowired
    private Test1Mapper test1Mapper;
@GlobalTransactional
// @Transactional @Override public void test(Integer id,Integer num) { //先远程调用服务seata_b seatabFeign.save(id); Test1 t1 = new Test1(); t1.setId(id); t1.setNum(num); test1Mapper.insert(t1); //异常 Integer i = 1/0; } }

使用@GlobalTransactional实现全局分布式事务,使用@Transactional实现本地事务,若抛出异常,则不会回滚远程事务。

备注:启动客户端(业务)服务可能报一下错误

这应该是该版本seata的jar包的bug。

我们根据提示跟踪类NettyClientChannelManager,找到对应的方法reconnect(String transactionServiceGroup)。

接着跟踪到类NacosRegistryServiceImpl的lookup(String key) 方法。

根据代码所只,此处是根据服务名称从nacos中获取seata集群列表,但是服务名称使用变量PRO_SERVER_ADDR_KEY写死了,因此只能在seata服务端的registry.conf中,将application写死为"serverAddr"。

 

 

posted @ 2022-02-11 14:34  炫舞风中  阅读(222)  评论(0编辑  收藏  举报