20191127 Spring Boot官方文档学习(5)

5.Spring Boot Actuator:可投入生产的功能

Spring Boot包含许多其他功能,可帮助您在将应用程序投入生产时监控和管理您的应用程序。您可以选择使用HTTP端点或JMX管理和监视您的应用程序。审核,运行状况和指标收集也可以自动应用于您的应用程序。

5.1。启用生产就绪功能

spring-boot-actuator模块提供了Spring Boot生产就绪的所有功能。启用功能的最简单方法是添加依赖项,spring-boot-starter-actuator“启动器”。

执行器的定义:
执行器是制造术语,是指用于移动或控制某些物体的机械设备。执行器可以通过很小的变化产生大量的动作。

要将执行器添加到基于Maven的项目中,请添加以下依赖项:

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

对于Gradle,请使用以下声明:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}

5.2。端点(Endpoints)

执行器端点使您可以监视应用程序并与之交互。Spring Boot包含许多内置端点,您可以添加自己的端点。例如,health端点提供基本的应用程序运行状况信息。

每个端点都可以启用或禁用。这控制了是否创建了端点以及它的bean在应用程序上下文中是否存在。为了可以远程访问,端点还必须通过JMXHTTP公开。大多数应用程序选择HTTP,其中终结点的ID和/actuator前缀映射到URL。例如,默认情况下,health端点映射到/actuator/health。

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

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

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

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

要了解有关执行器端点及其请求和响应格式的更多信息,请参阅单独的API文档

5.2.1。启用端点

默认情况下,所有端点除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
management.endpoint.info.enabled=true

禁用的端点将从应用程序上下文中完全删除。如果只想更改公开端点的技术,请使用includeexclude属性。

