一文搞懂,如何从运维视角审查 Spring Boot 应用程序(1~5 节)

4.10 运行中的 Spring Boot

课件:第10章.pdf

4.10.1 认识 Spring Boot 的各类 Actuator Endpoint

1、Actuator

image-20250405230224445

  1. Spring Boot 提供了哪些工具,帮助我们了解和管理应用程序的运行情况?
    • Spring Boot 提供了Actuator endpoints,它可以用来监控应用程序的各项指标,并且还支持一些简单的管理操作。
    • 例如,通过特定的URL关闭应用程序、调整日志配置等。
  2. Spring Boot 如何提供对Actuator endpoints 的访问方式?
    • 一种是通过HTTP,这是我们之前已经接触过的;
    • 另一种是通过JMX,默认会把更多的endpoint暴露在JMX端口上面。
2、⼀些常用的 Endpoint

image-20250405230336780

image-20250405230350716

  1. Spring Boot 中哪些endpoint是默认开启并可访问的?
    • 默认情况下,只有 "health"和"info"这两个endpoint是通过HTTP可访问的。
    • 其他endpoint需要通过相关参数调整后,才能在HTTP上访问。
3、如何访问 Actuator Endpoint

image-20250405230617965

image-20250405230701961

  1. 如何配置和控制 Spring Boot 中 Actuator endpoints 的启用与访问权限?
    • 可以通过配置管理服务器的端口、设置base path和mapping等相关配置来控制Actuator endpoints的启用和访问权限。
    • 还可以通过特定参数来开启或关闭特定的endpoint,并选择性地暴露所需的服务指标和操作。

4.10.2 定制⾃己的 Health Indicator

1、Spring Boot ⾃带的 Health Indicator

image-20250405231619392

  1. Spring Boot中健康检查的基本状态有哪些,并且它们分别返回什么样的HTTP响应码?

    • Spring Boot 自带的健康检查状态包括DOWN、OUT_OF_SERVICE(表示系统不好),这两种状态都会返回 503 的 HTTP 响应码。
    • UP 状态代表系统正常运行,UNKNOWN 状态代表未知状态,这两种状态都会返回200的响应码。
  2. Spring Boot中的健康检查是如何管理和配置的?

    • Spring Boot 中的健康检查通过 HealthIndicatorRegistry 收集各种健康指标。
    • 开发者可以配置是否显示详细的健康检查结果,比如设置 show-details 属性为always、never 或 login 授权认证情况下显示。
    • 此外,还可以选择性地开启或关闭特定的健康检查指标。
  3. Spring Boot 中内置的健康检查都涵盖了哪些方面?

    • Spring Boot 内置的健康检查覆盖了多种开源基础设施,如数据库(如H2、JDBC数据源等)、磁盘空间、redis等。
    • 这些内置的健康检查都通过扩展抽象的HealthIndicator类实现,并根据不同的资源类型设定不同的校验方式。

image-20250405231738815

image-20250407000531574

2、⾃定义 Health Indicator

image-20250405232139107

  1. 在 Spring Boot 中,如何通过自定义健康检查来了解应用程序的运行状况?

    • 除了使用 Spring Boot 自带的健康检查(如down、out of service状态),还可以添加自定义的健康指标,以监控应用程序的特定运行状况。

      例如,检查所需加载的数据是否已成功加载到内部基础设施中。

    • 要实现自定义健康检查,开发者需要创建一个自定义的HealthIndicator类,并在其中实现具体的检查逻辑。

      例如,CoffeeIndicator

  2. 如何在 Spring Boot 中实现自定义的 HealthIndicator?

    • 开发者需要实现HealthIndicator 接口或继承 AbstractHealthIndicator 类,并根据自定义的检查逻辑进行检查。
    • 检查完成后,返回特定的健康状态(如up或down)。
    • 同时可以在健康检查中添加额外的TTL信息。
    • 通过这种方式,可以创建反映特定业务逻辑的健康检查机制。
3、show me the code

indicator-demo

  1. 在演示项目中,如何配置和使用自定义的 HealthIndicator?
    • 在示例项目中,首先添加了 spring-boot-starter-actuator 依赖,用于发布健康检查点。
    • 然后,在 application.properties 文件中设置了健康检查的详细信息始终显示(即show-details=always),
    • 并将CoffeeIndicator声明为bean,注入CoffeeService后,根据coffee count判断健康状况。
    • 当count大于零时,健康状况为up,当count为零时,健康状况为down。
    • 通过控制数据库中coffee记录的数量来模拟健康状况的变化,从而观察到健康检查结果的动态更新。

