赵计刚
每天进步一点点

brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们定制,而ServerRequestInterceptor和ServerResponseInterceptor是在BraveServletFilter部分直接指定就好了(这在任何client技术下都可以复用)。

实际上,ClientRequestInterceptor和ClientResponseInterceptor也是我们的定制点

 

一、代码

基本参考第二十七章 springboot + zipkin(brave-okhttp实现)

1、service1

1.1、pom.xml

 1 <!-- zipkin brave -->
 2         <dependency>
 3             <groupId>io.zipkin.brave</groupId>
 4             <artifactId>brave-core</artifactId>
 5             <version>3.9.0</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>io.zipkin.brave</groupId>
 9             <artifactId>brave-spancollector-http</artifactId>
10             <version>3.9.0</version>
11         </dependency>
12         <dependency>
13             <groupId>io.zipkin.brave</groupId>
14             <artifactId>brave-web-servlet-filter</artifactId>
15             <version>3.9.0</version>
16         </dependency>
17         <!-- async-http-client -->
18         <dependency>
19             <groupId>com.ning</groupId>
20             <artifactId>async-http-client</artifactId>
21             <version>1.9.31</version>
22         </dependency>
View Code

1.2、ZipkinConfig

 1 package com.xxx.service1.zipkin.brave.async;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.github.kristofa.brave.Brave;
 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.servlet.BraveServletFilter;
13 import com.ning.http.client.AsyncHttpClient;
14 
15 @Configuration
16 public class ZipkinConfig {
17     @Bean
18     public SpanCollector spanCollector() {
19         HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
20                                               .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
21                                               .connectTimeout(5000)//5s,默认10s
22                                               .flushInterval(1)//1s
23                                               .readTimeout(6000)//5s,默认60s
24                                               .build();
25         return HttpSpanCollector.create("http://localhost:9411", 
26                                         spanConfig,
27                                         new EmptySpanCollectorMetricsHandler());
28     }
29 
30     @Bean
31     public Brave brave(SpanCollector spanCollector) {
32         Brave.Builder builder = new Brave.Builder("asyn1 - service1 - 1");//指定serviceName
33         builder.spanCollector(spanCollector);
34         builder.traceSampler(Sampler.create(1));//采集率
35         return builder.build();
36     }
37 
38     @Bean
39     public BraveServletFilter braveServletFilter(Brave brave) {
40         /**
41          * 设置sr、ss拦截器
42          */
43         return new BraveServletFilter(brave.serverRequestInterceptor(), 
44                                       brave.serverResponseInterceptor(),
45                                       new DefaultSpanNameProvider());
46     }
47 
48     @Bean
49     public AsyncHttpClient asyncHttpClient(){
50         return new AsyncHttpClient();
51     }
52 }
View Code

说明:指定了serviceName:"asyn1 - service1 - 1"

1.3、ZipkinAsyncController

 1 package com.xxx.service1.zipkin.brave.async;
 2 
 3 import java.net.URI;
 4 import java.util.concurrent.Future;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestMethod;
 9 import org.springframework.web.bind.annotation.RestController;
10 
11 import com.github.kristofa.brave.Brave;
12 import com.github.kristofa.brave.http.DefaultSpanNameProvider;
13 import com.github.kristofa.brave.http.HttpClientRequest;
14 import com.github.kristofa.brave.http.HttpClientRequestAdapter;
15 import com.github.kristofa.brave.http.HttpClientResponseAdapter;
16 import com.github.kristofa.brave.http.HttpResponse;
17 import com.ning.http.client.AsyncHttpClient;
18 import com.ning.http.client.Request;
19 import com.ning.http.client.RequestBuilder;
20 import com.ning.http.client.Response;
21 
22 import io.swagger.annotations.Api;
23 import io.swagger.annotations.ApiOperation;
24 
25 @Api("zipkin brave async api")
26 @RestController
27 @RequestMapping("/zipkin/async/service1")
28 public class ZipkinAsyncController {
29 
30     @Autowired
31     private AsyncHttpClient asyncHttpClient;
32     @Autowired
33     private Brave           brave;
34 
35     @ApiOperation("trace第一步")
36     @RequestMapping(value = "/test1", method = RequestMethod.GET)
37     public String myboot() {
38 
39         try {
40             RequestBuilder builder = new RequestBuilder();
41             String url = "http://localhost:8032/zipkin/async/service2/test2";
42             builder.setUrl(url);
43             Request request = builder.build();
44 
45             clientRequestInterceptor(request);
46             Future<Response> response = asyncHttpClient.executeRequest(request);
47             clientResponseInterceptor(response.get());
48 
49             return response.get().getResponseBody();
50         } catch (Exception e) {
51             e.printStackTrace();
52             return "";
53         }
54     }
55 
56     private void clientRequestInterceptor(Request request) {
57         brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() {
58 
59             @Override
60             public URI getUri() {
61                 return URI.create(request.getUrl());
62             }
63 
64             @Override
65             public String getHttpMethod() {
66                 return request.getMethod();
67             }
68 
69             @Override
70             public void addHeader(String headerKey, String headerValue) {
71                 request.getHeaders().add(headerKey, headerValue);
72             }
73         }, new DefaultSpanNameProvider()));
74     }
75 
76     private void clientResponseInterceptor(Response response) {
77         brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() {
78             public int getHttpStatusCode() {
79                 return response.getStatusCode();
80             }
81         }));
82     }
83 
84 }
View Code

