From cdef8e8780d319e60dd6166e831958fc97c936a4 Mon Sep 17 00:00:00 2001 From: YunaiV <> Date: Tue, 7 Jan 2020 00:32:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20zipkin=20=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- lab-40/lab-40-demo/pom.xml | 69 ++++++++++++ .../lab40/zipkindemo/Application.java | 13 +++ .../lab40/zipkindemo/Application2.java | 15 +++ .../config/SpringMvcConfiguration.java | 25 +++++ .../config/ZipkinConfiguration.java | 103 ++++++++++++++++++ .../zipkindemo/controller/DemoController.java | 32 ++++++ .../src/main/resources/application.yaml | 3 + lab-40/pom.xml | 19 ++++ pom.xml | 1 + 10 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 lab-40/lab-40-demo/pom.xml create mode 100644 lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java create mode 100644 lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java create mode 100644 lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java create mode 100644 lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java create mode 100644 lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java create mode 100644 lab-40/lab-40-demo/src/main/resources/application.yaml create mode 100644 lab-40/pom.xml diff --git a/README.md b/README.md index 21965167..44801002 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ ## 链路追踪 -* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37) 。 +* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-39) 。 * [《芋道 Spring Boot 链路追踪 Zipkin 入门》](http://www.iocoder.cn/Spring-Boot/Zipkin/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。 * [《芋道 Spring Boot 链路追踪 Pinpoint 入门》](http://www.iocoder.cn/Spring-Boot/Pinpoint/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。 diff --git a/lab-40/lab-40-demo/pom.xml b/lab-40/lab-40-demo/pom.xml new file mode 100644 index 00000000..6f5de8b9 --- /dev/null +++ b/lab-40/lab-40-demo/pom.xml @@ -0,0 +1,69 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-demo + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.apache.httpcomponents + httpclient + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + io.zipkin.brave + brave-instrumentation-httpclient + + + + + io.zipkin.brave + brave-context-slf4j + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java new file mode 100644 index 00000000..e2a5f21f --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java new file mode 100644 index 00000000..f4d13487 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java @@ -0,0 +1,15 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application2 { + + public static void main(String[] args) { + System.setProperty("spring.application.name", "demo-application-02"); + System.setProperty("server.port", "8079"); + SpringApplication.run(Application2.class, args); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 00000000..b56fd2d0 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 00000000..b222d480 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,103 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.httpclient.TracingHttpClientBuilder; +import brave.propagation.B3Propagation; +import brave.propagation.ExtraFieldPropagation; +import brave.servlet.TracingFilter; +import org.apache.http.impl.client.CloseableHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .propagationFactory(ExtraFieldPropagation.newFactory(B3Propagation.FACTORY, "user-name")) +// .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() +// .addScopeDecorator(MDCScopeDecorator.create()) // puts trace IDs into logs +// .build() +// ) + .spanReporter(spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + + // ==================== HttpClient 相关 ==================== + + @Bean + public RestTemplateCustomizer useTracedHttpClient(HttpTracing httpTracing) { + // 创建 CloseableHttpClient 对象,内置 HttpTracing 进行 HTTP 链路追踪。 + final CloseableHttpClient httpClient = TracingHttpClientBuilder.create(httpTracing).build(); + // 创建 RestTemplateCustomizer 对象 + return new RestTemplateCustomizer() { + @Override + public void customize(RestTemplate restTemplate) { + restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)); + } + }; + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 00000000..4fd4d0c5 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,32 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + private final RestTemplate restTemplate; + + DemoController(@Autowired RestTemplateBuilder restTemplateBuilder) { + this.restTemplate = restTemplateBuilder.build(); + } + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/http") + public String http() { +// restTemplate.getForObject("https://www.baidu.com", String.class); + restTemplate.getForObject("http://127.0.0.1:8079/demo/echo", String.class); + return "echo"; + } + +} diff --git a/lab-40/lab-40-demo/src/main/resources/application.yaml b/lab-40/lab-40-demo/src/main/resources/application.yaml new file mode 100644 index 00000000..d6e31da9 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + application: + name: demo-application diff --git a/lab-40/pom.xml b/lab-40/pom.xml new file mode 100644 index 00000000..75f1eee4 --- /dev/null +++ b/lab-40/pom.xml @@ -0,0 +1,19 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-40 + pom + + lab-40-demo + + + + diff --git a/pom.xml b/pom.xml index 2003d843..64d155d3 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,7 @@ lab-37 lab-38 lab-39 + lab-40