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服务跟踪,因此需引入以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
2.2 实现对应的Filter
由于我们是对于每一个请求都进行拦截处理,因此直接实现serlet提供的Filter接口,在doFilter方法中实现业务逻辑
public class SleuthWebTraceFilter implements Filter {
private final Tracer tracer;
public SleuthWebTraceFilter(Tracer tracer) {
this.tracer = tracer;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
//通过tracer.getCurrentSpan().traceIdString()方法获取traceId并放到header中
response.addHeader("X-j-TrackId", this.tracer.getCurrentSpan().traceIdString());
// 允许前端访问该请求头
response.addHeader("Access-Control-Expose-Headers", "X-j-TrackId");
chain.doFilter(servletRequest, response);
}
@Override
public void destroy() {
}
}
doFilter中通过tracer.getCurrentSpan().traceIdString() 来获取通过spring cloud slueth的traceId,并写入到http的header头中,同时允许前端可以访问该请求头,这样子在页面就能达到相应数据。
2.3 实现自动配置
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({Tracer.class})
public class SleuthWebTrackAutoConfigure {
@Bean
public SleuthWebTraceFilter getSleuthWebTraceFilter(Tracer tracer) {
return new SleuthWebTraceFilter(tracer);
}
}
3.使用
只要在项目中引入以下依赖,SpringBoot将会自动注入webtrace-spring-cloud-starter,并在HTTP Response的时候,设置X-J-TrackId,从而打通前端到后端整个请求链路的日志ID。
<dependency>
<groupId>cn.yangyang.starter</groupId>
<artifactId>webtrace-spring-cloud-starter</artifactId>
<version>1.0.0</version>
</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
欢迎关注我的公众号,获取更多文章,并与我交流沟通。





