Fescar分布式全局事务探索——结合springcloud做的新demo样例

首先给大家分享的是源码地址

https://github.com/spring-cloud-incubator/spring-cloud-alibaba(整合其他的)

https://github.com/alibaba/fescar(单独的源码)

先大致按readme讲下:fescar主要是解决微服务之间关于全局事务问题而设计出来的解决方案

废话不多说,直接开整!

首先按照官方样例(在上面地址中你能找到快速开始文档),我建议的步骤如下:

1.下载fescar-server(一个基于netty的通信服务器,这个将在下一章仔细讲)

2.准备一个数据库,创建表

上面工作准备好了,基本就是差不多完成了,现在开始我们自己的搭建

第一步:创建一个简单的springboot项目,引入cloud服务,jdbc服务,fegin服务,配置文件如下(版本基于parent2以上自我控制)

<!-- 提供基础服务 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <scope>provided</scope>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
    <!--<optional>true</optional>-->
</dependency>

第二步:将项目拆分成3个,我这里命名test2,test3,test4。test2作为业务服务需要引进上述配置,还需要引入fescar所需jar

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-fescar</artifactId>
    <version>0.2.2.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fescar</groupId>
    <artifactId>fescar-core</artifactId>
    <version>0.2.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fescar</groupId>
    <artifactId>fescar-common</artifactId>
    <version>0.2.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fescar</groupId>
    <artifactId>fescar-spring</artifactId>
    <version>0.2.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fescar</groupId>
    <artifactId>fescar-rm-datasource</artifactId>
    <version>0.2.3</version>
</dependency>

test2中参考官网写一个简单的rest接口test3,主要加上这个全局事务控制注解

@GlobalTransactional(timeoutMills = 300000, name = "test")

第三步:创建fegin远程调用接口

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 作为订单接口服务
 * @author zhouxl
 */
@FeignClient(value = "order", url = "http://127.0.0.1:8000",fallback = Test3Fallback.class)
public interface test3 {

        @RequestMapping(path = "/order", method = RequestMethod.POST)
        String order(@RequestParam("userId") String userId,
                     @RequestParam("commodityCode") String commodityCode,
                     @RequestParam("orderCount") int orderCount);

}

第四步:编写Fallback实现类

 

import org.springframework.stereotype.Component;

@Component
public class Test3Fallback implements test3 {

    private static final String SUCCESS = "SUCCESS";
    private static final String FAIL = "FAIL";
    @Override
    public String order(String userId, String commodityCode, int orderCount) {
        return FAIL;
    }
}

相同方法创建另外一个接口test,改下URL;test3作为订单业务服务,test4作为商品业务服务

 

第五步:可以参考官网样例也可以不参考在test3(业务服务),test4(商品服务)写一个rest接口

第6步:

   创建一个euark注册中心(不会创建的小伙伴可以看我之前写的cloud服务文档或者参考其他资料)

  依次启动fescar-server服务,eurka服务,test2,3,4

   启动后访问localhost:1001,说明注册中心注册好了test2,3,4这3个服务

 

上面很多步骤官网都有的,但如果此时你发送http调用请求的话看控制台会报错,为什么呢?

仔细观察输出日志发现,server服务没有成功将几个服务注册进去,当时我是想肯定和配置有关,于是找到demo下模板样例,发现多了几个文件

 

仔细看了下文件,幸好之前ELK给我的启发,这不就是类似logstask的配置吗(后面会在fescar-server中具体讲到)

先看file(加粗是我手动 更改的部分,没有更改分组,只改了服务名称):

transport {
  # tcp udt unix-domain-socket
  type = "TCP"
  #NIO NATIVE
  server = "NIO"
  #enable heartbeat
  heartbeat = true
  #thread factory for netty
  thread-factory {
    boss-thread-prefix = "NettyBoss"
    worker-thread-prefix = "NettyServerNIOWorker"
    server-executor-thread-prefix = "NettyServerBizHandler"
    share-boss-worker = false
    client-selector-thread-prefix = "NettyClientSelector"
    client-selector-thread-size = 1
    client-worker-thread-prefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    boss-thread-size = 1
    #auto default pin or 8
    worker-thread-size = 8
  }
}
service {
  #vgroup->rgroup
  #vgroup_mapping.business-service-fescar-service-group = "localRgroup"
  vgroup_mapping.order-fescar-service-group = "localRgroup"
  #only support single node
  localRgroup.grouplist = "127.0.0.1:8091"
  #degrade current not support
  enableDegrade = false
  #disable
  disable = false
}

client {
  async.commit.buffer.limit = 10000
  lock {
    retry.internal = 10
    retry.times = 30
  }
}

至于注册的配置文件,demo不想弄复杂没用

然后重新启动,你就会发现server会了正确信息提示(test3,test4也需要更改项目服务名称配置):

一切准备好了,开始测试!原始数据库数据如下

发送http到test2的全局事务接口后,成功结果如下

然后在order或者商品故意处理失败(result等于fale),继续调用接口:如下信息

test2

test3,test4,无报错异常,server无异常,数据库如下:

至此,测试完全正确,至于更多的源码分析,,下一章将深入讲讲这个server服务

测试源码git地址

https://github.com/zhou6675021/Fescar_demo 

 

 

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值