分布式事務數(shù)據(jù)最終一致性之serviceComb-Saga使用方法

準備環(huán)境

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/創(chuàng)建的項目,那么還需要手動添加

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

這個依賴

最終的pom包含五個依賴

添加Saga的注解及相應的補償方法

以一個轉(zhuǎn)賬應用為例:

在應用入口加入注解@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 的注解。

對轉(zhuǎn)入服務重復第三步即可。

如何運行

1.首先運行postgresql

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

這一步我是在linux服務器上直接運行的,因為第一步我編譯是在linux上編譯的,本地環(huán)境是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
補充了部分自己摸索遇到的坑

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,290評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評論 19 139
  • 序 又到了寫年終總結(jié)的時候了。每當這個時候思緒總是翻江倒海,因為太久沒有反思和總結(jié)的緣故,一年才總結(jié)一次,確實是有...
    go4it閱讀 589評論 1 6
  • 虛度光陰二十余年,此去經(jīng)年,未曾忘卻初衷,唯有愛在心頭,欲說還休。 曾幾何時,浮躁拘禁的心緒歸于平靜得以釋放---...
    田野木山閱讀 207評論 0 0
  • 前言:關注簡書這么多年了,從未在這上面留下零星文字,總覺得遺憾。我不想只當個觀眾,也想?yún)⑴c進來。 這是第一次在簡書...
    你真當我是浮夸吶閱讀 1,466評論 0 1

友情鏈接更多精彩內(nèi)容