实际测试后发现,无需management.endpoint.info.enabled=true,只要使用include属性如下,即可通过HTTP访问到(http://localhost:8080/actuator/mappings):

management.endpoints.web.exposure.include=mappings

5.3。通过HTTP进行监视和管理

如果您正在开发Web应用程序,则Spring Boot Actuator会自动配置所有启用的端点以通过HTTP公开。默认约定是使用前缀为/actuator的id端点的作为URL路径。例如,health暴露为/actuator/health。

Spring MVC,Spring WebFlux和Jersey原生支持Actuator。

5.3.1。自定义管理端点路径

有时,自定义管理端点的前缀很有用。例如,您的应用程序可能已经将/actuator用于其他用途。您可以使用management.endpoints.web.base-path属性来更改管理端点的前缀,如以下示例所示:

management.endpoints.web.base-path=/manage

前面的application.properties示例将端点从/actuator/{id}更改为/manage/{id}(例如/manage/info)。

除非管理端口已经被配置为通过使用不同的HTTP端口暴露端点,management.endpoints.web.base-path相对于server.servlet.context-path。如果management.server.port已配置,management.endpoints.web.base-path则相对于management.server.servlet.context-path

如果要将端点映射到其他路径,则可以使用management.endpoints.web.path-mapping属性。

以下示例重新映射/actuator/health到/healthcheck:

management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck

5.3.2。自定义管理服务器端口

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

您可以设置management.server.port属性以更改HTTP端口,如以下示例所示:

management.server.port=8081

在Cloud Foundry上,默认情况下,应用程序仅在端口8080上接收HTTP和TCP路由请求。如果要在Cloud Foundry上使用自定义管理端口,则需要明确设置应用程序的路由以将流量转发到自定义端口。

5.3.3。配置特定于管理的SSL

当配置为使用自定义端口时,还可以通过使用各种management.server.ssl.*属性将管理服务器配置为其自己的SSL 。例如,这样做可以使管理服务器通过HTTP可用,而主应用程序使用HTTPS,如以下属性设置所示:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=false

或者,主服务器和管理服务器都可以使用SSL,但具有不同的密钥库,如下所示:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret

5.3.4。自定义管理服务器地址

您可以通过设置management.server.address属性来自定义管理端点可用的地址。如果您只想在内部或面向操作的网络上侦听或仅侦听来自localhost的连接,则这样做很有用。

只有当端口与主服务器端口不同时,您可以在不同的地址侦听。

以下application.properties示例不允许远程管理连接:

management.server.port=8081
management.server.address=127.0.0.1

5.3.5。禁用HTTP端点

如果您不想通过HTTP公开端点,则可以将管理端口设置为-1,如以下示例所示:

management.server.port=-1

也可以使用management.endpoints.web.exposure.exclude属性来实现,如以下示例所示:

management.endpoints.web.exposure.exclude=*

也可以放开所有端点:

management.endpoints.web.exposure.include=*

5.4。通过JMX进行监视和管理

跳过

5.5。Loggers

Spring Boot Actuator可以在运行时查看和配置应用程序的日志级别。您可以查看整个列表,也可以查看单个记录器的配置,该配置由显式配置的记录级别以及由记录框架赋予它的有效记录级别组成。这些级别可以是以下之一:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF
  • null

null 表示没有显式配置。

5.5.1。配置Logger

要配置给定的Logger,POST部分实体到资源URI的,如以下示例所示:

{
    "configuredLevel": "DEBUG"
}

要“重置”记录器的特定级别(并使用默认配置),可以传递null值给configuredLevel

例如修改root日志级别:
Post请求,发送JSON参数:

http://localhost:8080/actuator/loggers/root

{
    "configuredLevel": "DEBUG"
}

5.6。Metrics

Spring Boot Actuator为Micrometer提供了依赖项管理和自动配置,Micrometer是一种支持大量监视系统的应用程序度量外观,包括:

  • AppOptics
  • Atlas
  • Datadog
  • Dynatrace
  • Elastic
  • Ganglia
  • Graphite
  • Humio
  • Influx
  • JMX
  • KairosDB
  • New Relic
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • StatsD
  • Wavefront

要了解有关Micrometer功能的更多信息,请参阅其参考文档,特别是概念部分。

5.6.1。入门

Spring Boot自动配置组合MeterRegistry,并为其在类路径上找到的每个受支持的实现向组合添加注册。在运行时类路径中具有micrometer-registry-{system}依赖项足以让Spring Boot配置注册。

大多数注册具有共同的特征。例如,即使Micrometer注册实现位于类路径中,您也可以禁用特定的注册。例如,禁用Datadog:

management.metrics.export.datadog.enabled=false

Spring Boot还会将任何自动配置的注册添加到Metrics类的全局静态复合注册表中,除非您明确告诉它不要:

management.metrics.use-global-registry=false

您可以注册任意数量的MeterRegistryCustomizer bean来进一步配置注册表,例如在向注册表注册任何计量器之前应用通用标签:

@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
    return registry -> registry.config().commonTags("region", "us-east-1");
}

您可以通过更具体地了解通用类型,将自定义项应用于特定的注册表实现:

@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
    return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}

完成该设置后,您可以注入MeterRegistry组件并注册指标:

@Component
public class SampleBean {

    private final Counter counter;

    public SampleBean(MeterRegistry registry) {
        this.counter = registry.counter("received.messages");
    }

    public void handleMessage(String message) {
        this.counter.increment();
        // handle message implementation
    }

}

Spring Boot还配置了内置工具(即MeterBinder实现),您可以通过配置或专用注释标记来控制它们

5.6.2。支持的监控系统

  • AppOptics
  • Atlas
  • Datadog
  • Dynatrace
  • Elastic
  • Ganglia
  • Graphite
  • Humio
  • Influx
  • JMX
  • KairosDB
  • New Relic
  • Prometheus
  • SignalFx
  • Simple
  • StatsD
  • Wavefront

具体内容跳过

5.6.3。支持的指标

如果适用,Spring Boot将注册以下核心指标:

  • JVM指标,报告以下各项的利用率:
    • 各种内存和缓冲池
    • 与垃圾收集有关的统计数据
    • 线程利用率
    • 加载/卸载的类数
  • CPU指标
  • 文件描述符指标
  • Kafka消费者指标
  • Log4j2指标:记录每个级别记录到Log4j2的事件数
  • Logback指标:记录每个级别记录到Logback的事件数
  • 正常运行时间指标:报告正常运行时间的量度和代表应用程序绝对启动时间的固定量度
  • Tomcat指标(server.tomcat.mbeanregistry.enabled必须设置true为才能注册所有Tomcat指标)
  • Spring Integration指标