说明:

  • clientRequestInterceptor(com.ning.http.client.Request request)
    • 其实就是在做cs
  • clientResponseInterceptor(com.ning.http.client.Response response)
    • 其实就是在做cr

 

2、service2

2.1、pom.xml

 1 <!-- zipkin brave -->
 2         <dependency>
 3             <groupId>io.zipkin.brave</groupId>
 4             <artifactId>brave-core</artifactId>
 5             <version>3.9.0</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>io.zipkin.brave</groupId>
 9             <artifactId>brave-spancollector-http</artifactId>
10             <version>3.9.0</version>
11         </dependency>
12         <dependency>
13             <groupId>io.zipkin.brave</groupId>
14             <artifactId>brave-web-servlet-filter</artifactId>
15             <version>3.9.0</version>
16         </dependency>
17         <!-- async-http-client -->
18         <dependency>
19             <groupId>com.ning</groupId>
20             <artifactId>async-http-client</artifactId>
21             <version>1.9.31</version>
22         </dependency>
View Code

2.2、ZipkinConfig

 1 package com.xxx.service1.zipkin.brave.async;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.github.kristofa.brave.Brave;
 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.servlet.BraveServletFilter;
13 import com.ning.http.client.AsyncHttpClient;
14 
15 @Configuration
16 public class ZipkinConfig {
17     @Bean
18     public SpanCollector spanCollector() {
19         HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
20                                               .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
21                                               .connectTimeout(5000)//5s,默认10s
22                                               .flushInterval(1)//1s
23                                               .readTimeout(6000)//5s,默认60s
24                                               .build();
25         return HttpSpanCollector.create("http://localhost:9411", 
26                                         spanConfig,
27                                         new EmptySpanCollectorMetricsHandler());
28     }
29 
30     @Bean
31     public Brave brave(SpanCollector spanCollector) {
32         Brave.Builder builder = new Brave.Builder("asyn2 - service2 - 2");//指定serviceName
33         builder.spanCollector(spanCollector);
34         builder.traceSampler(Sampler.create(1));//采集率
35         return builder.build();
36     }
37 
38     @Bean
39     public BraveServletFilter braveServletFilter(Brave brave) {
40         /**
41          * 设置sr、ss拦截器
42          */
43         return new BraveServletFilter(brave.serverRequestInterceptor(), 
44                                       brave.serverResponseInterceptor(),
45                                       new DefaultSpanNameProvider());
46     }
47 
48     @Bean
49     public AsyncHttpClient asyncHttpClient(){
50         return new AsyncHttpClient();
51     }
52 }
View Code

说明:指定了serviceName:"asyn2 - service2 - 2"

2.3、ZipkinAsyncController

 1 package com.xxx.service2.zipkin.brave.async;
 2 
 3 import java.net.URI;
 4 import java.util.concurrent.Future;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestMethod;
 9 import org.springframework.web.bind.annotation.RestController;
