調用鏈跟蹤是微服務架構中的基礎能力,Spring Cloud Zipkin+Sleuth為我們提供了該能力。首先我們先建立Zipkin服務端,它需要集成Eureka,用於發現服務提供方和消費方,進行數據的采集存儲、數據分析與UI展示;然后我們在服務提供方和消費方中植入Zipkin+Sleuth作為客戶端,進行追蹤數據的生成與上報。
zikpin服務端(三板斧):
1、pom里引入第三方(Twitter的)zipkin的jar包:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>zipkin</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> <version>2.11.8</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <version>2.11.8</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
注意標黃部分,日志jar包沖突會讓zipkin無法啟動的。
2、application:
#本機端口 server.port=8899 #服務名 spring.application.name=zipkin #注冊中心地址 eureka.client.service-url.defaultZone=http://localhost:8888/eureka/ #關閉自動收集web請求 management.metrics.web.server.auto-time-requests=false
3、主類通過@EnableZipkinServer啟動zipkin:
package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import zipkin2.server.internal.EnableZipkinServer; @EnableZipkinServer @EnableEurekaClient @SpringBootApplication public class ZipkinApplication { public static void main(String[] args) { SpringApplication.run(ZipkinApplication.class, args); } }
zipkin客戶端只需干兩件事:1、在pom里引入spring-cloud-starter-zipkin即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、在application中加入zipkin服務端地址和采用率(方便測試觀察):
#zipkin服務端地址
spring.zipkin.base-url=http://127.0.0.1:8899 #調用鏈信息采樣率 spring.sleuth.sampler.probability=1.0
我們在api-gateway、a-bootiful-client、a-beautiful-client和a-feign-client中都引入zipkin客戶端,現在打開localhost:8899點擊Find Traces即可搜到它們最近1個小時的調用鏈:
隨便點一個看看:

再點開一個具體的調用鏈,可以看到里面的調用詳細信息:

點導航菜單中的“Dependencies”可以看到調用關系圖:

