SpringCloud微服務實戰之分散式服務跟蹤Sleuth
通常一個由客戶端發起的請求會在後端系統中經過多個不同的微服務呼叫來協同產生最後的請求結果,在複雜的微服務架構系統中,幾乎每一個前端請求都會形成一條複雜的分散式服務呼叫鏈路,每條鏈路服務痴線錯誤或者延遲都有可能引起請求的失敗。Spring Cloud Sleuth提供了一套全鏈路呼叫跟蹤以及監控分析方案。
一、測試鏈路跟蹤
1、建立專案SpringCloud-Sleuth和SpringCloud-Trace2專案,專案Sleuth中呼叫Trace2專案中提供的服務介面。
2、pom中的依賴,兩個專案相同
<dependencies>
<dependency >
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId >
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- add ribbon depend -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- add sleuth depend -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
</dependencies>
3、Trace2專案中提供/trace-2介面
@RestController
public class TraceController {
@RequestMapping(value="/trace-2",method=RequestMethod.GET)
public String trace(){
System.out.println("======================call Trace 2========================");
return "Trace";
}
}
Sleuth中使用RestTemplate呼叫Trace-2服務
@RestController
public class TraceController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value="/trace-1",method=RequestMethod.GET)
public String trace(){
System.out.println("============>Call Trace=============");
ResponseEntity<String> entity = restTemplate.getForEntity("http://trace-2/trace-2", String.class);
return entity.getBody();
}
}
Trace2主類
@EnableDiscoveryClient
@SpringBootApplication
public class Trace2Application {
@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
public static void main(String[] args) {
SpringApplication.run(Trace2Application.class, args);
}
}
============>Call Trace=============
2017-12-25 14:32:48.808 INFO [sleuth-trace,1ccd077442207e68,191e2353159ad4bb,false] 11140
二、整合Zipkin
1、建立專案SpringCloud-Zipkin
2、在pom中新增依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<!-- <version>2.4.2</version> -->
</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>Camden.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3、在主類中使用註解@EnableZipkinServer 開啟Zipkin服務。
4、在application中配置埠和服務名
server.port=9411
spring.application.name=zipkin-server
客戶端預設連線Zipkin的url為http://localhost:9411, 故而這裡的埠設定為9411,也可以改成其他埠。
6、在(一)中的專案Sleuth和Trace中的pom中新增Zipkin依賴
<!-- add zipkin depend -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
7、在application.properties中新增配置,spring.zipkin.base-url預設配置為http://localhost:9411,所以這裡不做配置也行。
spring.zipkin.base-url=http://localhost:9411
8、依次啟動EurekaServer、Trace2、Sleuth專案,訪問http://localhost:9004/trace-1,在ZipkinServer中心檢視
點選Find Traces按鈕,查詢出結果,可以檢視Service詳細鏈路。