分布式事务数据最终一致性之serviceComb-Saga使用方法

准备环境

1.安装JDK 1.8

2.安装Maven 3.x

3.安装Docker

编译

$ git clone https://github.com/apache/incubator-servicecomb-saga.git

$ cd incubator-servicecomb-saga

$ mvn clean install -DskipTests -Pdocker

如何使用

引入Saga的依赖

 <dependency>
      <groupId>org.apache.servicecomb.saga</groupId>
      <artifactId>omega-spring-starter</artifactId>
      <version>0.0.3-SNAPSHOT</version>
  </dependency>
  <dependency>
      <groupId>org.apache.servicecomb.saga</groupId>
      <artifactId>omega-transport-resttemplate</artifactId>
      <version>0.0.3-SNAPSHOT</version>
  </dependency>

注意:如果是使用https://start.spring.io/创建的项目,那么还需要手动添加

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

这个依赖

最终的pom包含五个依赖

添加Saga的注解及相应的补偿方法

以一个转账应用为例:

在应用入口加入注解@EnableOmega来初始化omega的配置并与alpha建立连接。spring boot就直接在application上加入这个注解


@SpringBootApplication
@EnableOmega
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

在全局事务的起点添加@SagaStart注解

@SagaStart(timeout=10)
public boolean transferMoney(String from, String to, int amount) {
  transferOut(from, amount);
  transferIn(to, amount);
}

注意: 默认情况下,超时设置需要显式声明才生效。

在子事务处添加 @Compensable 的注解并指明其对应的补偿方法。

@Compensable(timeout=5, compensationMethod="cancel")
public boolean transferOut(String from, int amount) {
  repo.reduceBalanceByUsername(from, amount);
}
public boolean cancel(String from, int amount) {
  repo.addBalanceByUsername(from, amount);
}

注意: 默认情况下,超时设置需要显式声明才生效。

注意: 若全局事务起点与子事务起点重合,需同时声明 @SagaStart 和 @Compensable 的注解。

对转入服务重复第三步即可。

如何运行

1.首先运行postgresql

docker run -d -e "POSTGRES_DB=saga" -e "POSTGRES_USER=saga" -e "POSTGRES_PASSWORD=password" -p 5432:5432 postgres

这一步我是在linux服务器上直接运行的,因为第一步我编译是在linux上编译的,本地环境是win7,使用docker不方便

2.运行alpha。在运行alpha前,请确保postgreSQL已正常启动。

docker run -d -p 8090:8090 \
  -e "JAVA_OPTS=-Dspring.profiles.active=prd" \
  -e "spring.datasource.url=jdbc:postgresql://{docker.host.address}:5432/saga?useSSL=false" \
  alpha-server:0.0.3-SNAPSHOT

这里注意把{docker.host.address}改成你的postpresql的地址
3.最后在你的服务里面配置omega的信息。以yaml为例

spring:
  application:
    name: {application.name}alpha:
  cluster:
    address: {alpha.cluster.addresses}(这里注意要使用8080这个端口)

然后就可以运行相关的微服务了。

参考自:https://github.com/apache/incubator-servicecomb-saga/blob/master/docs/user_guide_zh.md
补充了部分自己摸索遇到的坑

转载于:https://my.oschina.net/katkrazy/blog/1626190

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值