Spring MVC指标

通过自动配置,可以检测由Spring MVC处理的请求。当management.metrics.web.server.request.autotime.enabled为true时,将对所有请求进行这种检测。或者,当设置为false时,可以通过添加@Timed到请求处理方法来启用检测:

@RestController
@Timed ①
public class MyController {

    @GetMapping("/api/people")
    @Timed(extraTags = { "region", "us-east-1" })  ②
    @Timed(value = "all.people", longTask = true)  ③
    public List<Person> listPeople() { ... }

}

① 控制器类,用于对控制器中的每个请求处理程序启用计时。
② 一种启用单个端点的方法。如果您将它放在类中,则不必这样做,但是可以用于进一步为此特定端点自定义计时器。
③ 一种用于为该方法启用长任务计时器的longTask = true方法。长任务计时器需要一个单独的度量标准名称,并且可以与短任务计时器堆叠在一起。

默认情况下,指标名称为http.server.requests。可以通过设置management.metrics.web.server.request.metric-name属性来自定义名称。

默认情况下,与Spring MVC相关的指标带有以下信息标记:

标签 描述
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GET或POST)
outcome 基于响应状态码的请求结果。1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx是CLIENT_ERROR和5xx是SERVER_ERROR
status 响应的HTTP状态代码(例如200或500)
uri 变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})

要自定义标签,请提供实现WebMvcTagsProvider的@Bean。

Spring WebFlux指标

通过自动配置,可以检测WebFlux控制器和功能处理程序处理的所有请求。

默认情况下,使用http.server.requests名称生成指标。您可以通过设置management.metrics.web.server.request.metric-name属性来自定义名称。

默认情况下,与WebFlux相关的度量标准标记有以下信息:

标签 描述
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GET或POST)
outcome 基于响应状态码的请求结果。1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx是CLIENT_ERROR和5xx是SERVER_ERROR
status 响应的HTTP状态代码(例如200或500)
uri 变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})

要自定义标签,请提供实现WebFluxTagsProvider的@Bean。

Jersey 服务器指标

通过自动配置,可以检测由Jersey JAX-RS实现处理的请求。当management.metrics.web.server.request.autotime.enabled为true时,将对所有请求进行这种检测。或者,当设置为false时,可以通过添加@Timed到请求处理方法来启用检测:

@Component
@Path("/api/people")
@Timed ①
public class Endpoint {
    @GET
    @Timed(extraTags = { "region", "us-east-1" }) ②
    @Timed(value = "all.people", longTask = true) ③
    public List<Person> listPeople() { ... }
}

① 在资源类上,对资源中的每个请求处理程序启用计时。
② 关于启用单个端点的方法。如果您将它放在类上,则不必这样做,但是可以用于进一步为此特定端点自定义计时器。
③ 具有启用该方法的长任务计时器的longTask = true方法。长任务计时器需要一个单独的度量标准名称,并且可以与短任务计时器堆叠在一起。

默认情况下,指标名称为http.server.requests。可以通过设置management.metrics.web.server.request.metric-name属性来自定义名称。

默认情况下,Jersey服务器指标带有以下信息:

标签 描述
exception 处理请求时引发的任何异常的简单类名。
method 请求的方法(例如GET或POST)
outcome 基于响应状态码的请求结果。1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx CLIENT_ERROR和5xx是SERVER_ERROR
status 响应的HTTP状态代码(例如200或500)
uri 变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})

要自定义标签,请提供实现JerseyTagsProvider的@Bean。

HTTP Client 指标

Spring Boot Actuator同时管理RestTemplateWebClient。为此,您必须注入自动配置的构建器并使用它来创建实例:

RestTemplateBuilder 对于 RestTemplate
WebClient.Builder 对于 WebClient

