服务链路追踪的目的,是为了解决服务过多,导致服务的引用效率排查困难的,而且这些服务都是系统之间不断的调用,如果不找一个工具去查看调用的规则以及逻辑,会导致微服务系统难以进行下去,所以SpringCloud也考虑到了这一点,开发了这个Zipkin项目,这个链路追踪服务,搭建起来不是特别的费劲,我在追踪过程中发现,这个Zipkin只对于服务调用有效,对于Zuul(路由),没有啥效果,不会监控zuul的分流操作(配置在application.yml的分流规则)。本文分三节,第一节 ,讲解如何搭建链路追踪服务端(Zipkin服务端),第二节,讲解子系统如何配置链路追踪,第三节,自然是测试环节了。

代码地址

https://gitee.com/yellowcong/springcloud/tree/master/chapter9

目录结构

这里写图片描述

项目架构

节点服务项目名启动顺序
yellowcong.com:8761eureka注册服务eureka-server1
yellowcong.com:8762链路追踪服务zipkin-server2
yellowcong.com:8763服务提供1eureka-client3
yellowcong.com:8764服务提供2eureka-client4
yellowcong.com:8765消费服务1(feign+rest)feign-server5
yellowcong.com:8766消费服务2(ribbon)ribbon-server6
yellowcong.com:8767路由服务zuul-server7

项目架构图

架构图,可以看到,我将所有的服务,都进行了链路监控操作。
这里写图片描述

第一节:搭建链路追踪服务端(Zipkin服务端)

搭建zipkin服务端,并不是很难,搭建的步骤:1、配置pom.xml,添加zipkin的依赖包,2、配置application.yml,3、配置启动器,添加@EnableZipkinServer注解,开启服务端

1、配置pom.xml

配置zipkin需要添加zipkin-server,zipkin-autoconfigure-ui依赖包。ps:zipkin的版本和springcloud的版本不是一致的,这点是需要注意的。我eureka用的是1.3.0.RELEASE版本,而zipkin使用的是1.30.0 版本

<!-- 导入zipkin 的依赖包 -->
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>1.30.0</version>
</dependency>

<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
    <version>1.30.0</version>
</dependency>

下面是完整的pom.xml配置文件

<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>yellowcong.com</groupId>
    <artifactId>cas-client-springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>cas-client-springboot</name>
    <url>http://maven.apache.org</url>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!-- 引用父类依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 导入zipkin 的依赖包 -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>1.30.0</version>
        </dependency>

       <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>1.30.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <!-- 添加spring的插件, 就可以直接通过 mvn spring-boot:run 运行了 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.4.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

2、配置application.yml

配置zipkin的服务名称,地址,以及注册中心,同普通的项目没差太多。

#配置eureka 的注册中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://yellowcong.com:8761/eureka/
# 注册服务的端口
server:
  port: 8762
#配置当前服务的名称
spring:
  application:
    name: service-zipkin

3、配置启动器

添加@EnableZipkinServer注解,开启配置服务

package com.yellowcong.main;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import zipkin.server.EnableZipkinServer;

/**
 * @author yellowcong
 */
@SpringBootApplication
// @EnableEurekaClient 表示这个是一个client
@EnableEurekaClient
@EnableZipkinServer
public class ConfigMain {

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

4、测试访问zipkin

启动eurake的注册服务端,然后启动zipkin项目,访问服务器地址:http://yellowcong.com:8762 ,出先,如下界面,表示服务端搭建成功。

这里写图片描述

第二节:子系统如何配置链路追踪

子系统配置链路追踪,需要下面几步:1、配置pom.xml,添加spring-cloud-starter-zipkin依赖,2、配置application.yml 文件,设置zipkin服务器地址。重要说明,对于路由系统(zuul)的application.yml配置的分流操作,zipkin不会追踪的。

1、配置pom.xml

在原来项目的基础上,再添加spring-cloud-starter-zipkin依赖,即可。

<!-- 添加对zipkin的依赖 -->
 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>

下面是一个服务提供的子系统eureka-client的pom.xml配置文件,不用直接拷贝,只需要配置上面我说的那一段到服务即可,就添加了支持

<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>yellowcong.com</groupId>
    <artifactId>cas-client-springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>cas-client-springboot</name>
    <url>http://maven.apache.org</url>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!-- 引用父类依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <!-- 添加对zipkin的依赖 -->
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
            <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <!-- 添加spring的插件, 就可以直接通过 mvn spring-boot:run 运行了 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.4.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

2、配置application.yml

指定ziplink的服务器地址,percentage,应采样的请求百分比。例如1.0 - 100%的请求应该被抽样。精度仅为全数(即不支持0.1%的痕迹)。springcload 默认percentage是0.1,大白话将,就是我访问10次,就有一次被链路追踪到,但是,我为了实现效果 ,设置为了1,实际上线环境切记保持管网配置即可,不然实在 太消耗资源了。

添加下面的配置,
这里写图片描述

下面是一个服务提供的子系统eureka-client的配置文件

#配置eureka 的注册中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://yellowcong.com:8761/eureka/

# 注册服务的端口
server:
  port: 8763

#配置当前服务的名称
spring:
  application:
    name: service-client
  zipkin:
    base-url: http://yellowcong.com:8762
  sleuth:
    sampler:
      percentage: 1.0

3、测试zipkin

启动服务后,访问 http://yellowcong.com:8761 ,可以看到所有的服务都启动了
这里写图片描述

让后,访问http:://yellowcong.com:8765/feign/hi/xx(zuul服务) 和http:://yellowcong.com:8765/hi/xx (消费服务) 后,然后再访问http://yellowcong.com:8762 的zipkin控制台,因为访问后,链路追踪才会有记录,如果不访问,就没有追踪信息了。

下图可以看出,我访问了zipkin的控制台,只记录了 消费服务,以及提供服务的,没有记录路由服务(zuul)的路由调用信息。
这里写图片描述

下图是服务信息中,没有zuul的服务。
这里写图片描述

参考文章

1、史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)

Logo

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

更多推荐