52. HTTP 的监控与管理

如果你在开发 web 应用程序,Spring Boot 执行器会自动配置所有启用的节点以通过 HTTP 暴露。默认约定是使用具有前缀 /actuator 的节点 id 作为 URL 路径。例如,health 被暴露为 /actuator/health。

[Tip] Tip

执行器由 Spring MVC、Spring WebFlux 和 Jersey 支持。

52.1 自定义管理节点路径

有时,为管理节点定制前缀是有用的。例如,你的应用程序可能已经使用 /actuator 另一个目的。可以使用 management.endpoints.web.base-path 属性更改管理节点的前缀,如下面的示例所示:

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

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

[Note] Note

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

52.2 自定义管理服务器端口

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

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

management.server.port=8081

52.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

52.4 自定义管理服务器地址

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

[Note] Note

只有当端口不同于主服务器端口时,才能监听不同的地址。

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

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

52.5 禁用 HTTP 节点

如果不想通过 HTTP 暴露节点,可以将管理端口设置为 -1,如下面的示例所示:

management.server.port=-1

53. JMX 的监控与管理

Java 管理扩展(JMX)提供了一种监控和管理应用程序的标准机制。默认情况下,Spring Boot 将管理节点暴露为 org.springframework.boot 域下的 JMX MBean。

53.1 自定义 MBean 名称

MBean 的名称通常是由节点 id 生成的。例如,health 节点被暴露为 org.springframework.boot:type=Endpoint,name=Health。

如果你的应用程序包含不止一个 Spring ApplicationContext,你可能会发现名称冲突。为了解决这个问题,可以将 management.endpoints.jmx.unique-names 属性设置为 true,以便 MBean 名称总是唯一的。

还可以自定义节点被暴露的 JMX 域。下面的设置展示了在 application.properties 中这样做的一个示例:

management.endpoints.jmx.domain=com.example.myapp
management.endpoints.jmx.unique-names=true

53.2 禁用 JMX 节点

如果不想通过 JMX 暴露节点,可以将 management.endpoints.jmx.exposure.exclude 属性设置为 *,如下面的示例所示:

management.endpoints.jmx.exposure.exclude=*

53.3 使用 Jolokia 通过 HTTP 实现 JMX

Jolokia 是一个 JMX-HTTP 桥,它提供了一种访问 JMX bean 的替代方法。为了使用 Jolokia,请包含 org.jolokia:jolokia-core 的依赖。例如,使用 Maven,你将添加以下依赖项:

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

然后可以通过向 management.endpoints.web.exposure.include 属性添加 jolokia 或 * 来暴露 Jolokia 节点。然后,可以在管理 HTTP 服务器上使用 /actuator/jolokia 访问它。

53.3.1 自定义 Jolokia

Jolokia 有许多设置,你将通过配置 servlet 参数来传统配置。使用 Spring Boot,可以使用 application.properties 文件。要做到这一点,对参数添加 management.endpoint.jolokia.config. 前缀,如下面的示例所示:

management.endpoint.jolokia.config.debug=true

53.3.2 禁用 Jolokia

如果使用 Jolokia,但不希望 Spring Boot 配置它,请将 management.endpoint.jolokia.enabled 属性设置为 false,如下所示:

management.endpoint.jolokia.enabled=false

54. 日志记录器

Spring Boot 执行器包括在运行时查看和配置应用程序日志级别的能力。你可以查看整个列表或单个日志记录器的配置,该配置由显式配置的日志记录级别以及日志框架赋予它的有效日志记录级别组成。这些级别可以是:

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

null 指示没有显式配置。

54.1 配置一个日志记录器

若要配置给定的记录器,请将部分实体 POST 到资源的 URI 上,如以下示例所示:

{
	"configuredLevel": "DEBUG"
}
[Tip] Tip

若要重置日志程序的特定级别(而是使用默认配置),可以将 null 值作为 configuredLevel 传递。

55. 度量

Spring Boot 执行器为 Micrometer 提供依赖项管理和自动配置,Micrometer 是一个支持许多监视系统的应用程序度量外观,包括:

  • Atlas
  • Datadog
  • Ganglia
  • Graphite
  • Influx
  • JMX
  • New Relic
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • StatsD
  • Wavefront
