【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们定制,而ServerRequestInterceptor和ServerResponseInterceptor是在BraveServletFilter部分直接指定就好了(这在任何client技术下都可以复用)。
实际上,ClientRequestInterceptor和ClientResponseInterceptor也是我们的定制点。
一、代码
基本参考第二十七章 springboot + zipkin(brave-okhttp实现)
1、service1
1.1、pom.xml
<!-- zipkin brave --> <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> <!-- async-http-client --> <dependency> <groupId>com.ning</groupId> <artifactId>async-http-client</artifactId> <version>1.9.31</version> </dependency>
1.2、ZipkinConfig
package com.xxx.service1.zipkin.brave.async; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler; import com.github.kristofa.brave.Sampler; import com.github.kristofa.brave.SpanCollector; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpSpanCollector; import com.github.kristofa.brave.servlet.BraveServletFilter; import com.ning.http.client.AsyncHttpClient; @Configuration public class ZipkinConfig { @Bean public SpanCollector spanCollector() { HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder() .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。 .connectTimeout(5000)//5s,默认10s .flushInterval(1)//1s .readTimeout(6000)//5s,默认60s .build(); return HttpSpanCollector.create("http://localhost:9411", spanConfig, new EmptySpanCollectorMetricsHandler()); } @Bean public Brave brave(SpanCollector spanCollector) { Brave.Builder builder = new Brave.Builder("asyn1 - service1 - 1");//指定serviceName builder.spanCollector(spanCollector); builder.traceSampler(Sampler.create(1));//采集率 return builder.build(); } @Bean public BraveServletFilter braveServletFilter(Brave brave) { /** * 设置sr、ss拦截器 */ return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider()); } @Bean public AsyncHttpClient asyncHttpClient(){ return new AsyncHttpClient(); } }
说明:指定了serviceName:"asyn1 - service1 - 1"
1.3、ZipkinAsyncController
package com.xxx.service1.zipkin.brave.async; import java.net.URI; import java.util.concurrent.Future; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpClientRequest; import com.github.kristofa.brave.http.HttpClientRequestAdapter; import com.github.kristofa.brave.http.HttpClientResponseAdapter; import com.github.kristofa.brave.http.HttpResponse; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.Request; import com.ning.http.client.RequestBuilder; import com.ning.http.client.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api("zipkin brave async api") @RestController @RequestMapping("/zipkin/async/service1") public class ZipkinAsyncController { @Autowired private AsyncHttpClient asyncHttpClient; @Autowired private Brave brave; @ApiOperation("trace第一步") @RequestMapping(value = "/test1", method = RequestMethod.GET) public String myboot() { try { RequestBuilder builder = new RequestBuilder(); String url = "http://localhost:8032/zipkin/async/service2/test2"; builder.setUrl(url); Request request = builder.build(); clientRequestInterceptor(request); Future<Response> response = asyncHttpClient.executeRequest(request); clientResponseInterceptor(response.get()); return response.get().getResponseBody(); } catch (Exception e) { e.printStackTrace(); return ""; } } private void clientRequestInterceptor(Request request) { brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() { @Override public URI getUri() { return URI.create(request.getUrl()); } @Override public String getHttpMethod() { return request.getMethod(); } @Override public void addHeader(String headerKey, String headerValue) { request.getHeaders().add(headerKey, headerValue); } }, new DefaultSpanNameProvider())); } private void clientResponseInterceptor(Response response) { brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() { public int getHttpStatusCode() { return response.getStatusCode(); } })); } }
说明:
- clientRequestInterceptor(com.ning.http.client.Request request)
- 其实就是在做cs
- clientResponseInterceptor(com.ning.http.client.Response response)
- 其实就是在做cr
2、service2
2.1、pom.xml
<!-- zipkin brave --> <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> <!-- async-http-client --> <dependency> <groupId>com.ning</groupId> <artifactId>async-http-client</artifactId> <version>1.9.31</version> </dependency>
2.2、ZipkinConfig
package com.xxx.service1.zipkin.brave.async; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler; import com.github.kristofa.brave.Sampler; import com.github.kristofa.brave.SpanCollector; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpSpanCollector; import com.github.kristofa.brave.servlet.BraveServletFilter; import com.ning.http.client.AsyncHttpClient; @Configuration public class ZipkinConfig { @Bean public SpanCollector spanCollector() { HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder() .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。 .connectTimeout(5000)//5s,默认10s .flushInterval(1)//1s .readTimeout(6000)//5s,默认60s .build(); return HttpSpanCollector.create("http://localhost:9411", spanConfig, new EmptySpanCollectorMetricsHandler()); } @Bean public Brave brave(SpanCollector spanCollector) { Brave.Builder builder = new Brave.Builder("asyn2 - service2 - 2");//指定serviceName builder.spanCollector(spanCollector); builder.traceSampler(Sampler.create(1));//采集率 return builder.build(); } @Bean public BraveServletFilter braveServletFilter(Brave brave) { /** * 设置sr、ss拦截器 */ return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider()); } @Bean public AsyncHttpClient asyncHttpClient(){ return new AsyncHttpClient(); } }
说明:指定了serviceName:"asyn2 - service2 - 2"
2.3、ZipkinAsyncController
package com.xxx.service2.zipkin.brave.async; import java.net.URI; import java.util.concurrent.Future; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpClientRequest; import com.github.kristofa.brave.http.HttpClientRequestAdapter; import com.github.kristofa.brave.http.HttpClientResponseAdapter; import com.github.kristofa.brave.http.HttpResponse; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.Request; import com.ning.http.client.RequestBuilder; import com.ning.http.client.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api("zipkin brave async api") @RestController @RequestMapping("/zipkin/async/service2") public class ZipkinAsyncController { @Autowired private AsyncHttpClient asyncHttpClient; @Autowired private Brave brave; @ApiOperation("trace第2步") @RequestMapping(value = "/test2", method = RequestMethod.GET) public String myboot2() { try { /*****************************serivce3*******************************/ RequestBuilder builder3 = new RequestBuilder(); String url3 = "http://localhost:8033/zipkin/async/service3/test3"; builder3.setUrl(url3); Request request3 = builder3.build(); clientRequestInterceptor(request3); Future<Response> response3 = asyncHttpClient.executeRequest(request3); clientResponseInterceptor(response3.get()); /*****************************serivce4*******************************/ RequestBuilder builder4 = new RequestBuilder(); String url4 = "http://localhost:8034/zipkin/async/service4/test4"; builder4.setUrl(url4); Request request4 = builder4.build(); clientRequestInterceptor(request4); Future<Response> response4 = asyncHttpClient.executeRequest(request4); clientResponseInterceptor(response4.get()); return response3.get().getResponseBody() + "=====" + response4.get().getResponseBody(); } catch (Exception e) { e.printStackTrace(); return ""; } } private void clientRequestInterceptor(Request request) { brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() { @Override public URI getUri() { return URI.create(request.getUrl()); } @Override public String getHttpMethod() { return request.getMethod(); } @Override public void addHeader(String headerKey, String headerValue) { request.getHeaders().add(headerKey, headerValue); } }, new DefaultSpanNameProvider())); } private void clientResponseInterceptor(Response response) { brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() { public int getHttpStatusCode() { return response.getStatusCode(); } })); } }
3、service3
3.1、pom.xml
<!-- zipkin brave --> <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>
3.2、ZipkinConfig
package com.xxx.service3.zipkin.brave.async; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler; import com.github.kristofa.brave.Sampler; import com.github.kristofa.brave.SpanCollector; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpSpanCollector; import com.github.kristofa.brave.servlet.BraveServletFilter; @Configuration public class ZipkinConfig { @Bean public SpanCollector spanCollector() { HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder() .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。 .connectTimeout(5000)//5s,默认10s .flushInterval(1)//1s .readTimeout(6000)//5s,默认60s .build(); return HttpSpanCollector.create("http://localhost:9411", spanConfig, new EmptySpanCollectorMetricsHandler()); } @Bean public Brave brave(SpanCollector spanCollector) { Brave.Builder builder = new Brave.Builder("asyn3 - service3 - 3");//指定serviceName builder.spanCollector(spanCollector); builder.traceSampler(Sampler.create(1));//采集率 return builder.build(); } @Bean public BraveServletFilter braveServletFilter(Brave brave) { /** * 设置sr、ss拦截器 */ return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider()); } }
说明:指定了serviceName:"asyn3 - service3 - 3"
3.3、ZipkinAsyncController
package com.xxx.service3.zipkin.brave.async; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api("zipkin brave async api") @RestController @RequestMapping("/zipkin/async/service3") public class ZipkinAsyncController { @ApiOperation("trace第3步") @RequestMapping(value = "/test3", method = RequestMethod.GET) public String myboot3() { try { return "async - service3"; } catch (Exception e) { e.printStackTrace(); return ""; } } }
4、service4
4.1、pom.xml
<!-- zipkin brave --> <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>
4.2、ZipkinConfig
package com.xxx.service4.zipkin.brave.async; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler; import com.github.kristofa.brave.Sampler; import com.github.kristofa.brave.SpanCollector; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpSpanCollector; import com.github.kristofa.brave.servlet.BraveServletFilter; @Configuration public class ZipkinConfig { @Bean public SpanCollector spanCollector() { HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder() .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。 .connectTimeout(5000)//5s,默认10s .flushInterval(1)//1s .readTimeout(6000)//5s,默认60s .build(); return HttpSpanCollector.create("http://localhost:9411", spanConfig, new EmptySpanCollectorMetricsHandler()); } @Bean public Brave brave(SpanCollector spanCollector) { Brave.Builder builder = new Brave.Builder("asyn4 - service4 - 4");//指定serviceName builder.spanCollector(spanCollector); builder.traceSampler(Sampler.create(1));//采集率 return builder.build(); } @Bean public BraveServletFilter braveServletFilter(Brave brave) { /** * 设置sr、ss拦截器 */ return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(), new DefaultSpanNameProvider()); } }
说明:指定了serviceName:"asyn4 - service4 - 4"
4.3、ZipkinAsyncController
package com.xxx.service4.zipkin.brave.async; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api("zipkin brave async api") @RestController @RequestMapping("/zipkin/async/service4") public class ZipkinAsyncController { @ApiOperation("trace第4步") @RequestMapping(value = "/test4", method = RequestMethod.GET) public String myboot3() { try { return "async - service4"; } catch (Exception e) { e.printStackTrace(); return ""; } } }
二、测试结果
1、依赖关系图:
2、span时间消耗图
3、详情图
点击第4个span,查看详情:
【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)的更多相关文章
- 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- Gradle 1.12用户指南翻译——第二十八章. Jetty 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第二十八章:数组详解(上篇)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- SpringBoot | 第二十八章:监控管理之Spring Boot Admin使用
前言 上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息.但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很 ...
- 第二十七章 springboot + zipkin(brave-okhttp实现)
本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 一.前提 1.zipkin基本知识:附8 zipkin 2.启动zipki ...
- 第十八章 springboot + thymeleaf
代码结构: 1.ThymeleafController package com.xxx.firstboot.web; import org.springframework.stereotype.Con ...
- 第三十八章 springboot+docker(maven)
回顾上一章的整个部署过程: 使用"mvn install"进行打包jar 将jar移动到与Dockerfile文件相同的文件夹下 编写Dockerfile文件 使用"do ...
- 我的学习之路_第二十八章_JQuery 和validator插件
jQuery 利用jQuery进行遍历 js原生: for(var i=0;i>?;i++){ } jQuery: 方式一: 想要遍历的jQuery对象.each(function(index, ...
随机推荐
- 【JMeter】如何优雅的写脚本
cc给发的视频链接: http://v.youku.com/v_show/id_XMzA4Mjg1ODA0MA==.html?spm=a2h3j.8428770.3416059.1 ————————— ...
- CSS分列等高
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SQLCE数据工具(Flyhoward Ltd SDF Viewer)
SDF Viewer sdf数据库创建编辑查看 官方下载地址 http://www.flyhoward.com/Download_SDF_Viewer.aspx 用户名:www.cr173.com注 ...
- 既生list何生tuple
python中list是可以修改的;若要创建一系列不可修改的元素时,就需要tuple. 用 tuple 的好处: 1.tuple 比 list 操作速度快.如果您定义了一个值的常量集,并且唯一要用它做 ...
- [py]django第三方分页器django-pure-pagination实战
第三方分页模块: django-pure-pagination 是基于django的pagination做的一款更好用的分页器 参考 配置django-pure-pagination模块 安装 pip ...
- .Net Core 使用依赖注入
ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的 ...
- 74. Search a 2D Matrix(二分查找,剑指offer 1)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- SQL 中【NULL】和【无】烦躁的问题
很烦躁,烦躁的很,总结一下. 先简单的说下: NULL : 不确定的东西 无 :没有东西 复杂的见下文....... 一 .null值 下面举个最简单的例子,平常工作当中肯定比这个sq ...
- BP神经网络原理详解
转自博客园@编程De: http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html http://blog.sina.com.cn/s/blog ...
- Devenv 命令行开关
Devenv 可用来设置集成开发环境 (IDE) 的各个选项,以及从命令行生成.调试和部署项目.使用这些开关从脚本或 .bat 文件(例如每夜生成的脚本)运行 IDE,或以特定配置启动 IDE. 说明 ...