重学SpringBoot系列应用程序监控管理
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学SpringBoot系列应用程序监控管理相关的知识,希望对你有一定的参考价值。
重学SpringBoot系列应用程序监控管理
Actuator应用监控快速入门
Spring Boot Actuator简介
Spring Boot作为构建微服务节点的方案,一定要提供全面而且细致的监控指标,使微服务更易于管理!微服务不同于单体应用,微服务的每个服务节点都单独部署,独立运行,大型的微服务项目甚至有成百上千个服务节点。这就为我们进行系统监控与运维提出了挑战。为了应对这个挑战,其中最重要的工作之一就是:微服务节点能够合理的暴露服务的相关监控指标,用以对服务进行健康检查、监控管理,从而进行合理的流量规划与安排系统运维工作!
Spring Boot Actuator
模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用、Bean加载情况、环境变量、日志信息、线程信息,JVM 堆信息等 。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP 和 JMX 访问。
Actuator 也可以和一些外部的应用监控系统整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
Actuator开启与配置
开启监控
在Spring Boot2.x项目中开启Actuator非常简单,只需要引入如下的maven坐标即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
默认开放访问的监控端点
Spring Boot Actuator
启用之后,HTTP
协议下默认开放了两个端点的访问:
-
/actuator/health
用以监控应用状态。返回值是应用状态信息,包含四种状态DOWN
(应用不正常),OUT_OF_SERVICE
(服务不可用),UP
(状态正常),UNKNOWN
(状态未知)。如果服务状态正常,我们访问http:/host:port/actuator/health
得到如下响应信息:
"status" : "UP"
从上面的响应结果看,该监控端点的监控信息非常有限,如果我们想让展示信息更加丰富的话,可以做如下配置。
management.endpoint.health.show-details=always
-
/actuator/info
用来响应应用相关信息,默认为空。可以根据我们自己的需要,向服务调用者暴露相关信息。如下所示,配置属性可以随意起名,但都要挂在info
下面:
info.app-name=spring-boot-actuator-demo
info.description=spring-boot-actuator-demo indexs monitor
开放端点配置(exposure)
如果我们希望开放更多的监控端点给服务调用者,需要配置:开放部分监控端点,端点名称用逗号分隔
。(所有的端点名称及作用,请看下文)
## 开放访问的服务端点
management.endpoints.web.exposure.include=beans,env
## 不暴露对外开放的服务端点
management.endpoints.web.exposure.exclude=mappings
开放所有监控端点:
management.endpoints.web.exposure.include=*
星号在YAML配置文件中中有特殊的含义,所以在YAML配置文件使用星号一定要加引号,如下所示:
management:
endpoints:
web:
exposure:
include: '*'
开启端点配置(enabled)
- 针对actuator提供的服务端点,开启启用(enabled)不等于开放访问(include)。
- 绝大部分的监控端点是默认开启的(下图中的Yes),少部分监控端点默认是不开启的,比如:shutdown。
- 对于默认不启用的监控服务端点,一定要先开启(enabled),开启的配置方法如下:
# shutdown是服务端点名称,可以替换
management.endpoint.shutdown.enabled=true
常用监控端点说明
Spring Boot Actuator监控端点的分类
- 静态配置类:主要是一些静态配置信息,比如: Spring Bean 加载信息、yml 或properties配置信息、环境变量信息、请求接口关系映射信息等;
- 动态指标类:主要用于展现程序运行期状态,例如内存堆栈信息、请求链信息、健康指标信息等;
- 操作控制类:主要是shutdown功能,用户可以远程发送HTTP请求,从而关闭监控功能。
ID(监控端点名称) | 描述 | 服务是否默认启用 |
---|---|---|
auditevents | 应用程序的审计事件相关信息 | Yes |
beans | 应用中所有Spring Beans的完整列表 | Yes |
conditions | (configuration and auto-configuration classes)的状态及它们被应用或未被应用的原因 | Yes |
configprops | @ConfigurationProperties 的集合列表 | Yes |
env | Spring的 ConfigurableEnvironment 的属性 | Yes |
flyway | flyway 数据库迁移路径,如果有的话 | Yes |
liquibase | Liquibase数据库迁移路径,如果有的话 | Yes |
metrics | 应用的metrics 指标信息 | Yes |
mappings | 所有@RequestMapping 路径的集合列表 | Yes |
scheduledtasks | 应用程序中的计划任务 | Yes |
sessions | 允许从Spring会话支持的会话存储中检索和删除(retrieval and deletion)用户会话。使用Spring Session对反应性Web应用程序的支持时不可用。 | Yes |
shutdown | 允许应用以优雅的方式关闭(默认情况下不启用) | No |
threaddump | 线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息 | Yes |
httptrace显示 | HTTP跟踪信息(默认显示最后100个HTTP请求 - 响应交换) | Yes |
如果使用web应用(Spring MVC, Spring WebFlux, 或者 Jersey),你还可以使用以下端点:
ID (监控端点名称) | 描述 | 默认启用 |
---|---|---|
heapdump | 返回一个GZip压缩的hprof 堆dump文件 | Yes |
jolokia | 通过HTTP暴露JMX beans (当Jolokia在类路径上时,WebFlux不可用) | Yes |
logfile | 返回日志文件内容 (如果设置了logging.file或logging.path属性的话),支持使用HTTP Range头接收日志文件内容的部分信息 | Yes |
prometheus | 以可以被Prometheus服务器抓取的格式显示metrics 信息 | Yes |
Actuator服务保护缓存及跨域
服务端点保护
在很多的情况下,我们只将服务监控信息暴露给特定的用户、特定的角色,而不是对外公开提供访问服务的。所以服务端点的开放,需要基于一定的角色权限控制,像保护我们自己写的服务接口一样去保护Actuator服务端点。我们可以基于RBAC权限模型设计一个权限管理系统,来控制Actuator服务端点的访问权限(一般的应用都会有这个)。这需要较大的工作量,和比较深入的理解RBAC权限模型的设计,对权限管理框架shiro或Spring Security的知识要有深入的掌握才能实现。
我们下面来给大家用Spring Security来配置实现对Actuator服务端点的保护
第一步:引入Spring Security进行权限管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
第二步:Spring Security权限管理配置
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http.httpBasic().and()
.authorizeRequests()
//有ACTUATOR_ADMIN角色标识的用户才能访问
.antMatchers("/actuator/*").hasRole("ACTUATOR_ADMIN")
//必须登录认证才能访问
.antMatchers("/actuator/*").authenticated();
注意看代码中的注释,只是针对Actuator服务端点进行权限访问的控制。如果你想针对不同的业务服务接口、不同的用户、不同的角色进行细粒度权限控制(数据库存储用户、角色、权限关系),那就需要去学Spring Security了。
第三步:application.yml
通过配置的方式,添加一个用户及其具有的角色
spring:
security:
user:
name: dhy #用户名
password: 123456 #密码
roles:
- ACTUATOR_ADMIN #角色名称要与上面的代码对应
第四步:测试
这回当我们再次通过浏览器访问: http://localhost:8888/actuator/health ,就会有弹出框提示我们,要进行登陆验证。输入上文配置的用户名密码即可。
服务端点缓存
对于一些不带参数的端点请求Spring Boot会自动进行缓存,通过下面的配置可以设置缓存时间。配置中的beans
可以被调换,beans
为actuator
的缓存服务端点的名称。
management.endpoint.beans.cache.time-to-live=100s
注意:如果端点添加了Spring Security保护,服务端点的响应结果将不会被缓存。
改变服务路径
由于Spring Boot Actuator
默认使用“/actuator”
作为服务访问的根路径,这是被广为人知的默认配置,这也给应用运行造成了一定的安全隐患。所以我们有必要给监控服务访问端点进行个性化的配置,
management:
endpoints:
web:
base-path: /dhy
path-mapping:
health: healthcheck
management.endpoints.web.base-path=/dhy
management.endpoints.web.path-mapping.health=healthcheck
-
base-path
是用来指定actuator
的访问根路径,替换原始的根路径“/actuator”
-
path-mapping.health
表示针对health
服务端点访问路径进行修改,将“health”
修改成“healthcheck”
经过以上的配置,原来的"/actuator/health"
端点对访问路径就变成了“/dhy/healthcheck”
,当然如果这里改了,权限访问控制代码中的/actuator/*
要改成/dhy/*
开启跨域访问
默认情况下,SpringBoot所有的服务端点默认都没有开启跨域,我们可以通过如下配置快速开启CORS支持,进而实现跨域。下面配置表示允许来自http://localhost:8081的应用服务访问Spring Boot应用,允许的请求方法为GET和POST
management.endpoints.web.cors.allowed-origins=http://localhost:8081
management.endpoints.web.cors.allowed-methods=GET,POST
定制Metrics信息
SpringBoot初始教程之SpringBoot-Metrics监控(十)
SpringBoot(37) - Actuator(5) - Metrics
Springboot 源码分析 —— metrics 生效原理解析
定制EndPoint
SpringBoot——四大核心之指标监控(actuator)
Spring Boot之执行器端点(Actuator Endpoint)实现剖析
SpringBootAdmin界面化监控
Spring Boot Admin 介绍
- Spring Boot Admin是一个针对Spring Boot Actuator的JSON数据响应结果进行UI美化封装的监控工具
- 通过Spring Boot Admin,可以在可视化页面中浏览所有被监控的spring-boot项目的Actuator运行时信息,甚至还可以直接修改logger的level。
Spring Boot Admin包括客户端和服务端两个部分,一个服务端可以展示多个客户端的监控结果:
- 客户端:即需要监控的应用服务,需集成
spring-boot-admin-starter-client
,通过HTTP
协议注册到Spring Boot Admin
服务端,从而进行集中展示。(也可以结合Spring Cloud服务注册中心
) - 服务端:访问客户端的
Actuator
运行时数据,并使用UI
界面进行展示。是一个独立的Spring Boot
应用,需集成spring-boot-admin-starter-server,
创建SpringBoot Admin服务端
1.引入依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.0</version>
</dependency>
2.并在项目启动类上面加上@EnableAdminServer
注解
@EnableAdminServer
@SpringBootApplication
public class BootLaunchActuatorAdminApplication
public static void main(String[] args)
SpringApplication.run(BootLaunchActuatorAdminApplication.class, args);
3.指定访问端口
server.port=8081
4.访问 http://localhost:8081/ ,因为目前没有任何的客户端应用注册上来,所以界面上没有相关的展示信息。
集成SpringBoot Admin客户端
- Spring Boot Admin对自建证书的支持不好,会报错。
- 如果你是为公司开发应用,使用公司付费购买的证书是没问题的。
在我们的项目boot-launch里面引入下面的依赖,目前boot-launch
作为被SpringBoot Admin
监控的客户端存在。注意是client
。
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.0</version>
</dependency>
进行application.yml配置
spring:
boot:
admin:
client:
url: http://localhost:8081
instance:
metadata:
user:
name: $spring.security.user.name
password: $spring.security.user.password
security:
user:
name: dhy#用户名
password: 123456 #密码
roles:
- ACTUATOR_ADMIN #角色名称要与上面的代码对应
-
spring.boot.admin.client.url
体现的是服务端的访问地址,也就是监控注册的地址。 - 当客户端注册到spring boot admin服务端之后,admin服务端就会访问客户端应用的"/actuator"访问端点信息,因为我们为boot-launch配置了用户密码的访问权限(上一节),所以需要将用户名密码告知服务端,它才能正确的获取"/actuator"访问端点信息。这就是metadata.user配置段的作用
另外,为了让Spring Boot Admin 展示的内容更加丰富,我们将所有的服务端点都开放出来。如果不开放,spring boot admin只能获取健康检查"/health"和“/info”两个默认开放访问的基础信息,也就失去了使用Spring Boot Admin的意义
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: '*'
# base-path: /dhy# 去掉自定义的配置路径,默认情况下不被支持
# path-mapping:
# health: healthcheck
喜欢用application.properties配置文件的,可以用下面的配置(作用一致)
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
再次访问 http://localhost:8081/ ,这次展示的监控信息内容就很多了,可以自己试一下!
以上是关于重学SpringBoot系列应用程序监控管理的主要内容,如果未能解决你的问题,请参考以下文章