mysql comb_分布式事务解决方案ServiceComb - Omega源码阅读与分享

本文介绍了Apache ServiceComb中的Omega组件,它作为微服务中的事务代理,与Alpha协调器通信,确保全局事务一致性。文章详细讲解了Omega的源码结构,包括OmegaContext、配置初始化、Omega与SpringBoot的集成以及Omega内部的事务传播机制。通过对@SagaStart和@Compensable注解的AOP处理,展示了Omega如何在服务间传递事务信息并处理异常。此外,还提及了Omega与Alpha间的gRPC通信基础。
摘要由CSDN通过智能技术生成

概览

ServiceComb已经是Apache的顶级项目,包含两个组件,即 alpha 和 omega。alpha是协调者的角色,需要单独部署的服务,主要负责对事务的事件进行持久化存储以及协调子事务的状态,保证全局事务的状态保持一致。

omega是微服务中的一个agent,负责对网络请求进行拦截并向alpha上报事务事件,并在异常情况下根据alpha下发的指令执行相应的补偿操作

59e26959305cb75d84d4a270ec8666b3.png

一、代码导入

源码地址:https://github.com/apache/servicecomb-pack第一步当然是下载代码并导入:git clone https://github.com/apache/servicecomb-pack.git

fa3184b14ddde1d23e008ab6a0ec026d.png

主要模块说明

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报告事务状态,

dc6aa7c14c86e33d9c9c89a479d93d4a.png

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值