image-20250405232352084

image-20250405232433337

image-20250405232639208

image-20250405232756738

修改我们的 data.sql ,现在没有插入数据了。

image-20250405233000318

image-20250405232922580

4.10.3 通过 Micrometer 获取运行数据

image-20250405234322335

1、认识 Micrometer

image-20250405234335423

image-20250405234426931

  1. 在系统运行过程中,除了程序健康状况外,还需要关注哪些方面的度量指标?
    • 操作系统级别的指标
    • 应用业务相关的指标。
  2. Micrometer 是什么?它在监控系统中的作用是什么?
    • Micrometer 是一个为各类主流监控系统提供探针客户端(instrument clients)的框架。
    • 核心作用是通过一层抽象,使得开发者无需关心底层监控系统的具体client实现,即可方便地插入探针收集所需度量信息。
  3. Micrometer 有哪些特性?
    • Micrometer 支持标签(tag)功能,可实现多维度度量;
    • 预置了大量探针,如缓存、类加载器、GC、CPU线程等;
    • 并且,与Spring有深度整合,例如,能与Web MVC、WebFlux进行集成,对RestTemplate 和 WebClien t也有良好的集成性。
  4. Micrometer 支持哪些主流监控系统?
    • Micrometer 支持多种主流监控系统,包括 Influx、Prometheus 以及其他SaaS监控工具,并且支持分层和多维度的监控输出,具体支持情况可以在其官网上查看。
  5. Spring Boot 2.0 中如何集成并配置 Micrometer ?
    • 在Spring Boot 2.0中,Micrometer 有自动配置和依赖管理功能,支持向多种监控系统导出数据,如 DataDog。并且,能够对度量名称进行转换以适应不同监控系统的格式要求。
2、⼀些核心度量指标

image-20250405234604805

  1. 在Micrometer 中,什么是核心的度量指标接口?它提供了哪些内置实现?
    • 在Micrometer 中,最核心的度量指标接口是Meta接口,它提供了默认的内置实现,包括针对单个值的度量(如CPU使用率、内存使用率)、计时器、计数器以及分布统计情况,如95线、99线指标。
3、Micrometer in Spring Boot 2.x

image-20250405234700706

image-20250405234814001

官方文档:Spring Boot Metrics

  1. Spring Boot 2.0 内置了哪些度量项以及对哪些技术有支持?
    • Spring Boot 2.0内置了一些内嵌度量项,如 JVM CPU 使用率、启动时间等,并对Spring Web MVC、WebFlux、Tomcat、RestTemplate、缓存和数据源等技术提供度量支持。
4、自定义度量指标

image-20250405235145023

  1. 如何在Spring Boot应用中创建和注册自定义度量指标?
    • 在Spring Boot应用中,可以通过实现MeterBinder接口来注册自定义的度量指标,也可以通过MetaFilter对现有度量指标进行过滤。
    • 例如,可以在服务端代 码中实现MetaBanner接口,定义一个Counter类型的度量指标orderCount,并在业务逻辑中对其进行加1操作以监控订单总数。
5、show me the code

metrics-demo

image-20250406003344984

image-20250406003355585

image-20250406003405702

image-20250406003520251

image-20250406003446971

4.10.4 Spring Boot Admin

image-20250406202404228

  1. 在 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、快速上手

image-20250406202528915

  1. 如何快速上手 Spring Boot Admin?
    • 对于服务端,需引入 spring-boot-admin-starter-server ,同时在类上添加@EnableAdminServer注解。
    • 对于客户端,需引入 spring-boot-admin-starter-client,并将 endpoint 暴露出来,由 Spring Boot Admin 自动完成注册。
2、安全控制

image-20250406202613028

image-20250406202706580

  1. 如何保证 Spring Boot Admin 的安全性?
    • 可以引入spring-boot-starter-security为服务端和客户端添加保护措施。
    • 设置 spring security 相关的用户名和密码后,服务端将要求提供这些信息才能访问。同样客户端也会使用指定的用户名密码连接服务端及自身actuator端点。
3、show me the code
  1. 如何配置 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 里,添加依赖

image-20250406202939274

指定相关配置

image-20250406203112737

在 server 主类上,添加 @EnableAdminServer注解。

image-20250406203256865

image-20250406203327430

sba-client-demo

