微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

整合篇:零基础学习与使用Actuator

配套资料,免费下载
链接:https://pan.baidu.com/s/1jA217UgqXpONi_fV-aOzqw
提取码:bm2g
复制这段内容后打开百度网盘手机App,操作更方便哦

1、场景简介

未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。Spring Boot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。而我们要做的就是引入这个场景的启动器即可。

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

2、端点介绍

2.1、端点概述

执行器端点(Actuator endpoints)使您可以监视应用程序并与之交互。Spring Boot包含许多内置端点,您可以添加自己的端点。例如,health端点提供基本的应用程序运行状况信息。每个单独的端点都可以通过HTTPJMX启用或禁用和公开。当端点同时启用和公开时,它被视为可用。内置端点只有在可用时才会被自动配置。大多数应用程序选择通过HTTP公开,其中端点的ID和前缀/actuator映射到URL。例如,认情况下,health端点映射到/actuator/health。

可以使用以下与技术无关的端点:

ID 描述
auditevents 公开当前应用程序的审核事件信息。需要一个AuditEventRepository组件。
beans 显示应用程序中所有Spring Bean的完整列表。
caches 公开可用的缓存。
conditions 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。
configprops 显示所有的整理列表@ConfigurationProperties
env 公开Spring的属性ConfigurableEnvironment
flyway 显示所有已应用的Flyway数据库迁移。需要一个或多个Flyway组件。
health 显示应用程序运行状况信息。
httptrace 显示HTTP跟踪信息(认情况下,最近100个HTTP请求-响应交换)。需要一个HttpTraceRepository组件。
info 显示任意应用程序信息。
integrationgraph 显示Spring Integration图。需要对的依赖spring-integration-core
loggers 显示修改应用程序中记录器的配置。
liquibase 显示已应用的所有Liquibase数据库迁移。需要一个或多个Liquibase组件。
metrics 显示当前应用程序的“指标”信息。
mappings 显示所有@RequestMapping路径的整理列表。
scheduledtasks 显示应用程序中的计划任务。
sessions 允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。
shutdown 使应用程序正常关闭认禁用。
startup 显示由收集的启动步骤数据ApplicationStartup。需要使用SpringApplication进行配置BufferingApplicationStartup
threaddump 执行线程转储。

如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:

ID 描述
heapdump 返回hprof堆转储文件
jolokia 通过HTTP公开JMX bean(当Jolokia在类路径上时,不适用于WebFlux)。需要对的依赖jolokia-core
logfile 返回日志文件内容(如果已设置logging.file.namelogging.file.path属性)。支持使用HTTPRange标头来检索部分日志文件内容
prometheus 以Prometheus服务器可以抓取的格式公开指标。需要对的依赖micrometer-registry-prometheus

2.2、启动端点

认情况下,除了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属性

2.3、暴露端点

由于端点可能包含敏感信息,因此应谨慎考虑何时公开它们。下表显示了内置端点的认暴露情况:

ID JMX Web
auditevents Yes No
beans Yes No
caches Yes No
conditions Yes No
configprops Yes No
env Yes No
flyway Yes No
health Yes Yes
heapdump N/A No
httptrace Yes No
info Yes Yes
integrationgraph Yes No
jolokia N/A No
logfile N/A No
loggers Yes No
liquibase Yes No
metrics Yes No
mappings Yes No
prometheus N/A No
scheduledtasks Yes No
sessions Yes No
shutdown Yes No
startup Yes No
threaddump Yes No

为了改变这些端点原有认暴露行为,您可以使用includeexclude属性进行设置:

属性
management.endpoints.jmx.exposure.exclude
management.endpoints.jmx.exposure.include *
management.endpoints.web.exposure.exclude
management.endpoints.web.exposure.include info,health

include属性列出了公开的端点的ID。该exclude属性列出了不应公开的端点的ID。

例如,要停止通过JMX公开所有端点,而仅公开healthinfo端点,请使用以下属性

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

*可用于选择所有端点。例如,要通过HTTP公开除envbeans端点之外的所有内容,请使用以下属性

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

注意:* 在YAML中具有特殊含义,因此如果要包括(或排除)所有端点,请确保添加引号。

2.4、访问端点

我们以访问health端点为例:http://localhost:8080/actuator/health

image-20210107205303843

2.5、保护端点

