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

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

  • Seata下载安装

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

  • Maven依赖配置

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

1.1.12
2.7.1
3.4.7
2.9.9.1

引入dubbo的时候要排除spring相关,避免冲突

    org.apache.dubbo
    dubbo
    ${dubbo.version}


    org.apache.zookeeper
    zookeeper
    ${zookeeper.version}

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>${jackson.version}version>
dependency>

<dependency>

 <groupId>io.seatagroupId>

 <artifactId>seata-allartifactId>

 <version>0.9.0version>

dependency>


<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-frameworkartifactId>
    <version>4.2.0version>
dependency>
<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-recipesartifactId>
    <version>4.2.0version>
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="应用名称">

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

xxx.xxx.service.xxx.impl"/>

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

  • 服务消费方

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

  • 注意事项

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

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

 

你可能感兴趣的:(框架)