SpringBoot(34) - Actuator(2) - 通过HTTP监控和管理

青旅半醒 2022-04-05 02:59 225阅读 0赞

参考:https://docs.spring.io/spring-boot/docs/1.5.18.RELEASE/reference/htmlsingle/#production-ready-monitoring

如果正在开发Spring MVC应用程序,Spring Boot Actuator自动配置所有已启用的端点,并且通过HTTP公开。 默认约定是使用端点的id作为URL路径。 例如,health 暴露为 /health。

  1. 访问敏感端点
    默认情况下,所有敏感HTTP端点都是安全的,这样只有具有ACTUATOR角色的用户才能访问它们。 使用标准HttpServletRequest.isUserInRole方法强制执行安全验证。
    注:如果想要与ACTUATOR不同的东西,请使用management.security.roles属性。

如果要在防火墙后面部署应用程序,可能希望无需身份验证即可访问所有actuator端点。 可以通过更改management.security.enabled属性来执行此操作:

application.properties

  1. management.security.enabled=false

注:默认情况下,actuator端点暴露在提供常规HTTP流量的同一端口上。 如果更改management.security.enabled属性,请注意不要意外暴露敏感信息。

如果要公开部署的应用程序,则可能需要添加“Spring Security”来处理用户身份验证。 添加“Spring Security”时,默认情况下,“basic”身份验证将与用户名 user 和生成的密码一起使用(在应用程序启动时打印在控制台上)。

注:应用程序启动时会记录生成的密码。 搜索“Using default security password”。

可以使用Spring属性更改用户名和密码,以及更改访问端点所需的安全角色。 例如,可以在application.properties中设置以下内容:

  1. security.user.name=admin
  2. security.user.password=secret
  3. management.security.roles=SUPERUSER

如果应用程序具有自定义安全配置,并且希望无需身份验证即可访问所有执行器端点,则需要在安全配置中明确配置该端点。除此之外,还需要将management.security.enabled属性更改为false。

如果自定义安全配置保护actuator端点,则还需要确保经过身份验证的用户具有在management.security.roles下指定的角色。
注:如果没有用于向未经身份验证的用户公开基本health信息的用例,并且已使用自定义安全保护了actuator端点,则可以将management.security.enabled设置为false。这将通知Spring Boot跳过额外的角色检查。

  1. 自定义管理端点路径
    有时,将所有管理端点分组到单个路径中非常有用。例如,应用程序可能已将 /info 用于其他目的。可以使用management.context-path属性为管理端点设置前缀:

    management.context-path=/manage

上面的application.properties示例会将端点从 /{id} 更改为 /manage/{id}(例如 /manage/info )。
注:除非管理端口已配置为使用不同的HTTP端口公开端点,否则management.context-path与server.context-path相关。

还可以更改端点的“id”(使用 endpoints.{name}.id ),然后就会同时更改MVC端点的默认资源路径。合法端点ID仅由字母数字字符组成(因为它们可以在许多地方公开,包括禁止使用特殊字符的JMX对象名称)。可以通过配置 endpoints.{name}.path 来单独更改MVC路径,并且不对这些值进行验证(因此可以使用URL路径中合法的任何内容)。例如,要将 /health 端点的位置更改为 /ping/me,可以设置 endpoints.health.path=/ping/me。

注:

  • 即使端点路径是单独配置的,它仍然相对于management.context-path。
  • 如果提供自定义MvcEndpoint,请记住包含可设置的path属性,如果希望代码的行为与标准MVC端点相同,则将其默认为 /{id}。 (参考HealthMvcEndpoint,了解如何实现。)如果自定义端点是Endpoint(不是MvcEndpoint),那么Spring Boot将处理路径。
  1. 自定义管理服务器端口
    对于基于云的部署,使用默认HTTP端口暴露管理端点是明智选择。 但是,如果应用程序在自己的数据中心内运行,可能更喜欢使用不同的HTTP端口暴露端点。

management.port属性可用于更改HTTP端口:

  1. management.port=8081

由于管理端口通常受防火墙保护,并且未向公众公开,因此即使主应用程序是安全的,也可能不需要管理端点上的安全性。 在这种情况下,将在类路径上安装Spring Security,并且可以禁用以下管理安全性:

  1. management.security.enabled=false
  1. 配置特定于管理的SSL
    配置为使用自定义端口时,还可以使用各种 management.ssl.* 属性为管理服务器配置自己的SSL。 例如,这允许管理服务器在主应用程序使用HTTPS时通过HTTP可用:

    server.port=8443
    server.ssl.enabled=true
    server.ssl.key-store=classpath:store.jks
    server.ssl.key-password=secret
    management.port=8080
    management.ssl.enabled=false

或者,主服务器和管理服务器都可以使用SSL但具有不同的密钥库:

  1. server.port=8443
  2. server.ssl.enabled=true
  3. server.ssl.key-store=classpath:main.jks
  4. server.ssl.key-password=secret
  5. management.port=8080
  6. management.ssl.enabled=true
  7. management.ssl.key-store=classpath:management.jks
  8. management.ssl.key-password=secret
  1. 自定义管理服务器地址
    可以通过设置management.address属性来自定义管理端点可用的地址。 如果只想在内部或面向操作的网络上监听,或仅监听来自localhost的连接,这将非常有用。
    注:如果端口与主服务器端口不同,则只能监听不同的地址。

以下是不允许远程管理连接的示例application.properties:

  1. management.port=8081
  2. management.address=127.0.0.1
  1. 禁用HTTP端点
    如果不想通过HTTP公开端点,可以将管理端口设置为-1:

    management.port=-1

  1. HTTP health端点格式和访问限制
    health端点暴露的信息取决于是否匿名访问,以及封闭应用程序是否安全。 默认情况下,在安全应用程序中匿名访问时,将隐藏有关服务器运行状况的任何详细信息,并且端点将仅指示服务器是启动还是关闭。 此外,响应缓存一段可配置的时间,以防止端点用于拒绝服务攻击。 endpoints.health.time-to-live属性用于配置缓存周期(以毫秒为单位)。 它默认为1000,即1秒。

示例汇总HTTP响应(匿名请求的默认值):

  1. $ curl -i localhost:8080/health
  2. HTTP/1.1 200
  3. X-Application-Context: application
  4. Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
  5. Content-Length: 15
  6. {"status":"UP"}

示例汇总状态为“DOWN”的HTTP响应(请注意503状态代码):

  1. $ curl -i localhost:8080/health
  2. HTTP/1.1 503
  3. X-Application-Context: application
  4. Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
  5. Content-Length: 17
  6. {"status":"DOWN"}

示例详细的HTTP响应:

  1. $ curl -i localhost:8080/health
  2. HTTP/1.1 200 OK
  3. X-Application-Context: application
  4. Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
  5. Content-Length: 221
  6. {
  7. "status" : "UP",
  8. "diskSpace" : {
  9. "status" : "UP",
  10. "total" : 63251804160,
  11. "free" : 31316164608,
  12. "threshold" : 10485760
  13. },
  14. "db" : {
  15. "status" : "UP",
  16. "database" : "H2",
  17. "hello" : 1
  18. }
  19. }

可以增强上述限制,从而仅允许经过身份验证的用户在安全应用程序中完全访问health端点。 为此,将endpoints.health.sensitive设置为true。 以下是行为摘要(默认敏感标志值“false”以粗体表示):






























management.security.enabled endpoints.health.sensitive 未经过身份认证 经过身份认证(带有正确的角色)

false

*

全部内容 全部内容

true

false

仅返回status

全部内容

true

true

全部内容

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读