Spring Cloud 上手9-服务监控
文章目录
这是Spring Cloud上手系列的第九篇,代码放在GitHub上,随着本系列文章更新。
Spring Cloud Sleuth
在Spring Cloud应用中,各服务之间存在复杂的调用关系链。Spring Cloud Sleuth主要的功能就是提供服务调用链追踪功能。
例如,访问gateway
的/api/consumer/hello
端点时,会调用consumer:service
的/consumer/hello
端点,之后调用provider:service
的/provider/hello
端点。在大型系统中,这种调用关系可能会非常复杂,因此需要有机制能对整个调用链进行追踪。
较早提供这种追踪组件的是Google的Dapper链路跟踪组件,于2010年发表了相关论文,相关的文章是实现链路追踪的理论基础。目前,除Dapper外,还有Twitter和Zipkin,阿里的Eagleeye等。
Spring Cloud Sleuth中能方便的集成Zipkin。
相关术语
Spring Cloud Sleuth使用的是Google Dapper的术语。
-
Span: 基本工作单元,发送一个远程调用就会产生一个Span,Span用64位ID唯一标识。
-
Trace: 由一系列Span组成的树状结构。调用一个服务接口时,由这次调用所产生的后续调用都会生成一个新的Span,由所有这些Span组成一个Trace。
-
Annotation: 用来记录事件,有一些核心注解来定义请求的开始和结束。这些注解包括:
-
cs: Client Sent客户端发送请求,表示Span的开始
-
sr: Server Received 服务端获取请求准备开始处理,
sr-cs
得到的就是网络传输时间 -
ss: Server Sent请求处理的完成时间,
ss-sr
就是服务器的处理时间 -
cr: Client Received客户端接收响应的时间,
cr-cs
就是客户端整个请求调用所消耗的时间
-
集成Zipkin
集成Zipkin的工作主要有:
-
添加
zipkin
应用,它主要用作ZipkinServer
收集调用链数据,并且提供展示。 -
将
gateway
、provider:service
和consumer:service
集成zipkin
客户端。 -
通过
gateway
访问/api/consumer/hello
时,ZpkinServer
就能收集到数据。
客户端与Zipkin的集成方式主要有两种,一种是通过Http POST数据至Zipkin Server,另一种是通过RabbitMQ接收消息。
网上很多文章都是以Http POST方式通讯的,有一些虽然是通过RabbitMQ,但是却不是针对Edgware
版的,很有可能在Edgware
版上无法配置成功。这是因为Edgware
之前的版本中,需要整合spring-cloud-sleuth-stream
,而在Edgware
版本中使用的是Zipkin 2.X
,它本身就已经支持消息队列,因此spring-cloud-sleuth-stream
将被废弃。
另外,在Spring Cloud F版中,Zipkin的工作方式仍会有变化。因为新版本的Zipkin在向独立中间件转变,它会转变成像RabbitMQ这样的独立服务。今后,集成起来将会更简单。
本文不再缀述Http POST方式进行数据传输,只记录如何使用RabbitMQ与Zipkin进行通讯。
配置依赖
在根模块的build.gradle
中ext.libs
中添加zipkin相关依赖:
|
|
添加Zipkin 服务模块
在根模块下添加zipkin
模块,并将它添加至settings.gradle
:
|
|
在zipkin
模块的build.gradle
中添加依赖,并设置Main-Class
:
|
|
主类代码如下:
|
|
在zipkin
应用的application.yml
中配置队列相关信息:
|
|
这里指定了zipkin
服务使用的队列名称为zipkin
,后面zipkin
客户端程序中的队列名称需要配置成同样的值。
配置Zipkin 客户端工程
为获取上面图中gateway-consumer-provider
的调用链信息,我们需要将gateway
、consumer:service
和provider:service
这几个模块配置为zipkin
客户端。
为减少配置量,我们把客户端工程的依赖放在根模块的build.gradle
中,在subprojects
段中设置以下依赖:
|
|
然后,在这几个客户端工程的application.yml
或bootstrap.yml
中添加zipkin
相关配置:
|
|
这里的spring.sleuth.sampler.percentage
是指100%
的将链接数据传输给Zipkin服务端,默认值为0.1
。这里为了便于查看,我们把它配置为1
。实际生产环境上,可以从1
开始逐渐的降低。queue
属性的值需要与服务端配置的队列名称保持一致。
测试
为了进行集成测试,我们需要启动registry
、gateway
、provider:service
、consumer:service
模块外,还需要启动rabbitmq
。另外,由于此前配置中心一文中provider:service
启动时依赖于config
模块,因此我们还需要启动config
模块。
启动完毕后,在Rabbit控制台,能看到新创建的zipkin
队列。
访问http://localhost:9003
能看到zipkin
服务程序的控制台。
访问http://localhost:9000/api/consumer/hello?name=Jamsa111
之后,再查看zipkin
控制台,就能看到调用链信息和依赖分析信息了。
文章作者 Jamsa
上次更新 2018-06-12