目录
1. Spring Boot Actuator简介
使用Spring Boot让我们开发一个Web应用变得非常简单,我们只需要做少量的配置,加一些MVC的代码,就可以对外提供Web服务了。
但是这有时候还不够,比如我们有时候想知道应用的状态,是不是可以访问,特别是在部署在Kubernetes的应用,Kubernetes需要获取应用的状态,如果挂了,K8S会自动的重启应用。
就这就需要我们的应用提供一个状态检查的接口。大部分人想到的就是自定义一个Controller
我们可以当然可以这么做,亲力亲为。但是如果还有其它需求呢,比如获取服务的状态(CPU 内存的使用情况等等),我们也每次自定义吗?
但是作为一款超级框架,Spring Boot 不会允许我们所有开发者都自己造轮子,直接提供了开箱即用的功能给我们使用。
> 像这些都是业务无关的,基础架构的功能,Spring Boot都给我们直接提供了。
这就是 Spring Boot的一个模块 `spring-boot-actuator`。它提供了很多开箱即用的功能:
- 健康检查
- 服务器指标
- 日志追踪
- 环境变量和配置
- ……
我们只需要做少量的配置,我们的应用就能自动集成这些功能。
2. 引入spring-boot-actuator
第一件事情,我们先要引入starter
然后在application.yaml中开启和配置健康检查端点
恭喜你,你的应用已经具备健康检查的接口了
这就是开箱即用。
3. 核心功能和端点解析
什么是端点 Endpoint
端点就是Spring Boot提供的一些接口,通过这些Actuator端点,我们可以对 Spring 应用进行监控和交互。
可以大概这么理解,虽然不太准确,因为通过HTTP暴露出来,只是一种形式,我们还可以通过JMX暴露端点。
这些Endpoint是开箱即用的,一般情况,我们不需要写Java代码,只是少量的配置即可。
比如前面用/health 这个endpoint 对应用进行健康检查。
查看有哪些端点
我们可以在配置中暴露全部的endpoint(web的意思是用HTTP来暴露endpoint)
调用接口 http://localhost:8080/actuator 就能看到全部的端点了
-
http://localhost:8080/actuator:查看所有端点
-
http://localhost:8080/actuator/beans:查看容器有哪些bean
-
http://localhost:8080/actuator/caches:查看缓存
-
http://localhost:8080/actuator/health:检查健康状态
-
http://localhost:8080/actuator/info:服务器基本信息
-
http://localhost:8080/actuator/conditions 定义了哪些自定配置类
-
http://localhost:8080/actuator/configprops 定义了哪些Properties配置类
-
http://localhost:8080/actuator/metrics 查看服务器性能指标
-
http://localhost:8080/actuator/mappings 查看Controller Mapping的映射
不得不说,自动集成的端点功能太强大了!
比如我们可以查看 JVM内存的使用情况 http://localhost:8080/actuator/metrics/jvm.memory.used
配置endpoint
启用endpoint后,我们可以配置具体的endpoint
用health endpoint举例,默认的health 端点,只有一个值 status : UP
但是我们可以配置打印详情
这样,我们可以得到更详细的信息
可以看到health的up状态,是因为其它的几个组件(我的项目中引入了db、redis等)都是UP状态。
生产项目谨慎打开,因为会暴露你的应用信息。
如果一定要打开,可以选择对端点认证。
Health 端点的自动配置
上面也看到了,我用到了db,所以health端点会自动去检查db的健康情况。
我们测试一下,把db从health检查的组件中移除
再次调用 http://localhost:8080/actuator/health 端点,已经不检测db的状态了
要暴露liveness和readness,还需要配置
这样就暴露了readness和liveness
http://localhost:8080/actuator/health/liveness
原理,万变不离其宗,也是自动配置
health检查的组件还有很多,都是自动配置的。完整的列表可以查看
定制端点
除了通过配置定制端点,我们还可以通过代码定制端点。用health端点举例。
我们要做到的只是实现HealthIndicator接口。只是测试,我们直接设置为down
可以看到,我们的health的结果是Down,因为下面新增了一个组件,它的状态是down
新增的组件的类名是 XXXHealthIndicator,则组件的名就是XXX
Kubernetes中的探针
Kubernetes可以把存活探针和可读探针直接指向我们spring boot应用的健康检查端点。
其实Kubernetes还提供一个启动探针startupProbe,专门用来做启动探测的,它的意思是检测这个端点,如果在指定的时间没有得到up状态,就会尝试重启,如果启动到指定次数,就表示启动失败。
info端点
再分享几个好玩的端点。第一个是info端点。
我们如果想要获取git相关的信息,只需要先维护git信息,再classpath下新建一个git.properties
git.branch=main
git.commit.id.abbrev=0f0e0d
然后启动git开关
management:
info:
git:
enabled: true
mode: full
http://localhost:8080/actuator/info 就可以获取到
其它端点也类似,比如info下的build信息。
这就是框架的意义。它帮我们定义好了规则,我们只需按规则做少量的配置,把配置放到指定目录下,就能够开箱即用的使用功能了。
Metrics端点
服务器性能指标,也是我们非常关注的信息
需要先启用metrics
访问端点,http://localhost:8081/actuator/metrics 列出了所有我们可以获取的metric指标信息
比如我们最关系的内存使用情况 http://localhost:8081/actuator/metrics/jvm.memory.used
4. 最佳实践
spring boot actuator 模块提供了很多开箱即用的端口,提供了丰富的功能,但是事情都有两面性,也带来了暴露我们服务关键信息的风险,可能被不法分子攻击。
所以生产环境需要谨慎使用。
不要暴露全部端点
按自己的情况,选择暴露哪些端点。比如只暴露health端点
这样,只能访问健康检查的端点
避免打印详细信息
打印详细信息,会暴露我们服务的重要信息,比如使用的数据库,使用了Redis等等
所以不要把show-details 设置成always
否则一览无余
配置单独的端口
最好给management指定一个单独的端口,不要影响正常的业务
http://localhost:8081/actuator
配置SSL
默认暴露是HTTP的,为了安全传输,我们需要配置SSL