分布式事务接入
所有文档

          云原生微服务应用平台 CNAP

          分布式事务接入

          准备工作

          • 开发环境中下载Maven并完成环境配置
          • 开发环境中安装JDK1.8并完成环境配置(目前仅支持1.8版本)
          • 目前仅支持与天河微服务平台结合使用,请参照"Spring-Cloud-应用接入"文档进行接入
          • 将分布式事务相关的jar包安装到开发环境的Maven库中:下载事务依赖包,并按照压缩包中的README说明进行安装

          引入依赖

          修改pom.xml文件,根据使用场景引入所需的maven依赖。

          <!--服务之间通过rest访问-->
          <dependency>
              <groupId>com.baidu.btcc</groupId>
              <artifactId>btcc-rest-template</artifactId>
              <version>2.3.0-SNAPSHOT</version>
          </dependency>
          <!--服务之间通过feign访问-->
          <dependency>
              <groupId>com.baidu.btcc</groupId>
              <artifactId>btcc-spring-cloud</artifactId>
              <version>2.3.0-SNAPSHOT</version>
          </dependency>

          添加配置项

          在application.properties文件中添加如下配置,用于上传事务数据。

          # 事务所属的模块名
          btcc.moduleName=xxxx
          # 用户鉴权信息,可以通过控制台进行查看和更新
          btcc.token=xxxx
          # 事务分组,需要通过控制台进行管理
          btcc.transGroup=xxxx
          # 事务数据的上传地址
          btcc.serverAddress=list://100.64.253.71:8024
          # 同步/异步执行confirm和cancel操作,true表示同步,false表示异步
          btcc.isSync=false
          # 连接btcc-server的超时时间
          btcc.connectTimeoutMillis=200
          # 访问btcc-server的读超时时间
          btcc.readTimeoutMillis=1000
          # 访问btcc-server的写超时时间
          btcc.writeTimeoutMillis=200
          # 访问btcc-server的最大连接数
          btcc.maxTotalConnections=1000
          # 访问btcc-server的最小空闲连接数
          btcc.minIdleConnections=10
          # 访问btcc-server的最大重试次数
          btcc.maxTryTimes=3
          # 访问btcc-server的工作线程数
          btcc.workThreadNum=10

          开启事务功能

          开启分布式事务功能,需要在代码中额外添加配置:

          • 开启对com.baidu.btcc包的扫描
          • 解析btcc配置,确保可以获得BtccConfig对象
          • 为RestTemplate和AsyncRestTemplate设置拦截器

          修改的代码示例如下所示。

          @SpringBootApplication
          @EnableFeignClients
          @EnableDiscoveryClient
          @ComponentScan(basePackages = "com.baidu.btcc")
          public class OrderApplication {
              @Bean
              @ConfigurationProperties("btcc")
              public BtccConfig btccConfig() {
                  return new BtccConfig();
              }
           
              @LoadBalanced
              @Bean
              public RestTemplate restTemplate() {
                  RestTemplate restTemplate = new RestTemplate();
                  restTemplate.setInterceptors(Lists.newArrayList(new BtccRestTemplateInterceptor()));
                  return restTemplate;
              }
           
              @LoadBalanced
              @Bean
              public AsyncRestTemplate asyncRestTemplate(){
                  AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
                  asyncRestTemplate.setInterceptors(Lists.newArrayList(new BtccRestTemplateAsyncInterceptor()));
                  return asyncRestTemplate;
              }
           
              public static void main(String[] args) {
                  SpringApplication.run(OrderApplication.class, args);
              }
          }

          业务改造

          在事务发起方和事务参与方的try方法上添加注解,用于创建一条事务信息:

          @BtccTransactional(confirmMethod = "", cancelMethod = "", mode="")

          其中:

          • confirmMethod表示事务确认函数,默认为空。
          • cancelMethod表示事务取消函数,默认为空。
          • mode表示事务的模式,可选,默认为MT(MT表示手动回滚,AT表示自动回滚)。

          注意:

          • @BtccTransactional可以保障本地事务,不需要再显式增加spring的@Transactional注解。
          • 对于事务发起方,一般情况下不需要设置confirmMethod、cancelMethod。
          • 对于事务参与方,在MT模式下必需提供cancelMethod,确保事务失败时可以进行回滚。
          • try / confirm / cancel方法必须定义在interface中,@BtccTransactional加在实现类的方法上。
          • 同一组try/confirm/cancel方法,入参必须一样。

          AT模式

          1. 配置数据源代理

          使用btcc提供的com.baidu.btcc.client.datasource.DataSourceProxy数据源代理,代码示例如下。

          @Configuration
          @PropertySource("classpath:application.properties")
          public class DatabaseConfig {
              @Value("${spring.datasource.url}")
              private String jdbcUrl;
              @Value("${spring.datasource.username}")
              private String username;
              @Value("${spring.datasource.password}")
              private String password;
              // 其他配置项
           
              @Bean
              public DataSource dataSource() throws SQLException {
                  HikariDataSource dataSource = new HikariDataSource();
                  dataSource.setJdbcUrl(jdbcUrl);
                  dataSource.setUsername(username);
                  dataSource.setPassword(password);
                  // 设置其他配置项
                  return new DataSourceProxy(dataSource);
              }
          }
          1. 创建数据库表

          在数据库中创建undo_log、btcc_global_lock表,建表所需的sql语句请参考事务依赖包

          1. 业务使用

          在事务发起方和参与方添加注解@BtccTransactional(mode="AT")即可。

          注意:

          目前AT模式只支持mysql数据库
          AT模式适用于相对简单的sql,若cancel场景比较复杂,建议使用MT模式
          上一篇
          镜像制作
          下一篇
          配置中心接入