SpringBoot(34) - Actuator(2) - 通过HTTP监控和管理
参考: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。
- 访问敏感端点
默认情况下,所有敏感HTTP端点都是安全的,这样只有具有ACTUATOR角色的用户才能访问它们。 使用标准HttpServletRequest.isUserInRole方法强制执行安全验证。
注:如果想要与ACTUATOR不同的东西,请使用management.security.roles属性。
如果要在防火墙后面部署应用程序,可能希望无需身份验证即可访问所有actuator端点。 可以通过更改management.security.enabled属性来执行此操作:
application.properties
management.security.enabled=false
注:默认情况下,actuator端点暴露在提供常规HTTP流量的同一端口上。 如果更改management.security.enabled属性,请注意不要意外暴露敏感信息。
如果要公开部署的应用程序,则可能需要添加“Spring Security”来处理用户身份验证。 添加“Spring Security”时,默认情况下,“basic”身份验证将与用户名 user 和生成的密码一起使用(在应用程序启动时打印在控制台上)。
注:应用程序启动时会记录生成的密码。 搜索“Using default security password”。
可以使用Spring属性更改用户名和密码,以及更改访问端点所需的安全角色。 例如,可以在application.properties中设置以下内容:
security.user.name=admin
security.user.password=secret
management.security.roles=SUPERUSER
如果应用程序具有自定义安全配置,并且希望无需身份验证即可访问所有执行器端点,则需要在安全配置中明确配置该端点。除此之外,还需要将management.security.enabled属性更改为false。
如果自定义安全配置保护actuator端点,则还需要确保经过身份验证的用户具有在management.security.roles下指定的角色。
注:如果没有用于向未经身份验证的用户公开基本health信息的用例,并且已使用自定义安全保护了actuator端点,则可以将management.security.enabled设置为false。这将通知Spring Boot跳过额外的角色检查。
自定义管理端点路径
有时,将所有管理端点分组到单个路径中非常有用。例如,应用程序可能已将 /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将处理路径。
- 自定义管理服务器端口
对于基于云的部署,使用默认HTTP端口暴露管理端点是明智选择。 但是,如果应用程序在自己的数据中心内运行,可能更喜欢使用不同的HTTP端口暴露端点。
management.port属性可用于更改HTTP端口:
management.port=8081
由于管理端口通常受防火墙保护,并且未向公众公开,因此即使主应用程序是安全的,也可能不需要管理端点上的安全性。 在这种情况下,将在类路径上安装Spring Security,并且可以禁用以下管理安全性:
management.security.enabled=false
配置特定于管理的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但具有不同的密钥库:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enabled=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret
- 自定义管理服务器地址
可以通过设置management.address属性来自定义管理端点可用的地址。 如果只想在内部或面向操作的网络上监听,或仅监听来自localhost的连接,这将非常有用。
注:如果端口与主服务器端口不同,则只能监听不同的地址。
以下是不允许远程管理连接的示例application.properties:
management.port=8081
management.address=127.0.0.1
禁用HTTP端点
如果不想通过HTTP公开端点,可以将管理端口设置为-1:management.port=-1
- HTTP health端点格式和访问限制
health端点暴露的信息取决于是否匿名访问,以及封闭应用程序是否安全。 默认情况下,在安全应用程序中匿名访问时,将隐藏有关服务器运行状况的任何详细信息,并且端点将仅指示服务器是启动还是关闭。 此外,响应缓存一段可配置的时间,以防止端点用于拒绝服务攻击。 endpoints.health.time-to-live属性用于配置缓存周期(以毫秒为单位)。 它默认为1000,即1秒。
示例汇总HTTP响应(匿名请求的默认值):
$ curl -i localhost:8080/health
HTTP/1.1 200
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 15
{"status":"UP"}
示例汇总状态为“DOWN”的HTTP响应(请注意503状态代码):
$ curl -i localhost:8080/health
HTTP/1.1 503
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 17
{"status":"DOWN"}
示例详细的HTTP响应:
$ curl -i localhost:8080/health
HTTP/1.1 200 OK
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 221
{
"status" : "UP",
"diskSpace" : {
"status" : "UP",
"total" : 63251804160,
"free" : 31316164608,
"threshold" : 10485760
},
"db" : {
"status" : "UP",
"database" : "H2",
"hello" : 1
}
}
可以增强上述限制,从而仅允许经过身份验证的用户在安全应用程序中完全访问health端点。 为此,将endpoints.health.sensitive设置为true。 以下是行为摘要(默认敏感标志值“false”以粗体表示):
management.security.enabled | endpoints.health.sensitive | 未经过身份认证 | 经过身份认证(带有正确的角色) |
---|---|---|---|
false | * | 全部内容 | 全部内容 |
true | false | 仅返回status | 全部内容 |
true | true | 无 | 全部内容 |
还没有评论,来说两句吧...