使用Zipkin和Brave实现http服务调用的跟踪,Brave 是用来装备Java程序的类库,提供了面向标准Servlet、Spring MVC、Http Client、JAX RS、Jersey、Resteasy 和 MySQL 等接口的装备能力,可以通过编写简单的配置和代码,让基于这些框架构建的应用可以向 Zipkin 报告数据。同时 Brave 也提供了非常简单且标准化的接口,在以上封装无法满足要求的时候可以方便扩展与定制。

提供四个工程,分别对应四个服务分别是:zipkin1,zipkin2,zipkin3,zipkin4;zipkin1通过httpclient调用zipkin2,然后zipkin2通过httpclient调用zipkin3和zipkin4,形成一个调用链;四个服务都是基于spring-boot来实现,对应的端口分别是8081,8082,8083,8084;

1.公共maven依赖库

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.zipkin.brave</groupId>
  8. <artifactId>brave-core</artifactId>
  9. <version>3.9.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>io.zipkin.brave</groupId>
  13. <artifactId>brave-spancollector-http</artifactId>
  14. <version>3.9.0</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>io.zipkin.brave</groupId>
  18. <artifactId>brave-web-servlet-filter</artifactId>
  19. <version>3.9.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>io.zipkin.brave</groupId>
  23. <artifactId>brave-apache-http-interceptors</artifactId>
  24. <version>3.9.0</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.apache.httpcomponents</groupId>
  28. <artifactId>httpclient</artifactId>
  29. </dependency>
  30. </dependencies>

2.核心类ZipkinBean提供需要使用的Bean

  1. import org.apache.http.impl.client.CloseableHttpClient;
  2. import org.apache.http.impl.client.HttpClients;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import com.github.kristofa.brave.Brave;
  6. import com.github.kristofa.brave.Brave.Builder;
  7. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  8. import com.github.kristofa.brave.Sampler;
  9. import com.github.kristofa.brave.SpanCollector;
  10. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  11. import com.github.kristofa.brave.http.HttpSpanCollector;
  12. import com.github.kristofa.brave.http.HttpSpanCollector.Config;
  13. import com.github.kristofa.brave.httpclient.BraveHttpRequestInterceptor;
  14. import com.github.kristofa.brave.httpclient.BraveHttpResponseInterceptor;
  15. import com.github.kristofa.brave.servlet.BraveServletFilter;
  16. @Configuration
  17. public class ZipkinBean {
  18. /**
  19. * 配置收集器
  20. *
  21. * @return
  22. */
  23. @Bean
  24. public SpanCollector spanCollector() {
  25. Config config = HttpSpanCollector.Config.builder().compressionEnabled(false).connectTimeout(5000)
  26. .flushInterval(1).readTimeout(6000).build();
  27. return HttpSpanCollector.create("http://192.168.237.128:9411", config, new EmptySpanCollectorMetricsHandler());
  28. }
  29. /**
  30. * Brave各工具类的封装
  31. *
  32. * @param spanCollector
  33. * @return
  34. */
  35. @Bean
  36. public Brave brave(SpanCollector spanCollector) {
  37. Builder builder = new Builder("service1");// 指定serviceName
  38. builder.spanCollector(spanCollector);
  39. builder.traceSampler(Sampler.create(1));// 采集率
  40. return builder.build();
  41. }
  42. /**
  43. * 拦截器,需要serverRequestInterceptor,serverResponseInterceptor 分别完成sr和ss操作
  44. *
  45. * @param brave
  46. * @return
  47. */
  48. @Bean
  49. public BraveServletFilter braveServletFilter(Brave brave) {
  50. return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(),
  51. new DefaultSpanNameProvider());
  52. }
  53. /**
  54. * httpClient客户端,需要clientRequestInterceptor,clientResponseInterceptor分别完成cs和cr操作
  55. *
  56. * @param brave
  57. * @return
  58. */
  59. @Bean
  60. public CloseableHttpClient httpClient(Brave brave) {
  61. CloseableHttpClient httpclient = HttpClients.custom()
  62. .addInterceptorFirst(new BraveHttpRequestInterceptor(brave.clientRequestInterceptor(),
  63. new DefaultSpanNameProvider()))
  64. .addInterceptorFirst(new BraveHttpResponseInterceptor(brave.clientResponseInterceptor())).build();
  65. return httpclient;
  66. }
  67. }

3.核心类ZipkinController对外接口

  1. @RestController
  2. public class ZipkinController {
  3. @Autowired
  4. private CloseableHttpClient httpClient;
  5. @GetMapping("/service1")
  6. public String service() throws Exception {
  7. Thread.sleep(100);
  8. HttpGet get = new HttpGet("http://localhost:8082/service2");
  9. CloseableHttpResponse response = httpClient.execute(get);
  10. return EntityUtils.toString(response.getEntity(), "utf-8");
  11. }
  12. }

