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