胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号,荣获2024年电子工业出版社博文视点20周年荣誉专家称号。
目录
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色,帮助经济体平稳的度过历年的双11,对上层业务进行了有力的技术支撑。经过多年沉淀与积累,其商业化产品先后在阿里云、金融云上售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助用户快速落地分布式事务解决方案。
1.概要设计
1.1 支持微服务框架
目前已支持Dubbo、Spring Cloud、Sofa-RPC、Motan 和 gRPC 等RPC框架,其他框架持续集成中。
1.2 支持分布式事务模式
1.2.1 AT 模式
提供无侵入自动补偿的事务模式,目前已支持MySQL、Oracle、PostgreSQL、TiDB、MariaDB、DaMeng、PolarDB-X 2.0、SQLServer。DB2开发中。
1.2.2 TCC 模式
支持 TCC 模式并可与 AT 混用,灵活度更高。
1.2.3 SAGA 模式
为长事务提供有效的解决方案,提供编排式与注解式(开发中)。
1.2.4 XA 模式
支持已实现 XA 接口的数据库的 XA 模式,目前已支持MySQL、Oracle和MariaDB。
2.Dubbo支持Seata分布式事务的核心原理
Dubbo支持Seata分布式事务的核心原理主要体现在两者如何协同工作,以实现跨服务的分布式事务管理。以下是详细的核心原理说明。
2.1 事务注解与拦截
(1)在Dubbo服务中,通过引入Seata的客户端库,开发者可以在服务方法上添加@GlobalTransactional
注解,以标记该方法参与全局事务。
(2)Seata的客户端会在运行时拦截这些被注解的方法调用,将其纳入全局事务的管理范围。
2.2 全局事务与分支事务
(1)当一个全局事务开始时,Seata会生成一个全局唯一的事务ID(XID)。
(2)在Dubbo服务之间的远程调用过程中,这个XID会被传递,以确保所有参与的分支事务都能被正确地关联到全局事务中。
(3)每个Dubbo服务中的被调用方法都会作为一个分支事务来执行,其执行结果将影响全局事务的最终状态。
2.3 两阶段提交
(1)以Seata的AT模式为例,该模式采用两阶段提交协议来处理分布式事务。
(2)第一阶段:在业务数据被修改的同时,Seata会记录必要的回滚日志(undo log),以确保在需要时可以恢复到事务开始前的状态。然后,业务数据和回滚日志会被提交到本地数据库。
(3)第二阶段:根据全局事务的提交或回滚决策,Seata会通知所有参与的分支事务进行提交或回滚。如果需要回滚,Seata会根据回滚日志来恢复数据。
2.4 服务注册与发现
(1)Dubbo的服务注册与发现机制有助于Seata在分布式环境中定位和管理参与全局事务的服务实例。
(2)通过注册中心(如Zookeeper、Nacos等),Seata可以获取服务的实时地址信息,以便在需要时与它们进行通信。
2.5 监控与治理
(1)Dubbo和Seata都提供了丰富的监控与治理功能。通过Dubbo Admin和Seata Dashboard等工具,开发者可以实时查看服务的运行状态、事务的执行情况等信息。
(2)这有助于及时发现和解决问题,提高系统的稳定性和可靠性。
Dubbo支持Seata分布式事务的核心原理在于两者通过事务注解、全局事务与分支事务管理、两阶段提交协议以及服务注册与发现等机制紧密协作,共同实现了跨服务的分布式事务管理。这种协作使得开发者可以在微服务架构下轻松地构建高性能、高可用性的分布式系统。
3.Dubbo如何集成Seata
Dubbo集成Seata的过程主要涉及配置Seata环境、修改Dubbo服务配置以及使用Seata的事务注解等步骤。以下是一个详细的集成过程。
3.1 环境准备
3.1.1 Seata Server部署
(1)下载Seata的最新版本,可以从Seata的GitHub仓库获取。
(2)解压并配置Seata Server,主要修改配置文件(如file.conf
和registry.conf
),确保注册中心、存储模式等设置符合实际需求。
(3)启动Seata Server。
3.1.2 数据库准备
(1)根据业务需要创建相应的数据库和表,并确保这些数据库支持XA事务或能够被Seata的AT模式所代理。
(2)如果使用Seata的AT模式,并且日志存储在数据库中,还需要创建用于存储回滚日志的表(如undo_log
表)。
3.1.3 注册中心准备
(1)确保Dubbo和Seata都使用相同的注册中心,如Zookeeper、Nacos等。
(2)在注册中心中注册Dubbo服务和Seata服务。
3.2 Dubbo服务配置
3.2.1 引入Seata依赖
在Dubbo服务的pom.xml
文件中引入Seata的客户端依赖。
3.2.2 配置Seata数据源代理
修改Dubbo服务的数据源配置,使用Seata提供的数据源代理(如DataSourceProxy
),以便在数据操作时自动参与分布式事务。
3.2.3 配置Seata客户端
在Dubbo服务的配置文件中(如application.yml
或application.properties
),配置Seata客户端的相关参数,如服务组(group)、事务日志存储模式(store.mode)等。
3.2.4 注册事务服务
如果使用Seata的TCC模式或SAGA模式,需要在Dubbo服务中注册相应的事务服务接口,并实现Try、Confirm、Cancel等方法。
3.3 使用Seata事务注解
3.3.1 添加全局事务注解
在Dubbo服务的业务方法上添加@GlobalTransactional
注解,标记该方法参与全局事务。该注解的作用类似于Spring的@Transactional
注解,但它是针对分布式事务的。
3.3.2 处理事务回滚
在业务逻辑中,如果遇到需要回滚的情况(如抛出异常),Seata会根据@GlobalTransactional
注解的配置自动回滚相关事务。
3.4 测试与验证
3.4.1 单元测试
编写单元测试来验证Dubbo服务在集成Seata后的分布式事务处理能力。
3.4.2 集成测试
在多个Dubbo服务之间进行集成测试,确保分布式事务能够正确地在不同服务之间传播和提交/回滚。
3.4.3 监控与日志
利用Seata提供的监控和日志功能来跟踪和诊断分布式事务的执行情况。
通过以上步骤,Dubbo服务就可以成功地集成Seata分布式事务解决方案了。需要注意的是,具体的集成细节可能会因Seata版本、Dubbo版本以及业务场景的不同而有所差异,因此在集成过程中需要参考最新的官方文档和最佳实践。