您应该像对待其他任何敏感URL一样,确保HTTP端点的安全。如果存在Spring Security,则认情况下使用Spring Security内容协商策略保护端点的安全。例如,如果您希望为HTTP端点配置自定义安全性,仅允许具有特定角色的用户访问它们,Spring Boot提供了一些方便的RequestMatcher对象,这些对象可以与Spring Security结合使用。典型的Spring Security配置可能类似于以下示例:

@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
                requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
        http.httpBasic();
    }

}

前面的示例用于EndpointRequest.toAnyEndpoint()将请求匹配到任何端点,然后确保所有ENDPOINT_ADMIN角色都具有该角色。如果将应用程序部署在防火墙后面,则可能希望无需进行身份验证即可访问所有执行器端点。您可以通过更改management.endpoints.web.exposure.include属性来做到这一点,如下所示:

management:
  endpoints:
    web:
      exposure:
        include: '*'

此外,如果存在Spring Security,则需要添加自定义安全配置,该配置允许未经身份验证的端点访问,如以下示例所示:

@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
            requests.anyRequest().permitAll());
    }

}

2.6、配置端点

对于不带任何参数的端点读取操作,端点将自动缓存。要配置端点缓存生存的时间,请使用其cache.time-to-live属性

以下示例将beans端点的缓存的生存时间设置为10秒:

management:
  endpoint:
    beans:
      cache:
        time-to-live: 10s

2.7、跨域支持

(CORS)是W3C规范,可让您灵活地指定授权哪种类型的跨域请求。如果使用Spring MVC或Spring WebFlux,则可以将Actuator的Web端点配置为支持此类方案。认情况下,CORS支持是禁用的,并且仅management.endpoints.web.cors.allowed-origins在设置了属性后才启用。

以下配置允许GETPOSTexample.com调用

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

注意: 有关选项的完整列表,请参见CorsEndpointProperties

2.8、自定义端点

如果您想自定义端点请在类上标注@Endpoint注解,还有一些特定的方法注解如@ReadOperation@WriteOperation@DeleteOperation,自定义厚的端点会显示在Web应用程序以及JMX和HTTP的访问中,可以使用Jersey,Spring MVC或Spring WebFlux通过HTTP公开端点。如果Jersey和Spring MVC均可用,则将使用Spring MVC。

以下示例公开了一个读取操作,一个写操作:

@Component
@Endpoint(id = "container")
public class DockerEndpoint {

    @ReadOperation
    public Map getDockerInfo(){
        return Collections.singletonMap("info","docker started...");
    }

    @WriteOperation
    private void restartDocker(){
        System.out.println("docker restarted....");
    }

}

以下示例公开了一个读取操作,该操作返回一个自定义对象:

@ReadOperation
public CustomData getCustomData() {
    return new CustomData("test", 5);
}

您也可以使用@Jmxendpoint或编写技术特定的端点@WebEndpoint。这些端点仅限于其各自的技术。例如,@WebEndpoint仅通过HTTP而不是JMX公开。

您可以使用@EndpointWebExtension和编写特定于技术的扩展@EndpointJmxextension。这些注解使您可以提供特定于技术的操作来扩展现有端点。

最后,如果需要访问特定于Web框架的功能,则可以实现Servlet或Spring@Controller@RestController终结点,但要付出代价,即它们无法通过JMX或使用其他Web框架使用。

Servlet端点

Servlet可以通过标注一个@ServletEndpoint注解同时实现supplier<EndpointServlet>就能成为一个Servlet端点。Servlet端点提供了与Servlet容器的更深层集成,但以可移植性为代价。它们旨在用于将现有对象公开Servlet为端点。对于新端点,应尽可能使用@Endpoint@WebEndpoint注解。

Controller端点

@ControllerEndpoint@RestControllerEndpoint可以用于实现仅由Spring MVC或Spring WebFlux公开的端点。使用Spring MVC和Spring WebFlux的标准注解(例如@RequestMapping和)映射方法@GetMapping,并将端点的ID用作路径的前缀。控制器端点提供了与Spring Web框架的更深层集成,但以可移植性为代价。对于新端点,应尽可能使用@Endpoint@WebEndpoint注解。

3、健康信息

3.1、健康详情