也可以手动应用负责此工具的定制程序,即MetricsRestTemplateCustomizerMetricsWebClientCustomizer

默认情况下,指标名称为http.client.requests。可以通过设置management.metrics.web.client.request.metric-name属性来自定义名称。

默认情况下,通过检测的客户端生成的指标会标记以下信息:

标签 描述
clientName URI的主机部分
method 请求的方法(例如GET或POST)
outcome 基于响应状态码的请求结果。1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx是CLIENT_ERROR和5xx是SERVER_ERROR,UNKNOWN否则
status 响应的HTTP状态代码(例如200或500)(IO_ERROR如果存在I / O问题),CLIENT_ERROR否则
uri 变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})

要自定义标签,并根据您选择的客户端,可以提供实现RestTemplateExchangeTagsProviderWebClientExchangeTagsProvider的@Bean。RestTemplateExchangeTagsWebClientExchangeTags中有方便的静态函数。

Cache 指标

通过自动配置,可以在启动时使用前缀为cache的指标来检测所有可用的Cache。高速缓存检测针对一组基本指标进行了标准化。还提供其他特定于缓存的指标。

支持以下缓存库:

  • Caffeine
  • EhCache 2
  • Hazelcast
  • 任何兼容的JCache(JSR-107)实现

度量标准由高速缓存的名称以及从Bean名称派生的CacheManager的名称标记。

只有启动时可用的缓存才绑定到注册表。对于在启动阶段后即时或以编程方式创建的缓存,需要显式注册。可以使用CacheMetricsRegistrarBean来简化该过程。

DataSource 指标

自动配置可使用前缀为jdbc.connections的度量来检测所有可用DataSource对象。数据源检测产生的量规表示池中当前活动,空闲,最大允许和最小允许的连接。

度量标准还通过基于bean名称的DataSource计算名称来标记。

默认情况下,Spring Boot为所有支持的数据源提供元数据。如果不支持立即使用您喜欢的数据源,则可以添加其他DataSourcePoolMetadataProvider bean。请参阅DataSourcePoolMetadataProvidersConfiguration示例。

此外,特定于Hikari的指标带有hikaricp前缀。每个度量标准都以“池”的名称标记(可以通过spring.datasource.name来控制)。

Hibernate 指标

自动配置启用所有可用的Hibernate EntityManagerFactory的检测,具有名为hibernate指标的统计信息的实例。

指标也由从Bean名称派生的EntityManagerFactory的名称进行标记。

要启用统计信息,必须将标准JPA属性hibernate.generate_statistics设置为true。您可以在自动配置中启用该功能,EntityManagerFactory如以下示例所示:

spring.jpa.properties.hibernate.generate_statistics=true

RabbitMQ 指标

自动配置将启用名为rabbitmq的度量标准来检测所有可用的RabbitMQ连接工厂。

5.6.4。注册自定义指标

要注册自定义指标,请注入MeterRegistry到您的组件中,如以下示例所示:

class Dictionary {

    private final List<String> words = new CopyOnWriteArrayList<>();

    Dictionary(MeterRegistry registry) {
        registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
    }

    // …

}

如果发现您反复在组件或应用程序中检测一组度量标准,则可以将此套件封装在MeterBinder实现中。默认情况下,所有MeterBinder bean的度量标准都将自动绑定到Spring-managed MeterRegistry

5.6.5。自定义单个指标

如果需要将自定义应用于特定Meter实例,则可以使用io.micrometer.core.instrument.config.MeterFilter接口。默认情况下,所有MeterFilter bean都会自动应用于micrometer MeterRegistry.Config

例如,如果要将所有以com.example开头的仪表ID 的mytag.region标签重命名为mytag.area,则可以执行以下操作:

@Bean
public MeterFilter renameRegionTagMeterFilter() {
    return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}

通用标签

通用标签通常用于在操作环境(如主机,实例,区域,堆栈等)上进行维度深入分析。通用标签适用于所有仪表,并可以按以下示例所示进行配置:

management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod

