4.10 运行中的 Spring Boot
4.10.1 认识 Spring Boot 的各类 Actuator Endpoint
1、Actuator
- Spring Boot 提供了哪些工具,帮助我们了解和管理应用程序的运行情况?
- Spring Boot 提供了Actuator endpoints,它可以用来监控应用程序的各项指标,并且还支持一些简单的管理操作。
- 例如,通过特定的URL关闭应用程序、调整日志配置等。
- Spring Boot 如何提供对Actuator endpoints 的访问方式?
- 一种是通过HTTP,这是我们之前已经接触过的;
- 另一种是通过JMX,默认会把更多的endpoint暴露在JMX端口上面。
2、⼀些常用的 Endpoint
- Spring Boot 中哪些endpoint是默认开启并可访问的?
- 默认情况下,只有 "health"和"info"这两个endpoint是通过HTTP可访问的。
- 其他endpoint需要通过相关参数调整后,才能在HTTP上访问。
3、如何访问 Actuator Endpoint
- 如何配置和控制 Spring Boot 中 Actuator endpoints 的启用与访问权限?
- 可以通过配置管理服务器的端口、设置base path和mapping等相关配置来控制Actuator endpoints的启用和访问权限。
- 还可以通过特定参数来开启或关闭特定的endpoint,并选择性地暴露所需的服务指标和操作。
4.10.2 定制⾃己的 Health Indicator
1、Spring Boot ⾃带的 Health Indicator
-
Spring Boot中健康检查的基本状态有哪些,并且它们分别返回什么样的HTTP响应码?
- Spring Boot 自带的健康检查状态包括DOWN、OUT_OF_SERVICE(表示系统不好),这两种状态都会返回 503 的 HTTP 响应码。
- UP 状态代表系统正常运行,UNKNOWN 状态代表未知状态,这两种状态都会返回200的响应码。
-
Spring Boot中的健康检查是如何管理和配置的?
- Spring Boot 中的健康检查通过 HealthIndicatorRegistry 收集各种健康指标。
- 开发者可以配置是否显示详细的健康检查结果,比如设置 show-details 属性为always、never 或 login 授权认证情况下显示。
- 此外,还可以选择性地开启或关闭特定的健康检查指标。
-
Spring Boot 中内置的健康检查都涵盖了哪些方面?
- Spring Boot 内置的健康检查覆盖了多种开源基础设施,如数据库(如H2、JDBC数据源等)、磁盘空间、redis等。
- 这些内置的健康检查都通过扩展抽象的HealthIndicator类实现,并根据不同的资源类型设定不同的校验方式。
2、⾃定义 Health Indicator
-
在 Spring Boot 中,如何通过自定义健康检查来了解应用程序的运行状况?
-
除了使用 Spring Boot 自带的健康检查(如down、out of service状态),还可以添加自定义的健康指标,以监控应用程序的特定运行状况。
例如,检查所需加载的数据是否已成功加载到内部基础设施中。
-
要实现自定义健康检查,开发者需要创建一个自定义的HealthIndicator类,并在其中实现具体的检查逻辑。
例如,CoffeeIndicator
-
-
如何在 Spring Boot 中实现自定义的 HealthIndicator?
- 开发者需要实现HealthIndicator 接口或继承 AbstractHealthIndicator 类,并根据自定义的检查逻辑进行检查。
- 检查完成后,返回特定的健康状态(如up或down)。
- 同时可以在健康检查中添加额外的TTL信息。
- 通过这种方式,可以创建反映特定业务逻辑的健康检查机制。
3、show me the code
indicator-demo
- 在演示项目中,如何配置和使用自定义的 HealthIndicator?
- 在示例项目中,首先添加了 spring-boot-starter-actuator 依赖,用于发布健康检查点。
- 然后,在 application.properties 文件中设置了健康检查的详细信息始终显示(即show-details=always),
- 并将CoffeeIndicator声明为bean,注入CoffeeService后,根据coffee count判断健康状况。
- 当count大于零时,健康状况为up,当count为零时,健康状况为down。
- 通过控制数据库中coffee记录的数量来模拟健康状况的变化,从而观察到健康检查结果的动态更新。
修改我们的 data.sql ,现在没有插入数据了。
4.10.3 通过 Micrometer 获取运行数据
1、认识 Micrometer
- 在系统运行过程中,除了程序健康状况外,还需要关注哪些方面的度量指标?
- 操作系统级别的指标
- 应用业务相关的指标。
- Micrometer 是什么?它在监控系统中的作用是什么?
- Micrometer 是一个为各类主流监控系统提供探针客户端(instrument clients)的框架。
- 核心作用是通过一层抽象,使得开发者无需关心底层监控系统的具体client实现,即可方便地插入探针收集所需度量信息。
- Micrometer 有哪些特性?
- Micrometer 支持标签(tag)功能,可实现多维度度量;
- 预置了大量探针,如缓存、类加载器、GC、CPU线程等;
- 并且,与Spring有深度整合,例如,能与Web MVC、WebFlux进行集成,对RestTemplate 和 WebClien t也有良好的集成性。
- Micrometer 支持哪些主流监控系统?
- Micrometer 支持多种主流监控系统,包括 Influx、Prometheus 以及其他SaaS监控工具,并且支持分层和多维度的监控输出,具体支持情况可以在其官网上查看。
- Spring Boot 2.0 中如何集成并配置 Micrometer ?
- 在Spring Boot 2.0中,Micrometer 有自动配置和依赖管理功能,支持向多种监控系统导出数据,如 DataDog。并且,能够对度量名称进行转换以适应不同监控系统的格式要求。
2、⼀些核心度量指标
- 在Micrometer 中,什么是核心的度量指标接口?它提供了哪些内置实现?
- 在Micrometer 中,最核心的度量指标接口是Meta接口,它提供了默认的内置实现,包括针对单个值的度量(如CPU使用率、内存使用率)、计时器、计数器以及分布统计情况,如95线、99线指标。
3、Micrometer in Spring Boot 2.x
官方文档:Spring Boot Metrics
- Spring Boot 2.0 内置了哪些度量项以及对哪些技术有支持?
- Spring Boot 2.0内置了一些内嵌度量项,如 JVM CPU 使用率、启动时间等,并对Spring Web MVC、WebFlux、Tomcat、RestTemplate、缓存和数据源等技术提供度量支持。
4、自定义度量指标
- 如何在Spring Boot应用中创建和注册自定义度量指标?
- 在Spring Boot应用中,可以通过实现MeterBinder接口来注册自定义的度量指标,也可以通过MetaFilter对现有度量指标进行过滤。
- 例如,可以在服务端代 码中实现MetaBanner接口,定义一个Counter类型的度量指标orderCount,并在业务逻辑中对其进行加1操作以监控订单总数。
5、show me the code
metrics-demo
4.10.4 Spring Boot Admin
-
在 Spring Boot 应用中,为什么需要使用监控系统?以及如何引入 Spring Boot Admin 进行管理?Spring Boot Admin 的主要功能有哪些?
-
在Spring Boot应用中,虽然可以通过浏览器访问URL并查看程序运行状况,但这种方式不够直观和便捷。
-
因此,通常会采用一套监控系统来收集并集中展示应用程序信息,如通过Actuator提供的输出内容。
-
Spring Boot自带了一个名为“Spring Boot Admin”的非官方管理工具,由第三方提供,能够为Spring Boot应用提供一套集中管理界面,展示并管理应用程序状态。
-
Spring Boot命主要为Spring Boot应用程序提供一个管理界面,集中展示与actuator相关的输出内容,并支持变更通知。
例如,在浏览器打开管理页面时,若应用上下线,系统会通过弹窗方式提醒用户。此外,它还能对接短信、邮件等通知工具进行通知。
-
1、快速上手
- 如何快速上手 Spring Boot Admin?
- 对于服务端,需引入 spring-boot-admin-starter-server ,同时在类上添加
@EnableAdminServer
注解。 - 对于客户端,需引入 spring-boot-admin-starter-client,并将 endpoint 暴露出来,由 Spring Boot Admin 自动完成注册。
- 对于服务端,需引入 spring-boot-admin-starter-server ,同时在类上添加
2、安全控制
- 如何保证 Spring Boot Admin 的安全性?
- 可以引入spring-boot-starter-security为服务端和客户端添加保护措施。
- 设置 spring security 相关的用户名和密码后,服务端将要求提供这些信息才能访问。同样客户端也会使用指定的用户名密码连接服务端及自身actuator端点。
3、show me the code
-
如何配置 Spring Boot Admin 的例子?运行结果是什么样的?
-
配置 Spring Boot Admin的例子,包括创建spring boot admin server demo和spring boot admin client demo。
-
server demo 中添加security starter、web以及spring-boot-admin-starter-server,并设置必要的端口和应用名称,同时进行安全相关配置。
-
client demo 则引入相关starter,配置不同的端口、应用名称,并发布所有end point,设置用户名密码信息以便与server进行身份验证和注册。
-
最终,可以在浏览器访问本地 8080 端口登录并查看注册应用程序的各项指标和状态变化。
-
sba-server-demo
在 pom 里,添加依赖
指定相关配置
在 server 主类上,添加 @EnableAdminServer
注解。
sba-client-demo
在 pom 里,添加依赖
指定相关配置
登录访问
4.10.5 如何定制 Web 容器的运行参数
1、内嵌的 WEB 容器
- 在Spring Boot生产环境中,是否对容器进行了定制配置?Spring Boot支持哪些容器?
- 是的,在生产过程中,通常会对Spring Boot应用程序的容器进行定制配置,以满足特定需求。
- Spring Boot不仅支持Tomcat,还支持Jetty、 Undertow等其他容器。
- 可以通过移除web starter中的Tomcat依赖,并引入相应starter来替换容器。
2、修改容器配置
- 如何配置Spring Boot应用的端口号?
- 通过设置
server.port
属性来指定端口号, - 例如,设置为8080或8081。
- 通过设置
- 如何在Spring Boot中开启压缩功能并设置相关参数?
- 设置
server.compression.enable=true
,开启压缩支持, - 设置
server.compression.minSize
,最小压缩大小(默认为2K) - 设置
server.compression.targetTypes
,配置压缩的目标类型。
- 设置
- 针对不同容器,Spring Boot有哪些特定配置?
- 对于Tomcat,有
server.tomcat
相关配置,如最大连接数和最大线程数; - 对于Undertow,有
server.undertow
配置; - 在错误处理方面,有
server.error
配置,其中可以控制是否显示异常信息和stack trace。
- 对于Tomcat,有
-
如何通过编程方式修改容器配置?
- 可以通过实现
WebServerFactoryCustomizer
接口来自定义 WebServerFactory,对各个支持的服务器类型(如Tomcat、Undertow)进行编程式的配置调整。
- 可以通过实现
-
是否可以在代码中实现与容器相关的配置调整?
-
可以在application.properties文件中配置诸如压缩、最小压缩大小等参数,
-
也可以利用编程方式实现相同配置,
如,实现WebServerFactoryCustomizer接口,对服务器进行更细致的定制配置。
-
3、show me the code
tomcat-demo
- 在演示代码中,如何体现通过编程方式配置容器的效果?
- 首先,展示了在 application.properties 中进行配置的方法。
- 然后,演示了通过编程方式(即实现WebServerFactoryCustomizer接口)对压缩配置进行调整。
- 两种方式都能达到预期的配置效果。
通过编程的方式,指定压缩配置
使用 curl ,在命令行测试