概览
ServiceComb已经是Apache的顶级项目,包含两个组件,即 alpha 和 omega。alpha是协调者的角色,需要单独部署的服务,主要负责对事务的事件进行持久化存储以及协调子事务的状态,保证全局事务的状态保持一致。
omega是微服务中的一个agent,负责对网络请求进行拦截并向alpha上报事务事件,并在异常情况下根据alpha下发的指令执行相应的补偿操作
一、代码导入
源码地址:https://github.com/apache/servicecomb-pack第一步当然是下载代码并导入:git clone https://github.com/apache/servicecomb-pack.git
主要模块说明
alpha 是事务协调中心,保存事务日志,通过日志协调各个分支
demo 里面项目的各框架的例子:spring和dubbo saga tcc
docs 设计文档,最先应该熟悉的。
omega 负责与alpha通讯,子事务逻辑
pack-contracts gRPC通讯接口定义文件,通过中间文件生成客户端与服务端面代码,让开发者不必关心通讯过程
web 用angular写的web界面,可以查看事务的状态。
我们主要关注的alpha和omega的代码,gRPC知识是通讯基础非常重要,最好先了解gRPC和probuf、Kyro序列化对阅读源码
还是很有帮助的。但通讯部分只是简单带过。
服务之间的事务传递与OmegaContext
GlobalTxId全局事务ID标记子事务是否同属性一个事务中
ParentTxId 父类的事务ID
localTxId子事务Id
Omega会面向切面编程的方式,向程序中注入相应的逻辑,初始化事务上下文OmegaContext,在事务处理的过程中向alpha报告事务状态,
public class OmegaContext {
//在微服务之间相互传递作为 globalTxId和localTxId的Key
public static final String GLOBAL_TX_ID_KEY = "X-Pack-Global-Transaction-Id";
public static final String LOCAL_TX_ID_KEY = "X-Pack-Local-Transaction-Id";
private final ThreadLocal globalTxId = new InheritableThreadLocal<>();
private final ThreadLocal localTxId = new InheritableThreadLocal<>();
private final IdGenerator idGenerator;//事务Id生成类,用UUID实现
public OmegaContext(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public String newGlobalTxId() {
String id = idGenerator.nextId();
globalTxId.set(id);
return id;
}
}
omega配置与初始化
实现saga协调协议和TCC协调协议,下面就是omega客户端要配置了三个信息alpha集群的通讯地址
服务注册中心的,这个是可选的,可以使用eureka、consul
omega.enable=true开启omage,还有@EnableOmega不过这种方式已经被标记抛弃,下个版本也许就不支持注解方式开启了alpha:
cluster:
address: 127.0.0.1:8081
eureka:
client:
enabled: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
omega:
enable: true
omega->omega-spring-starter Omega与SpringBoot框架的结合
omega.enable=true或@EnableOmega的作用只标记开启Omega,Omega在SpringBoot上初始化过程:
OmegaSpringAutoConfiguration通过@Configuration,在Spring框架启动时加载并配置@Configuration
@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})
@ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)
public class OmegaSpringAutoConfiguration {
//@Configuration用于定义配置类,可替换xml配置文件
//@Import({OmegaSpringConfig.class,TransactionAspectConfig.class})在当前类起作用时,
//也初始化OmegaSpringConfig和TransactionAspectConfig类里的Spring Bean
//@ConditionalOnProperty(value = {"omega.enabled"}, matchIfMissing = true)