从0开始用SpringCloud搭建微服务系统【五】

调用链监控

如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。

链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。

市面上链路追踪产品,大部分基于google的Dapper论文

链路追踪要考虑的几个问题

  1. 探针的性能消耗。尽量不影响 服务本尊。
  2. 易用。开发可以很快接入,别浪费太多精力。
  3. 数据分析。要实时分析。维度足够。

Sleuth

Sleuth是Spring cloud的分布式跟踪解决方案。

  1. span(跨度),基本工作单元。一次链路调用,创建一个span,span用一个64位id唯一标识。包括:id,描述,时间戳事件,spanId,span父id。

    span被启动和停止时,记录了时间信息,初始化span叫:root span,它的span id和trace id相等。

  2. trace(跟踪),一组共享“root span”的span组成的树状结构 称为 trace,trace也有一个64位ID,trace中所有span共享一个trace id。类似于一颗 span 树。

  3. annotation(标签),annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。

    • CS(Client Send客户端发起请求)。客户端发起请求描述了span开始。
    • SR(Server Received服务端接到请求)。服务端获得请求并准备处理它。SR-CS=网络延迟。
    • SS(Server Send服务器端处理完成,并将结果发送给客户端)。表示服务器完成请求处理,响应客户端时。SS-SR=服务器处理请求的时间。
    • CR(Client Received 客户端接受服务端信息)。span结束的标识。客户端接收到服务器的响应。CR-CS=客户端发出请求到服务器响应的总时间。

其实数据结构是一颗树,从root span 开始。

sleuth.png

使用

在每个需要被监控的系统的pom中引入:

1
2
3
4
5
<!-- 引入sleuth依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

启动后,日志中可以看到类似于:[account-service,,,]的数据,说明如下:

1
[服务名称,traceId(一条请求调用链中 唯一ID),spanID(基本的工作单元,获取数据等),是否让zipkin收集和展示此信息]

zipkin

zipkin是twitter开源的分布式跟踪系统。

原理收集系统的时序数据,从而追踪微服务架构中系统延时等问题。还有一个友好的界面。

由4个部分组成:Collector(采集器)、Storage(存储器)、Restful API(接口)、Web UI

原理

sleuth收集跟踪信息通过http请求发送给zipkin server,zipkin将跟踪信息存储,以及提供RESTful API接口,zipkin ui通过调用api进行数据展示。

默认内存存储,可以用mysql,ES等存储。

使用

在每个需要被监控的系统的pom中引入:

1
2
3
4
5
<!-- zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

在每个需要监听的服务的配置文件中加入:

1
2
3
4
5
6
7
8
spring:
#zipkin
zipkin:
base-url: http://localhost:9411/
#采样比例1
sleuth:
sampler:
rate: 1

根据zipkin官网中的Quickstart,启动zipkin。

监控告警

使用 Spring Boot2.x Actuator 监控应用

在项目的 POM 中引入

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Endpoints

可以通过/actuator查看所有的暴露端点。

暴露配置
1
2
3
4
5
6
7
8
9
management:
endpoints:
web:
exposure:
include: '*' # 通过HTTP暴露所有的端点
base-path: '/actuator'
jmx:
exposure:
include: '*' # 通过JMX暴露所有的端点
health端点

health端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于:management.endpoint.health.show-details=always

show-details的值:

  • never 不展示详细信息,up或者down的状态,默认配置
  • when-authorized 详细信息将会展示给通过认证的用户。授权的角色可以通过 management.endpoint.health.roles配置
  • always 对所有用户暴露详细信息
metrics端点

metrics端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。

调用:"http://localhost:8080/actuator/metrics/{requiredMetricName}" 获得各个指标。如:http://localhost:8080/actuator/metrics/jvm.memory.max

loggers端点

loggers 端点暴露了我们程序内部配置的所有logger的信息。

调用:http://localhost:8080/actuator/loggers获得所有的logger信息。

可以调用对应的POST接口,修改日志级别等。

info端点

info端点可以用来展示你程序的信息。我理解过来就是一些程序的基础信息。并且你可以按照自己的需求在配置文件 application.properties中个性化配置。

beans端点

beans端点会返回Spring 容器中所有bean的别名、类型、是否单例、依赖等信息。

heapdump端点

访问:http://localhost:8080/actuator/heapdump会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm监控工具,VisualVM 打开此文件查看内存快照。

threaddump 端点

主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。访问:http://localhost:8080/actuator/threaddump

shutdown端点

这个端点属于操作控制类端点,可以优雅关闭 Spring Boot 应用。要使用这个功能首先需要在配置文件中开启:

1
2
3
4
management:
endpoint:
shutdown:
enabled: true

由于 shutdown 接口默认只支持 POST 请求。

env端点

获取应用所有可用的环境属性报告

mappings端点

获取应用所有Spring Web的控制器映射关系报告

configprops端点

获取应用中配置的属性信息报告

SpringCloud Admin健康检查

Admin客户端

在要被监控的客户端添加pom引用:

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在配置文件中如下配置:

1
2
3
4
5
spring:
boot:
admin:
client:
url: http://localhost:9030

Admin服务端

新建一个项目,引入:

1
2
3
4
5
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.1</version>
</dependency>

然后添加注解@EnableAdminServer