10 
11 import com.github.kristofa.brave.Brave;
12 import com.github.kristofa.brave.http.DefaultSpanNameProvider;
13 import com.github.kristofa.brave.http.HttpClientRequest;
14 import com.github.kristofa.brave.http.HttpClientRequestAdapter;
15 import com.github.kristofa.brave.http.HttpClientResponseAdapter;
16 import com.github.kristofa.brave.http.HttpResponse;
17 import com.ning.http.client.AsyncHttpClient;
18 import com.ning.http.client.Request;
19 import com.ning.http.client.RequestBuilder;
20 import com.ning.http.client.Response;
21 
22 import io.swagger.annotations.Api;
23 import io.swagger.annotations.ApiOperation;
24 
25 @Api("zipkin brave async api")
26 @RestController
27 @RequestMapping("/zipkin/async/service2")
28 public class ZipkinAsyncController {
29 
30     @Autowired
31     private AsyncHttpClient asyncHttpClient;
32     @Autowired
33     private Brave           brave;
34 
35     @ApiOperation("trace第2步")
36     @RequestMapping(value = "/test2", method = RequestMethod.GET)
37     public String myboot2() {
38 
39         try {
40             /*****************************serivce3*******************************/
41             RequestBuilder builder3 = new RequestBuilder();
42             String url3 = "http://localhost:8033/zipkin/async/service3/test3";
43             builder3.setUrl(url3);
44             Request request3 = builder3.build();
45 
46             clientRequestInterceptor(request3);
47             Future<Response> response3 = asyncHttpClient.executeRequest(request3);
48             clientResponseInterceptor(response3.get());
49 
50             /*****************************serivce4*******************************/
51             RequestBuilder builder4 = new RequestBuilder();
52             String url4 = "http://localhost:8034/zipkin/async/service4/test4";
53             builder4.setUrl(url4);
54             Request request4 = builder4.build();
55 
56             clientRequestInterceptor(request4);
57             Future<Response> response4 = asyncHttpClient.executeRequest(request4);
58             clientResponseInterceptor(response4.get());
59 
60             return response3.get().getResponseBody() + "=====" + response4.get().getResponseBody();
61         } catch (Exception e) {
62             e.printStackTrace();
63             return "";
64         }
65     }
66 
67     private void clientRequestInterceptor(Request request) {
68         brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() {
69 
70             @Override
71             public URI getUri() {
72                 return URI.create(request.getUrl());
73             }
74 
75             @Override
76             public String getHttpMethod() {
77                 return request.getMethod();
78             }
79 
80             @Override
81             public void addHeader(String headerKey, String headerValue) {
82                 request.getHeaders().add(headerKey, headerValue);
83             }
84         }, new DefaultSpanNameProvider()));
85     }
86 
87     private void clientResponseInterceptor(Response response) {
88         brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() {
89             public int getHttpStatusCode() {
90                 return response.getStatusCode();
91             }
92         }));
93     }
94 
95 }
View Code

 

3、service3

3.1、pom.xml

 1 <!-- zipkin brave -->
 2         <dependency>
 3             <groupId>io.zipkin.brave</groupId>
 4             <artifactId>brave-core</artifactId>
 5             <version>3.9.0</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>io.zipkin.brave</groupId>
 9             <artifactId>brave-spancollector-http</artifactId>
10             <version>3.9.0</version>
11         </dependency>
12         <dependency>
13             <groupId>io.zipkin.brave</groupId>
14             <artifactId>brave-web-servlet-filter</artifactId>
15             <version>3.9.0</version>
16         </dependency>
View Code

3.2、ZipkinConfig

 1 package com.xxx.service3.zipkin.brave.async;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.github.kristofa.brave.Brave;
 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.servlet.BraveServletFilter;
13 
14 @Configuration
15 public class ZipkinConfig {
16     @Bean
17     public SpanCollector spanCollector() {
18         HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
19                                               .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
20                                               .connectTimeout(5000)//5s,默认10s
21                                               .flushInterval(1)//1s
22                                               .readTimeout(6000)//5s,默认60s
23                                               .build();
24         return HttpSpanCollector.create("http://localhost:9411", 
25                                         spanConfig,
26                                         new EmptySpanCollectorMetricsHandler());
27     }
28 
29     @Bean
30     public Brave brave(SpanCollector spanCollector) {
31         Brave.Builder builder = new Brave.Builder("asyn3 - service3 - 3");//指定serviceName
32         builder.spanCollector(spanCollector);
33         builder.traceSampler(Sampler.create(1));//采集率
34         return builder.build();
35     }
36 
37     @Bean
38     public BraveServletFilter braveServletFilter(Brave brave) {
39         /**
40          * 设置sr、ss拦截器
41          */
42         return new BraveServletFilter(brave.serverRequestInterceptor(), 
43                                       brave.serverResponseInterceptor(),
44                                       new DefaultSpanNameProvider());
45     }
46 }
View Code

