dubbo分布式事务整合seata解决方案

Dubbo分布式事务整合seata解决方案

  • Seata下载安装

可以在github上进行下载windows版本和linux版本的压缩包,解压

  • Maven依赖配置

包括dubbo,zookeeper,的配置,当然还要引入seata的依赖

<!--数据源可以灵活配置-->

<druid.version>1.1.12</druid.version>
<dubbo.version>2.7.1</dubbo.version>
<zookeeper.version>3.4.7</zookeeper.version>
<jackson.version>2.9.9.1</jackson.version>

<!-- dubbo相关 -->

引入dubbo的时候要排除spring相关,避免冲突
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>${dubbo.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

<!-- seata相关-->

<dependency>

 <groupId>io.seata</groupId>

 <artifactId>seata-all</artifactId>

 <version>0.9.0</version>

</dependency>

<!--dubbo2.6以上需要该包支持作为连接注册中心的客户端-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.2.0</version>
</dependency>

 

  • 配置文件的配置

Seata服务器配置文件

将服务器conf目录的file.conf文件和registry.conf文件拷贝到服务的资源路径,修改配置

Registry.conf

registry {

 type = "file"

 file {

  name = "file.conf"

 }

}

File.conf

在选择file配置的前提下修改该配置

service {

 #vgroup->rgroup

 vgroup_mapping.my_test_tx_group="default"-分支事务的事务分组

一个服务器可以管理多个事务分组

 #only support single node

 default.grouplist = "127.0.0.1:8091" --端口启动时也可以指定端口号

 #degrade current not support

 enableDegrade = false

 #disable

 disable = false

}

  • 关于事务分组
  1. tc服务中可以配置多个事务分组,一个分组类似于一个服务
  2. 每个服务中的全局事务指定的事务分组名必须与file.conf配置文件中的事务分组映射相匹配,服务启动时,相关的事务分组信息注册到tc中,不同的事务分组信息只要注册到同一tc下,事务就会被管理,其实项目中只需要有一个事务分组就可以。

所以,各个项目都要在项目中指定事务分组,配置file.conf文件,才可以将分支事务分别注册到tc中,以供tc进行事务的协调控制,各个服务的事务分组名可以不同,但只要是注册到一个tc中,事务就会得到控制。

 

 

 

服务启动命令

seataServer.bat/.sh  -p端口号 -m 配置文件名

Dubbo.xml

<!-- 应用名-->

<dubbo:application name="应用名称">

 <!--解决2222端口占用的问题 消费端和服务端一端配置-->
    <dubbo:parameter key="qos.enable" value="true"/>
    <dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
    <dubbo:parameter key="qos.port" value="33333"/>

</dubbo:application>

<!--注册协议 单机版-->
<dubbo:registry protocol="zookeeper" address="服务地址:2181"/>

<!--集群版-->

<dubbo:registry protocol="zookeeper" address="服务地址:2181,。。。"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>

 

  • 关于服务的发布俩种方式
  1. 声明式
  • 服务的提供方

<bean id="xxx" class="com.xxx.xxx.xxx.xxxImpl"/>


<dubbo:service interface="com.xxx.xxx.service.xxx" ref="xxxImpl"/>

  • 服务消费方

<dubbo:reference interface="com.xxx.xxx.service.xxx" id="xxxImpl" />

使用的地方直接进行接口注入即可

  1. 注解方式(推介使用的方式)
  • 服务提供方

在配置文件中加上<dubbo:annotation>,是dubbo的扫描标签,它除了会扫描带有'@Component'、'@Service'、'@Controller'注解的类,把它们注册成SpringBean之外,它还会扫描带有”@Service” (dubbo的service标签)的接口实现类发布服务(必须有实现接口,不然或抛出BeanCreationException异常)。同时在要发布服务的接口实现类上加上”@Service” (dubbo的service标签)。启动服务器,服务就发布成功了。

<dubbo:annotation package="com.xxx.xxx.service.xxx.impl"/>

在需要发布服务的接口上方标注@Service注解(注意这一用的是alibaba的service注解)

  • 服务消费方

在配置文件中加上<dubbo:annotation>,它会扫描所有注册bean的java类,发现带”@Reference”标签的属性,它会去寻找发布的provider是否有匹配的接口,有就自动注入。

<dubbo:annotation package="com.xxx.xxx"></dubbo:annotation>

  • 注意事项

注解方式服务发布失败的问题

  1. 需要发布的服务必须使用@Service进行标注,该注解是 org.apache.dubbo.config.annotation.Service;不能与spring中的@service包进行混淆,
  2. 在xml文件中配置dubbo注解扫描的基础包
  3. 使用的dubbo版本低于2.5.3的话,dubbo注解式发布带有@Transactional注解的接口是无法进行发布的
  4. 服务的消费方也必须在xml进行配置注解扫描基础包,在具体使用的地方使用dubbo中的@Refrence注解进行服务的引用
  5. 消费方注意配置全局服务调用响应的超时时间,默认超时时间1s,超过1s的响应时间会重试服务的调用。

<dubbo:consumer timeout="2000"/>

 

  • ​​​​​​​配置代理数据源,全局事务管理对象(可以基于注解,也可以基于xml配置,以下为基于注解的配置)

@Bean
public GlobalTransactionScanner globalTransactionScanner() {
    return new GlobalTransactionScanner("应用名称-service", "my_test_tx_group");
}

作用:扫描全局事务注解@GlobalTransactionScanner

@Bean
public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
    return new DataSourceProxy(druidDataSource);
}

sqlSessionFactory工厂要使用代理数据源作为数据源,每个服务的代理数据源会交于事务协调器管理,用来配合全局事务提交或回滚本地已提交的事务

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Seata是一个开源的分布式事务解决方案,它提供了一套简单易用的API,可以帮助解决分布式事务的问题。Seata使用了两阶段提交协议(Two-Phase Commit,简称2PC)来确保分布式事务的一致性。它由三个核心组件组成:事务协调器(Transaction Coordinator)、资源管理器(Resource Manager)和事务参与者(Transaction Participant)。 事务协调器负责协调和管理全局事务,它负责事务的发起、提交和回滚操作。资源管理器负责管理分支事务的提交和回滚,它与具体的数据源进行交互。事务参与者是分支事务的参与者,它负责执行具体的业务逻辑操作。 当一个分布式事务开始时,事务协调器会生成一个全局事务ID,并将这个ID传递给各个事务参与者。每个事务参与者都会将这个ID关联到自己的本地事务中。在事务执行过程中,各个事务参与者会将本地事务的操作记录到日志中。当所有的事务参与者都执行完毕后,事务协调器会向各个参与者发送提交或回滚的指令,并根据各个参与者的反馈结果来决定最终的事务提交或回滚。 Seata支持多种应用场景,包括数据库事务、消息事务以及跨多个微服务的分布式事务。它提供了与各种常见的中间件和框架的集成,如MySQL、Oracle、Dubbo、Spring Cloud等,使得在这些环境下使用Seata非常方便。 总而言之,Seata是一个强大的分布式事务解决方案,可以帮助开发人员简化分布式事务的管理和处理,并保证数据的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值