服务链路追踪的目的,是为了解决服务过多,导致服务的引用效率排查困难的,而且这些服务都是系统之间不断的调用,如果不找一个工具去查看调用的规则以及逻辑,会导致微服务系统难以进行下去,所以SpringCloud也考虑到了这一点,开发了这个Zipkin项目,这个链路追踪服务,搭建起来不是特别的费劲,我在追踪过程中发现,这个Zipkin只对于服务调用有效,对于Zuul(路由),没有啥效果,不会监控zuul的分流操作(配置在application.yml的分流规则)。本文分三节,第一节 ,讲解如何搭建链路追踪服务端(Zipkin服务端),第二节,讲解子系统如何配置链路追踪,第三节,自然是测试环节了。
https://gitee.com/yellowcong/springcloud/tree/master/chapter9
节点 | 服务 | 项目名 | 启动顺序 |
---|---|---|---|
yellowcong.com:8761 | eureka注册服务 | eureka-server | 1 |
yellowcong.com:8762 | 链路追踪服务 | zipkin-server | 2 |
yellowcong.com:8763 | 服务提供1 | eureka-client | 3 |
yellowcong.com:8764 | 服务提供2 | eureka-client | 4 |
yellowcong.com:8765 | 消费服务1(feign+rest) | feign-server | 5 |
yellowcong.com:8766 | 消费服务2(ribbon) | ribbon-server | 6 |
yellowcong.com:8767 | 路由服务 | zuul-server | 7 |
搭建zipkin服务端,并不是很难,搭建的步骤:1、配置pom.xml,添加zipkin的依赖包,2、配置application.yml,3、配置启动器,添加@EnableZipkinServer
注解,开启服务端
配置zipkin需要添加zipkin-server
,zipkin-autoconfigure-ui
依赖包。ps:zipkin的版本和springcloud的版本不是一致的,这点是需要注意的。我eureka用的是1.3.0.RELEASE版本,而zipkin使用的是1.30.0 版本
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
<version>1.30.0version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
<version>1.30.0version>
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.0modelVersion>
<groupId>yellowcong.comgroupId>
<artifactId>cas-client-springbootartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>cas-client-springbootname>
<url>http://maven.apache.orgurl>
<repositories>
<repository>
<id>spring-milestonesid>
<name>Spring Milestonesname>
<url>https://repo.spring.io/milestoneurl>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.10.RELEASEversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eureka-serverartifactId>
<version>1.3.0.RELEASEversion>
<exclusions>
<exclusion>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
<version>1.30.0version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
<version>1.30.0version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springloadedartifactId>
<version>1.2.4.RELEASEversion>
dependency>
dependencies>
plugin>
plugins>
build>
project>
配置zipkin的服务名称,地址,以及注册中心,同普通的项目没差太多。
#配置eureka 的注册中心
eureka:
client:
serviceUrl:
defaultZone: http://yellowcong.com:8761/eureka/
# 注册服务的端口
server:
port: 8762
#配置当前服务的名称
spring:
application:
name: service-zipkin
添加@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);
}
}
启动eurake的注册服务端,然后启动zipkin项目,访问服务器地址:http://yellowcong.com:8762 ,出先,如下界面,表示服务端搭建成功。
子系统配置链路追踪,需要下面几步:1、配置pom.xml,添加spring-cloud-starter-zipkin
依赖,2、配置application.yml 文件,设置zipkin服务器地址。重要说明,对于路由系统(zuul)的application.yml配置的分流操作,zipkin不会追踪的。
在原来项目的基础上,再添加spring-cloud-starter-zipkin
依赖,即可。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
<version>1.3.0.RELEASEversion>
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.0modelVersion>
<groupId>yellowcong.comgroupId>
<artifactId>cas-client-springbootartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>cas-client-springbootname>
<url>http://maven.apache.orgurl>
<repositories>
<repository>
<id>spring-milestonesid>
<name>Spring Milestonesname>
<url>https://repo.spring.io/milestoneurl>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.10.RELEASEversion>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eureka-serverartifactId>
<version>1.3.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
<version>1.3.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springloadedartifactId>
<version>1.2.4.RELEASEversion>
dependency>
dependencies>
plugin>
plugins>
build>
project>
指定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
启动服务后,访问 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)的路由调用信息。
1、史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)