您可以使用运行状况信息来检查正在运行的应用程序的状态。监视软件通常使用它在生产系统出现故障时向某人发出警报。health端点公开的信息取决于management.endpoint.health.show-detailsmanagement.endpoint.health.show-components属性,可以使用以下值之一对其进行配置:

名称 描述
never 详细信息永远不会显示
when-authorized 详细信息仅显示给授权用户。可以使用来配置授权角色management.endpoint.health.roles
always 向所有用户显示详细信息。

认值为never。当用户担任一个或多个端点的角色时,该用户被视为已授权。如果端点没有配置的角色(认值),则所有通过身份验证的用户均被视为已授权。可以使用management.endpoint.health.roles属性配置角色。

健康信息是从HealthContributorRegistry中收集的,该HealthContributorRegistry可用于在运行时注册和注销的健康指标。Spring Boot包括许多自动配置HealthContributors,您也可以编写自己的。

一个HealthContributor可以是一个Healthindicator或是一个 CompositeHealthContributor一个Healthindicator提供实际的健康信息,包括Status一个CompositeHealthContributor提供其他的组合HealthContributors,合起来形成一个树形结构来代表整个系统的健康状况。

认情况下,最终的系统健康状况是由StatusAggregator派生的,它根据状态Healthindicator的有序列表对每个状态进行排序。排序列表中的第一个状态用作整体运行状况。如果没有Healthindicator返回一个已知状态StatusAggregator,一种UNKNowN是使用状态。

3.2、健康指标

3.2.1、健康指标列表

Healthindicators在适当的情况下,Spring Boot会自动配置以下内容。您也可以通过配置启用/禁用选定的指标management.health.key.enabled,key表示键这一列的某一个属性

名称 描述
cassandra CassandraDriverHealthIndicator 检查Cassandra数据库是否已启动。
couchbase CouchbaseHealthIndicator 检查Couchbase群集是否已启动。
datasource DataSourceHealthIndicator Checks that a connection to DataSource can be obtained.
diskspace DiskSpaceHealthIndicator 检查磁盘空间不足。
elasticsearch ElasticsearchRestHealthIndicator 检查Elasticsearch集群是否已启动。
hazelcast HazelcastHealthIndicator 检查Hazelcast服务器是否已启动。
influxdb InfluxDbHealthIndicator 检查InfluxDB服务器是否已启动。
jms JmsHealthIndicator 检查JMS代理是否启动。
ldap LdapHealthIndicator 检查LDAP服务器是否已启动。
mail MailHealthIndicator 检查邮件服务器是否已启动。
mongo MongoHealthIndicator 检查Mongo数据库是否已启动。
neo4j Neo4jHealthIndicator 检查Neo4j数据库是否启动。
ping PingHealthIndicator 一律以回应UP
rabbit RabbitHealthIndicator 检查Rabbit服务器是否已启动。
redis RedisHealthIndicator 检查Redis服务器是否启动。
solr SolrHealthIndicator 检查Solr服务器是否已启动。

注意: 您可以通过设置management.health.defaults.enabled属性来全部禁用它们。

其他Healthindicators功能可用,但认情况下未启用:

名称 描述
livenessstate LivenessStateHealthIndicator 公开“活动”应用程序的可用性状态。
readinessstate ReadinessStateHealthIndicator 公开“就绪”应用程序可用性状态。

反应式健康指标列表

ReactiveHealthindicators在适当的情况下,Spring Boot会自动配置以下内容

名称 描述
CassandraDriverReactiveHealthIndicator 检查Cassandra数据库是否已启动。
CouchbaseReactiveHealthIndicator 检查Couchbase群集是否已启动。
ElasticsearchReactiveHealthIndicator 检查Elasticsearch集群是否已启动。
MongoReactiveHealthIndicator 检查Mongo数据库是否已启动。
Neo4jReactiveHealthIndicator 检查Neo4j数据库是否启动。
RedisReactiveHealthIndicator 检查Redis服务器是否启动。

3.2.2、自定义健康指标

