1. zipkin基礎介紹: 分佈式追蹤系統
概念:
- tranceID: 請求全局處理標識
- spanID: 請求在單個服務流轉處理標識
- ParentID: 子服務中顯示父服務ID(spanID),主要用於構建服務調用鏈路
數據傳輸到Zipkin方式:
- http
- kafka
- Scribe
Zipkin構成組件:
- collector: zipkin校驗、保存、索引接收的追蹤數據
- storage: zipkin 數據存儲(Cassandra、mysql、ES、內存等,支持擴展)
- search: zipkin 數據檢索服務(WEB UI)
- WEB UI: 數據追蹤展示UI,默認沒有認證
2. 環境部署
參考官網下載:zipkin quickstart
3. 使用案例
3.1 maven 依賴引入
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
3.2 測試服務
服務調用流程:zipkin_service_one -> zipkin_service_two -> zipkin_service_three
zipkin_service_one
ServiceController:
@RestController
public class ServiceController {
@Autowired
private FeignService feignService;
@Value("${spring.application.name}")
private String application;
@GetMapping("/hello")
public String hello() {
return application;
}
@GetMapping("/trace")
public String trace() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(application).append(" ==> ");
return stringBuilder.append(feignService.hello()).toString();
}
}
FeignService:
@FeignClient("zipkin-service-two")
public interface FeignService {
@GetMapping("/hello")
String hello();
}
zipkin_service_two
ServiceController:
@RestController
@Slf4j
public class ServiceController {
@Autowired
private FeignService feignService;
@Value("${spring.application.name}")
private String application;
@GetMapping("/hello")
public String hello(HttpServletRequest httpServletRequest) {
String AUTHORIZATION = "AUTHORIZATION";
log.info("AUTHORIZATION ==> {}", httpServletRequest.getHeader(AUTHORIZATION));
StringBuilder stringBuilder = new StringBuilder(application).append(" ==> ");
return stringBuilder.append(feignService.hello()).toString();
}
@GetMapping("/trace")
public String trace() {
return feignService.hello();
}
}
FeignService:
@FeignClient("zipkin-service-three")
public interface FeignService {
@GetMapping("/hello")
String hello();
}
zipkin_service_three
ServiceController:
@RestController
@Slf4j
public class ServiceController {
@Value("${spring.application.name}")
private String application;
@GetMapping("/hello")
public String hello(HttpServletRequest httpServletRequest) {
String AUTHORIZATION = "AUTHORIZATION";
log.info("AUTHORIZATION ==> {}", httpServletRequest.getHeader(AUTHORIZATION));
return application;
}
}