在 pom 里,添加依赖

image-20250406203439218

指定相关配置

image-20250406203627727

登录访问

image-20250406233530691

image-20250406233724492

4.10.5 如何定制 Web 容器的运行参数

1、内嵌的 WEB 容器

image-20250406234159729

  1. 在Spring Boot生产环境中,是否对容器进行了定制配置?Spring Boot支持哪些容器?
    • 是的,在生产过程中,通常会对Spring Boot应用程序的容器进行定制配置,以满足特定需求。
    • Spring Boot不仅支持Tomcat,还支持Jetty、 Undertow等其他容器。
    • 可以通过移除web starter中的Tomcat依赖,并引入相应starter来替换容器。
2、修改容器配置

image-20250406234208031

  1. 如何配置Spring Boot应用的端口号?
    • 通过设置server.port属性来指定端口号,
    • 例如,设置为8080或8081。
  2. 如何在Spring Boot中开启压缩功能并设置相关参数?
    • 设置server.compression.enable=true,开启压缩支持,
    • 设置 server.compression.minSize,最小压缩大小(默认为2K)
    • 设置 server.compression.targetTypes ,配置压缩的目标类型。

image-20250406234236274

  1. 针对不同容器,Spring Boot有哪些特定配置?
    • 对于Tomcat,有server.tomcat相关配置,如最大连接数和最大线程数;
    • 对于Undertow,有server.undertow配置;
    • 在错误处理方面,有server.error配置,其中可以控制是否显示异常信息和stack trace。

image-20250406234247744

image-20250406234319397

  1. 如何通过编程方式修改容器配置?

    • 可以通过实现WebServerFactoryCustomizer接口来自定义 WebServerFactory,对各个支持的服务器类型(如Tomcat、Undertow)进行编程式的配置调整。
  2. 是否可以在代码中实现与容器相关的配置调整?

    • 可以在application.properties文件中配置诸如压缩、最小压缩大小等参数,

    • 也可以利用编程方式实现相同配置,

      如,实现WebServerFactoryCustomizer接口,对服务器进行更细致的定制配置。

3、show me the code

tomcat-demo

  1. 在演示代码中,如何体现通过编程方式配置容器的效果?
    • 首先,展示了在 application.properties 中进行配置的方法。
    • 然后,演示了通过编程方式(即实现WebServerFactoryCustomizer接口)对压缩配置进行调整。
    • 两种方式都能达到预期的配置效果。

image-20250406234604843

通过编程的方式,指定压缩配置

image-20250406235223301

使用 curl ,在命令行测试

image-20250406234917286

### 解决编译时找不到 `Eigen/Eigen` 头文件的问题 当遇到类似于 `fatal error: Eigen/Eigen: No such file or directory` 的错误时,通常意味着编译器无法定位所需的库文件。对于这个问题,有几种常见的解决方法。 #### 安装 Eigen 库 如果尚未安装 Eigen 库,则需要先进行安装。可以通过包管理工具来简化这一过程: ```bash sudo apt-get update sudo apt-get install libeigen3-dev ``` 这会下载并安装最新版本的 Eigen 到系统的标准路径下[^1]。 #### 修改 CMakeLists.txt 配置 确保项目能够正确识别 Eigen 路径,在项目的 `CMakeLists.txt` 中加入如下配置语句: ```cmake find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) ``` 这段代码告诉 CMake 去寻找 Eigen 并将其包含目录添加到编译选项里。这样可以使得后续源码中的 `#include <Eigen/Dense>` 或其他形式的引入变得有效[^2]。 #### 设置环境变量 另一种方式是在终端环境中设置相应的环境变量,比如 `CPATH` 来指定额外的头文件搜索位置。假设已经手动解压了 Eigen 至 `/opt/eigen3` 下面的话,可以在命令行执行下面的操作: ```bash export CPATH=/opt/eigen3:$CPATH ``` 或者更持久化的方式是将上述指令加到 `.bashrc` 文件里面去[^3]。 #### 校验依赖关系 有时即使完成了以上操作仍然会出现同样的问题,这时应该仔细检查整个工程的所有子模块及其各自的 `package.xml` 和 `CMakeLists.txt` 是否遗漏了对 Eigen 的声明或引用不当的情况。 ```xml <build_depend> eigen </build_depend> <!-- package.xml --> ``` 以及确认所有涉及的地方都已经按照官方文档说明进行了正确的集成处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写文章的大米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值