为了提供定制的健康信息,您可以注册实现该HealthIndicator接口的Spring bean 。您需要提供该health()方法的实现并返回Health响应。的Health响应应该包括一个状态,并且可以任选地包括另外的细节被显示。以下代码显示了示例Healthindicator实现:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Healthindicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthindicator implements Healthindicator {

    @Override
    public Health health() {
        int errorCode = check(); // perform some specific health check
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}

除了Spring Boot的预定义Status类型之外,Health还可以返回代表新系统状态的自定义Status

在这种情况下,StatusAggregator还需要提供接口的自定义实现或者必须使用management.endpoint.health.status.order配置属性来配置认实现。

management:
  endpoint:
    health:
      status:
        order: fatal,down,out-of-service,unkNown,up

响应中的HTTP状态代码反映了总体健康状态。认情况下,OUT_OF_SERVICEDOWN映射到503的所有未映射的健康状态,包括UP,映射到200你可能也想,如果你通过HTTP访问健康端点注册自定义状态映射。配置自定义映射禁用认映射DOWNOUT_OF_SERVICE。如果要保留认映射,则必须在所有自定义映射旁边显式配置它们。例如,以下属性映射FATAL到503(服务不可用)和保留的认映射DOWNOUT_OF_SERVICE

management:
  endpoint:
    health:
      status:
        http-mapping:
          down: 503
          fatal: 503
          out-of-service: 503

下表显示了内置状态的认状态映射:

Status Mapping
DOWN SERVICE_UNAVAILABLE (503)
OUT_OF_SERVICE SERVICE_UNAVAILABLE (503)
UP 认情况下没有映射,因此http状态为200
UNKNowN 认情况下没有映射,因此http状态为200

自定义反应式健康指标

对于反应式应用程序,例如使用Spring WebFlux的那些应用程序,ReactiveHealthContributor提供了非阻塞合同来获取应用程序的运行状况。与传统方法类似HealthContributor,健康信息是从中收集的ReactiveHealthContributorRegistry的信息。为了从反应式API提供自定义的健康信息,您可以注册实现该ReactiveHealthIndicator接口的Spring bean 。以下代码显示了示例ReactiveHealthindicator实现:

@Component
public class MyReactiveHealthindicator implements ReactiveHealthindicator {

    @Override
    public Mono<Health> health() {
        return doHealthCheck() //perform some specific health check that returns a Mono<Health>
            .onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()));
    }

}

4、数据可视化

4.1、Spring Boot Admin概述

我们虽然可以使用HTTP请求来查看当前应用健康数据,但是毕竟不是很方便,所以我们可以使用开源的 Spring Boot Admin 来进行可视化。

Spring Boot Admin为注册的应用程序提供以下功能

  • 显示健康状况
  • 显示详细信息,例如
    • JVM和内存指标
    • micrometer.io指标
    • 数据源指标
    • 缓存指标
  • 显示内部编号
  • 关注并下载日志文件
  • 查看JVM系统和环境属性
  • 查看Spring Boot配置属性
  • 支持Spring Cloud的可发布/ env-和// refresh-endpoint
  • 轻松的日志级别管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http-traces
  • 查看审核事件
  • 查看http端点
  • 查看预定的任务
  • 查看和删除活动会话(使用spring-session)
  • 查看Flyway / Liquibase数据库迁移
  • 下载heapdump
  • 状态更改通知(通过电子邮件,Slack,Hipchat等)
  • 状态更改的事件日志(非持久性)

4.2、Spring Boot Admin文档

指南地址:http://codecentric.github.io/spring-boot-admin/2.3.1/

4.3、Spring Boot Admin使用

4.3.1、Client端

我们自己编写的应用叫做客户端,为了能够连接服务器,所以我们应该添加客户端的依赖:

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

也需要针对性的做一些配置:

management:
  endpoints:
    web:
      exposure:
        include: '*'

spring:
  boot:
    admin:
      client:
        #配置服务端地址
        url: http://127.0.0.1:8888
        instance:
          #是否启用IP地址访问服务端
          prefer-ip: true
          #请配置当前应用的应用名称
          name: spring-boot-quick

重新启动咱们自己编写的应用即可,但是现在先不要访问,因为我们还没有服务端,服务端就是用来将数据进行可视化的,所以,等服务端创建完毕并运行以后,我们再启动当前的应用就好。

4.3.2、Server端

image-20210107224348556

image-20210107224430189

image-20210107224506919

image-20210107224525593

导入依赖:

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

修改配置:

server:
  port: 8888
  
spring: 
  application:
    name: spring-boot-admin

开启注解:

@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminApplication.class, args);
    }

}

启动应用,然后再启动客户端,最后访问地址:http://localhost:8888/

image-20210107225745441

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