Fescar 支持springcloud微服务
Fescar是阿里巴巴开源的分布式事务中间件,以高效并且对业务 0 侵入的方式,解决 微服务场景下面临的分布式事务问题。
fescar基础介绍就不多说了,大家具体想了解fescar的原理、版本规划等可跳转以下地址
官方介绍地址:https://github.com/alibaba/fescar/wiki/概览
源码地址:https://github.com/alibaba/fescar
目前fescar最新版本是0.2.1,暂时不支持springcloud微服务,要等到0.5.0版本才支持。其实只要解决XID在服务调用间传递就能够支持springcloud微服务,所以可以尝试一下
XID在springcloud传递思路
springcloud我这边主要是通过feignclient进行服务间调用,那就是在每次请求时候将XID放在请求头里面进行传递就OK了,这是最简单最原始方法,但是这样是违背fescar对业务0侵入原则,这时候就很容易想到对请求进行拦截,feign有个接口RequestInterceptor,通过实现这个接口可以对每次请求设置XID参数,这样子就解决了XID在服务间传递。
XID传递到下个服务要考虑到存储到RootContext中,我这里通过过滤器进行处理
具体代码实现
XID传递代码
public class FeignBasicRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("feign request XID:" + RootContext.getXID());
requestTemplate.header("fescar-XID", RootContext.getXID());
}
}
过滤器XID存储代码
public class FescarXidFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String xid = RootContext.getXID();
String restXid = request.getHeader("fescar-XID");
boolean bind = false;
if(StringUtils.isBlank(xid)&&StringUtils.isNotBlank(restXid)){
RootContext.bind(restXid);
bind = true;
}
try{
filterChain.doFilter(request, response);
} finally {
if (bind) {
RootContext.unbind();
}
}
}
}
在配置中定义下这两个bean
@Configuration
public class FescarConfig {
@Bean
public RequestInterceptor requestInterceptor(){
return new FeignBasicRequestInterceptor();
}
@Bean
public FescarXidFilter fescarXidFilter(){
return new FescarXidFilter();
}
}
很简单的代码就这样解决xid在springcloud服务传递
遇到问题
在开发中遇到了几个问题:
1、使用jdbcTemplate时候,一直无法执行sql,后来才发现是我的druid版本太低了,升级到demo中druid版本就可以了
2、mybatis支持,其实跟使用jdbcTemplate原理是一样的,都是需要在数据源使用fescar数据源代理,否则sql脚本执行时候就会走默认数据源代理
总结
平常比较懒写东西,毕竟是个理科生,突然心血来潮想锻炼下自己的表达能力,顺便记录下自己的点点滴滴,希望对fescar 有兴趣的同学多多交流,不足之处多多见谅。