上面的示例将region和stack标记分别添加到具有us-east-1和prod的值的所有仪表。

如果使用Graphite,则通用标签的顺序很重要。由于使用这种方法不能保证通用标签的顺序,因此建议Graphite用户定义一个自定义MeterFilter。

Per-meter 属性

除了MeterFilter bean,还可以使用属性在per-meter的基础上应用一组有限的自定义设置。per-meter定制适用于以给定名称开头的所有仪表ID。例如,以下将禁用所有以example.remote开头的仪表ID

management.metrics.enable.example.remote=false

以下属性允许按米自定义:

属性 描述
management.metrics.enable 是否拒绝仪表发出任何指标。
management.metrics.distribution.percentiles-histogram 是否发布适合于计算可凝集(跨维度)百分位数逼近的直方图。
management.metrics.distribution.minimum-expected-value,management.metrics.distribution.maximum-expected-value 通过限制期望值的范围来发布较少的直方图桶。
management.metrics.distribution.percentiles 发布在应用程序中计算的百分位值
management.metrics.distribution.sla 发布包含您的SLA定义的存储桶的累积直方图。

有关概念的更多细节的背后percentiles-histogram,percentiles和sla,请参阅micrometer文档“Histograms and percentiles”部分

5.6.6。指标终点

Spring Boot提供了一个metrics端点,可用于诊断检查应用程序收集的指标。端点默认情况下不可用,必须公开。

导航/actuator/metrics显示可用仪表名称的列表。您可以通过提供特定的仪表名称作为选择器来向下浏览以查看有关该仪表的信息,例如/actuator/metrics/jvm.memory.max。

您在此处使用的名称应与代码中使用的名称相匹配,而不是已经针对其附带的监视系统进行了命名约定标准化后的名称。换句话说,如果由于其蛇形命名约定jvm.memory.max为jvm_memory_max在Prometheus中出现,则jvm.memory.max在检查metrics端点中的仪表时仍应将其用作选择器。

您还可以在URL的末尾添加任意数量的tag=KEY:VALUE查询参数,以在维度上进一步细分仪表,例如/actuator/metrics/jvm.memory.max?tag=area:nonheap

报告的测量值是与仪表名称和已应用的任何标签相匹配的所有仪表的统计信息的总和。因此,在上面的示例中,返回的“值”统计量是堆的“代码缓存”,“压缩类空间”和“元空间”区域的最大内存占用量的总和。如果您只想查看“ Metaspace”的最大大小,则可以添加一个额外的tag=id:Metaspace,即/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace

5.7。稽核(Auditing)

一旦启动了Spring Security,Spring Boot Actuator将拥有一个灵活的审核框架来发布事件(默认情况下,“身份验证成功”,“失败”和“拒绝访问”异常)。此功能对于基于身份验证失败的报告和实施锁定策略非常有用。

可以通过在应用程序的配置中提供AuditEventRepository类型的bean来启用审核。为了方便起见,Spring Boot提供了一个InMemoryAuditEventRepository。 InMemoryAuditEventRepository功能有限,我们建议仅将其用于开发环境。对于生产环境,请考虑创建自己的替代AuditEventRepository实现。

5.7.1。定制审核

要自定义发布的安全事件,可以提供自己的AbstractAuthenticationAuditListenerAbstractAuthorizationAuditListener 实现。

您也可以将审核服务用于自己的业务事件。为此,可以将AuditEventRepository Bean注入您自己的组件中,然后直接使用它,也可以将AuditApplicationEvent发布到Spring中ApplicationEventPublisher(通过实现ApplicationEventPublisherAware)。

5.8。HTTP追踪

可以通过在应用程序的配置中提供HttpTraceRepository类型的bean来启用HTTP跟踪。为了方便起见,Spring Boot提供了一个默认存储最后100个请求-响应交换的跟踪的InMemoryHttpTraceRepositoryInMemoryHttpTraceRepository与其他跟踪解决方案相比,它受到限制,我们建议仅将其用于开发环境。对于生产环境,建议使用可用于生产的跟踪或可观察性解决方案,例如Zipkin或Spring Cloud Sleuth。或者,创建自己的HttpTraceRepository满足您需求的产品。

