码迷,mamicode.com
首页 > 其他好文 > 详细

分布式链路追踪器:Sleuth

时间:2020-10-16 10:37:33      阅读:23      评论:0      收藏:0      [点我收藏+]

标签:star   final   group   pos   netflix   one   lazy   避免   如何   

在开始使用Sleuth之前,需要先确定一下我们追踪之后应该如何显示。此处我选择使用zipkin,但由于zipkin与SpringBoot2.x系列不兼容,因此无法在工程中引入一个单独的zipkin组件。通过如下方式启动一个zipkin Docker容器:

docker run -d -p 9411:9411 openzipkin/zipkin

 启动之后,访问:9411/zipkin,可以进入zipkin主页:

技术图片

 

 接下来,为每一个独立的服务引入如下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
 
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

 远端配置文件中加入如下内容:

spring:
  zipkin:
    base-url: http://10.177.48.24:9411/
  sleuth:
    sampler:
      percentage: 1.0

 sampler参数指定了采样率,范围从0.0-1.0。由于是测试环境,因此设置为1.0全采样。如果生产环境并发较高时,需要调低采样率,避免过载。

 

重新启动应用,而后尝试通过网关进行服务调用,在服务控制台可以看到类似输出:

技术图片

 

前面的一串随机字符就是traceId。此时在zipkin中已经可以看到调用链路信息:

技术图片

 

 同样地,可以通过这一串traceId在zipkin中直接查询。

 

更进一步地,我们在Zuul中将traceId放入请求头部,并在接下来的调用链中一直保持,一直到返回客户端,这样,客户端可以凭借traceId直接查找本地调用的链路。此步骤需要实现一个Zuul过滤器:

package com.aac.acoustics.api.platform.zuul.filter;
 
import brave.Tracer;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
 
@Component
public class TraceIdFilter extends ZuulFilter {
 
    private final Tracer tracer;
 
    public TraceIdFilter(Tracer tracer) {
        this.tracer = tracer;
    }
 
    @Override
    public String filterType() {
        return "post";
    }
 
    @Override
    public int filterOrder() {
        return 1;
    }
 
    @Override
    public boolean shouldFilter() {
        return true;
    }
 
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.getResponse().addHeader("scd-trace-id",tracer.currentSpan().context().traceIdString());
        return null;
    }
}

 这样配置之后,再次尝试调用时,在服务返回的响应头中,将存在一个scd-trace-id的属性,其值为traceId:

 技术图片

 

分布式链路追踪器:Sleuth

标签:star   final   group   pos   netflix   one   lazy   避免   如何   

原文地址:https://www.cnblogs.com/liuxiaopen1995/p/13820579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!