[Tip] Tip

要了解 Micrometer 的能力,请参阅它的参考文档,特别是概念部分。

55.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 实现),你可以通过配置或专用注解标记来控制这些工具。

55.2 支持的监控系统

55.2.1 Atlas

默认情况下,度量导出到运行在本地计算机上的 Atlas。可以使用 Atlas 服务器 的位置来使用:

management.metrics.export.atlas.uri=http://atlas.example.com:7101/api/v1/publish

55.2.2 Datadog

Datadog 注册表周期性地将度量推送到 datadoghq。要向 Datadog 导出度量,必须提供 API 密钥:

management.metrics.export.datadog.api-key=YOUR_KEY

你还可以更改向 Datadog 发送度量的间隔:

management.metrics.export.datadog.step=30s

55.2.3 Ganglia

默认情况下,度量导出到运行在本地计算机上的 Ganglia。可以使用以下方式提供 Ganglia 服务器主机和使用端口:

management.metrics.export.ganglia.host=ganglia.example.com
management.metrics.export.ganglia.port=9649

55.2.4 Graphite

默认情况下,度量导出到运行在本地计算机上的 Graphite。可以使用以下方式提供 Graphite 服务器主机和端口:

management.metrics.export.graphite.host=graphite.example.com
management.metrics.export.graphite.port=9004

Micrometer 提供了一个缺省的 HierarchicalNameMapper,它管理如何将维度表 id 映射到平面分层的名称。

[Tip] Tip

若要控制此行为,请定义 GraphiteMeterRegistry,并提供自己的 HierarchicalNameMapper。除非你定义自己的,否则将提供自动配置的 GraphiteConfig 和 Clock bean。

@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
	return new GraphiteMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}

55.2.5 Influx

默认情况下,度量将导出到本地机器上运行的 Influx。使用的 Influx 服务器的位置可以使用:

management.metrics.export.influx.uri=http://influx.example.com:8086

55.2.6 JMX

Micrometer 为 JMX 提供了一种分层映射,主要是一种廉价的、可移植的本地度量方法。默认情况下,度量被导出到 metrics JMX 域。可以使用以下提供的使用域:

management.metrics.export.jmx.domain=com.example.app.metrics

Micrometer 提供了一个缺省的 HierarchicalNameMapper,它管理如何将维度表 id 映射到平面分层的名称。

[Tip] Tip

若要控制此行为,请定义 JmxMeterRegistry 并提供自己的 HierarchicalNameMapper。除非你定义了自己的,否则将提供自动配置的 JmxConfig 和 Clock bean。

@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
	return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}

55.2.7 New Relic

New Relic 注册表周期推送度量到 NewRelic。要向 New Relic 导出度量,必须提供 API 密钥和帐户 id:

management.metrics.export.newrelic.api-key=YOUR_KEY
management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_ID

你还可以更改将度量推送到 New Relic 的时间间隔:

management.metrics.export.newrelic.step=30s

55.2.8 Prometheus

Prometheus 预计将对单个应用程序实例进行度量或投票。Spring Boot 提供了在 /actuator/prometheus 处可用的执行器节点,以便以适当的格式呈现 Prometheus 集。

[Tip] Tip

默认情况下,节点不可用,必须暴漏,请参阅暴漏节点以获取更多细节。

下面是一个 scrape_config 添加到 prometheus.yml 的示例:

scrape_configs:
  - job_name: 'spring'
	metrics_path: '/actuator/prometheus'
	static_configs:
	  - targets: ['HOST:PORT']

55.2.9 SignalFx

SignalFx 注册表将度量周期性地推送到 SignalFx。要向 SignalFx 导出度量,必须提供访问令牌:

management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKEN

你还可以更改向 SignalFx 发送度量的间隔时间:

management.metrics.export.signalfx.step=30s

55.2.10 Simple

Micrometer 附带了一个简单的内存中后端,如果没有配置其它注册表,该后端将自动用作回退。这允许你查看度量节点中收集的度量。

内存中后端在使用任何其它可用后端时禁用自身。你也可以显式禁用它:

