Skip to content

2 快速开始

changmingxie edited this page Jun 1, 2021 · 35 revisions

未完待续。。。

让我们从一个微服务示例开始。

用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

支付服务:根据采购需求创建订单,发起支付。

资金服务:从用户资金帐户中扣除余额。

红包服务:从用户红包账户中扣除余额。

微服务部署架构图

架构图

红包服务:

public interface RedPacketTradeOrderService {

    public String record(RedPacketTradeOrderDto tradeOrderDto);
}

资金服务:

public interface CapitalTradeOrderService {

    public String record(CapitalTradeOrderDto tradeOrderDto);

}

支付服务:

public void makePayment(String orderNo) {
    System.out.println("order try make payment called.time seq:" + DateFormatUtils.format(Calendar.getInstance(), "yyyy-MM-dd HH:mm:ss"));

    Order order = orderRepository.findByMerchantOrderNo(orderNo);

    String result = capitalTradeOrderService.record(buildCapitalTradeOrderDto(order));
    String result2 = redPacketTradeOrderService.record(buildRedPacketTradeOrderDto(order));
}

提供支持的示例

示例包含tcc-transaction-dubbo-sample 和 tcc-transaction-http-sample 两个。这两个示例业务模型内容是一样的,区别在于rpc不一样,tcc-transaction-dubbo-sample 演示使用隐式传参的方式传输tcc-transaction在rpc调用过程中需要传输的参数TransactionContext,而tcc-transaction-http-sample演示使用显示传参(接口方法中定义TransactionContext参数)。

tcc-transaction-dubbo-sample配置

  1. 配置tcc-transaction-dubbo-capital

    1.1 生效tcc-transaction

    在spring项目中可以使用xml配置或者注解来生效tcc-transaction。

    a. XML配置

     <tcc:annotation-driven transaction-repository="transactionRepository"/>
    

    b. 注解配置

     @EnableTccTransaction
    

    1.2 配置transaction repository

    transaction repository用来保存事务日志,框架提供多种Transaction Repository:

TransactionRepository 类图

 在tcc-transaction-dubbo-sample中使用MemoryStoreTransactionRepository(没有持久化能力,仅可用于测试):


    <bean id="transactionRepository" class="org.mengyun.tcctransaction.repository.MemoryStoreTransactionRepository">
        <property name="domain" value="TCC:DUBBO:CAPITAL:"/>
    </bean>


1.3 提供tcc接口
  
 在接口方法上加上@Compensable将提供的接口标记为tcc接口:

     public interface CapitalTradeOrderService {
        @Compensable
        public String record(CapitalTradeOrderDto tradeOrderDto);

    }

1.4 配置TCC事务的Try、Confirm、Cancel方法:
    
    在tcc接口方法的实现上添加@Compensable注解,设置confirmMethod和cancelMethod方法,分别为tcc的confirm和cancel方法。

    @Override
    @Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord", transactionContextEditor = DubboTransactionContextEditor.class)
    @Transactional
    public String record(CapitalTradeOrderDto tradeOrderDto) {
        ...
    }
  1. 配置tcc-transaction-dubbo-redpacket

    配置生效tcc-transaction 和 transactionRepository和配置tcc-transaction-dubbo-captial类似,在此不做赘述。定义tcc接口如下:

    在接口方法上加上@Compensable将提供的接口标记为tcc接口:

      public interface RedPacketTradeOrderService {
    
         @Compensable
         public String record(RedPacketTradeOrderDto tradeOrderDto);
     }
    
  2. 配置tcc-transaction-dubbo-order

    配置生效tcc-transaction 和 transactionRepository和配置tcc-transaction-dubbo-captial类似,在此不做赘述。

    3.1 配置TCC事务的Try、Confirm、Cancel方法:

    添加@Compensable在makePayment方法上,该方法为TCC事务的try方法,设置注解的confirmMethod指定TCC事务的confirm方法,设置注解的cancelMethod指定TCC事务的cancel方法。如下:

    @Compensable(confirmMethod = "confirmMakePayment", cancelMethod = "cancelMakePayment", asyncConfirm = false)
    public void makePayment(@UniqueIdentity String orderNo) {
         System.out.println("order try make payment called.time seq:" + DateFormatUtils.format(Calendar.getInstance(), "yyyy-MM-dd HH:mm:ss"));
    
         Order order = orderRepository.findByMerchantOrderNo(orderNo);
    
         String result = capitalTradeOrderService.record(buildCapitalTradeOrderDto(order));
         String result2 = redPacketTradeOrderService.record(buildRedPacketTradeOrderDto(order));
    }
    

    TCC事务的confirm和cancel方法的声明必须和try方法一致。confirmMakePayment、cancelMakePayment方法声明如下:

     void confirmMakePayment(String orderNo);
     void cancelMakePayment(String orderNo);
    

    3.2 添加tcc-transaction-dubbo jar依赖

     在pom.xml中添加jar依赖
         
         <dependency>
             <groupId>org.mengyun</groupId>
             <artifactId>tcc-transaction-dubbo</artifactId>
             <version>${project.version}</version>
         </dependency>
    

    3.3 更改dubbo服务的proxy spi为tccJavassist或tccJdk

    示例中在web.xml中添加classpath:tcc-transaction-dubbo.xml, 该xml配置设置使用tccJavassist作为dubbo服务的proxy。

     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
             classpath:tcc-transaction-dubbo.xml,classpath*:config/spring/local/appcontext-*.xml
         </param-value>
     </context-param>
    

至此,三个服务的TCC配置完成,分别启动这三个服务。

tcc-transaction-http-sample配置

  1. 配置tcc-transaction-http-capital

    配置生效tcc-transaction 和 transactionRepository和配置tcc-transaction-dubbo-captial类似,在此不做赘述。

    1.1 提供tcc接口

    在CapitalTradeOrderService接口方法入参上加上TransactionContext 将提供的接口标记为tcc接口:

      public interface CapitalTradeOrderService {
         public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto);
     }
    

    1.2 提供tcc实现

    在CapitalTradeOrderServiceImpl实现类的tcc方法上添加@Compensable注解,并提供confirm方法和cancel方法

     @Override
     @Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord")
     @Transactional
     public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {
         ...
     }
    

文档将持续更新中。。。

Clone this wiki locally