前言

本文将会运用 Spring Boot Actuator 组件完成运用监视和办理,一起结合 Spring Boot Admin 对 Actuator 中的信息进行界面化展现,监控运用的健康状况,供给实时警报功用

Spring Boot Actuator

简介

官方文档:Production-ready Features (spring.io)

Actuator 的核心是端点(Endpoint),它用来监视、供给运用程序的信息,Spring Boot 供给的 spring-boot-actuator 组件中已经内置了十分多的 Endpointhealth、info、beans、metrics、httptrace、shutdown 等),每个端点都能够启用和禁用。Actuator 也答应咱们扩展自己的端点。经过 JMX 或 HTTP 的方法露出自定义端点

注:查看全部 Endpoints 请参照上方的官方文档

Actuator 会将自定义端点的 ID 默许映射到一个带 /actuator 前缀的 URL。比方,health 端点默许映射到 /actuator/health。这样就能够经过 HTTP 的方法获取自定义端点的数据,许多网关作为反向代理需求 URL 来勘探后端集群运用是否存活,这个 URL 就能够供给给网关运用

启动端点

默许情况下,除shutdown之外的一切终结点都处于启用状态。若要装备终结点的启用,请运用其 management.endpoint.<id>.enabled 特点。以下示例启用终结点 shutdown

management:
  endpoint:
    shutdown:
      enabled: true

假如您期望端点启用挑选参加而不是挑选退出,请将该 management.endpoints.enabled-by-default 特点设置为 false 并运用单个端点 enabled 特点挑选重新参加。以下示例启用该 info 终结点并禁用一切其他终结点:

management:
  endpoints:
    enabled-by-default: false
  endpoint:
    info:
      enabled: true

注:禁用的端点将从运用程序上下文中彻底删去。假如只想更改揭露终结点的技能,请改用 includeexclude 特点。

揭露端点

禁用的端点将从运用程序上下文中彻底删去。假如只想更改揭露终结点的技能,请改用 include 和 exclude 特点。若要更改揭露的终结点,请运用以下特定于 include 技能的 exclude 特点

include 特点列出了揭露的终结点的 ID。exclude 特点列出了不该揭露的终结点的 ID。 exclude 特点优先于该 include 特点。您能够运用端点 ID 列表装备特点和 exclude 特点 include 。

例如,要仅经过 JMX 揭露 healthinfo 端点,请运用以下特点

management:
  endpoints:
    jmx:
      exposure:
        include: "health,info"

*可用于挑选一切端点。例如,若要经过 HTTP 揭露除 env 和 beans 终结点之外的一切内容,请运用以下特点

management:
  endpoints:
    web:
      exposure:
        include: "*"
        exclude: "env,beans"

Actuator 一起还能够与外部运用监控系统整合,比方 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic 等。这些系统供给了十分好的仪表盘、图标、分析和告警等功用,使得你能够经过一致的接口轻松的监控和办理你的运用系统。这关于施行微服务的中小团队来说,无疑快速高效的解决方案

装备集成

首要咱们需求创立 springboot web 项目,然后 pom.xml 中增加如下 actuator 依靠

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

装备 application.yml

server:
  port: 8080
management:
  endpoints:
    enabled-by-default: false
    web:
      base-path: /manage
      exposure:
        include: 'info,health,env,beans'
  endpoint:
    info:
      enabled: true
    health:
      enabled: true
    env:
      enabled: true
    beans:
      enabled: true

上述装备只露出 info,health,env,beans 四个 endpoints, web 经过能够 /manage 拜访

拜访:localhost:8080/manage 查看一切开放的端点

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/manage",
            "templated": false
        },
        "beans": {
            "href": "http://localhost:8080/manage/beans",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8080/manage/health",
            "templated": false
        },
        "health-path": {
            "href": "http://localhost:8080/manage/health/{*path}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8080/manage/info",
            "templated": false
        },
        "env": {
            "href": "http://localhost:8080/manage/env",
            "templated": false
        },
        "env-toMatch": {
            "href": "http://localhost:8080/manage/env/{toMatch}",
            "templated": true
        }
    }
}

拜访:localhost:8080/manage/beans

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

拓展装备

安全性

当咱们想要露出更多接口,一起确保 endpoint 接口安全,能够与 Spring Security 集成

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint())
                .authorizeRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
        http.httpBasic();
        return http.build();
    }
}

此外,假如存在 Spring Security,一起你需求增加自定义安全装备,以答应对端点进行未经身份验证的拜访,如以下示例所示

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.securityMatcher(EndpointRequest.toAnyEndpoint());
        http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
        return http.build();
    }
}

