在以前,所有的东西放在一起打包,放到服务器上也就不管了,但是到了分布式场景下,可能一个请求要经过十几个服务的周转,如果不进行链路的追踪,这些对于我们来说都是透明的,那么哪个节点存在问题或者存在超时隐患我们都是很难知道的,因此服务追踪是我们必须要做的一样事情。

一、为什么需要进行分布式链路追踪springcloud-sleuth呢?

随着分布式系统越来越复杂,你的一个请求发过发过去,各个微服务之间的跳转,有可能某个请求某一天压力太大了,一个请求过去没响应,一个请求下去依赖了三四个服务,但是你去不知道哪一个服务出来问题,这时候我是不是需要对微服务进行追踪呀?监控一个请求的发起,从服务之间传递之间的过程,我最好记录一下,记录每一个的耗时多久,一旦出了问题,我们就可以针对性的进行优化,是要增加节点,减轻压力,还是服务继续拆分,让逻辑更加简单点呢?这时候springcloud-sleuth集成zipkin能帮我们解决这些服务追踪问题。

二、创建工程

本工程的Spring Boot的版本为1.5.8Spring Cloud版本为Dalston.RELEASE。包含了eureka-server工程,作为服务注册中心,eureka-server的创建过程这里不重复;zipkin-server作为链路追踪服务中心,负责存储链路数据;gateway-service作为服务网关工程,负责请求的转发,同时它也作为链路追踪客户端,负责产生数据,并上传给zipkin-serviceuser-service为一个应用服务,对外暴露API接口,同时它也作为链路追踪客户端,负责产生数据。

1.构建eureka-server

这个服务就比较简单了,就是eureka的服务端,用来注册服务。见代码eureka-server.

2.构建zipkin-server

依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<dependencies>
<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>

<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--zipkin服务端-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<!--显示的页面-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
</dependencies>

主函数上打上两个注解开启ZipkinServer的功能:

1
2
@EnableEurekaClient
@EnableZipkinServer

配置文件上也很简单,注册到eureka上和指定好启动的端口即可。

1
2
3
4
5
6
7
8
9
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 9411
spring:
application:
name: zipkin-server

3.构建user-service

新建一个工程,取名为user-service,作为应用服务,对外暴露API接口.

依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
<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>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>

打上eureka注解。配置文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8080
spring:
application:
name: user-service
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
percentage: 1.0

Zipkin Server地址为http://localhost:9411
spring.sleuth.sampler.percentage为1.0,即100%的概率将链路的数据上传给Zipkin Server,在默认的情况下,该值为0.1.

测试的api为:

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/user")
public class UserController {

@GetMapping("/hello")
public String hi(){
return "hello user!";
}
}

4.构建gateway-service

新建一个名为gateway-service工程,这个工程作为服务网关,将请求转发到user-service,作为Zipkin客户端,需要将链路数据上传给Zipkin Server,同时它也作为Eureka Client

依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<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>
<version>RELEASE</version>
</dependency>
</dependencies>

注解:

1
2
@EnableEurekaClient
@EnableZuulProxy

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

server:
port: 8081
spring:
application:
name: gateway-service
sleuth:
sampler:
percentage: 1.0
zipkin:
base-url: http://localhost:9411

zuul:
routes:
api-a:
path: /user-api/**
serviceId: user-service

“/user-api/**”开头的Uri请求,转发到服务名为 user-service 的服务

三、演示效果

完整的项目搭建完毕,依次启动eureka-serverzipkin-serveruser-servicegateway-service。在浏览器上访问http://localhost:8081/user-api/user/hi

访问http://localhost:9411,即访问Zipkin的展示界面,界面显示如图所示:

image

这个界面主要用来查找服务的调用情况,可以根据服务名、开始时间、结束时间、请求消耗的时间等条件来查找。点击“Find Traces”按钮,界面如图所示。从图可知服务的调用情况,比如服务调用时间、服务的消耗时间,服务调用的链路情况。

点击Dependences按钮,可以查看服务的依赖关系,在本案例中,gateway-service将请求转发到了user-service,它们的依赖关系如图:

image

参考文章:Spring Cloud Sleuth进阶实战