带你读《Apache Dubbo微服务开发从入门到精通》——二、 分布式事务

简介: 带你读《Apache Dubbo微服务开发从入门到精通》——二、 分布式事务

二、 分布式事务

 

1. 使用方式与概念

 

1) 事务上下文

 

Seata的事务上下文由RootContext来管理。

 

应用开启一个全局事务后,RootContext会自动绑定该事务的XID,事务结束(提交或回滚完成),RootContext会自动解绑XID。

 

image.png 

 

应用可以通过RootContext的API接口来获取当前运行时的全局事务XID。

 

image.png

 

应用是否运行在一个全局事务的上下文中,就是通过RootContext是否绑定XID来判定的。

 

image.png

 

2) 事务传播

 

Seata全局事务的传播机制就是指事务上下文的传播,根本上,就是XID的应用运行时的传播方式。

 

• 服务内部的事务传播

 

默认的,RootContext的实现是基于ThreadLocal的,即XID绑定在当前线程上下文中。

 

image.png

 

所以服务内部的XID传播通常是天然的通过同一个线程的调用链路串连起来的。默认不做任何处理,事务的上下文就是传播下去的。

 

如果希望挂起事务上下文,则需要通过RootContext提供的API来实现:

 

image.png

 

• 跨服务调用的事务传播

 

通过上述基本原理,我们可以很容易理解:

 

注:

跨服务调用场景下的事务传播,本质上就是要把XID通过服务调用传递到服务提供方,并绑定到RootContext中去。

 

只要能做到这点,理论上Seata可以支持任意的微服务框架。

 

2. 完整示例

 

完整示例请参见Dubbo给的官方示例:https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-seata

 

3. 对Dubbo支持的解读

 

下面,我们通过内置的对Dubbo RPC支持机制的解读,来说明Seata在实现对一个特定微服务框架支持的机制。

 

对Dubbo的支持,我们利用了Dubbo框架的_org.apache.dubbo.rpc.Filter_机制。

 

/**
 * The type Transaction propagation filter.
 */
@Activate(group = { Constants.PROVIDER, Constants.CONSUMER }, order = 100)
public class TransactionPropagationFilter implements Filter {
    private static final Logger LOGGER = LoggerFactory.getLogger(TransactionPropagationFilter.class);
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String xid = RootContext.getXID(); // 获取当前事务 XID
        String rpcXid = RpcContext.getContext().getAttachment(RootContext.KEY_XID); // 获取 RPC 调用传递过来的 XID
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("xid in RootContext[" + xid + "] xid in RpcContext[" + rpcXid + "]");
        }
        boolean bind = false;
        if (xid != null) { // Consumer:把 XID 置入 RPC 的 attachment 中
            RpcContext.getContext().setAttachment(RootContext.KEY_XID, xid);
        } else {
            if (rpcXid != null) { // Provider:把 RPC 调用传递来的 XID 绑定到当前运行时
                RootContext.bind(rpcXid);
                bind = true;
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("bind[" + rpcXid + "] to RootContext");
                }
            }
        }
        try {
            return invoker.invoke(invocation); // 业务方法的调用
        } finally {
            if (bind) { // Provider:调用完成后,对 XID 的清理
                String unbindXid = RootContext.unbind();
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("unbind[" + unbindXid + "] from RootContext");
                }
                if (!rpcXid.equalsIgnoreCase(unbindXid)) {
                    LOGGER.warn("xid in change during RPC from " + rpcXid + " to " + unbindXid);
                    if (unbindXid != null) { // 调用过程有新的事务上下文开启,则不能清除
                        RootContext.bind(unbindXid);
                        LOGGER.warn("bind [" + unbindXid + "] back to RootContext");
                    }
                }
            }
        }
    }
}


相关文章
|
运维 监控 负载均衡
探索微服务架构下的服务治理:动态服务管理平台深度解析
探索微服务架构下的服务治理:动态服务管理平台深度解析
|
运维 监控 安全
探索微服务架构下的服务治理:动态服务管理平台的力量
探索微服务架构下的服务治理:动态服务管理平台的力量
|
人工智能 Dubbo 应用服务中间件
使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力
本文介绍了如何利用 Apache Dubbo 的多语言 SDK 充分释放 DeepSeek R1 的全部潜力,助力 AI 开发的高效落地。
655 121
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
1440 136
|
负载均衡 监控 Java
深入探索微服务架构下的服务治理
深入探索微服务架构下的服务治理
330 39
|
存储 监控 负载均衡
构建高效微服务架构:服务治理与监控的实践
构建高效微服务架构:服务治理与监控的实践
|
负载均衡 Java 云计算
微服务架构下的服务治理与容错机制
微服务架构下的服务治理与容错机制
379 20
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
1394 1
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
353 0
|
负载均衡 算法 Java
深入探索微服务架构下的服务治理
深入探索微服务架构下的服务治理

推荐镜像

更多