management.metrics.export.simple.enabled=false

55.2.11 StatsD

StatsD 注册表迫切地将 UDP 的度量推送到 StatsD 代理。默认情况下,度量将导出到本地机器上运行的 StatsD 代理。可以使用 StatsD 代理主机和端口来提供:

management.metrics.export.statsd.host=statsd.example.com
management.metrics.export.statsd.port=9125

你还可以更改 StatsD 线路协议以使用(默认为 Datadog):

management.metrics.export.statsd.flavor=etsy

55.2.12 Wavefront

Wavefront 注册表周期性地将度量推送到 Wavefront。如果直接向 Wavefront 导出度量,则必须提供 API 令牌:

management.metrics.export.wavefront.api-token=YOUR_API_TOKEN

或者,你可以使用在你的环境中设置的 Wavefront 挎斗或内部代理,该代理将度量数据转发给 Wavefront API 主机:

management.metrics.export.wavefront.uri=proxy://localhost:2878
[Tip] Tip

如果将度量发布到 Wavefront 代理(如文档中所述),则主机必须是 proxy://HOST:PORT 格式。

你还可以更改向 Wavefront 发送度量的间隔时间:

management.metrics.export.wavefront.step=30s

55.3 支持的度量

Spring Boot 在适用时注册以下核心度量:

  • JVM 度量,报告使用:

    • 各种内存和缓冲池
    • 与垃圾收集有关的统计数据
    • 线程利用
    • 加载/卸载的类数量
  • CPU 度量
  • 文件描述符度量
  • Logback 度量: Logback 记录到每个级别的日志事件的数量
  • Uptime 度量: 报告一个正常运行时间的标准和一个表示应用程序绝对启动时间的固定标准
  • Tomcat 度量
  • Spring Integration 度量

55.3.1 Spring MVC 度量

自动配置允许对由 Spring MVC 处理的请求进行检测。当 management.metrics.web.server.auto-time-requests 是 true 时,该检测会发生在所有请求中。或者,当设置为 false 时,可以通过向请求处理方法添加 @Timed 来启用检测:

@RestController
@Timed 1
public class MyController {

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

}

1

控制器类,用于在控制器中的每个请求处理程序上启用计时。

2

为单个节点启用的方法。如果你在类上有此,则不必这样做,但可以用于进一步定制这个特定节点的计时器。

3

使用 longTask = true 的方法来启用该方法的长任务计时器。长任务计时器需要单独的度量名,并且可以用短任务计时器堆叠。

默认情况下,度量是用名称 http.server.requests 生成的。可以通过设置 management.metrics.web.server.requests-metric-name 属性来定制名称。

默认情况下,用以下信息标记 Spring MVC 相关度量:

  • method, 请求的方法 (例如,GET 或 POST)。
  • uri, 如果可能的话,在变量替换之前请求 URI 模板 (例如,/api/person/{id})。
  • status, 响应的 HTTP 状态代码 (例如,200 后 500)。
  • exception, 处理请求时抛出的任何异常的简单类名。

为了定制标签,提供一个实现 WebMvcTagsProvider 的 @Bean。

55.3.2 Spring WebFlux 度量

自动配置允许对由 WebFlux 控制器和函数式处理程序处理的所有请求进行检测。

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

默认情况下,WebFlux 相关度量被标记为以下信息:

  • method, 请求的方法 (例如,GET 或 POST)。
  • uri, 如果可能的话,在变量替换之前请求 URI 模板 (例如,/api/person/{id})。
  • status, 响应的 HTTP 状态代码 (例如,200 后 500)。
  • exception, 处理请求时抛出的任何异常的简单类名。

为了定制标签,提供一个实现 WebFluxTagsProvider 的 @Bean。

55.3.3 HTTP 客户端度量

Spring Boot 执行器管理 RestTemplate 和 WebClient 的仪器。为此,你必须注入一个自动配置的生成器并使用它来创建实例:

  • 用于 RestTemplate 的 RestTemplateBuilder
  • 用于 WebClient 的 WebClient.Builder

还可以手动应用负责此工具的定制器,即 MetricsRestTemplateCustomizer 和 MetricsWebClientCustomizer。

