赞
踩
首先介绍下seata是什么?
- Seata(原名 Fescar)是一个开源的分布式事务解决方案,旨在解决微服务架构下的分布式事务问题。Seata 提供了高性能和简单易用的分布式事务框枰,支持 ACID 事务属性,并且兼容各种不同的存储引擎。
-
- Seata 主要包括以下三个主要模块:
-
- TC(Transaction Coordinator)事务协调器:负责全局事务的协调和发起,采用一阶段提交或两阶段提交协议来确保跨多个服务的一致性。
-
- TM(Transaction Manager)事务管理器:负责事务的开启、提交和回滚。通过与 TC 交互,协调分布式事务的执行。
-
- RM(Resource Manager)资源管理器:负责事务中各个分支(也称为分支事务)的管理,与本地数据库或其他资源进行交互,确保数据的一致性。
-
- 通过这些模块的协作,Seata 实现了在分布式环境下进行事务管理的功能,包括全局事务的管理、事务注解支持、事务恢复机制等。
-
- Seata 支持的分布式事务模式包括 AT 模式(TCC 柔性事务)、TCC 模式、SAGA 模式和 XA 模式,可以根据实际需求选择适合的事务模式。
其次nacos和seata的安装可以参考这两篇文章:
SpringCloud+Nacos+Seata实现分布式事物_nacos spring setea-CSDN博客
springcloud整合seata、nacos_springcloud seata nacos-CSDN博客
SpringCloud+nacos+seata的整合使用
环境准备:确保已经安装和启动了 Nacos 作为服务注册中心和配置中心,以及 Seata 服务器和各个微服务实例。在 Nacos 中注册微服务,并配置相关的服务信息。
引入依赖:在订单服务和库存服务的 pom.xml 文件中,添加 Spring Cloud、Seata 和 Nacos 相应的依赖项。
配置 Nacos 作为配置中心:在订单服务和库存服务的配置文件中,将 Nacos 配置中心的相关配置(如服务地址、命名空间等)添加到配置文件中。
整合 Seata 到项目中:在订单服务和库存服的 pom.xml 文件中,添加 Seata 的相关依赖项,这些依赖项包括 Seata 的客户端依赖和数据源代理依赖。同时,在订单服务和库存服务的配置文件中,配置 Seata 的代理和 Register 配置。
使用 @GlobalTransactional 注解:在订单服务的创建订单方法上添加 @GlobalTransactional 注解,该注解表示这是一个全局事务的边界。当进入该方法时,Seata 会自动开始全局事务。同样,库存服务的方法也适用此注解,使其参与到全局事务中。
调用其他服务:在订单服务中调用库存服务时,通过 RestTemplate 或 Feign 等方式发起请求。Seata 会拦截这些请求并协同完成分布式事务管理。
订单服务(Order Service)配置
- 在订单服务的配置文件中,设置 Nacos 作为配置中心,并配置 Seata 的代理和 Register 配置。
-
-
- spring.application.name=order-service
- # 配置 Nacos 作为配置中心
- spring.cloud.nacos.config.server-addr=localhost:8848
- # 注册 Seata 代理配置
- seata.tx-service-group=my_test_tx_group
- seata.config.type=file
- seata.config.file.path=/path/to/seata-config
- seata.config.registry.type=Nacos
- seata.config.registry.nacos.endpoint=localhost:8848
- seata.config.registry.nacos.group=default
- seata.config.registry.nacos.namespace=seata-namespace
库存服务(Inventory Service)配置
- 在库存服务的配置文件中,设置 Nacos 作为配置中心,并配置 Seata 的代理和 Register 配置。
- spring.application.name=inventory-service
- # 配置 Nacos 作为配置中心
- spring.cloud.nacos.config.server-addr=localhost:8848
- # 注册 Seata 代理配置
- seata.config.type=file
- seata.config.file.path=/path/to/seata-config
- seata.config.registry.type=Nacos
- seata.config.registry.nacos.endpoint=localhost:8848
- seata.config.registry.nacos.group=default
- seata.config.registry.nacos.namespace=seata-namespace
订单服务(Order Service)代码示例
- // 订单服务中的Controller类
- @RestController
- public class OrderController {
-
- @Autowired
- private OrderService orderService;
-
- @GlobalTransactional
- @PostMapping("/createOrder")
- public String createOrder(@RequestBody OrderInfo orderInfo) {
- orderService.createOrder(orderInfo);
- return "Order created successfully!";
- }
- }
-
- // 订单服务中的Service类
- @Service
- public class OrderService {
-
- @Autowired
- private RestTemplate restTemplate;
-
- @GlobalTransactional
- public void createOrder(OrderInfo orderInfo) {
- // 创建订单逻辑
- // ...
-
- // 调用库存服务扣减库存
- restTemplate.postForObject("http://inventory-service/reduceStock", orderInfo, String.class);
-
- // ...
- }
- }
库存服务(Inventory Service)代码示例
- // 库存服务中的Controller类
- @RestController
- public class InventoryController {
-
- @Autowired
- private InventoryService inventoryService;
-
- @PostMapping("/reduceStock")
- public String reduceStock(@RequestBody OrderInfo orderInfo) {
- inventoryService.reduceStock(orderInfo.getItemId(), orderInfo.getQuantity());
- return "Stock reduced successfully!";
- }
- }
-
- // 库存服务中的Service类
- @Service
- public class InventoryService {
-
- @GlobalTransactional
- public void reduceStock(String itemId, int quantity) {
- // 扣减库存逻辑
- // ...
- }
- }
以上示例演示了如何在 Spring Cloud、Seata 和 Nacos 下实现简单的分布式事务。需要注意的是,还需要在各个微服务的配置文件中配置 Seata 代理和相关信息,以使各个服务正常连接到 Seata Server 进行事务协调。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。