跨域拜访

management:
  endpoints:
    web:
      cors:
        allowed-origins: "https://example.com"
        allowed-methods: "GET,POST"

自定义端点

咱们能够经过@JmxEndpoint or @WebEndpoint 注解来定义自己的 endpoint, 然后经过@ReadOperation, @WriteOperation 或许@DeleteOperation 来露出操作

比方增加系统时间 date 的 endpoint

@RestController("custom")
@WebEndpoint(id = "date")
public class CustomEndpointController {
    @ReadOperation
    public ResponseEntity<String> currentDate() {
        return ResponseEntity.ok(LocalDateTime.now().toString());
    }
}
management:
  endpoints:
    enabled-by-default: false
    web:
      base-path: /manage
      exposure:
        include: 'info,health,env,beans,date'
  endpoint:
    info:
      enabled: true
    health:
      enabled: true
    env:
      enabled: true
    beans:
      enabled: true
    date:
      enabled: true

info 不显现

咱们直接拜访 info 接口是空的

问题出处官方文档:Production-ready Features (spring.io)

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

解决方案,修正 application.yml 如下

management:
  endpoint:
    info:
      env:
        enabled: true

Spring Boot Admin

简介

官方仓库:codecentric/spring-boot-admin

官方文档:Spring Boot Admin – (spring-boot-admin.com)

Spring Boot Admin(简称 SBA)由两部分组成:SBA Server 和 SBA Client

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

SBA Server: 包含 Admin 用户界面并独立运行于被监控运用

SBA Client: 供给一种方法将被监控运用注册到 SBA Server

SBA 分为服务端和客户端原理:由于 SBA 需求做集中化的监控(比方运用的集群,多个服务或许微服务等),而不是每个运用都需求有一个 UI。一起被监控的运用应该是和监控渠道是分离的,而且需求考虑其他语言和其他渠道的集成

除此之外,SBA Client 不仅只能够注册到 SBA Server ,还能够注册到 Spring Cloud Discovery(微服务),Python Applications Using Pyctuator(其他语言)等渠道

启用 Server

pom.xml 装备

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.5.3</version>
</dependency>

注意:这儿咱们必须增加 <version> 字段,由于父模块 spring-boot-starter-parent 中的 BOM(Bill of Material) 并没有装备 SBA 的 version,无法自动识别

经过 @EnableAdminServer 注解启用 SBA Server

@Configuration
@EnableAdminServer
@SpringBootApplication
public class SpringBootActuatorDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootActuatorDemoApplication.class, args);
    }
}

拜访:Spring Boot Admin

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

注册 Client

引入 SBA Client 依靠

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.5.3</version>
</dependency>

装备 application.yml

server:
  port: 8080
management:
  endpoints:
    enabled-by-default: false
    web:
      base-path: /manage
      exposure:
        include: 'info,health,env,beans'
  endpoint:
    info:
      env:
        enabled: true
      enabled: true
    health:
      enabled: true
    env:
      enabled: true
    beans:
      enabled: true
# 增加如下装备
spring:
  boot:
    admin:
      client:
        url: 'http://localhost:8080'

拜访:Spring Boot Admin

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

之后点击进入实例,能够自行探究监控信息

『Spring Boot Actuator & Spring Boot Admin』 完成运用监控办理

其他问题

启用 JMX 办理

默许下 SBA 没有启用 JMX,需求经过如下装备启用。

首要需求引入 POM 依靠(PS:需求 SpringBoot2.2 版别)

<dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-core</artifactId>
</dependency>

yml 装备

spring:
  jmx:
    enabled: true

显现日志内容

默许下没有显现 Log File 的内容,假如需求显现 SpringBoot 运用日志需求进行如下装备(装备 logging.file.path 或许 logging.file.name)

logging:
  file:
    name: 'pdai-spring-boot-application.log'
  pattern:
    file: '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx'

继承 Spring Security

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll()  
            .and().csrf().disable();
    }
}

告诉告警信息

集成 spring-boot-starter-mail 装备 JavaMailSender 来用邮件告诉信息

官方文档对应链接:Spring Boot Admin – (spring-boot-admin.com)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
    mail:
        host:smtp.example.com
    boot:
        admin:
            notify:
                mail:
                    to:admin@example.com

注:更多告诉方法(钉钉,微信等)能够直接参考上方官方文档

弥补

在出产环境下,运用 Prometheus Grafana 组合也是十分推荐的监控解决方案,这儿华章有限,读者能够自行探究

参考链接

本文由博客一文多发渠道 OpenWrite 发布!