美文网首页
分布式事务数据最终一致性之serviceComb-Saga使用方

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

作者: katkrazy | 来源:发表于2018-02-28 14:49 被阅读0次

    准备环境

    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
    补充了部分自己摸索遇到的坑

    相关文章

      网友评论

          本文标题:分布式事务数据最终一致性之serviceComb-Saga使用方

          本文链接:https://www.haomeiwen.com/subject/lmobxftx.html