暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringCloud自定义starter实现web服务跟踪

程序员小阳的代码人生 2018-04-03
1105

1.前言

在微服务系统中,一个来自用户页面的搜索请求,请求先达到前端系统A(如前端界面),然后通过远程调用,达到系统的中间件B、C(如负载均衡、网关等),最后达到后端服务D、E,后端经过一系列的业务逻辑计算最后将数据返回给用户。对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪。 在前面的文章我已经为大家讲述了如何在Spring Cloud Sleuth中集成Zipkin,本文主要为大家讲解如何在web页面上植入traceId来达到根据traceId去ELK等日志系统查看相关跟踪。

2.具体实现

由于这一功能性的需求,对于每一个面向展现web的页面都有类似web服务跟踪的需求,因此考虑做一个starter,业务系统只需要引用webtrace-spring-cloud-starter就可以实现集成这个功能。

2.1引用相关pom

由于是基于spring cloud的web服务跟踪,因此需引入以下依赖

  1. <dependency>

  2.    <groupId>org.springframework.cloud</groupId>

  3.    <artifactId>spring-cloud-starter-sleuth</artifactId>

  4.    <version>1.2.1.RELEASE</version>

  5. </dependency>


  6. <dependency>

  7.    <groupId>javax.servlet</groupId>

  8.    <artifactId>javax.servlet-api</artifactId>

  9.    <version>3.1.0</version>

  10. </dependency>

2.2 实现对应的Filter

由于我们是对于每一个请求都进行拦截处理,因此直接实现serlet提供的Filter接口,在doFilter方法中实现业务逻辑

  1. public class SleuthWebTraceFilter implements Filter {


  2.    private final Tracer tracer;


  3.    public SleuthWebTraceFilter(Tracer tracer) {

  4.        this.tracer = tracer;

  5.    }


  6.    @Override

  7.    public void init(FilterConfig filterConfig) throws ServletException {


  8.    }


  9.    @Override

  10.    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

  11.        HttpServletResponse response = (HttpServletResponse) servletResponse;

  12.        //通过tracer.getCurrentSpan().traceIdString()方法获取traceId并放到header中

  13.        response.addHeader("X-j-TrackId", this.tracer.getCurrentSpan().traceIdString());

  14.        // 允许前端访问该请求头

  15.        response.addHeader("Access-Control-Expose-Headers", "X-j-TrackId");

  16.        chain.doFilter(servletRequest, response);

  17.    }


  18.    @Override

  19.    public void destroy() {


  20.    }

  21. }

doFilter中通过tracer.getCurrentSpan().traceIdString() 来获取通过spring cloud slueth的traceId,并写入到http的header头中,同时允许前端可以访问该请求头,这样子在页面就能达到相应数据。

2.3 实现自动配置

  1. @Configuration

  2. @EnableConfigurationProperties

  3. @ConditionalOnClass({Tracer.class})

  4. public class SleuthWebTrackAutoConfigure {



  5.    @Bean

  6.    public SleuthWebTraceFilter getSleuthWebTraceFilter(Tracer tracer) {

  7.        return new SleuthWebTraceFilter(tracer);

  8.    }

  9. }

3.使用

只要在项目中引入以下依赖,SpringBoot将会自动注入webtrace-spring-cloud-starter,并在HTTP Response的时候,设置X-J-TrackId,从而打通前端到后端整个请求链路的日志ID。

  1. <dependency>

  2.   <groupId>cn.yangyang.starter</groupId>

  3.   <artifactId>webtrace-spring-cloud-starter</artifactId>

  4.   <version>1.0.0</version>

  5. </dependency>

相关源码: 码云:https://gitee.com/shunyang/springcloud-starter/tree/master/webtrace-spring-cloud-starter github:https://github.com/shunyang/springcloud-starter/tree/master/webtrace-spring-cloud-starter


欢迎关注我的公众号,获取更多文章,并与我交流沟通。


文章转载自程序员小阳的代码人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论