重学springboot系列应用程序监控管理(代码片段)

大忽悠爱忽悠 大忽悠爱忽悠     2023-02-22     373

关键词:


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
envSpring的 ConfigurableEnvironment的属性Yes
flywayflyway 数据库迁移路径,如果有的话Yes
liquibaseLiquibase数据库迁移路径,如果有的话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可以被调换,beansactuator的缓存服务端点的名称。

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信息

SpringBoot2—指标监控

SpringBoot初始教程之SpringBoot-Metrics监控(十)

SpringBoot(37) - Actuator(5) - Metrics

Springboot 源码分析 —— metrics 生效原理解析


定制EndPoint

SpringBoot2—指标监控

如何理解SpringBoot Actuator

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系列之日志框架与全局日志管理(代码片段)

重学SpringBoot系列之日志框架与全局日志管理日志框架的体系结构五花八门的日志工具包日志框架日志门面日志门面存在的意义日志框架选型日志级别常见术语概念解析logback日志框架配置application配置文件实现日志配置日志格式... 查看详情

重学springboot系列之基础知识回顾(代码片段)

重学SpringBoot系列之基础知识回顾SpringBoot项目结构SpringBoot、SpringMVC、Spring对比SpringBoot自动配置什么是SpringBootStarter?什么是SpringBootStarterParent嵌入式web容器SpringDataspringboot2.x新特性基础环境升级依赖组件升级默认软件替换新技... 查看详情

重学springboot系列之嵌入式容器的配置与应用(代码片段)

...为Web容器配置HTTPS如何生成自签名证书将SSL应用于SpringBoot应用程序测试将HTTP请求重定向为HTTPSssl证书配置可参考文章切换到jetty&undertow容器替换掉tomcatReactorNIO多线程模型切换为JettyServer切换到undertow嵌入式容器详细参考文章打w... 查看详情

重学springboot系列之整合数据库开发框架---上(代码片段)

...级的工具和接口,使数据库开发人员能够编写数据库应用程序,术语:什么是持久层:持久层就是指对数据进行持久化操作的代码,比如将数据保存到数据库、文 查看详情

重学springboot系列之整合数据库开发框架---下(代码片段)

重学Springboot系列之整合数据库开发框架---下mybatis+atomikos实现分布式事务整合jta-atomikos配置多数据源统一事务管理器service层测试mybatisplus+atomikos实现分布式事务遗留问题整合jta-atomikos配置多数据源(调整)Spring事务... 查看详情

重学springboot系列之springcache详解(代码片段)

...于有大量重复查询的程序来说。通常来说,在WEB后端应用程序来说,耗时比较大的往往有两个地方:一个是查数据库,一个是调用其它服务的API(因为其它服务最终也要去做查数据库等耗时操作)。重复查... 查看详情

重学springboot系列之redis与springcache缓存(代码片段)

重学SpringBoot系列之redis缓存使用docker安装redis准备工作获取redis镜像创建容器创建持久化存储目录获取redis的默认配置文件模版使用镜像创建一个容器查看活跃的容器访问redis容器服务开启防火墙端口,提供外部访问redis数据结... 查看详情

重学springboot系列之集群多节点应用session共享,redis分布式锁(代码片段)

重学springboot系列之集群多节点应用session共享,redis分布式锁springsession共享的实现原理集成Springsession引入spring-session-redis的maven依赖配置启用`Redis`的`httpSession`配置redis链接信息(application.yml)测试一个项目多个端口... 查看详情

重学springboot系列之ehcache缓存,缓存问题(代码片段)

重学SpringBoot系列之EhCache缓存,缓存问题,session共享与redis分布式锁EhCache缓存整合SpringCache与Ehcache缓存的使用方法缓存使用中的坑缓存雪崩穿透等解决方案缓存使用的若干问题缓存穿透缓存击穿缓存雪崩redis缓存配置自定... 查看详情

重学springboot系列之异步任务与定时任务(代码片段)

重学SpringBoot系列之异步任务与定时任务实现Async异步任务环境准备同步调用异步调用异步回调为异步任务规划线程池SpringBoot任务线程池自定义线程池优雅地关闭线程池通过@Scheduled实现定时任务开启定时任务方法不同定时方式... 查看详情

重学springboot系列番外篇之resttemplate(代码片段)

重学springboot系列番外篇之RestTemplate基本介绍及配置使用什么是RestTemplate?非Spring环境下使用RestTemplateSpring环境下使用RestTemplate底层HTTP客户端库的切换源码分析底层实现切换方法切换为okHTTP切换为ApacheHttpComponents设置超时时间GET请... 查看详情

重学springboot系列之restful接口及常用注解(代码片段)

重学SpringBoot系列之RestFul接口RESTful接口与http协议状态表述RestFul风格的好处RESTfulAPI的设计风格RESTful是面向资源的(名词)用HTTP方法体现对资源的操作(动词)HTTP状态码Get方法和查询参数不应该改变数据使用复数... 查看详情

重学springboot系列之整合数据库开发框架---中(代码片段)

重学Springboot系列之整合数据库开发框架---中javabean的赋值转换为什么要做javabean赋值转换BeanUtils和Dozer?引入Dozer(6.2.0)自定义类型转换(非对称类型转换)映射localDateTime的问题整合MybatisGenerator操作数据整合M... 查看详情

重学springboot系列之统一全局异常处理(代码片段)

重学SpringBoot系列之统一全局异常处理设计一个优秀的异常处理机制异常处理的乱象例举该如何设计异常处理开发规范自定义异常和相关数据结构该如何设计数据结构枚举异常的类型自定义异常请求接口统一响应数据结构使用示... 查看详情

重学springboot系列之mockito测试(代码片段)

重学SpringBoot系列之Mockito测试mock中文文档使用Mockito编码完成接口测试编码实现接口测试为什么要写代码做测试?使用接口测试工具Postman很方便啊junit测试框架Mockito测试框架真实servlet容器环境下的测试@SpringBootTest注解@E... 查看详情

重学springboot系列之服务器推送技术(代码片段)

重学Springboot系列之服务器推送技术主流服务器推送技术说明需求与背景服务端推送常用技术全双工通信:WebSocket服务端主动推送:SSE(ServerSendEvent)websocket与SSE比较服务端推送事件SSE模拟网络支付场景应用场景sse规范模拟实现服务端... 查看详情

重学springboot系列之生命周期内的拦截过滤与监听(代码片段)

重学SpringBoot系列之生命周期内的拦截过滤与监听Servlet域对象与属性变化监听监听器定义与实现使用场景监听器的实现全局Servlet组件扫描注解监听器测试session创建时机Servlet过滤器的实现过滤器过滤器的实现servletspring拦截器及请... 查看详情

重学springboot系列之整合分布式文件系统(代码片段)

重学SpringBoot系列之整合分布式文件系统文件本地上传与提供访问服务复习文件上传目录自定义配置文件上传的Controller实现写一个模拟的文件上传页面,进行测试MinIO简介与选型介绍为什么使用MInIO替换了FastDFS理由一:安... 查看详情