• 文档
  • 控制台
  • 登录
  • 立即注册
    目前不支持用户自主注册,如需注册账号,请联系400-080-1100
微服务平台CSP开发指南
最近更新时间:

5 在 CSP 上使用分布式事务功能

5.1 前提

 开通 CSP 平台服务。

 请确保您的机器上已经安装了 Java 和 Maven。

 目前版本只支持 Spring Cloud 开发框架。

5.2 创建Demo应用

(1) 登录 CSP 平台。

(2) 在“应用管理 > 命名空间”列表页面,创建命名空间 test_tx。

(3) 在“应用管理 > 应用组”页面,选中创建的命名空间 test_tx,创建应用组 test_tx_group。

(4) 在“分布式事务 > 事务分组”页面,选择对应命名空间和应用组,创建事务分组 service-tx- group。

(5) 在“应用管理 > 容器应用”页面,单击“创建”,创建应用 order-service,account- service,storage-service,单击“开启分布式事务”,选择对应事务分组,demo 应用示例如下:

1.png

(6) 创建一个 Maven 工程,命名为 order-service(或者使用上述 demo 工程),若需要使用分

布式事务功能,需在 pom.xml 文件中引入如下依赖:

        <dependency>

                <groupId>com.cecloud.csp</groupId>

                <artifactId>spring-cloud-starter-cecloud-csp-config</artifactId>

                <version>1.0.1.RELEASE</version>

        </dependency>


        <dependency>

                <groupId>com.cecloud.csp</groupId>

                <artifactId>spring-cloud-starter-cecloud-csp-discovery</artifactId>

                <version>1.0.1.RELEASE</version>

        </dependency>

        <dependency>

                <groupId>com.cecloud.csp</groupId>

                <artifactId>spring-cloud-starter-cecloud-ctf</artifactId>

                <version>1.0.0-SNAPSHOT</version>

        </dependency>

(7) 在 src\main\java 目录下创建 Package com.cecloud.csp。

(8) 创建启动类。

        package com.cecloud.csp;

        

        import org.springframework.boot.SpringApplication;

        import org.springframework.boot.autoconfigure.SpringBootApplication;

        import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

        import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

        import org.springframework.cloud.openfeign.EnableFeignClients;

        

        @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

        @EnableDiscoveryClient

        @EnableFeignClients

        public class OrderApplication {

        

                public static void main(String[] args) {

                        SpringApplication.run(OrderApplication.class, args);

                }

        }

(9) 在 Package com.cecloud.csp.controller 中创建 OrderController。   

        package com.cecloud.csp.controller;

        

        import com.cecloud.csp.domain.Order;

        import com.cecloud.csp.service.OrderService;

        import com.cecloud.csp.vo.CommonResult;

        import org.springframework.web.bind.annotation.*;

        

        import javax.annotation.Resource;

        

        @RestController

        @RequestMapping("/order")

        public class OrderController {

        

                @Resource

                private OrderService orderService;

                

                @PostMapping("/create")

                public CommonResult createOrder(@RequestBody Order order) {

                        return orderService.createOrder(order);

                }

        

        }     

(10) 在 src\main\resources 路径下创建文件 application.yml,在 application.yml 中添加如下配置:

        spring:

            application:

                name: order-service

            cloud:

                cecloud:

                    ctf:

                        application-id: order-service

              datasource:

                    driver-class-name: com.mysql.cj.jdbc.Driver

                    url:

            jdbc:mysql://192.168.0.12:13306/order?useUnicode=true&characterEncoding=utf8&allowM

            ultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai

                    username: root

                    password: 123456

        

             server:

                    port: 2001

其中数据库的 datasource 配置需要在电子云官网购买云数据库 RDB,选择 MYSQL 类型,并创建好相应的数据库、用户和表,对应建表语句如下:

1.png

(11) 在“应用管理 > 容器应用”页面,单击“创建”,打包并上传对应应用的 JAR 包。        

1.png

(12) 成功部署应用后能在“微服务治理 > 服务”页面,根据命名空间 test_tx 看到应用对应的服务 order-service,同理可在 CSP 平台创建另外两个 Demo 应用 account-service,storage- service。

5.3 触发事务功能

(1) 上述所给三个 Demo 示例的调用逻辑为 order-service 首先会创建订单,然后调用 storage- service 扣减商品库存,接着调用 account-service 扣减账户余额,最后再更新订单状态。在order-service 的 OrderServiceImpl 类中代码如下:

         package com.cecloud.csp.service.impl;

        

         import com.cecloud.csp.client.AccountClient;

         import com.cecloud.csp.client.StorageClient;

         import com.cecloud.csp.dao.OrderMapper;

         import com.cecloud.csp.domain.Order;

         import com.cecloud.csp.enums.OrderStatus;

         import com.cecloud.csp.service.OrderService;

         import com.cecloud.csp.vo.CommonResult;

         import io.seata.spring.annotation.GlobalTransactional;

         import org.springframework.stereotype.Service;


         import javax.annotation.Resource;


         @Service

         public class OrderServiceImpl implements OrderService {

                 @Resource

                 private OrderMapper orderMapper;


                 @Resource

                 private AccountClient accountClient;

        

                 @Resource

                 private StorageClient storageClient;

        

                 @Override

                 @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)

                 public CommonResult createOrder(Order order) {

                         // 创建订单

                         orderMapper.create(order);

                         // 扣减商品库存

                         storageClient.decrease(order.getProductId(), order.getCount());

                         // 扣减账户余额

                         accountClient.decrease(order.getUserId(), order.getMoney());

                         //更新订单状态

                         orderMapper.update(order.getId(), OrderStatus.FINISHED.getValue());

                         return new CommonResult();

                 }

         }

(2) 使用 postman 等接口调用工具调用 order-service 的/order/create 接口,会得到如下返回:

1.png

说明代码调用没有出现异常,事务成功提交,同时可以在“应用管理 > 容器应用 > 应用详情”页面,单击“查看日志”,查看到相应日志如下:

 2.png

(3) 在“应用管理 > 容器应用”页面,停止 storage-service 构造异常回滚场景,同样使用postman 等接口调用工具调用 order-service 的/order/create 接口,会得到如下返回:

1.png

同时在“应用管理 > 容器应用 > 应用详情”页面,单击“查看日志”,查看到相应日志如下:

1.png

日志内容 Branch Rollbacked result: PhaseTwo_Rollbacked 表示由于发生异常情况,事务被回滚。同时可去相应的数据库查询数据是否被扣减。

(4) 在“分布式事务 > 概览”页面,选择相应的命名空间、应用分组和事务分组,可查看到提交和回滚对应的事务总数和 TPS 如下:

1.png

意见反馈

文档内容是否对您有帮助?

如您有其他疑问,您也可以通过在线客服来与我们联系探讨 在线客服

联系我们
回到顶部