说明:指定了serviceName:"asyn3 - service3 - 3" 

3.3、ZipkinAsyncController

 1 package com.xxx.service3.zipkin.brave.async;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RequestMethod;
 5 import org.springframework.web.bind.annotation.RestController;
 6 
 7 import io.swagger.annotations.Api;
 8 import io.swagger.annotations.ApiOperation;
 9 
10 @Api("zipkin brave async api")
11 @RestController
12 @RequestMapping("/zipkin/async/service3")
13 public class ZipkinAsyncController {
14 
15     @ApiOperation("trace第3步")
16     @RequestMapping(value = "/test3", method = RequestMethod.GET)
17     public String myboot3() {
18 
19         try {
20             return "async - service3";
21         } catch (Exception e) {
22             e.printStackTrace();
23             return "";
24         }
25     }
26 
27 }
View Code

 

4、service4

4.1、pom.xml

 1 <!-- zipkin brave -->
 2         <dependency>
 3             <groupId>io.zipkin.brave</groupId>
 4             <artifactId>brave-core</artifactId>
 5             <version>3.9.0</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>io.zipkin.brave</groupId>
 9             <artifactId>brave-spancollector-http</artifactId>
10             <version>3.9.0</version>
11         </dependency>
12         <dependency>
13             <groupId>io.zipkin.brave</groupId>
14             <artifactId>brave-web-servlet-filter</artifactId>
15             <version>3.9.0</version>
16         </dependency>
View Code

4.2、ZipkinConfig

 1 package com.xxx.service4.zipkin.brave.async;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.github.kristofa.brave.Brave;
 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.servlet.BraveServletFilter;
13 
14 @Configuration
15 public class ZipkinConfig {
16     @Bean
17     public SpanCollector spanCollector() {
18         HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
19                                               .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
20                                               .connectTimeout(5000)//5s,默认10s
21                                               .flushInterval(1)//1s
22                                               .readTimeout(6000)//5s,默认60s
23                                               .build();
24         return HttpSpanCollector.create("http://localhost:9411", 
25                                         spanConfig,
26                                         new EmptySpanCollectorMetricsHandler());
27     }
28 
29     @Bean
30     public Brave brave(SpanCollector spanCollector) {
31         Brave.Builder builder = new Brave.Builder("asyn4 - service4 - 4");//指定serviceName
32         builder.spanCollector(spanCollector);
33         builder.traceSampler(Sampler.create(1));//采集率
34         return builder.build();
35     }
36 
37     @Bean
38     public BraveServletFilter braveServletFilter(Brave brave) {
39         /**
40          * 设置sr、ss拦截器
41          */
42         return new BraveServletFilter(brave.serverRequestInterceptor(), 
43                                       brave.serverResponseInterceptor(),
44                                       new DefaultSpanNameProvider());
45     }
46 
47 }
View Code

说明:指定了serviceName:"asyn4 - service4 - 4"

4.3、ZipkinAsyncController

 1 package com.xxx.service4.zipkin.brave.async;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RequestMethod;
 5 import org.springframework.web.bind.annotation.RestController;
 6 
 7 import io.swagger.annotations.Api;
 8 import io.swagger.annotations.ApiOperation;
 9 
10 @Api("zipkin brave async api")
11 @RestController
12 @RequestMapping("/zipkin/async/service4")
13 public class ZipkinAsyncController {
14 
15     @ApiOperation("trace第4步")
16     @RequestMapping(value = "/test4", method = RequestMethod.GET)
17     public String myboot3() {
18 
19         try {
20             return "async - service4";
21         } catch (Exception e) {
22             e.printStackTrace();
23             return "";
24         }
25     }
26 
27 }
View Code

 

二、测试结果

1、依赖关系图:

 

2、span时间消耗图

 

3、详情图

点击第4个span,查看详情:

posted on 2016-09-06 22:35  赵计刚  阅读(5871)  评论(2编辑  收藏  举报