1. 简介

Spring Cloud Sleuth implements a distributed tracing solution for Spring Cloud.

微服务的调用链监控是解决微服务的复杂性带来的一系列问题的强有效手段之一,其监控原理、必要性、更多理解以及理论知识入门请查看《十一:对微服务调用链监控的理解

2. 代码实现

2.1 涉及的模块及整体步骤

2.1.1 涉及的模块

  • zipkin-server:Spring Cloud Sleuth 整合Zipkin的服务端
  • zipkin-service:受zipkin server监控的服务提供者,实际中为一个微服务。
  • zipkin-another-service:受zipkin server监控的服务提供者,实际中为一个微服务,这里模拟服务之间的相互调用

2.1.2 整体步骤

  1. 实现zipkin-server:引入zipkin-serverzipkin-autoconfigure-ui,指定端口
  2. 实现zipkin-service:引入spring-cloud-starter-zipkin,指定zipkin server服务端信息,同时配置自己的应用名称与端口,应用名称很重要,需要全局唯一,用于在zipkin上定位针对当前服务的跟踪信息。
  3. 实现zipkin-another-service:引入spring-cloud-starter-zipkin,指定zipkin server服务端信息,同时配置自己的应用名称与端口,应用名称很重要,需要全局唯一,用于在zipkin上定位针对当前服务的跟踪信息。
  4. 启动三个项目,浏览器方式调用两个服务提供者提供的服务,服务提供者内部会通过RestTemplate访问另一个服务,产生调用链关系
  5. 观察zipkin server的管理界面,查看调用关系

2.2 源代码

2.2.1 Github地址

https://github.com/andyChenHuaYing/spring-cloud-demo

2.3 zipkin-service

2.3.1 整体实现

  1. pom.xml文件中引入依赖引入zipkin-serverzipkin-autoconfigure-ui,指定端口
  2. application.yml中指定具体配置信息
  3. ZipkinServerApplication使用注解@EnableZipkinServer开启zipkin server功能

2.3.2 pom.xml

<?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">
    <parent>
        <artifactId>spring-cloud-finchley-demo</artifactId>
        <groupId>org.oscar.scd</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>zipkin-server</artifactId>

    <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.zipkin.java/zipkin-server -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.11.4</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/io.zipkin.java/zipkin-autoconfigure-ui -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.11.4</version>
        </dependency>

    </dependencies>
</project>

2.3.3 application.yml

server:
  port: 8777
management:
  metrics:
    web:
      server:
        auto-time-requests: false

2.3.4 ZipkinServerApplication

package org.oscar.scd.zipkin.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin2.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}


2.4 zipkin-service

2.4.1 整体实现

  1. pom.xml:引入spring-cloud-starter-zipkin
  2. application.yml:指定zipkin server服务端信息,同时配置自己的应用名称与端口,应用名称很重要,需要全局唯一,用于在zipkin上定位针对当前服务的跟踪信息。
  3. ZipkinServiceApplication:Spring boot启动类,通过RestTemplate调用zipkin-another-service提供的REST服务

2.4.2 pom.xml

<?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">
    <parent>
        <artifactId>spring-cloud-finchley-demo</artifactId>
        <groupId>org.oscar.scd</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>zipkin-service</artifactId>

    <dependencies>
        <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>
</project>

2.4.3 application.yml

probability: 1#日志采集率,从0到1依次提高,1标识每次都采集

server:
  port: 8778
spring:
  zipkin:
    base-url: http://localhost:8777
  application:
    name: zipkin-service
  sleuth:
    sampler:
      probability: 1 

2.5 zipkin-another-service

基本与 zipkin-service相同,端口与应用名称不同,提供的REST接口返回值不同

2.5.1 整体实现

  1. pom.xml:引入spring-cloud-starter-zipkin
  2. application.yml:指定zipkin server服务端信息,同时配置自己的应用名称与端口,应用名称很重要,需要全局唯一,用于在zipkin上定位针对当前服务的跟踪信息。
  3. ZipkinAnotherServiceApplication:Spring boot启动类,通过RestTemplate调用zipkin-service提供的REST服务

2.5.2 pom.xml

<?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">
    <parent>
        <artifactId>spring-cloud-finchley-demo</artifactId>
        <groupId>org.oscar.scd</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>zipkin-service</artifactId>

    <dependencies>
        <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>
</project>

2.5.3 application.yml

probability: 1#日志采集率,从0到1依次提高,1标识每次都采集

server:
  port: 8779
spring:
  zipkin:
    base-url: http://localhost:8777
  application:
    name: zipkin-another-service
  sleuth:
      sampler:
        probability: 1

3. 验证

3.1 创建SpringBoot启动类

最简单的方式添加一个SpringBoot启动类型的启动类就行,如果对SpringBoot有所了解或者看过前面系列的文章,这里很简单。

3.1.1 ZipkinServerApplication

3.1.2 ZipkinServiceApplication

3.1.3 ZipkinAnotherServiceApplication

3.2 启动

  1. ZipkinServerApplication
  2. ZipkinServiceApplication
  3. ZipkinAnotherServiceApplication

3.3 查看zipkin-server服务信息界面

3.4 服务相互调用

3.4.1 访问zipkin-service

Hi i am zipkin-another-service

3.4.2 访问zipkin-another-service

Hi i am zipkin-service

此时已经产生服务调用链。zipkin-service -> zipkin-another-service;zipkin-another-service -> zipkin-service 两个。

3.5 界面查看调用情况

  • 参考如下界面,查看zipkin-service调用链情况,一个是整体调用情况
    在这里插入图片描述

  • 另一个点进去可以查看所点击的调用链的详细调用信息
    在这里插入图片描述

4. 思考

  • 刚入门,调用信息单薄
  • 如何监控微服务整条链路信息,如网络、服务调用链、数据库、缓存并且支持多种展示形式,如报表,数据
  • 当数据量上来之后如何快速查询想要的信息
  • 还有没有其他的微服务监控体系,如ELK如何在实际生产中实时

5. 补充

5.1 资料

http://cloud.spring.io/spring-cloud-static/Finchley.SR1/multi/multi_spring-cloud.html

十一:对微服务调用链监控的理解

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