Spring Boot四大神器之Actuator

Spring Boot自带一个名为Actuator执行器的模块,可以启用有关应用程序的指标和统计信息。例如,我们可以收集日志,查看指标,执行线程转储,显示环境变量,了解垃圾收集,以及显示BeanFactory中配置的bean。您可以通过HTTP,JMX公开此信息,或者甚至可以通过SSH直接登录到该过程。

公开应用程序指标和信息

当你已经成功开发了Spring Boot 应用程序后,将它部署到了生产环境中,你将如何
监控它?如何才能了解程序的运行方式?我们的微服务通常都是黑盒子,除非我们明确地考虑如何将指标公开给外界。

Spring Boot附带一个预先打包的启动器,称为Actuator,可以轻松实现这一目标。

启用Actuator

要在Boot中开始使用现有的执行器 - 我们只需要将spring-boot-actuator依赖项添加到pom中:

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

就是这么简单! 您现在已将执行器添加到现有应用程序中。重新启动应用程序时,将为用户访问启用端点。更多详细的配置和度量的自定义将在以后的部分中介绍。

执行器端点

只需添加执行器依赖项,我们的应用程序现在已经公开了大量信息,这对于调试或一般的微服务洞察非常方便。

大多数端点都是敏感的 - 这意味着它们并非完全公开 - 而少数端点则不是,比如:/health和/info。

以下是Boot提供的一些最常见的端点:

  • /health - 显示应用程序运行状况信息(包含通过未经身份验证的连接访问时的简单“状态”或经过身份验证时的完整消息详细信息)。默认情况下它不敏感。
  • /info - 显示任意应用程序信息。默认不敏感。
  • /metrics - 显示当前应用程序的“指标”信息。它默认是敏感的。
  • /trace - 显示跟踪信息(默认情况下为最后几个HTTP请求)。

您可以在官方文档中找到现有端点的完整列表。

自定义管理服务器端口

使用默认HTTP端口公开管理端点是基于云的部署的明智选择。但是,如果您的应用程序在您自己的数据中心内运行,您可能更喜欢使用不同的HTTP端口公开端点。

使用management.port属性可用于更改HTTP端口。

management.port=8081

安全

大多数情况下,通过端点公开的详细信息都很敏感,需要授权用户查看详细信息。您可以添加spring security以保护您的终端。只需添加依赖项,当类路径中有spring安全文件时,它将自动配置。

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

默认情况下,启用basic安全性。这将为所有端点启用。但是,您可以通过更新application.properties文件来禁用它们,并在没有安全性的情况下公开非敏感端点。

以下是配置spring boot 执行器应用程序安全性所需的基本条目:

management.security.enabled=true
security.basic.enabled=true
security.user.name=admin
security.user.password=admin

在上面的配置中,我们启用基本安全性并提供用户名和密码来访问端点。当用户尝试访问端点时,浏览器上将弹出以使用凭据对用户进行身份验证。

自定义端点

可以使用以下格式使用属性自定义每个端点:

endpoints.[endpoint name].[property to customize]

有三个属性:

  • id - 通过HTTP访问此端点
  • enabled - 如果为true,则可以访问,否则不能访问
  • sensitive - 如果是,则需要授权通过HTTP显示关键信息。

例如,添加以下属性将自定义/beans端点:

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true

Health端点

/health端点被用来检查正在运行的应用程序的健康状态。它通常由基本监控软件用于在生产出现故障时提醒您。

默认情况下,仅显示健康信息以通过HTTP进行未经授权的访问

{
   "status" : "UP"
}

此健康信息是从HealthIndicator应用程序上下文中配置的所有bean实现接口收集的。

返回的某些信息HealthIndicator本质上是敏感的 - 但您可以配置endpoints.health.sensitive=false为公开其他信息,如磁盘空间,数据源等。

自定义Health端点

您还可以自定义健康指标。可以扩展HealthIndicator接口并提供自己的实现。创建此类型的自定义类并覆盖health()方法,自定义逻辑将覆盖默认功能。

@Component
public class CustomHealthCheck implements HealthIndicator {
    public Health health() {
        int errorCode = 0;
        if (errorCode != 1) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}

输出将是:

{
  "status": "DOWN",
  "customHealthCheck": {
    "status": "DOWN",
    "Error Code": 0
  },
  "diskSpace": {
    "status": "UP",
    "free": 19593824409432,
    "threshold": 15485791
  }
}

Info端点

您还可以自定义/ info端点显示的数据 - 例如:

endpoints.info.id=info
endpoints.info.sensitive=false
endpoints.info.enabled=true
info.app.name=Spring Actuator Example
info.app.description=Simple project of Spring Actuator with examples
info.app.version=0.0.1-SNAPSHOT

示例输出:

{
   "app": {
     "version": "0.0.1-SNAPSHOT",
     "description": "Simple project of Spring Actuator with examples",
     "name": "Spring Actuator Example"
   }
}

Metrics端点

度量端点是收集和发布有关操作系统,JVM和应用程序级别度量的信息的更重要的端点之一, 开箱即用。我们能得到内存,堆,处理器,线程,加载类,卸载类,线程池以及一些HTTP指标等内容。

Dump端点

当您的应用程序遇到任何性能问题时,Thread Dumps很重要。在正常情况下,您必须请求生产服务器管理员以频繁的间隔进行Thread Dumps并发送给您进行分析。但是,这需要花费大量时间,并且只有在出现实际性能问题时才需要Thread Dumps。

这个端点将为生产应用程序提供真正的好处,只需通过使用浏览器访问应用程序来获取Thread Dumps。看到Spring Boot 为生产应用提供了如此出色的功能,真是太棒了!

自定义端点实现

除了Spring Boot引用的上述默认端点之外,我们可以通过实现接口Endpoint来编写自己的端点。当您希望公开应用程序详细信息(这是应用程序的附加功能)时,这非常有用。例如,在此示例中,我创建了一个自定义端点来显示应用程序的服务器详细信息。

实现类看起来像这样:

@Component
public class ServerEndpoint implements Endpoint<List<String>> {

  public String getId() {
      return "server";
  }

  public List<String> invoke() {
      List<String> serverDetails = new ArrayList<String>();
      try {
          serverDetails.add("Server IP Address : " + InetAddress.getLocalHost().getHostAddress());
          serverDetails.add("Server OS : " + System.getProperty("os.name").toLowerCase());
      } catch (Exception e) {
          e.printStackTrace();
      }
      return serverDetails;
  }

  public boolean isEnabled() {
      return true;
  }

  public boolean isSensitive() {
      return false;
  }

}

这是输出的样子:

["Server IP Address : 192.168.1.164","Server OS : Mac OS X"]

总结

Actuator是Spring Boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过restful api请求来监管、审计、收集应用的运行情况。

随着Spring boot 2.0的发布,Actuator获得了许多新功能。虽然它经过重新设计并添加了新的edpoints,但Actuator保留了其基本意图,简化了其模型,扩展了其功能并采用了更好的默认设置。

Spring Boot 1.x与2.x中的用法和不同点可参看我们另一篇文章:服务监控 Spring Boot Actuator 介绍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章