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
}
- 关于事务分组
- tc服务中可以配置多个事务分组,一个分组类似于一个服务
- 每个服务中的全局事务指定的事务分组名必须与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"/>
- 关于服务的发布俩种方式
- 声明式
- 服务的提供方
<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" />
使用的地方直接进行接口注入即可
- 注解方式(推介使用的方式)
- 服务提供方
在配置文件中加上<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>
- 注意事项
注解方式服务发布失败的问题
- 需要发布的服务必须使用@Service进行标注,该注解是 org.apache.dubbo.config.annotation.Service;不能与spring中的@service包进行混淆,
- 在xml文件中配置dubbo注解扫描的基础包
- 使用的dubbo版本低于2.5.3的话,dubbo注解式发布带有@Transactional注解的接口是无法进行发布的
- 服务的消费方也必须在xml进行配置注解扫描基础包,在具体使用的地方使用dubbo中的@Refrence注解进行服务的引用
- 消费方注意配置全局服务调用响应的超时时间,默认超时时间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工厂要使用代理数据源作为数据源,每个服务的代理数据源会交于事务协调器管理,用来配合全局事务提交或回滚本地已提交的事务