服務鏈路跟蹤 && 服務監控

  • 2019 年 10 月 3 日
  • 筆記

服務鏈路跟蹤

背景

微服務以微出名,在實際的開發過程中,涉及到成百上千個服務,網絡請求引起服務之間的調用極其複雜。

當請求不可用或者變慢時,需要及時排查出故障服務點成為了微服務維護的一大難關。

服務鏈路跟蹤技術應運而生。


ZipKin

Zipkin 是一個開放源代碼分佈式的跟蹤系統,由Twitter公司開源,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。

每個服務向zipkin報告計時數據,zipkin會根據調用關係通過Zipkin UI生成依賴關係圖,顯示了多少跟蹤請求通過每個服務,該系統讓開發者可通過一個 Web 前端輕鬆的收集和分析數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。

Zipkin提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra以及Elasticsearch。接下來的測試為方便直接採用In-Memory方式進行存儲,生產推薦Elasticsearch。

快速入門

在Zuul集群的代碼上進行修改:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx

  • 創建zipkin-server

  • pom【zipkin】

<parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <version>2.1.7.RELEASE</version>      <relativePath/> <!-- lookup parent from repository -->  </parent>    <properties>      <java.version>1.8</java.version>      <spring-cloud.version>Greenwich.SR2</spring-cloud.version>  </properties>    <dependencies>      <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-test</artifactId>          <scope>test</scope>      </dependency>        <dependency>          <groupId>org.springframework.cloud</groupId>          <artifactId>spring-cloud-starter-config</artifactId>      </dependency>      <!--        Eureka客戶端啟動需要依賴web模塊-->      <dependency>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-web</artifactId>      </dependency>        <dependency>          <groupId>org.springframework.cloud</groupId>          <artifactId>spring-cloud-starter-zipkin</artifactId>      </dependency>      </dependencies>    <dependencyManagement>      <dependencies>          <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-dependencies</artifactId>              <version>${spring-cloud.version}</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>
  • yaml
eureka:    client:      serviceUrl:        defaultZone: http://eureka2001.com:2001/eureka/,http://eureka2002.com:2002/eureka/,http://eureka2003.com:2003/eureka/  server:    port: 9001  spring:    application:      name: zipkin-server
  • 主啟動類@EnableZipkinServer
package zkrun.top;      import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.cloud.netflix.eureka.EnableEurekaClient;  import zipkin2.server.internal.EnableZipkinServer;    @EnableEurekaClient  @SpringBootApplication  @EnableZipkinServer  public class App_Zipkin_9001 {      public static void main(String[] args) {          SpringApplication.run(App_Zipkin_9001.class,args);      }    }
  • 向其他服務注入Zipkin監控
<dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-zipkin</artifactId>  </dependency>
spring:    zipkin:      base-url: http://localhost:9001

訪問

localhost:9001

1566643514473

服務監控

  • 創建msc-springboot-admin-10001
  • pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>        <groupId>zkrun.top</groupId>      <artifactId>msc-springboot-admin-10001</artifactId>      <version>1.0-SNAPSHOT</version>        <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.7.RELEASE</version>          <relativePath/> <!-- lookup parent from repository -->      </parent>        <properties>          <java.version>1.8</java.version>          <spring-cloud.version>Greenwich.SR2</spring-cloud.version>      </properties>        <dependencies>          <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-test</artifactId>              <scope>test</scope>          </dependency>            <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-starter-config</artifactId>          </dependency>          <!--        Eureka客戶端啟動需要依賴web模塊-->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>          </dependency>            <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-starter-zipkin</artifactId>          </dependency>            <dependency>              <groupId>de.codecentric</groupId>              <artifactId>spring-boot-admin-starter-server</artifactId>              <version>2.1.5</version>          </dependency>        </dependencies>        <dependencyManagement>          <dependencies>              <dependency>                  <groupId>org.springframework.cloud</groupId>                  <artifactId>spring-cloud-dependencies</artifactId>                  <version>${spring-cloud.version}</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>
  • yaml
server:    port: 10001    spring:    application:      name: admin-server    zipkin:      base-url: http://localhost:9001    eureka:    client:      service-url:        defaultZone: http://eureka2001.com:2001/eureka/,http://eureka2002.com:2002/eureka/,http://eureka2003.com:2003/eureka/    instance:      instance-id: admin-server-10001      prefer-ip-address: true     #訪問路徑可以顯示IP地址    management:    endpoint:      health:        show-details: always    endpoints:      web:        exposure:          include: ["health","info"]
  • 主類@EnableAdminServer
package zkrun.top;    import de.codecentric.boot.admin.server.config.EnableAdminServer;  import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.cloud.netflix.eureka.EnableEurekaClient;    @SpringBootApplication  @EnableAdminServer  @EnableEurekaClient  public class App_Admin_10001 {      public static void main(String[] args) {          SpringApplication.run(App_Admin_10001.class,args);      }  }

依次啟動Eureka,provider,zuul,zipkin,admin

訪問Eureka

http://localhost:2001/

1566647026884

訪問

http://localhost:10001

1566646843789


代碼參考:https://github.com/HCJ-shadow/Zipkin-SpringBoot-Admin