準(zhǔn)備環(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)建的項(xiàng)目鹏倘,那么還需要手動(dòng)添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
這個(gè)依賴
最終的pom包含五個(gè)依賴
添加Saga的注解及相應(yīng)的補(bǔ)償方法
以一個(gè)轉(zhuǎn)賬應(yīng)用為例:
在應(yīng)用入口加入注解@EnableOmega來初始化omega的配置并與alpha建立連接聋伦。spring boot就直接在application上加入這個(gè)注解
@SpringBootApplication
@EnableOmega
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在全局事務(wù)的起點(diǎn)添加@SagaStart注解
@SagaStart(timeout=10)
public boolean transferMoney(String from, String to, int amount) {
transferOut(from, amount);
transferIn(to, amount);
}
注意: 默認(rèn)情況下,超時(shí)設(shè)置需要顯式聲明才生效玛臂。
在子事務(wù)處添加 @Compensable 的注解并指明其對(duì)應(yīng)的補(bǔ)償方法前域。
@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);
}
注意: 默認(rèn)情況下辕近,超時(shí)設(shè)置需要顯式聲明才生效。
注意: 若全局事務(wù)起點(diǎn)與子事務(wù)起點(diǎn)重合匿垄,需同時(shí)聲明 @SagaStart 和 @Compensable 的注解移宅。
對(duì)轉(zhuǎn)入服務(wù)重復(fù)第三步即可。
如何運(yùn)行
1.首先運(yùn)行postgresql
docker run -d -e "POSTGRES_DB=saga" -e "POSTGRES_USER=saga" -e "POSTGRES_PASSWORD=password" -p 5432:5432 postgres
這一步我是在linux服務(wù)器上直接運(yùn)行的年堆,因?yàn)榈谝徊轿揖幾g是在linux上編譯的吞杭,本地環(huán)境是win7,使用docker不方便
2.運(yùn)行alpha变丧。在運(yùn)行alpha前芽狗,請(qǐng)確保postgreSQL已正常啟動(dòng)。
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.最后在你的服務(wù)里面配置omega的信息痒蓬。以yaml為例
spring:
application:
name: {application.name}alpha:
cluster:
address: {alpha.cluster.addresses}(這里注意要使用8080這個(gè)端口)
然后就可以運(yùn)行相關(guān)的微服務(wù)了童擎。
參考自:https://github.com/apache/incubator-servicecomb-saga/blob/master/docs/user_guide_zh.md
補(bǔ)充了部分自己摸索遇到的坑