httptrace终端可以被用来获得关于被存储在HttpTraceRepository中的请求-响应交换信息。

5.8.1。自定义HTTP跟踪

要自定义每个跟踪中包含的项目,请使用management.trace.http.include配置属性。对于高级定制,请考虑注册自己的HttpExchangeTracer实现。

5.9。过程监控

spring-boot模块中,您可以找到两个类来创建文件,这些类通常对于过程监视很有用:

  • ApplicationPidFileWriter创建一个包含应用程序PID的文件(默认情况下,在应用程序目录中的文件名为application.pid)。
  • WebServerPortFileWriter创建一个文件(一个或多个),其中包含正在运行的Web服务器的端口(默认情况下,在应用程序目录中的文件名为application.port)。

默认情况下,不会激活这些编写器,但是您可以通过以下方式启用:

  • 通过扩展配置
  • 以编程方式

5.9.1。扩展配置

META-INF/spring.factories文件中,您可以激活写入PID文件的侦听器,如以下示例所示:

org.springframework.context.ApplicationListener = \
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter

5.9.2。以编程方式

您也可以通过调用SpringApplication.addListeners(..)方法并传递适当的Writer对象来激活侦听器。此方法还允许您自定义Writer构造函数中的文件名和路径。

5.10。Cloud Foundry支持

Spring Boot的执行器模块包括额外的支持,当您将其部署到兼容的Cloud Foundry实例时就会激活。/cloudfoundryapplication路径提供了通往所有@Endpoint bean 的替代安全路径。

扩展支持使Cloud Foundry管理UI(例如可用于查看已部署的应用程序的Web应用程序)增加了Spring Boot执行器信息。例如,应用程序状态页面可能包含完整的运行状况信息,而不是典型的“正在运行”或“已停止”状态。

普通用户不能直接访问 /cloudfoundryapplication 路径。为了使用端点,必须将有效的UAA令牌与请求一起传递。

5.10.1。禁用扩展的Cloud Foundry执行器支持

如果要完全禁用/cloudfoundryapplication端点,可以将以下设置添加到application.properties文件中:

management.cloudfoundry.enabled=false

5.10.2。Cloud Foundry自签名证书

默认情况下,/cloudfoundryapplication端点的安全性验证会对各种Cloud Foundry服务进行SSL调用。如果您的Cloud Foundry UAA或Cloud Controller服务使用自签名证书,则需要设置以下属性:

management.cloudfoundry.skip-ssl-validation=true

5.10.3。自定义上下文路径

如果服务器的上下文路径已配置为 / 以外的任何其他值,则Cloud Foundry端点在应用程序的根目录将不可用。例如,如果server.servlet.context-path=/app,Cloud Foundry端点将可用/app/cloudfoundryapplication/*

如果您希望Cloud Foundry端点始终在 /cloudfoundryapplication/* 处可用,而与服务器的上下文路径无关,则需要在应用程序中进行显式配置。配置将根据所使用的Web服务器而有所不同。对于Tomcat,可以添加以下配置:

@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
    return new TomcatServletWebServerFactory() {

        @Override
        protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
            super.prepareContext(host, initializers);
            StandardContext child = new StandardContext();
            child.addLifecycleListener(new Tomcat.FixContextListener());
            child.setPath("/cloudfoundryapplication");
            ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
            child.addServletContainerInitializer(initializer, Collections.emptySet());
            child.setCrossContext(true);
            host.addChild(child);
        }

    };
}

private ServletContainerInitializer getServletContextInitializer(String contextPath) {
    return (c, context) -> {
        Servlet servlet = new GenericServlet() {

            @Override
            public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                ServletContext context = req.getServletContext().getContext(contextPath);
                context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
            }

        };
        context.addServlet("cloudfoundry", servlet).addMapping("/*");
    };
}
posted @ 2019-11-27 18:10  流星<。)#)))≦  阅读(1109)  评论(0编辑  收藏  举报