.分布式事务实战
如何在项目中运用
- ,需要进行以下步骤:编译
-.环境准备
•
.•
..源码获取
地址: :// . / / -
$
:// . / / - .$
. ..修改配置文件
找到
- / / / / . ,修改 信息为本地信息即可.本地构建 -
$
-$
- - - -在执行玩命令之后,可在
/ - / / / - -${ }- . 中找到 - 的可执行 包.初始化数据库
可在
\ - \ \ \ 目录下找到 - . 和 - . 两个 文件,可自行根据所选数据库进行初始化即可。.启动 -
java -Dspring.profiles.active=prd
-D"spring.datasource.url=jdbc:postgresql://${host_address}:5432/saga?useS
SL=false" -jar alpha-server-${saga_version}-exec.jar
注意:请在执行命令前将${ _ }和${ _ }更改为实际值
至此, - 全局事务管理器已经启动成功。
替换
为目前
- 支持 和 两种数据库,默认为 ,如需改为 ,需要进行如下操作:.安装并运行
.修改 文件,添加依赖
- / . ,添加 依赖
dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.15</version>
</dependency>
.修改配置文件
找到
- / / / / . ,修改 信息为本地信息即可spring:
profiles: mysql
datasource:
username: ${username}
password: ${password}
url: jdbc:mysql://${host_address}:${port}/${database_name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
platform: mysql
continue-on-error: false
driver-class-name: com.mysql.cj.jdbc.Driver
注意:${ },${ },${ _ },${ },${ _ }需替换为实际值
.本地构建 - (和上面步骤一致)
.启动 -
java -Dspring.profiles.active=mysql -Dloader.path=./plugins
-D"spring.datasource.url=jdbc:mysql://${host_address}:3306/${database_name}?
serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF
-8&useSSL=false " -jar alpha-server-${saga_version}-exec.jar
注意:请在执行命令前将${ _ }和${ _ }更改为实际值
自此,
- 端已经配置编译完成配置完
- 之后,就相当于分布式事务的协调器已经配置完成,剩下的就是 的配置,也就是在实际开发中如何运用 - 去处理分布式事务。本次讲解会结合一个实际案例:购物系统中的下单流程和删除产品流程来分别讲解 模式和 模式如何使用的。环境准备
本次案例:购物系统是采用分布式微服务架构,整体分为三个微服务应用:
订单管理应用、 产品管理应用、 库存管理应用.添加依赖
分别在三个应用的
文件中添加 所需的依赖:<dependency>
<groupId>org.apache.servicecomb.pack</groupId>
<artifactId>omega-spring-starter</artifactId>
<version>${servicecomb-pack.version}</version>
</dependency>
<dependency>
<groupId>org.apache.servicecomb.pack</groupId>
<artifactId>omega-transport-resttemplate</artifactId>
<version>${servicecomb-pack.version}</version>
</dependency>
<!--非必需 -->
<dependency>
<groupId>org.apache.servicecomb.pack</groupId>
<artifactId>omega-spring-cloud-consul-starter</artifactId>
<version>${servicecomb-pack.version}</version>
</dependency>
<dependency>
<groupId>org.apache.servicecomb.pack</groupId>
<artifactId>omega-spring-cloud-eureka-starter</artifactId>
<version>${servicecomb-pack.version}</version>
</dependency>
注意:请将${
- . }更改为实际的版本号(推荐版本为 . . )注意:如需做集群, - - - - 和 - - - - 二选一,视项目的注册中心而定。
.修改配置文件
分别在三个应用的
. 配置文件中添加 - 配置,具体配置如下:#配置alpha-server地址
alpha:
cluster:
address: 10.15.15.172:8080
omega:
enabled: true
注意: . 一定不要过长,因为 的格式是 . + ,并且长度为 ,否则 - 事务持久化会报错
以上两个属性配置为必填,因为 - 会依据 . 去查找对应的 ,其他应用配置自行添加, 可根据 - 中的配置实际添加
自此,环境准备已经完毕,下面开始进行应用代码编写
模式代码编写
在本次案例中,我们以一个下单流程来讲解
模式下代码是如何编写的。下单流程包括:点击下单、查询库存、支付、更新库存;订单应用作为起始服务,调用库存应用和产品应用,这两个应用对应的服务作为参与服务(子事务),在订单应用下单,订单应用使用 向产品应用发起调用校验产品库存,然后订单应用向库存应用发起支付请求(子事务 ),支付成功后订单应用再向库存应用发起请求更新库存(子事务 )。.@
首先需要在应用代码中描述出
事务的边界,作为分布式事务的起始点,因此我们需要在订单应用中的 ()方法上添加该注解@ :.@
@
所代表的是本地子事务,因此需要在创建支付和更新库存的方法上添加此注解来标注该逻辑为子事务,并且在 的 属性中描述补偿方法。注意补偿方法和本地事务方法的参数必须一致,否则 在系统启动进行参数检查的时候报找不到恢复方法的错误:支付:
支付对应补偿方法:
更新库存:
更新库存补偿方法:
注意:实现的服务和补偿方法必须满足幂等的要求
注意:默认情况下,超时需要显示声明
注意:若全局事务起点与子事务重合,需同时声明@ 和@ 注解
注意:补偿方法的入参必须与 方法入参一致,否则启动时会报错( - 找不到补偿方法)
模式代码编写
下面我们会以删除库存流程来讲解
模式是如何编写代码的。删除库存流程:由产品应用发起(分布式事务起始),调用库存应用删除对应产品的库存信息( 子事务).本次调用使用的是
的方式,因此需要在产品应用中的 文件添加相应的依赖:.@
我们以产品应用中的
方法作为分布式事务起始点,因此在该方法上添加注解@ :.@
在子事务所处的方法上添加该注解,并通过
以及 属性定义相关确认以及取消方法名。这里需要注意的是这里提到的 , 方法的参数必须和 方法的相同。逻辑:
逻辑:
注意: 和 方法的入参必须和 方法一致
目前 模式还不支持
事件信息获取
默认情况下,
端口用来处理 处发起的 请求,用来做事务上下文等操作;而 端口则用于处理查询 处的事件信息。. -事件信息查询
:统计所有事件状态 ://${ - . : }/ /
:统计最近事件状态 ://${ - . : }/ /
:根据事件状态查询事件列表 ://${ - . : }/ /
:根据服务名称查询对应的分布式事件列表 ://${ - . : }/ /
. -事件信息查询
目前没有提供正式的查询接口。但是有测试接口,在 中,可自行根据测试接口修改源码,重新编译即可
目前 - 提供的事件查询 不多,若有其他需求,用户可自行编写接口对数据库进行查询。
以上就是分布式事务实战微课堂的整个内容,本次文章是基于华为 - 来总结了一些使用心得和实际项目经验,希望能对正在分布式事务上摸索的同仁们提供一些帮忙。本文章所有观点都出自个人见解,疏漏、错误之处在所难免,欢迎大家指正,希望能够与大家一起交流和进步。
[ 引用自: ] :// . . / / / - - - - /
[ 引用自: ] :// . . / / / - - - - /
推荐阅读
关于作者:花无缺,普元信息 开发工程师,擅长微服务开发、网关拓展开发;曾参与普元 . 微服务产品开发。爱钻研的"技术控",微服务专家、分布式事务解决方案专家。