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,歡迎大家關注