经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
SpringBoot2.0 ZipKin示例代码
来源:jb51  时间:2018/11/12 10:07:13  对本文有异议

Zipkin是一种分布式跟踪系统。它有助于收集解决微服务架构中延迟问题所需的时序数据。它管理这些数据的收集和查找。Zipkin的设计基于 Google Dapper论文。

应用程序用于向Zipkin报告时间数据。Zipkin用户界面还提供了一个依赖关系图,显示每个应用程序有多少跟踪请求。如果您正在解决延迟问题或错误问题,则可以根据应用程序,跟踪长度,注释或时间戳过滤或排序所有跟踪。选择跟踪后,您可以看到每个跨度所需的总跟踪时间百分比,从而可以识别问题应用程序。

这是翻译过来的原意,自己在这里想如果有个调用链,我们自己该怎么实现。要去质疑任何代码。

官方流程图:最关键的是Transport这个地方,通过几种方式传输给Conllector。如何在这里支持多种协议,有兴趣的可以进去看看源码。


开始示例,在这里通过一个项目调用不同的方法来进行测试。

先下载Zipkin的web UI,通过java -jar zipkin.jar执行


项目结构:


pom.xml

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  6. <!-- zipkin-->
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-core</artifactId>
  10. <version>3.10.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.zipkin.brave</groupId>
  14. <artifactId>brave-spancollector-http</artifactId>
  15. <version>3.10.0</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>io.zipkin.brave</groupId>
  19. <artifactId>brave-web-servlet-filter</artifactId>
  20. <version>3.10.0</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>io.zipkin.brave</groupId>
  24. <artifactId>brave-okhttp</artifactId>
  25. <version>3.10.0</version>
  26. </dependency>
  27. <!-- zipkin-->

application.properties

  1. server.port=9000
  2.  
  3. ##########请求的项目名##########
  4. server.servlet.context-path=/zipkinTest
  5.  
  6.  
  7. ##########zipKin################
  8. zipkin.serviceName=zipkin-test
  9. zipkin.url=http://localhost:9411
  10. zipkin.connectTimeout=6000
  11. zipkin.readTimeout=6000
  12. zipkin.flushInterval=1
  13. zipkin.compressionEnabled=true
  • server.port 访问端口号
  • server.servlet.context-path 访问项目名
  • zipkin.serviceName 服务名
  • zipkin.url  Zipkin的web ui访问地址
  • zipkin.connectTimeout 连接时间
  • zipkin.readTimeout 读数据时间
  • zipkin.flushInterval 采集率
  • zipkin.compressionEnabled 是否压缩

ZipkinProperties.java

  1. package com.cms.zipkin;
  2.  
  3. import com.github.kristofa.brave.Brave;
  4. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  5. import com.github.kristofa.brave.Sampler;
  6. import com.github.kristofa.brave.SpanCollector;
  7. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  8. import static com.github.kristofa.brave.Brave.Builder;
  9. import static com.github.kristofa.brave.http.HttpSpanCollector.Config;
  10. import static com.github.kristofa.brave.http.HttpSpanCollector.create;
  11. import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
  12. import com.github.kristofa.brave.servlet.BraveServletFilter;
  13. import lombok.Data;
  14. import okhttp3.OkHttpClient;
  15. import org.springframework.boot.context.properties.ConfigurationProperties;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18.  
  19. /**
  20. * @program: zjsz-user
  21. * @description: Zipkin配置
  22. * @author: Mr.Yang
  23. * @create: 2018-07-03 21:58
  24. **/
  25. @Data
  26. @Configuration
  27. @ConfigurationProperties(prefix = ZipkinProperties.ZIPKIN_PREFIX)
  28. public class ZipkinProperties {
  29.  
  30. public static final String ZIPKIN_PREFIX = "zipkin";
  31.  
  32. /**
  33. * 服务名称
  34. */
  35. private String serviceName;
  36.  
  37. /**
  38. * zipkin地址
  39. */
  40. private String url;
  41.  
  42. /**
  43. * 连接时间
  44. */
  45. private int connectTimeout;
  46.  
  47. /**
  48. * 读取时间
  49. */
  50. private int readTimeout;
  51.  
  52. /**
  53. * 每间隔多少秒执行一次Span信息上传
  54. */
  55. private int flushInterval;
  56.  
  57. /**
  58. * 是否启动压缩
  59. */
  60. private boolean compressionEnabled;
  61.  
  62. /**
  63. * @Description: span(一次请求信息或者一次链路调用)信息收集器
  64. * @Param:
  65. * @return: SpanCollector 控制器
  66. * @Author: Mr.Yang
  67. * @Date: 2018/7/3 0002
  68. */
  69. @Bean
  70. public SpanCollector spanCollector() {
  71. Config config = Config.builder()
  72. // 默认false,span在transport之前是否会被gzipped
  73. .compressionEnabled(compressionEnabled)
  74. .connectTimeout(connectTimeout)
  75. .flushInterval(flushInterval)
  76. .readTimeout(readTimeout)
  77. .build();
  78. return create(url, config, new EmptySpanCollectorMetricsHandler());
  79. }
  80.  
  81. /**
  82. * @Description: 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
  83. * @Param:
  84. * @return:
  85. * @Author: Mr.Yang
  86. * @Date: 2018/7/3 0002
  87. */
  88. @Bean
  89. public Brave brave(SpanCollector spanCollector) {
  90. //调用服务的名称
  91. Builder builder = new Builder(serviceName);
  92. builder.spanCollector(spanCollector);
  93. //采集率
  94. builder.traceSampler(Sampler.ALWAYS_SAMPLE);
  95. return builder.build();
  96. }
  97.  
  98.  
  99. /**
  100. * @Description: 设置server的(服务端收到请求和服务端完成处理,并将结果发送给客户端)过滤器
  101. * @Param:
  102. * @return: 过滤器
  103. * @Author: Mr.Yang
  104. * @Date: 2018/7/3 0002
  105. */
  106. @Bean
  107. public BraveServletFilter braveServletFilter(Brave brave) {
  108. BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),
  109. brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
  110. return filter;
  111. }
  112.  
  113. /**
  114. * @Description: 设置client的(发起请求和获取到服务端返回信息)拦截器
  115. * @Param:
  116. * @return: OkHttpClient 返回请求实例
  117. * @Author: Mr.Yang
  118. * @Date: 2018/7/3 0002
  119. */
  120. @Bean
  121. public OkHttpClient okHttpClient(Brave brave) {
  122. OkHttpClient httpClient = new OkHttpClient.Builder()
  123. .addInterceptor(new BraveOkHttpRequestResponseInterceptor(
  124. brave.clientRequestInterceptor(),
  125. brave.clientResponseInterceptor(),
  126. new DefaultSpanNameProvider())).build();
  127. return httpClient;
  128. }
  129. }

