SpringCloud 2020.0.4 系列之 Sleuth + Zipkin

追風人聊Java發表於2021-11-09

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

相關文章