一、入门篇:Fescar 支持springcloud微服务

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 支持springcloud微服务_第1张图片

总结

平常比较懒写东西,毕竟是个理科生,突然心血来潮想锻炼下自己的表达能力,顺便记录下自己的点点滴滴,希望对fescar 有兴趣的同学多多交流,不足之处多多见谅。

你可能感兴趣的:(Fescar)