默认情况下,度量是用名称 http.client.requests 生成的。可以通过设置 management.metrics.web.client.requests-metric-name 属性来定制名称。

默认情况下,由仪表化客户端生成的度量被标记为以下信息:

  • method, 请求的方法 (例如,GET 或 POST)。
  • uri, 如果可能的话,在变量替换之前请求 URI 模板 (例如,/api/person/{id})。
  • status, 响应的 HTTP 状态代码 (例如,200 后 500)。
  • clientName, URI 的主机部分。

为了定制标签,并且根据你对客户端的选择,你可以提供一个 @Bean,它实现 RestTemplateExchangeTagsProvider 或 WebClientExchangeTagsProvider。在 RestTemplateExchangeTags 和 WebClientExchangeTags 中有方便的静态功能。

55.3.4 缓存度量

自动配置允许在启动时使用以 cache 为前缀的度量对所有可用 Cache 进行插装。对于基本的度量集合,缓存工具是标准化的。另外,缓存特定的度量也是可用的。

支持以下缓存库:

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

度量由缓存的名称和由 bean 名称派生的 CacheManager 的名称来标记。

[Note] Note

只有启动时可用的缓存绑定到注册表。对于在启动阶段或以编程方式创建的缓存,需要进行显式注册。一个 CacheMetricsRegistrar bean 可用于使该过程更容易。

55.3.5 数据源度量

自动配置允许使用一个称为 jdbc 的度量来检测所有可用的 DataSource 对象。数据源插装的结果是表示池中当前活动的、允许的最大连接和最小允许的连接的标准。这些标准中的每一个都有一个 jdbc 前缀的名称。

度量也由基于 bean 名称计算的 DataSource 的名称标记。

[Tip] Tip

默认情况下,Spring Boot 为所有支持的数据源提供元数据;如果你喜欢的数据源不受支持,则可以添加额外的 DataSourcePoolMetadataProvider bean。有关示例,请参阅 DataSourcePoolMetadataProvidersConfiguration。

此外,Hikari 特定的度量使用 hikaricp 前缀来暴露。每个度量都由池的名称来标记(可以用 spring.datasource.name 来控制)。

55.3.6 Hibernate 度量

自动配置使所有可用的 Hibernate EntityManagerFactory 实例都能够使用名为 hibernate 的度量启用统计。

度量也由源自 bean 名称的 EntityManagerFactory 的名称标记。

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

spring.jpa.properties.hibernate.generate_statistics=true

55.3.7 RabbitMQ 度量

自动配置将使所有可用的 RabbitMQ 连接工厂的度量都被称为 rabbitmq。

55.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 管理的 MeterRegistry。

55.5 定制个体度量

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

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

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

55.5.1 通用标签

通用标签通常用于对操作环境(如主机、实例、区域、堆栈等)进行维度向下钻取。通用标签应用于所有仪表,并且可以按照以下示例进行配置:

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

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

[Note] Note

如果使用 Graphite,普通标签的顺序是很重要的。由于使用此方法不能保证通用标签的顺序,因此建议 Graphite 用户定义定制的 MeterFilter。

55.5.2 每个仪表盘属性

除了 MeterFilter bean 之外,还可以以每个仪表盘使用属性应用一组有限的定制。每个仪表盘自定义应用于任何以给定名称开头的所有仪表 ID。例如,下面将禁用任何带有 example.remote 的 ID 的表。

management.metrics.enable.example.remote=false

以下属性允许每个仪表盘定制:

表格 55.1. 每个仪表盘自定义

属性 描述

management.metrics.enable

是否从发送的任何度量拒绝仪表盘

management.metrics.distribution.percentiles-histogram

是否发布适合计算可聚合(跨维度)百分位近似的直方图。

management.metrics.distribution.percentiles

发布应用程序中计算的百分位数值

management.metrics.distribution.sla

使用 SLA 的大量定义来发布累积直方图。


有关 percentiles-histogram、percentiles 和 sla 背后概念的更多细节,请参考 micrometer 文档的 “直方图和百分位数”部分。

55.6 度量节点

