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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 带你读《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");
                    }
                }
            }
        }
    }
}


相关文章
|
2天前
|
监控 安全 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第30天】随着现代软件开发的复杂性日益增加,传统的单体应用架构已难以满足快速迭代与灵活部署的需求。微服务架构作为一种新兴的设计理念,它通过将一个大型应用程序拆分成一系列小而专注的服务来提供解决方案。本文旨在探讨如何构建一个高效且可靠的微服务架构系统,涵盖从设计原则、技术选型到部署实践的全方位知识,为后端开发者提供一种全新的开发思路和实践指导。
|
2天前
|
Java 调度 开发者
构建高效微服务架构:后端开发的新趋势深入理解操作系统之进程调度策略
【4月更文挑战第30天】 随着企业数字化转型的不断深入,传统的单体应用逐渐不能满足快速迭代和灵活部署的需求。微服务架构以其高度模块化、独立部署和易于扩展的特性,成为现代后端开发的重要趋势。本文将探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术选型以及可能面临的挑战。
|
2天前
|
Cloud Native Devops 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用构建高效微服务架构:后端开发的新范式
【4月更文挑战第30天】 随着企业加速其数字化进程,云原生架构已成为支撑复杂、可伸缩和灵活应用的骨干。本文探讨了云原生技术的崛起,重点分析了其在促进业务敏捷性、提高运营效率及推动创新方面的核心价值。通过深入剖析云原生生态系统的关键技术组件,如容器化、微服务、持续集成/持续部署(CI/CD)和DevOps实践,揭示了企业如何利用这些技术来构建和维护高度可用且动态的IT环境。文章还提出了一个多维度的采纳框架,帮助企业评估和实施云原生解决方案,以实现真正的业务价值。 【4月更文挑战第30天】在现代软件开发的快速演变中,微服务架构已经成为一种领先的设计模式,用于构建可扩展、灵活且容错的应用程序。与传
|
2天前
|
消息中间件 监控 负载均衡
构建高效微服务架构:后端开发的新范式
【4月更文挑战第30天】 在现代软件开发的浪潮中,微服务架构已成为一种广泛采用的设计模式。它通过将大型应用程序拆分成一组小型、松散耦合的服务来增强系统的可维护性、可扩展性和敏捷性。本文将探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术选型、以及实现过程中的最佳实践。我们将深入讨论微服务间的通信机制、数据一致性问题、服务发现与负载均衡策略,以及如何确保系统的安全性和监控。
|
2天前
|
机器学习/深度学习 安全 网络安全
数字堡垒的构筑者:网络安全与信息安全的深层剖析构建高效微服务架构:后端开发的新趋势
【4月更文挑战第30天】在信息技术高速发展的今天,构建坚不可摧的数字堡垒已成为个人、企业乃至国家安全的重要组成部分。本文深入探讨网络安全漏洞的本质、加密技术的进展以及提升安全意识的必要性,旨在为读者提供全面的网络安全与信息安全知识框架。通过对网络攻防技术的解析和案例研究,我们揭示了防御策略的关键点,并强调了持续教育在塑造安全文化中的作用。
|
2天前
|
缓存 监控 API
构建高效微服务架构:后端开发的新范式
【4月更文挑战第30天】 随着现代软件开发的演进,传统的单体应用逐渐向微服务架构转变。本文将深入探讨微服务的核心概念、优势以及在设计高效后端系统时所面临的挑战。通过实例分析与最佳实践的结合,我们将揭示如何优化微服务的性能,保证系统的可扩展性、可维护性和安全性。
|
2天前
|
监控 API 开发者
构建高效可靠的微服务架构:后端开发的实践指南
【4月更文挑战第30天】 在当前软件开发的浪潮中,微服务架构以其灵活性、可扩展性和技术多样性成为企业数字化转型的宠儿。本文旨在探讨构建一个既高效又可靠的微服务系统所涉及的关键后端技术和策略。我们将深入分析微服务设计原则,讨论如何通过容器化、服务发现、API网关和断路器模式等技术手段来优化系统性能并确保其稳定性。同时,文章还将介绍持续集成/持续部署(CI/CD)的实践以及监控和日志管理的重要性。
|
3天前
|
消息中间件 监控 数据管理
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第30天】 在现代软件开发领域,微服务架构已经成为一种流行且有效的解决方案,用于应对复杂系统的挑战和需求。本文将深入探讨如何构建高效的微服务架构,包括关键设计原则、技术选型、以及实现细节。我们还将讨论如何确保系统的可扩展性、弹性和维护性,同时考虑到安全性和性能优化的最佳实践。通过实际案例分析和最佳实践的分享,本文旨在为后端开发人员提供一份全面的微服务架构指南。
|
3天前
|
监控 数据管理 API
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第30天】 在现代软件开发的潮流中,微服务架构以其灵活性、可扩展性和技术多样性成为企业转型和数字化升级的关键。本文深入探讨了构建一个高效且可靠的微服务系统所涉及的核心概念、关键技术以及面临的挑战,并提出了一系列实用的策略和最佳实践。从服务的划分原则到API网关的设计,再到服务间的通信与数据一致性问题,文章为后端开发者提供了一套全面的指导方案,旨在帮助企业实现敏捷开发和持续交付,同时保证系统的稳定性和可靠性。
|
3天前
|
监控 Kubernetes 持续交付
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第30天】 随着云计算和容器化技术的兴起,微服务架构已成为企业软件开发的主流选择。本文将深入探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计灵活的服务接口、确保系统的可扩展性和可维护性等关键方面。通过实际案例分析,我们将展示如何利用现代后端开发实践来提升系统性能和团队协作效率。

推荐镜像

更多