首先给大家分享的是源码地址
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