1. 概述
老話說的好:安全不能帶來財富,但盲目的冒險也是不可取的,大膽籌劃,小心實施才是上策。
言歸正傳,微服務的特點就是服務多,服務間的互相呼叫也很複雜,就像一張關係網,因此為了更好的定位故障和優化效能,我們需要有工具幫我們很快的梳理出服務間上下游的呼叫關係。Sleuth 就可以很好的幫我們解決這個問題。
但 Sleuth 只是做了後臺工作,沒有展示頁面,不方便我們對呼叫鏈進行分析。因此需要 Zipkin 去把資料展示出來,方便我們進行分析。
閒話不多說,直接上程式碼。
2. Zipkin 服務的搭建
2.1 Zipkin 服務的搭建方式
我們開啟Zipkin的官網地址:https://zipkin.io/pages/quickstart.html
如圖所示,Zipkin Server 支援 Docker方式啟動,Java 執行 Jar 包方式啟動,以及編譯原始碼的方式啟動。
2.2 Java 執行 jar 包方式啟動
大家可以根據自己的喜好選擇啟動方式,這裡我們選擇 Java 執行 jar 包的方式啟動。
1)下載 zipkin.jar
# curl -sSL https://zipkin.io/quickstart.sh | bash -s
2)啟動 Zipkin Server
# java -jar zipkin.jar
2.3 訪問 Zipkin Server
http://IP:9411/zipkin/
3. Demo 服務的搭建
3.1 概述
這裡我們搭建兩個有呼叫關係的服務作為 Demo。
兩個服務都依賴 Sleuth 和 Zipkin。
3.2 my-sleuth-A 的搭建
3.2.1 主要依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 健康檢查 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>2.2.8.RELEASE</version> </dependency>
3.2.2 主要配置
server: port: 46000 spring: application: name: my-sleuth-A sleuth: sampler: probability: 1 # 取樣率100% zipkin: base-url: http://192.168.1.22:9411 # Zipkin Server 地址 eureka: client: service-url: defaultZone: http://zhuifengren1:35000/eureka/,http://zhuifengren2:35001/eureka/ # Eureka Server的地址
3.2.3 啟動類
@SpringBootApplication @EnableDiscoveryClient public class MySleuthAApplication { @LoadBalanced @Bean public RestTemplate lb() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MySleuthAApplication.class, args); } }
3.2.4 Demo Controller
@RestController @Slf4j public class Controller { @Autowired private RestTemplate restTemplate; @GetMapping("/traceA") public String traceA() { log.info("-------- traceA -------"); return restTemplate.getForEntity ("http://my-sleuth-B/traceB", String.class).getBody(); } }
3.3 my-sleuth-B 的搭建
3.3.1 主要依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 健康檢查 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>2.2.8.RELEASE</version> </dependency>
3.3.2 主要配置
server: port: 46001 spring: application: name: my-sleuth-B sleuth: sampler: probability: 1 # 取樣率100% zipkin: base-url: http://192.168.1.22:9411 # Zipkin Server 地址 eureka: client: service-url: defaultZone: http://zhuifengren1:35000/eureka/,http://zhuifengren2:35001/eureka/ # Eureka Server的地址
3.3.3 啟動類
@SpringBootApplication @EnableDiscoveryClient public class MySleuthBApplication { @LoadBalanced @Bean public RestTemplate lb() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MySleuthBApplication.class, args); } }
3.3.4 Demo Controller
@RestController @Slf4j public class Controller { @Autowired private RestTemplate restTemplate; @GetMapping("/traceB") public String traceB() { log.info("-------- traceB -------"); return "traceB"; } }
4. Zipkin 的簡單使用
4.1 呼叫 Demo 介面
呼叫兩個Demo工程的介面
GET http://localhost:46001/traceB
GET http://localhost:46000/traceA
4.2 開啟 zipkin 檢視
4.3 依賴關係圖檢視
5. 綜述
今天聊了一下 呼叫鏈追蹤 Sleuth + Zipkin ,希望可以對大家的工作有所幫助。
歡迎幫忙點贊、評論、轉發、加關注 :)
關注追風人聊Java,每天更新Java乾貨。
6. 個人公眾號
追風人聊Java,歡迎大家關注