ZipkinBraveController1 

  1. package com.cms.contorller;
  2.  
  3. import okhttp3.OkHttpClient;
  4. import okhttp3.Request;
  5. import okhttp3.Response;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. /**
  11. * @program: zjsz-user
  12. * @description: 服务一
  13. * @author: Mr.Yang
  14. * @create: 2018-07-03 21:58
  15. **/
  16. @RestController
  17. @RequestMapping("server1")
  18. public class ZipkinBraveController1 {
  19.  
  20.  
  21. @Autowired
  22. private OkHttpClient client;
  23.  
  24. /**
  25. * @Description: 第一步调用
  26. * @Param:
  27. * @return: 字符串
  28. * @Author: Mr.Yang
  29. * @Date: 2018/7/3
  30. */
  31. @RequestMapping("/zipkin")
  32. public String service1() throws Exception {
  33. Thread.sleep(100);
  34. Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server2/zipkin").build();
  35. Response response = client.newCall(request).execute();
  36. return response.body().string();
  37. }
  38.  
  39. }

ZipkinBraveController2

  1. package com.cms.contorller;
  2.  
  3. import okhttp3.OkHttpClient;
  4. import okhttp3.Request;
  5. import okhttp3.Response;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. /**
  11. * @program: zjsz-user
  12. * @description: 服务二
  13. * @author: Mr.Yang
  14. * @create: 2018-07-03 21:58
  15. **/
  16. @RestController
  17. @RequestMapping("server2")
  18. public class ZipkinBraveController2 {
  19.  
  20. @Autowired
  21. private OkHttpClient client;
  22.  
  23. /**
  24. * @Description: 第二步调用
  25. * @Param:
  26. * @return: 字符串
  27. * @Author: Mr.Yang
  28. * @Date: 2018/7/3
  29. */
  30. @RequestMapping("/zipkin")
  31. public String service1() throws Exception {
  32. Thread.sleep(100);
  33. Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server3/zipkin").build();
  34. Response response = client.newCall(request).execute();
  35. return response.body().string();
  36. }
  37.  
  38. }

ZipkinBraveController3

  1. package com.cms.contorller;
  2.  
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5.  
  6.  
  7. /**
  8. * @program: zjsz-user
  9. * @description: 服务三
  10. * @author: Mr.Yang
  11. * @create: 2018-07-03 21:58
  12. **/
  13. @RestController
  14. @RequestMapping("server3")
  15. public class ZipkinBraveController3 {
  16.  
  17. /**
  18. * @Description: 第三步调用
  19. * @Param:
  20. * @return: 字符串
  21. * @Author: Mr.Yang
  22. * @Date: 2018/7/3
  23. */
  24. @RequestMapping("/zipkin")
  25. public String service1() throws Exception {
  26. Thread.sleep(200);
  27.  
  28. return "你好,欢迎进入Zipkin的世界";
  29. }
  30.  
  31. }

项目启动后,访问http://localhost:9000/zipkinTest/server1/zipkin 就可以看到

你好,欢迎进入Zipkin的世界

我们通过http://localhost:9411/zipkin 查看zipkin的web UI


查看每条调用链的详情


后面还会讲关于zipkin将数据整合到Mysql、Elasticsearch中去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号