Spring Boot 提供了一个 metrics 节点,可以用来诊断性地检查应用程序收集的度量。默认情况下,节点不可用,必须暴露,请参阅暴露端点以获取更多细节。

导航到 /actuator/metrics 显示可用仪表名的列表。你可以通过提供特定仪表的名称作为选择器(例如 /actuator/metrics/jvm.memory.max)向下钻取以查看关于该特定仪表的信息。

[Tip] Tip

在这里使用的名称应该与代码中使用的名称相匹配,而不是在它被传输到的监控系统已被命名规范化之后的名称。换句话说,如果 jvm.memory.max 由于它的 snake 情况命名约定而出现在 Prometheus 中的 jvm_memory_max,那么在检查 metrics 节点中的仪表时,仍然应该使用 jvm.memory.max 作为选择器。

你还可以向 URL 的末尾添加任意数量的 tag=KEY:VALUE 查询参数,以便在维度上向下钻取仪表,例如 /actuator/metrics/jvm.memory.max?tag=area:nonheap。

[Tip] Tip

报告的测量值是匹配仪表名称和已应用的任何标记的所有仪表的统计值的总和。因此,在上面的示例中,返回的 "Value" 统计信息是堆的 "Code Cache"、"Compressed Class Space" 和 "Metaspace" 区域的最大内存占用的总和。如果只想看到 "Metaspace" 的最大大小,可以添加一个附加 tag=id:Metaspace,即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace。

56. 审计

一旦Spring Security发挥作用,Spring Bug执行器就有一个灵活的审计框架来发布事件(默认情况下,“验证成功”、“失败”和“拒绝访问”异常)。此特性对于基于认证失败的报告和实现锁定策略非常有用。为了自定义发布的安全事件,你可以提供自己的 AbstractAuthenticationAuditListener 和 AbstractAuthorizationAuditListener 的实现。

你还可以使用审计服务来处理你自己的业务事件。为此,可以将现有的 AuditEventRepository 注入到你自己的组件中并直接使用它。或者使用 Spring ApplicationEventPublisher(通过实现 ApplicationEventPublisherAware)发布 AuditApplicationEvent。

57. HTTP 追踪

对所有 HTTP 请求自动启用追踪。你可以查看 httptrace 节点,并获取有关最后100个请求响应交换的基本信息。

57.1 自定义 HTTP 追踪

若要自定义包含在每个追踪中的项,请使用 management.trace.http.include 配置属性。

默认情况下,使用存储最后100个请求响应交换的追踪的 InMemoryHttpTraceRepository。如果需要扩展容量,可以定义自己的 InMemoryHttpTraceRepository bean 的实例。你还可以创建自己的替代 HttpTraceRepository 实现。

58. 进程监控

在 spring-boot 模块中,你可以找到两个类来创建对进程监控有用的文件:

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

默认情况下,这些写入器未被激活,但你可以启用:

  • 通过扩展配置
  • 小节 58.2, 编程方式

58.1 扩展配置

在 META-INF/spring.factories 文件中,可以激活编写 PID 文件的监听器,如下面的示例所示:

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

58.2 编程方式

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

59. Cloud Foundry 支持

Spring Boot 的执行器模块包括当你部署到兼容的 Cloud Foundry 实例时激活的附加支持。/cloudfoundryapplication 路径提供了一个替代的安全路由到所有 @Endpoint bean。

扩展支持允许使用 Spring Boot 执行器信息来增强 Cloud Foundry 管理 UI(例如可用于查看已部署应用程序的 web 应用程序)。例如,应用程序状态页可以包括完整的健康信息,而不是典型的 “running” 或 “stopped” 状态。

[Note] Note

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

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

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

application.properties. 

management.cloudfoundry.enabled=false

59.2 Cloud Foundry 自签署证书

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

application.properties. 

management.cloudfoundry.skip-ssl-validation=true

59.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("/*");
	};
}

60. 后续内容

如果你想探索本章中讨论的一些概念,可以查看执行器示例应用程序。你也可能想了解 Graphite 等绘图工具。

否则,你可以继续阅读部署选项,或者跳转到有关 Spring Boot 的构建工具插件的深入信息。