分别启动四个服务,然后浏览器访问:http://localhost:8081/service1,正常调用结果返回:

  1. service3 service4

可以观察zipkin web ui,查看服务的调用链:

Zipkin和Brave实现http服务调用的跟踪的更多相关文章

  1. 调用链系列二、Zipkin 和 Brave 实现(springmvc、RestTemplate)服务调用跟踪

    Brave介绍 1.Brave简介 Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet.Spring MVC.Http Client.JAX RS.Jersey.Resteas ...

  2. zipkin微服务调用链分析

    1.zipkin的作用 在微服务架构下,一个http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作, 如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价 ...

  3. Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin

    前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...

  4. zipkin微服务调用链分析(python)

    一,概述 zipkin的作用 在微服务架构下,一个http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作,如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很 ...

  5. 调用链系列一、Zipkin架构介绍、Springboot集承(springmvc,HttpClient)调用链跟踪、Zipkin UI详解

    1.Zipkin是什么 Zipkin分布式跟踪系统:它可以帮助收集时间数据,解决在microservice架构下的延迟问题:它管理这些数据的收集和查找:Zipkin的设计是基于谷歌的Google Da ...

  6. 微服务之分布式跟踪系统(springboot+zipkin+mysql)

    通过上一节<微服务之分布式跟踪系统(springboot+zipkin)>我们简单熟悉了zipkin的使用,但是收集的数据都保存在内存中重启后数据丢失,不过zipkin的Storage除了 ...

  7. zipkin之brave

    brave是同步收集信息,及计算调用时间,但是异步发送日志信息给zipkin:所以很多时候你无法在第一时间获取日志数据可能需要等一会.另外在写一个demo的时候,因为最后睡了1秒,经常会发现丢了一些日 ...

  8. 使用zipkin2在SpringCloud2.0环境下追踪服务调用情况

    1.目的: 使用zipkin2.0在Spring Cloud 2.0环境下,追踪服务调用情况. 2.所需组件: zipkin2.0,Spring Cloud 2.0,Eureka Server,Eur ...

  9. 手把手教你学Dapr - 4. 服务调用

    上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...

随机推荐

  1. 如何解决VMware 12 安装Ubuntu 16.04时无网络连接问题

    刚安装玩Ubuntu,打开后上网没有网络连接 ,点击右上角的数据连接,显示已经启动联网,但是用火狐还是无法上网: 解决方法如下: 先查看虚拟机的网络适配器:点击虚拟机左上角的编辑,里面有个网络适配器 ...

  2. C语言---辗转相除法 HDU 2503

    Problem Description 给你2个分数,求他们的和,并要求和为最简形式. Input 输入首先包含一个正整数T(T < =1000),表示有T组测试数据,然后是T行数据,每行包含四 ...

  3. JSM的topic和queue的区别

    在JMS(Java消息服务)中,Topic实现publish和subscribe语义.一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个 subscriber(电脑词汇中解释为“用户 ...

  4. python django day 3 页面,自动 跳转,参数传递

    zqxt_views/urls.pypath('', calc_views.index, name='home'), calc/views.pydef index(request): return r ...

  5. Centos6.8 搭建Tomcat服务器

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,是一个可以提供web服务同时也支持Servlet的JSP服务器. ...

  6. day05 Spring中自定义注解的用处-之获取自定义的Servie

    PS: 在RPC远程调用中,想要获取自定义的service的方法,就得自定义标签遍历拿到方法 PS:在spring中,两个最核心的 概念是aop和ioc,aop其实就是动态代理. ioc 就是解决对象 ...

  7. 剑指offer-在数组中查找两个数,是的他们的和正好是S(一次性跑通)(时间复杂度还可以降低)

    /*对于一个递增的序列,存在2个数字的和相等,要想这2个数字的乘积最小,则这2个数字的距离最远*/ /*思想:j指向最后一个元素,然后i从前扫描看sum-a[j]在这个序列中吗?若不在j--*/ im ...

  8. Centos7安装32位库用来安装32位软件程序

    打算在centos7上安装一个远程控制软件,发现teamviewer只有centos的32位版本,试着安装了一下,各种报错,尝试多次无果.于是试着用向日葵远程控制软件,也报错,貌似也是只支持32位. ...

  9. re正则匹配使用

    print(result.span()) #输入字符串的范围 如果在匹配语句中有括号,group(1)就是提取第一个括号的内容,以此类推. 扩展思考:如果要从文本中匹配出目标字符串可以使用括号加gro ...

  10. Python问题汇总

    1.dict is not callable tree是一个字典类型. tree("left") -> tree["left"]   2.list ind ...