Spring Cloud 学习笔记十:搭建微服务工程之整合 Zipkin 进行服务跟踪

目录

整合 Zipkin 进行服务跟踪

Zipkin 数据收集服务

项目集成 Zipkin 发送调用链数据

过滤不想跟踪的请求

用 RabbitMq 代替 Http 发送调用链数据

用 Elasticsearch 存储调用链数据


整合 Zipkin 进行服务跟踪

Zipkin 是 Twitter 的一个开源项目,是一个致力于收集所有服务的监控数据的分布式跟踪系统,它提供了收集数据和查询数据两大接口服务。有了 Zipkin 我们就可以很直观地对调用链进行查看,并且可以很方便地看出服务之间的调用关系以及调用耗费的时间。

 

Zipkin 数据收集服务

部署 Zipkin 需要先下载已经编译好了的 jar 包,下载地址:https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec,然后 java –jar 启动即可。

启动后访问 http://localhost:9411/zipkin/ 就可以看到管理页面了,如图所示:

Spring Cloud 学习笔记十:搭建微服务工程之整合 Zipkin 进行服务跟踪_第1张图片 管理页面

 

项目集成 Zipkin 发送调用链数据

在前面的教程中,我们只是集成了 Spring Cloud Sleuth,然后将跟踪信息输出到日志中。现在,Zipkin 的服务部署好了,需要将链路跟踪的信息发送给 Zipkin 的收集服务。需要在项目中添加依赖,具体代码如下所示:



    org.springframework.cloud
    spring-cloud-starter-zipkin

在属性文件中可以配置 Zipkin 的地址,默认是 http://127.0.0.1:9411,这样才能将跟踪的数据发送到执行的收集服务中。

spring:
  zipkin:
    base-url: http://127.0.0.1:9411

然后我们启动之前的服务、访问接口,就可以看到数据已经能够在 Zipkin 的 Web 页面中了,如图所示:

Spring Cloud 学习笔记十:搭建微服务工程之整合 Zipkin 进行服务跟踪_第2张图片 访问后界面
Spring Cloud 学习笔记十:搭建微服务工程之整合 Zipkin 进行服务跟踪_第3张图片 详细

 

停掉被访问的服务,模拟一下异常情况,通过 Zipkin 的 UI 可以快速发现请求异常的信息,如图所示:

Spring Cloud 学习笔记十:搭建微服务工程之整合 Zipkin 进行服务跟踪_第4张图片 请求失败

 

在实际使用中可能调用了 10 次接口,但是 Zipkin 中只有一条数据,这是因为收集信息是有一定比例的,这并不是 bug。Zipkin 中的数据条数与调用接口次数默认比例是 0.1,当然我们也可以通过配置来修改这个比例值:

spring:
  sleuth:
    sampler:
      #zipkin 抽样比例
      probability: 1.0

之所以有这样的一个配置,是因为在高并发下,如果所有数据都采集,那这个数据量就太大了,采用抽样的做法可以减少一部分数据量,特别是对于 Http 方式去发送采集数据,对性能有很大的影响。

 

过滤不想跟踪的请求

对于某些请求不想开启跟踪,可以通过配置 HttpSampler 来过滤掉,比如 swagger 这些请求等。代码如下所示:

@Component(value = HttpServerSampler.NAME)
public class MyHttpSampler implements SamplerFunction {
    
    @Autowired
    private SkipPatternProvider provider;
    
    @Override
    public Boolean trySample(HttpRequest httpRequest) {
        Pattern pattern = provider.skipPattern();
        String url = httpRequest.url();
        String path = httpRequest.path();
        System.err.println(url);
        System.err.println(path);
        boolean shouldSkip = pattern.matcher(path).matches();
        if (shouldSkip) {
            return false;
        }
        return null;
    }
}

 核心在 trySample 方法中,只要不想跟踪的 URL 直接返回 false 就可以过滤。规则可以自定,本人用了 SkipPatternProvider 来过滤,SkipPatternProvider 中的 skipPattern 配置了很多过滤规则。

/api-docs.*|/autoconfig|/configprops|/dump|/health|/info|/metrics.*|
/mappings|/trace|/swagger.*|.*\.png|.*\.css|.*\.js|.*\.html|/favicon.ico|
/hystrix.stream|/application/.*|/actuator.*|/cloudfoundryapplication

 

用 RabbitMq 代替 Http 发送调用链数据

虽然有基于采样的收集方式,但是数据的发送采用 Http 还是对性能有影响。如果 Zipkin 的服务端重启或者挂掉了,那么将丢失部分采集数据。为了解决这些问题,我们将集成 RabbitMq 来发送采集数据,利用消息队列来提高发送性能,保证数据不丢失。

在服务中增加 RabbitMq 的依赖:

        
        
            org.springframework.boot
            spring-boot-starter-amqp
        

然后在属性文件中增加 RabbitMq 的连接配置:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin
    listener:
      direct:
        retry:
          enabled: true
      simple:
        retry:
          enabled: true 

到这里,集成就已经完成了,记得去掉之前配置的 spring.zipkin.base-url。因为我们现在利用 RabbitMq 来发送数据了,所以这个配置就不需要了。

数据发送方已经采用 RabbitMq 来发送调用链数据,但是 Zipkin 服务并不知道 RabbitMq 的信息,所以我们在启动 Zipkin 服务的时候需要指定 RabbitMq 的信息。

java -jar zipkin-server-2.23.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=admin --zipkin.collector.rabbitmq.password=admin

可以监听下 RabbitMq :

@Component
public class RabbitListener {

    @org.springframework.amqp.rabbit.annotation.RabbitListener(queues = "zipkin")
    private void handleMessage(Message message){
        String messageBody = new String(message.getBody());
        System.out.println("收到了消息是 : " + messageBody);
    }

}

 

用 Elasticsearch 存储调用链数据

目前我们收集的数据都是存在 Zipkin 服务的内存中,服务一重启这些数据就没了,我们需要将这些数据持久化。我们可以将其存储在 MySQL 中,实际使用中数据量可能会比较大,所以 MySQL 并不是一种很好的选择,可以选择用 Elasticsearch 来存储数据,Elasticsearch 在搜索方面有先天的优势。

启动 Zipkin 的时候指定存储类型为 ES,指定 ES 的 URL 信息:

java -jar zipkin-server-2.23.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=admin --zipkin.collector.rabbitmq.password=admin --STORAGE_TYPE=elasticsearch --ES_HOSTS=http://127.0.0.1:9200

重启服务,然后收集一些数据,我们可以通过两种方式来验证数据是否存储到了 Elasticsearch 中。

可以重启 Zipkin 服务,然后看看数据是否还存在,如果存在则证明数据已经是持久化了。

可以通过查看 Elasticsearch 中的数据来确认数据有没有存储成功,访问 Elasticsearch 的地址查看当前所有的索引信息:http://localhost:9200/_cat/indices。

yellow open zipkin-span-2021-02-07     C3qY_2e3TaezuabYubu2Ow 5 1 1085  0 494.8kb 494.8kb

可以看到当前节点下面有哪些索引,如果看到有以 zipkin 开头的就说明索引创建了,接着直接查询这个索引下是否有数据即可认证是否存储成功,访问 http://localhost:9200/索引名称/_search。

 

你可能感兴趣的:(Spring,Cloud,学习笔记,分布式,java,spring,cloud)