【微服務】zipkin 鏈路追蹤

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;
    }
}

3.3 效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章