zipkin——分布式性能追踪日志系统

Posted 落叶飞翔的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zipkin——分布式性能追踪日志系统相关的知识,希望对你有一定的参考价值。


zipkin架构图

包含组件
    collector 收集器
    storage 存储
    api 查询
    webUI 界面

ZipKin数据模型
   Trace:一组代表一次用户请求所包含的spans,其中根span只有一个。
   Span: 一组代表一次HTTP/RPC请求所包含的annotations。
   annotation:包括一个值,时间戳,主机名(留痕迹)。

几个时间
   cs:客户端发起请求,标志Span的开始
   sr:服务端接收到请求,并开始处理内部事务,其中sr - cs则为网络延迟和时钟抖动
   ss:服务端处理完请求,返回响应内容,其中ss - sr则为服务端处理请求耗时
   cr:客户端接收到服务端响应内容,标志着Span的结束,其中cr - ss则为网络延迟和时钟抖动

启动zipkin
    java -jar zipkin-server-2.10.1-exec.jar

Demo


service1

对外服务

@RestController
@Api("service的API接口")
@RequestMapping("/service1")
public class ZipkinController {

@Autowired
   private CloseableHttpClient httpClient;

   @ApiOperation("trace第一步")
@GetMapping("/test")
public String service() throws Exception {
HttpGet get = new HttpGet("http://localhost:8082/service2/test");
       CloseableHttpResponse response = httpClient.execute(get);
       return EntityUtils.toString(response.getEntity(), "utf-8");
   }

}

配置zipkin组件

@Configuration
public class ZipkinConfig {


/**
    * span信息收集器
    * @return
    */
   @Bean
   public SpanCollector spanCollector(){
HttpSpanCollector.Config config = HttpSpanCollector.Config.builder()
//默认false,span在transport之前是否会被gzipped
               .compressionEnabled(false)
.connectTimeout(5000)
.flushInterval(1)
.readTimeout(6000)
.build();
       return HttpSpanCollector.create("http://localhost:9411", config, new EmptySpanCollectorMetricsHandler());
   }


/**
    * 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
    * @param spanCollector
    * @return
    */
   @Bean
   public Brave brave(SpanCollector spanCollector){
//指定serviceName
       Brave.Builder builder = new Brave.Builder("service1");
       builder.spanCollector(spanCollector);
       //采集率
       builder.traceSampler(Sampler.create(1));
       return builder.build();
   }

/**
    * 设置client的(发起请求和获取到服务端返回信息的)拦截器
    * @param brave
    * @return
    */
   @Bean
   public BraveServletFilter braveServletFilter(Brave brave){
BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
       return filter;
   }

/**
    * httpClient客户端,需要clientRequestInterceptor,clientResponseInterceptor分别完成cs和cr操作
    * @param brave
    * @return
    */
   @Bean
   public CloseableHttpClient httpClient(Brave brave) {
CloseableHttpClient httpClient = HttpClients.custom()
.addInterceptorFirst(new BraveHttpRequestInterceptor(brave.clientRequestInterceptor(), new DefaultSpanNameProvider()))
.addInterceptorFirst(new BraveHttpResponseInterceptor(brave.clientResponseInterceptor()))
.build();
       return httpClient;
   }

设置服务名和端口

spring.application.name=service1
server.port=8081

maven依赖

<dependencies>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
     <groupId>io.zipkin.brave</groupId>
     <artifactId>brave-core</artifactId>
     <version>3.9.0</version>
  </dependency>
  <dependency>
     <groupId>io.zipkin.brave</groupId>
     <artifactId>brave-spancollector-http</artifactId>
     <version>3.9.0</version>
  </dependency>
  <dependency>
     <groupId>io.zipkin.brave</groupId>
     <artifactId>brave-web-servlet-filter</artifactId>
     <version>3.9.0</version>
  </dependency>
  <dependency>
     <groupId>io.zipkin.brave</groupId>
     <artifactId>brave-apache-http-interceptors</artifactId>
     <version>3.9.0</version>
  </dependency>
  <dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpclient</artifactId>
  </dependency>
  <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.6.1</version>
  </dependency>
  <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.6.1</version>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
  </dependency>
</dependencies>


service2、service3、service4同上。


zipkin控制台

zipkin——分布式性能追踪日志系统

能从zipkin上直观的看出服务调用依赖关系,以及调用链上每个服务所花费的时间。这样在进行异常跟踪以及服务优化的时候,能简单快速的定位到某个具体服务。


至此zipkin功能测试正常。

以上是关于zipkin——分布式性能追踪日志系统的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈

zipkin链路追踪

链路追踪Sleuth

十springcloud之展示追踪数据 Sleuth+zipkin

zipkin分布式链路追踪系统

快速了解分布式链路追踪系统 zipkin