diff --git a/docs/spring-boot/README.md b/docs/spring-boot/README.md
index 98f6ceb2e5de2f79b479255ff266b95cef0fee76..8fdcf54f47a3daa8c72fe12ed4cf89b49c2d66b2 100644
--- a/docs/spring-boot/README.md
+++ b/docs/spring-boot/README.md
@@ -1 +1 @@
-# Spring Boot
\ No newline at end of file
+# Spring 引导
\ No newline at end of file
diff --git a/docs/spring-boot/actuator.md b/docs/spring-boot/actuator.md
index 7087f948a2b6436ef25146513acce2dc57308c8c..57978f0f72bac1cd3c77071fed2b9fdf1f75802f 100644
--- a/docs/spring-boot/actuator.md
+++ b/docs/spring-boot/actuator.md
@@ -1 +1,2936 @@
-# actuator
\ No newline at end of file
+# 可投入生产的功能
+
+Spring 启动包括许多额外的功能,以帮助你在将应用程序推向生产时监视和管理该应用程序。你可以选择通过使用 HTTP 端点或使用 JMX 来管理和监视你的应用程序。审核、健康和度量收集也可以自动应用到你的应用程序中。
+
+## 1. 启用可用于生产的功能
+
+[`spring-boot-actuator`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator)模块提供了 Spring Boot 的所有可用于生产的功能。推荐的启用这些功能的方法是在`spring-boot-starter-actuator`“starter”上添加一个依赖项。
+
+执行器的定义
+
+执行器是一个制造术语,指用于移动或控制某物的机械设备。执行器可以从微小的变化中产生大量的运动。
+
+要将执行器添加到基于 Maven 的项目中,请添加以下“starter”依赖项:
+
+```
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+```
+
+对于 Gradle,使用以下声明:
+
+```
+dependencies {
+ implementation 'org.springframework.boot:spring-boot-starter-actuator'
+}
+```
+
+## 2. 端点
+
+执行器端点允许你监视应用程序并与其交互。 Spring 启动包括许多内置的端点,并允许你添加自己的端点。例如,`health`端点提供了基本的应用程序健康信息。
+
+你可以[启用或禁用](#actuator.endpoints.enabling)每个单独的端点和[通过 HTTP 或 JMX 公开它们(使它们可以远程访问)](#actuator.endpoints.exposing)。当端点被启用和公开时,它被认为是可用的。内置端点只有在可用时才会自动配置。大多数应用程序选择的是公开而不是 HTTP,在 HTTP 中,端点的 ID 和`/actuator`的前缀被映射到一个 URL。例如,默认情况下,`health`端点映射到`/actuator/health`。
+
+| |要了解有关执行器端点及其请求和响应格式的更多信息,请参见单独的 API 文档([HTML](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/htmlsingle)或[PDF](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/pdf/spring-boot-actuator-web-api.pdf))。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+以下是与技术无关的端点:
+
+| ID |说明|
+|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`auditevents`|公开当前应用程序的审计事件信息。
需要`AuditEventRepository` Bean。|
+|`beans`|显示应用程序中所有 Spring bean 的完整列表。|
+|`caches`|公开可用的缓存。|
+|`conditions`|显示在配置和自动配置类上评估的条件,以及它们匹配或不匹配的原因。|
+|`configprops`|显示所有`@Configuration属性`的已整理列表。|
+|`env`|公开 Spring 的`ConfigurableEnvironment`中的属性。|
+|`flyway`|显示已应用的任何 Flyway 数据库迁移。
需要一个或多个`Flyway`bean。|
+|`health`|显示应用程序的健康信息。|
+|`httptrace`|显示 HTTP 跟踪信息(默认情况下,最近 100 次 HTTP 请求-响应交换)。
需要`HttpTraceRepository` Bean。|
+|`info`|显示任意的应用程序信息。|
+|`integrationgraph`|显示 Spring 积分图。
需要对`spring-integration-core`的依赖关系。|
+|`loggers`|显示并修改应用程序中记录器的配置。|
+|`liquibase`|显示已应用的任何 Liquibase 数据库迁移。
需要一个或多个`Liquibase`bean。|
+|`metrics`|显示当前应用程序的“度量”信息。|
+|`mappings`|显示所有`@RequestMapping`路径的已整理列表。|
+|`quartz`|显示有关 Quartz 调度程序作业的信息。|
+|`scheduledtasks`|显示应用程序中的计划任务。|
+|`sessions`|允许从 Spring 会话支持的会话存储中检索和删除用户会话。
需要使用 Spring 会话的基于 Servlet 的 Web 应用程序。|
+|`shutdown`|让应用程序优雅地关闭。
默认禁用。|
+|`startup`|显示由`ApplicationStartup`收集的[启动步骤数据](features.html#features.spring-application.startup-tracking)。
需要将`SpringApplication`配置为`BufferingApplicationStartup`。|
+|`threaddump`|执行线程转储。|
+
+如果你的应用程序是一个 Web 应用程序( Spring MVC、 Spring WebFlux 或 Jersey),则可以使用以下附加端点:
+
+| ID |说明|
+|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `heapdump` |返回堆转储文件。
在热点 JVM 上,将返回一个`HPROF`-format 文件。
在 OpenJ9JVM 上,将返回一个`PHD`-format 文件。|
+| `jolokia` |当 Jolokia 在 Classpath 上时,通过 HTTP 公开 JMX Bean(WebFlux 不可用)。
需要对`jolokia-core`的依赖关系。|
+| `logfile` |返回日志文件的内容(如果设置了`logging.file.name`或`logging.file.path`属性)。
支持使用 http`Range`头来检索日志文件的部分内容。|
+|`prometheus`|以 Prometheus 服务器可以抓取的格式公开度量数据。
需要对`micrometer-registry-prometheus`具有依赖关系。|
+
+### 2.1.启用端点
+
+默认情况下,除了`shutdown`之外的所有端点都已启用。要配置端点的启用,请使用其`management.endpoint..enabled`属性。下面的示例启用`shutdown`端点:
+
+属性
+
+```
+management.endpoint.shutdown.enabled=true
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ shutdown:
+ enabled: true
+```
+
+如果你希望端点使能是 OPT 输入而不是 OPT 输出,那么将`management.endpoints.enabled-by-default`属性设置为`false`,并使用单独的端点`enabled`属性来 OPT 返回。下面的示例启用`info`端点并禁用所有其他端点:
+
+属性
+
+```
+management.endpoints.enabled-by-default=false
+management.endpoint.info.enabled=true
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ enabled-by-default: false
+ endpoint:
+ info:
+ enabled: true
+```
+
+| |禁用的端点将从应用程序上下文中完全删除。
如果你只想更改公开端点的技术,请使用[`include` and `exclude` properties](#actuator.endpoints.exposing)。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 2.2.公开端点
+
+由于端点可能包含敏感信息,因此你应该仔细考虑何时公开它们。下表显示了内建端点的默认暴露:
+
+| 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|No |
+|`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 |
+| `quartz` |Yes|No |
+| `scheduledtasks` |Yes|No |
+| `sessions` |Yes|No |
+| `shutdown` |Yes|No |
+| `startup` |Yes|No |
+| `threaddump` |Yes|No |
+
+要更改暴露的端点,请使用以下特定于技术的`include`和`exclude`属性:
+
+|财产|Default |
+|-------------------------------------------|--------|
+|`management.endpoints.jmx.exposure.exclude`| |
+|`management.endpoints.jmx.exposure.include`| `*` |
+|`management.endpoints.web.exposure.exclude`| |
+|`management.endpoints.web.exposure.include`|`health`|
+
+`include`属性列出了公开的端点的 ID。`exclude`属性列出了不应该公开的端点的 ID。`exclude`属性优先于`include`属性。你可以使用端点 ID 列表来配置`include`和`exclude`属性。
+
+例如,要停止在 JMX 上公开所有端点,而只公开`health`和`info`端点,请使用以下属性:
+
+属性
+
+```
+management.endpoints.jmx.exposure.include=health,info
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ jmx:
+ exposure:
+ include: "health,info"
+```
+
+`*`可用于选择所有端点。例如,要在 HTTP 上公开除了`env`和`beans`端点之外的所有内容,请使用以下属性:
+
+属性
+
+```
+management.endpoints.web.exposure.include=*
+management.endpoints.web.exposure.exclude=env,beans
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ exclude: "env,beans"
+```
+
+| |`*`在 YAML 中具有特殊的含义,因此,如果你想包含(或排除)所有端点,请务必添加引号。|
+|---|-----------------------------------------------------------------------------------------------------------------------|
+
+| |如果你的应用程序公开,我们强烈建议你也[保护你的端点](#actuator.endpoints.security)。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------|
+
+| |如果你希望实现自己的端点公开策略,则可以注册`EndpointFilter` Bean。|
+|---|---------------------------------------------------------------------------------------------------------------------|
+
+### 2.3.安全
+
+出于安全目的,除`/health`以外的所有执行器都默认禁用。你可以使用`management.endpoints.web.exposure.include`属性来启用执行器。
+
+| |在设置`management.endpoints.web.exposure.include`之前,请确保暴露的执行器不包含敏感信息,通过将它们放置在防火墙后面来进行安全保护,或者通过 Spring 安全性之类的方法进行安全保护。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+如果 Spring 安全性在 Classpath 上,并且不存在其他`WebSecurityConfigurerAdapter`或`SecurityFilterChain` Bean,则除`/health`以外的所有致动器都由 Spring 引导自动配置来保护。如果你定义了自定义的`WebSecurityConfigurerAdapter`或`SecurityFilterChain` Bean, Spring 引导自动配置就会后退,并允许你完全控制执行器访问规则。
+
+如果你希望为 HTTP 端点配置自定义安全性(例如,仅允许具有特定角色的用户访问它们), Spring Boot 提供了一些方便的`RequestMatcher`对象,你可以将这些对象与 Spring 安全性结合使用。
+
+Spring 典型的安全配置可能类似于以下示例:
+
+```
+import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+@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();
+ }
+
+}
+
+```
+
+前面的示例使用`EndpointRequest.toAnyEndpoint()`将请求匹配到任何端点,然后确保所有请求都具有`ENDPOINT_ADMIN`角色。在`EndpointRequest`上也可以使用其他几种匹配方法。有关详细信息,请参见 API 文档([HTML](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/htmlsingle)或[PDF](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/pdf/spring-boot-actuator-web-api.pdf))。
+
+如果你将应用程序部署在防火墙之后,那么你可能希望你的所有执行器端点都可以访问,而无需进行身份验证。你可以通过更改`management.endpoints.web.exposure.include`属性来实现此目的,如下所示:
+
+属性
+
+```
+management.endpoints.web.exposure.include=*
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+```
+
+此外,如果存在 Spring 安全性,则需要添加自定义安全配置,该配置允许对端点进行未经身份验证的访问,如下例所示:
+
+```
+import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration(proxyBeanMethods = false)
+public class MySecurityConfiguration {
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ http.requestMatcher(EndpointRequest.toAnyEndpoint())
+ .authorizeRequests((requests) -> requests.anyRequest().permitAll());
+ return http.build();
+ }
+
+}
+
+```
+
+| |在上述两个示例中,配置仅适用于执行器端点。
由于 Spring boot 的安全配置在存在任何`SecurityFilterChain` Bean 的情况下完全退缩,你需要配置一个附加的`SecurityFilterChain` Bean,其规则适用于应用程序的其余部分。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.3.1.跨站点请求伪造保护
+
+由于 Spring 启动依赖于 Spring 安全性的默认值,因此 CSRF 保护在默认情况下是打开的。这意味着要求执行器端点`POST`(关机和记录器端点)、`PUT`或`DELETE`的端点在使用默认安全配置时会得到 403(禁止)错误。
+
+| |我们建议仅当你正在创建一个由非浏览器客户端使用的服务时,才完全禁用 CSRF 保护。|
+|---|-------------------------------------------------------------------------------------------------------------------------|
+
+你可以在[Spring Security Reference Guide](https://docs.spring.io/spring-security/reference/5.6.2/features/exploits/csrf.html)中找到有关 CSRF 保护的其他信息。
+
+### 2.4.配置端点
+
+端点自动缓存响应,以读取不接受任何参数的操作。要配置端点缓存响应的时间长度,请使用其`cache.time-to-live`属性。下面的示例将`beans`端点缓存的持续时间设置为 10 秒:
+
+属性
+
+```
+management.endpoint.beans.cache.time-to-live=10s
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ beans:
+ cache:
+ time-to-live: "10s"
+```
+
+| |`management.endpoint.`前缀唯一地标识正在配置的端点。|
+|---|--------------------------------------------------------------------------------------------------|
+
+### 2.5.用于执行器 Web 端点的超媒体
+
+添加了一个“发现页面”,其中包含指向所有端点的链接。默认情况下,“发现页面”在`/actuator`上可用。
+
+要禁用“发现页面”,请将以下属性添加到应用程序属性中:
+
+属性
+
+```
+management.endpoints.web.discovery.enabled=false
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ discovery:
+ enabled: false
+```
+
+在配置自定义管理上下文路径时,“发现页”会自动从`/actuator`移动到管理上下文的根。例如,如果管理上下文路径是`/management`,则可以从`/management`获取发现页面。当管理上下文路径设置为`/`时,将禁用发现页,以防止与其他映射发生冲突的可能性。
+
+### 2.6.CORS 支持
+
+[跨源资源共享](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)是一个[W3C 规范](https://www.w3.org/TR/cors/),它允许你以灵活的方式指定授权哪种类型的跨域请求。如果使用 Spring MVC 或 Spring WebFlux,则可以配置 Actuator 的 Web 端点以支持此类场景。
+
+默认情况下,CORS 支持是禁用的,并且只有在你设置了`management.endpoints.web.cors.allowed-origins`属性后才会启用。以下配置允许`GET`和`POST`来自`example.com`域的调用:
+
+属性
+
+```
+management.endpoints.web.cors.allowed-origins=https://example.com
+management.endpoints.web.cors.allowed-methods=GET,POST
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ cors:
+ allowed-origins: "https://example.com"
+ allowed-methods: "GET,POST"
+```
+
+| |有关选项的完整列表,请参见[“CorsendPoint属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/CorsEndpoint属性.java)。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 2.7.实现自定义端点
+
+如果添加带有`@Bean`注释的`@Endpoint`,则任何带有`@ReadOperation`、`@WriteOperation`或`@DeleteOperation`注释的方法都会在 JMX 上自动公开,在 Web 应用程序中,也会在 HTTP 上自动公开。可以通过使用 Jersey、 Spring MVC 或 Spring WebFlux 在 HTTP 上公开端点。如果球衣和 Spring MVC 都可用,则使用 Spring MVC。
+
+下面的示例公开了一个返回自定义对象的读取操作:
+
+```
+@ReadOperation
+public CustomData getData() {
+ return new CustomData("test", 5);
+}
+
+```
+
+你还可以通过使用`@JmxEndpoint`或`@WebEndpoint`来编写特定于技术的端点。这些端点仅限于各自的技术。例如,`@WebEndpoint`仅在 HTTP 上公开,而不在 JMX 上公开。
+
+你可以使用`@EndpointWebExtension`和`@EndpointJmxExtension`来编写特定于技术的扩展。这些注释允许你提供特定于技术的操作,以增强现有的端点。
+
+最后,如果需要访问特定于 Web Framework 的功能,则可以实现 Servlet 或 Spring `@Controller`和`@RestController`端点,代价是它们不能在 JMX 上或在使用不同的 Web 框架时可用。
+
+#### 2.7.1.接收输入
+
+端点上的操作通过其参数接收输入。当在 Web 上公开时,这些参数的值来自 URL 的查询参数和 JSON 请求主体。当通过 JMX 公开时,参数将映射到 MBean 操作的参数。默认情况下需要参数。可以通过使用`@javax.annotation.Nullable`或`@org.springframework.lang.Nullable`对它们进行注释来使它们成为可选的。
+
+你可以将 JSON 请求主体中的每个根属性映射到端点的参数。考虑以下 JSON 请求主体:
+
+```
+{
+ "name": "test",
+ "counter": 42
+}
+```
+
+你可以使用它来调用一个包含`String name`和`int counter`参数的写操作,如下例所示:
+
+```
+@WriteOperation
+public void updateData(String name, int counter) {
+ // injects "test" and 42
+}
+
+```
+
+| |由于端点与技术无关,因此只能在方法签名中指定简单的类型。
特别是,声明带有`CustomData`类型的单个参数,该类型定义了`name`和`counter`属性,不受支持。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |为了让输入映射到操作方法的参数,实现端点的 Java 代码应该使用`-parameters`进行编译, Kotlin 实现端点的代码应该用`-java-parameters`编译。
如果你使用 Spring boot 的 Gradle 插件,或者如果你使用 Maven 和`spring-boot-starter-parent`,这将自动发生。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+##### 输入类型转换
+
+如果需要,将传递给端点操作方法的参数自动转换为所需的类型。在调用操作方法之前,通过使用`ApplicationConversionService`的实例以及`Converter`或`GenericConverter`的实例,将通过 JMX 或 HTTP 接收的输入转换为所需的类型。
+
+#### 2.7.2.自定义 Web 端点
+
+对`@Endpoint`、`@WebEndpoint`或`@EndpointWebExtension`的操作使用 Jersey、 Spring MVC 或 Spring WebFlux 在 HTTP 上自动公开。如果球衣和 Spring MVC 都可用,则使用 Spring MVC。
+
+##### Web 端点请求谓词
+
+对于公开 Web 的端点上的每个操作,都会自动生成一个请求谓词。
+
+##### 路径
+
+谓词的路径由端点的 ID 和公开 Web 的端点的基本路径决定。默认的基本路径是`/actuator`。例如,ID 为`sessions`的端点在谓词中使用`/actuator/sessions`作为其路径。
+
+你可以通过使用`@Selector`注释操作方法的一个或多个参数来进一步自定义路径。将这样的参数作为路径变量添加到路径谓词中。当调用端点操作时,变量的值被传递到操作方法中。如果要捕获所有剩余的路径元素,可以将`@Selector(Match=ALL_REMAINING)`添加到最后一个参数,并使其成为与`String[]`转换兼容的类型。
+
+##### HTTP 方法
+
+谓词的 HTTP 方法由操作类型决定,如下表所示:
+
+|操作|HTTP method|
+|------------------|-----------|
+|`@ReadOperation`| `GET` |
+|`@WriteOperation`| `POST` |
+|`@DeleteOperation`| `DELETE` |
+
+##### 消耗
+
+对于使用请求主体的`@WriteOperation`(http`POST`),谓词的`consumes`子句是`application/vnd.spring-boot.actuator.v2+json, application/json`。对于所有其他操作,`consumes`子句是空的。
+
+##### 生产
+
+谓词的`produces`子句可以由`@DeleteOperation`、`@ReadOperation`和`@WriteOperation`注释的`produces`属性确定。属性是可选的。如果不使用,则自动确定`produces`子句。
+
+如果操作方法返回`void`或`Void`,则`produces`子句为空。如果操作方法返回一个`org.springframework.core.io.Resource`,则`produces`子句是`application/octet-stream`。对于所有其他操作,`produces`子句是`application/vnd.spring-boot.actuator.v2+json, application/json`。
+
+##### Web 端点响应状态
+
+端点操作的默认响应状态取决于操作类型(读、写或删除)以及操作返回的内容(如果有的话)。
+
+如果`@ReadOperation`返回一个值,则响应状态将为 200(OK)。如果它不返回一个值,响应状态将是 404(未找到)。
+
+如果`@WriteOperation`或`@DeleteOperation`返回一个值,则响应状态将为 200(确定)。如果它不返回一个值,响应状态将是 204(没有内容)。
+
+如果调用的操作没有所需的参数或参数不能转换为所需的类型,则不调用该操作方法,响应状态将为 400(错误请求)。
+
+##### Web 端点范围请求
+
+你可以使用 HTTP 范围请求来请求 HTTP 资源的一部分。当使用 Spring MVC 或 Spring Web 流量时,返回`org.springframework.core.io.Resource`的操作自动支持范围请求。
+
+| |使用 Jersey 时不支持范围请求。|
+|---|---------------------------------------------------|
+
+##### Web 端点安全
+
+在 Web 端点或特定于 Web 的端点扩展上的操作可以接收当前的`java.security.Principal`或`org.springframework.boot.actuate.endpoint.SecurityContext`作为方法参数。前者通常与`@Nullable`结合使用,以为经过身份验证的和未经身份验证的用户提供不同的行为。后者通常通过使用其`isUserInRole(String)`方法来执行授权检查。
+
+#### 2.7.3. Servlet 端点
+
+Servlet 可以通过实现一个用`@ServletEndpoint`注释的类公开为端点,该类也实现`Supplier`。 Servlet 端点提供了与 Servlet 容器的更深的集成,但以牺牲可移植性为代价。它们旨在用于公开现有的 Servlet 作为端点。对于新的端点,应尽可能使用`@Endpoint`和`@WebEndpoint`注释。
+
+#### 2.7.4.控制器端点
+
+可以使用`@ControllerEndpoint`和`@RestControllerEndpoint`来实现仅由 Spring MVC 或 Spring WebFlux 公开的端点。方法通过使用 Spring MVC 和 Spring WebFlux 的标准注释进行映射,例如`@RequestMapping`和`@GetMapping`,并使用端点的 ID 作为路径的前缀。控制器端点提供了与 Spring 的 Web 框架更深入的集成,但以牺牲可移植性为代价。只要有可能,就应该首选`@Endpoint`和`@WebEndpoint`注释。
+
+### 2.8.健康信息
+
+你可以使用健康信息来检查正在运行的应用程序的状态。当生产系统发生故障时,监控软件经常使用它来提醒某人。由`health`端点公开的信息取决于`management.endpoint.health.show-details`和`management.endpoint.health.show-components`属性,这些属性可以配置为以下值之一:
+
+| Name |说明|
+|-----------------|-------------------------------------------------------------------------------------------------------------------------------|
+| `never` |细节从未显示。|
+|`when-authorized`|详细信息仅向授权用户显示。
授权角色可以通过使用`management.endpoint.health.roles`进行配置。|
+| `always` |详细信息将向所有用户显示。|
+
+默认值为`never`。当用户处于端点的一个或多个角色中时,该用户被视为获得授权。如果端点没有配置的角色(默认值),则所有经过身份验证的用户都被认为是经过授权的。你可以使用`management.endpoint.health.roles`属性来配置角色。
+
+| |如果你已经保护了你的应用程序,并且希望使用`always`,那么你的安全配置必须允许经过身份验证的和未经身份验证的用户访问健康端点。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+健康信息是从[` 健康贡献登记册’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthContributorRegistry.java)的内容中收集的(默认情况下,在你的`ApplicationContext`中定义的所有[“健康贡献者”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthContributor.java)实例)。 Spring 启动包括一些自动配置的`HealthContributors`,并且还可以编写自己的。
+
+a`HealthContributor`可以是 a`HealthIndicator`,也可以是 a`CompositeHealthContributor`。a`HealthIndicator`提供实际的健康信息,包括 a`Status`。a`CompositeHealthContributor`提供了其它`HealthContributors`的复合。总的来说,贡献者形成了一个树状结构来表示整个系统的健康状况。
+
+默认情况下,最终的系统健康状况是由`StatusAggregator`派生的,它根据状态的有序列表对每个`HealthIndicator`的状态进行排序。排序列表中的第一个状态被用作整体健康状态。如果没有`HealthIndicator`返回`StatusAggregator`已知的状态,则使用`UNKNOWN`状态。
+
+| |你可以使用`HealthContributorRegistry`在运行时注册和取消注册健康指标。|
+|---|----------------------------------------------------------------------------------------------------|
+
+#### 2.8.1.自动配置的健康指示器
+
+在适当的时候, Spring 引导自动配置下表中列出的`HealthIndicators`。你还可以通过配置`management.health.key.enabled`来启用或禁用选定的指示器,下表列出了`key`:
+
+| Key |姓名| Description |
+|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------|
+| `cassandra` |[“CassandRadriverHealthindicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraDriverHealthIndicator.java)| Checks that a Cassandra database is up. |
+| `couchbase` |[“CouchBaseHealthIndicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicator.java)| Checks that a Couchbase cluster is up. |
+| `db` |[“数据来源健康指示器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/jdbc/DataSourceHealthIndicator.java)|Checks that a connection to `DataSource` can be obtained.|
+| `diskspace` |[diskspacehealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/system/DiskSpaceHealthIndicator.java)| Checks for low disk space. |
+|`elasticsearch`|[“弹性搜索算法”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/elasticsearch/ElasticsearchRestHealthIndicator.java)| Checks that an Elasticsearch cluster is up. |
+| `hazelcast` |[Hazelcasthealthindicator](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/hazelcast/HazelcastHealthIndicator.java)| Checks that a Hazelcast server is up. |
+| `influxdb` |[` 影响健康指标’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/influx/InfluxDbHealthIndicator.java)| Checks that an InfluxDB server is up. |
+| `jms` |[JMSearthIndicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/jms/JmsHealthIndicator.java)| Checks that a JMS broker is up. |
+| `ldap` |[ldaphealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/ldap/LdapHealthIndicator.java)| Checks that an LDAP server is up. |
+| `mail` |[“MailHealthindicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/mail/MailHealthIndicator.java)| Checks that a mail server is up. |
+| `mongo` |[` 蒙古健康指数’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/mongo/MongoHealthIndicator.java)| Checks that a Mongo database is up. |
+| `neo4j` |[NEO4jhealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jHealthIndicator.java)| Checks that a Neo4j database is up. |
+| `ping` |[Pinghealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/PingHealthIndicator.java)| Always responds with `UP`. |
+| `rabbit` |[` 犹太教神职人员 `](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/amqp/RabbitHealthIndicator.java)| Checks that a Rabbit server is up. |
+| `redis` |[`Redishealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/redis/RedisHealthIndicator.java)| Checks that a Redis server is up. |
+| `solr` |[“SolrHealthindicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/solr/SolrHealthIndicator.java)| Checks that a Solr server is up. |
+
+| |你可以通过设置`management.health.defaults.enabled`属性来禁用它们。|
+|---|--------------------------------------------------------------------------------------|
+
+其他`HealthIndicators`可用,但默认情况下未启用:
+
+| Key |姓名| Description |
+|----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|
+|`livenessstate` |[“生活状态健康指示器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/availability/LivenessStateHealthIndicator.java)|Exposes the “Liveness” application availability state. |
+|`readinessstate`|[“ReadinessStateHealthIndicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/availability/ReadinessStateHealthIndicator.java)|Exposes the “Readiness” application availability state.|
+
+#### 2.8.2.编写自定义健康指示器
+
+要提供自定义健康信息,你可以注册实现[` 健康指示器 `](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthIndicator.java)接口的 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();
+ if (errorCode != 0) {
+ return Health.down().withDetail("Error Code", errorCode).build();
+ }
+ return Health.up().build();
+ }
+
+ private int check() {
+ // perform some specific health check
+ return ...
+ }
+
+}
+
+```
+
+| |给定的`HealthIndicator`的标识符是不带`HealthIndicator`后缀的 Bean 的名称,如果它存在的话。
在前面的示例中,健康信息在名为`my`的条目中可用。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+除了 Spring boot 的预定义[`Status`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/Status.java)类型之外,`Health`还可以返回一个自定义的`Status`,它表示一个新的系统状态。在这种情况下,还需要提供[StatusAggregator](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/StatusAggregator.java)接口的自定义实现,或者必须通过使用`management.endpoint.health.status.order`配置属性来配置默认实现。
+
+例如,假设一个新的`Status`代码为`FATAL`的`HealthIndicator`正在你的一个`HealthIndicator`实现中使用。要配置严重性顺序,请将以下属性添加到应用程序属性中:
+
+属性
+
+```
+management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ status:
+ order: "fatal,down,out-of-service,unknown,up"
+```
+
+响应中的 HTTP 状态代码反映了整体的健康状态。默认情况下,`OUT_OF_SERVICE`和`DOWN`映射到 503。任何未映射的健康状态,包括`UP`,都映射到 200。如果你通过 HTTP 访问健康端点,你可能还希望注册自定义状态映射。配置自定义映射会禁用`DOWN`和`OUT_OF_SERVICE`的默认映射。如果希望保留默认映射,则必须显式地配置它们以及任何自定义映射。例如,下面的属性将`FATAL`映射到 503(服务不可用),并保留`DOWN`和`OUT_OF_SERVICE`的默认映射:
+
+属性
+
+```
+management.endpoint.health.status.http-mapping.down=503
+management.endpoint.health.status.http-mapping.fatal=503
+management.endpoint.health.status.http-mapping.out-of-service=503
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ status:
+ http-mapping:
+ down: 503
+ fatal: 503
+ out-of-service: 503
+```
+
+| |如果需要更多的控制,可以定义自己的`HttpCodeStatusMapper` Bean。|
+|---|------------------------------------------------------------------------------|
+
+下表显示了内置状态的默认状态映射:
+
+| Status |映射|
+|----------------|----------------------------------------------|
+| `DOWN` |`SERVICE_UNAVAILABLE`(`503’)|
+|`OUT_OF_SERVICE`|`SERVICE_UNAVAILABLE`(`503’)|
+| `UP` |默认情况下没有映射,所以 HTTP 状态是`200`|
+| `UNKNOWN` |默认情况下没有映射,所以 HTTP 状态是`200`|
+
+#### 2.8.3.反应性健康指标
+
+对于反应性应用程序,例如那些使用 Spring WebFlux 的应用程序,`ReactiveHealthContributor`提供了用于获取应用程序健康状态的非阻塞契约。与传统的`HealthContributor`类似,健康信息是从[“ReactiveHealthContributorRegistry”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/ReactiveHealthContributorRegistry.java)的内容中收集的(默认情况下,所有[“健康贡献者”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthContributor.java)和[“ReactiveHealthContributor”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/ReactiveHealthContributor.java)实例定义在你的`ApplicationContext`中)。常规的`HealthContributors`在弹性计划程序上执行,它们不会根据反应性 API 进行检查。
+
+| |在反应性应用程序中,你应该使用`ReactiveHealthContributorRegistry`在运行时注册和取消注册健康指标。
如果你需要注册一个常规的`HealthContributor`,你应该用`ReactiveHealthContributor#adapt`包装它。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+要从反应性 API 提供自定义健康信息,你可以注册实现[“恢复健康指示器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/ReactiveHealthIndicator.java)接口的 Spring bean。下面的代码显示了`ReactiveHealthIndicator`实现的示例:
+
+```
+import reactor.core.publisher.Mono;
+
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
+
+ @Override
+ public Mono health() {
+ return doHealthCheck().onErrorResume((exception) ->
+ Mono.just(new Health.Builder().down(exception).build()));
+ }
+
+ private Mono doHealthCheck() {
+ // perform some specific health check
+ return ...
+ }
+
+}
+
+```
+
+| |要自动处理该错误,请考虑从`AbstractReactiveHealthIndicator`扩展。|
+|---|---------------------------------------------------------------------------------------------|
+
+#### 2.8.4.自动配置的 reactivehealthindicators###
+
+在适当的时候, Spring 引导自动配置以下`ReactiveHealthIndicators`:
+
+| Key |姓名| Description |
+|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|
+| `cassandra` |[cassandradriverreactivehealthindicator’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraDriverReactiveHealthIndicator.java)| Checks that a Cassandra database is up. |
+| `couchbase` |[“CouchBaseReactiveHealthindicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/couchbase/CouchbaseReactiveHealthIndicator.java)| Checks that a Couchbase cluster is up. |
+|`elasticsearch`|[“弹性搜索激活健康指示器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/elasticsearch/ElasticsearchReactiveHealthIndicator.java)|Checks that an Elasticsearch cluster is up.|
+| `mongo` |[“MongoReactiveHealthindicator”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/mongo/MongoReactiveHealthIndicator.java)| Checks that a Mongo database is up. |
+| `neo4j` |[“NEO4,恢复健康指标”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/neo4j/Neo4jReactiveHealthIndicator.java)| Checks that a Neo4j database is up. |
+| `redis` |[“恢复活动健康指示器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicator.java)| Checks that a Redis server is up. |
+
+| |如果有必要,用反应性指示器代替常规指示器。
此外,任何未显式处理的`HealthIndicator`都会自动包装。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.8.5.健康团体
+
+有时,将健康指标组织成可用于不同目的的组是有用的。
+
+要创建健康指示剂组,可以使用`management.endpoint.health.group.`属性,并将健康指示剂 ID 的列表指定为`include`或`exclude`。例如,要创建一个只包含数据库指标的组,你可以定义以下内容:
+
+属性
+
+```
+management.endpoint.health.group.custom.include=db
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ group:
+ custom:
+ include: "db"
+```
+
+然后,你可以点击`[localhost:8080/actuator/health/custom](http://localhost:8080/actuator/health/custom)`检查结果。
+
+类似地,要创建一个从组中排除数据库指标并包括所有其他指标的组,你可以定义以下内容:
+
+属性
+
+```
+management.endpoint.health.group.custom.exclude=db
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ group:
+ custom:
+ exclude: "db"
+```
+
+默认情况下,组继承与系统健康相同的`StatusAggregator`和`HttpCodeStatusMapper`设置。但是,你也可以在每个组的基础上定义这些。如果需要,还可以重写`show-details`和`roles`属性:
+
+属性
+
+```
+management.endpoint.health.group.custom.show-details=when-authorized
+management.endpoint.health.group.custom.roles=admin
+management.endpoint.health.group.custom.status.order=fatal,up
+management.endpoint.health.group.custom.status.http-mapping.fatal=500
+management.endpoint.health.group.custom.status.http-mapping.out-of-service=500
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ group:
+ custom:
+ show-details: "when-authorized"
+ roles: "admin"
+ status:
+ order: "fatal,up"
+ http-mapping:
+ fatal: 500
+ out-of-service: 500
+```
+
+| |如果需要注册自定义`StatusAggregator`或`HttpCodeStatusMapper`bean 以用于组,则可以使用`@Qualifier("groupname")`bean。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------|
+
+健康组也可以包括/排除`CompositeHealthContributor`。你也可以只包含/排除`CompositeHealthContributor`中的某个组件。这可以使用组件的完全限定名称来完成,如下所示:
+
+```
+management.endpoint.health.group.custom.include="test/primary"
+management.endpoint.health.group.custom.exclude="test/primary/b"
+```
+
+在上面的示例中,`custom`组将包括名为`HealthContributor`的`primary`,这是组合`test`的组件。在这里,`primary`本身是一个组合,而名称为`b`的`HealthContributor`将被排除在`custom`组之外。
+
+可以在主端口或管理端口的附加路径上提供健康组。这在 Kubernetes 等云环境中很有用,在这种环境中,出于安全目的,对执行器端点使用单独的管理端口是很常见的。拥有一个单独的端口可能会导致不可靠的健康检查,因为即使健康检查成功,主应用程序也可能无法正常工作。可以将健康组配置为以下附加路径:
+
+```
+management.endpoint.health.group.live.additional-path="server:/healthz"
+```
+
+这将使`live`健康组在主服务器端口`/healthz`上可用。前缀是强制性的,并且必须是`server:`(表示主服务器端口)或`management:`(表示管理端口,如果已配置的话。)路径必须是单个路径段。
+
+#### 2.8.6.数据源健康
+
+`DataSource`健康指示器显示标准数据源和路由数据源 bean 的健康状况。路由数据源的健康状况包括其每个目标数据源的健康状况。在健康端点的响应中,每个路由数据源的目标都是通过使用其路由密钥来命名的。如果不希望在指示器的输出中包含路由数据源,请将`management.health.db.ignore-routing-data-sources`设置为`true`。
+
+### 2.9.Kubernetes 探测器
+
+部署在 Kubernetes 上的应用程序可以用[容器探针](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes)提供有关其内部状态的信息。根据[你的 Kubernetes 配置](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/),Kubelet 调用这些探测并对结果做出反应。
+
+默认情况下, Spring boot 管理你的[应用程序可用性状态](features.html#features.spring-application.application-availability)。如果部署在 Kubernetes 环境中,致动器将从`ApplicationAvailability`接口收集“活性”和“就绪”信息,并在专用[健康指标](#actuator.endpoints.health.auto-configured-health-indicators)中使用该信息:`LivenessStateHealthIndicator`和`ReadinessStateHealthIndicator`。这些指标显示在全球健康端点(“/执行器/健康”`)上。通过使用[health groups](#actuator.endpoints.health.groups):`"/actuator/health/liveness"`和`"/actuator/health/readiness"`,它们也可以作为单独的 HTTP 探针公开。
+
+然后,你可以使用以下端点信息来配置 Kubernetes 基础架构:
+
+```
+livenessProbe:
+ httpGet:
+ path: "/actuator/health/liveness"
+ port:
+ failureThreshold: ...
+ periodSeconds: ...
+
+readinessProbe:
+ httpGet:
+ path: "/actuator/health/readiness"
+ port:
+ failureThreshold: ...
+ periodSeconds: ...
+```
+
+| |``应该设置为执行器端点可用的端口。
如果`"management.server.port"`属性已设置,它可以是主 Web 服务器端口或单独的管理端口。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+只有当应用程序[在 Kubernetes 环境中运行](deployment.html#deployment.cloud.kubernetes)时,这些健康组才会自动启用。你可以通过使用`management.endpoint.health.probes.enabled`配置属性在任何环境中启用它们。
+
+| |如果一个应用程序的启动时间超过了配置的活动周期,Kubernetes 提到`"startupProbe"`是一个可能的解决方案。
这里不一定需要`"startupProbe"`,因为`"readinessProbe"`在完成所有启动任务之前都会失败。参见描述[探针在应用程序生命周期中的行为](#actuator.endpoints.kubernetes-probes.lifecycle)的部分。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+如果你的执行器端点部署在单独的管理上下文中,那么端点不使用与主应用程序相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序不能正常工作(例如,它不能接受新的连接),探测检查也可能是成功的。出于这个原因,在主服务器端口上提供`liveness`和`readiness`健康组是一个好主意。这可以通过设置以下属性来完成:
+
+```
+management.endpoint.health.probes.add-additional-paths=true
+```
+
+这将使`liveness`在主服务器端口上的`/livez`和`readiness`上可用。
+
+#### 2.9.1.用 Kubernetes 探测器检查外部状态 ###
+
+Actuator 将“活性”和“准备”探测配置为健康小组。这意味着所有的[健康团体功能](#actuator.endpoints.health.groups)对它们都是可用的。例如,你可以配置其他的健康指标:
+
+属性
+
+```
+management.endpoint.health.group.readiness.include=readinessState,customCheck
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ health:
+ group:
+ readiness:
+ include: "readinessState,customCheck"
+```
+
+默认情况下, Spring Boot 不会向这些组添加其他健康指标。
+
+“活性”调查不应依赖于外部系统的健康检查。如果[应用程序的活性状态](features.html#features.spring-application.application-availability.liveness)被破坏,Kubernetes 将尝试通过重新启动应用程序实例来解决该问题。这意味着,如果外部系统(例如数据库、Web API 或外部缓存)发生故障,Kubernetes 可能会重新启动所有应用程序实例并产生级联故障。
+
+至于“就绪”调查,检查外部系统的选择必须由应用程序开发人员仔细做出。出于这个原因, Spring Boot 不包括在准备状态探测中的任何额外的健康检查。如果[应用程序实例的准备状态](features.html#features.spring-application.application-availability.readiness)未准备好,则 Kubernetes 不会将通信量路由到该实例。一些外部系统可能不会被应用程序实例共享,在这种情况下,它们可能会被包含在就绪状态探测中。其他外部系统可能对应用程序不是必需的(应用程序可能有断路器和后备),在这种情况下,它们绝对不应该被包含。不幸的是,所有应用程序实例共享的外部系统是常见的,你必须做出判断:将其纳入准备状态调查,并期望当外部服务关闭或将其排除在外时,应用程序将退出服务,并处理堆栈中更高的故障,也许通过在呼叫者中使用断路器。
+
+| |如果应用程序的所有实例都没有准备好,那么带有`type=ClusterIP`或`NodePort`的 Kubernetes 服务不接受任何传入连接。
没有 HTTP 错误响应(503 等),因为没有连接。
带有`type=LoadBalancer`的服务可能接受连接,也可能不接受连接,取决于提供者。
具有显式[ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)的服务也以某种方式响应这取决于实现——Ingress 服务本身必须决定如何处理来自下游的“拒绝连接”。
HTTP503 在负载均衡器和 Ingress 两种情况下都很有可能发生。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+此外,如果一个应用程序使用 Kubernetes[autoscaling](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/),它可能会对从负载均衡器取出的应用程序做出不同的反应,这取决于它的自动定标器配置。
+
+#### 2.9.2.应用程序生命周期和探测状态
+
+Kubernetes Probes 支持的一个重要方面是它与应用程序生命周期的一致性。在`AvailabilityState`(这是应用程序在内存中的内部状态)和实际的探测(公开该状态)之间存在显著差异。根据应用程序生命周期的阶段,探测可能不可用。
+
+Spring 引导发布[启动和关闭过程中的应用程序事件](features.html#features.spring-application.application-events-and-listeners),并且探测可以侦听这样的事件并公开`AvailabilityState`信息。
+
+下表显示了`AvailabilityState`和 HTTP 连接器在不同阶段的状态。
+
+当 Spring 启动应用程序启动时:
+
+|Startup phase|LivenessState| ReadinessState | HTTP server |笔记|
+|-------------|-------------|-------------------|----------------|--------------------------------------------------------------------------------------------------------------|
+| Starting | `BROKEN` |`REFUSING_TRAFFIC` | Not started |Kubernetes 检查“活性”探测,如果时间太长,则重新启动应用程序。|
+| Started | `CORRECT` |`REFUSING_TRAFFIC` |Refuses requests|将刷新应用程序上下文。应用程序执行启动任务,但尚未接收到流量。|
+| Ready | `CORRECT` |`ACCEPTING_TRAFFIC`|Accepts requests|启动任务完成。应用程序正在接收流量。|
+
+当 Spring 引导应用程序关闭时:
+
+| Shutdown phase |Liveness State| Readiness State | HTTP server |笔记|
+|-----------------|--------------|-------------------|-------------------------|---------------------------------------------------------------------------------------------|
+| Running | `CORRECT` |`ACCEPTING_TRAFFIC`| Accepts requests |已请求关闭。|
+|Graceful shutdown| `CORRECT` |`REFUSING_TRAFFIC` |New requests are rejected|如果启用,[优雅的关机处理飞行中的请求](web.html#web.graceful-shutdown)。|
+|Shutdown complete| N/A | N/A | Server is shut down |应用程序上下文是关闭的,应用程序是关闭的。|
+
+| |有关 Kubernetes 部署的更多信息,请参见[Kubernetes 容器生命周期部分](deployment.html#deployment.cloud.kubernetes.container-lifecycle)。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 2.10.应用程序信息
+
+应用程序信息公开从你的`ApplicationContext`中定义的所有[“信息贡献者”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/InfoContributor.java)bean 中收集的各种信息。 Spring 引导包括许多自动配置的`InfoContributor`bean,并且可以编写自己的 bean。
+
+#### 2.10.1.自动配置的信息贡献者
+
+在适当的时候, Spring 自动配置以下`InfoContributor`bean:
+
+| ID |姓名| Description | Prerequisites |
+|-------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------|--------------------------------------------|
+|`build`|[“建立贡献者”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/BuildInfoContributor.java)| Exposes build information. |A `META-INF/build-info.properties` resource.|
+| `env` |[` 环境保护者’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/EnvironmentInfoContributor.java)|Exposes any property from the `Environment` whose name starts with `info.`.| None. |
+| `git` |[“GitInfoContributor”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/GitInfoContributor.java)| Exposes git information. | A `git.properties` resource. |
+|`java` |[“JavaInfoContributor”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/JavaInfoContributor.java)| Exposes Java runtime information. | None. |
+
+是否启用单个贡献者由其`management.info..enabled`属性控制。不同的贡献者对此属性有不同的默认值,这取决于他们的先决条件和他们公开的信息的性质。
+
+由于没有先决条件来表明应该启用它们,`env`和`java`贡献者默认情况下是禁用的。你可以通过将`management.info.env.enabled`或`management.info.java.enabled`属性设置为`true`来启用它们。
+
+默认情况下启用`build`和`git`信息贡献者。可以通过将其`management.info..enabled`属性设置为`false`来禁用每个属性。或者,要禁用每个默认情况下通常启用的贡献者,请将`management.info.defaults.enabled`属性设置为`false`。
+
+#### 2.10.2.自定义应用程序信息
+
+当启用`env`Contributor 时,可以通过设置`info.*` Spring 属性来定制由`info`端点公开的数据。在`info`键下的所有`Environment`属性都会自动公开。例如,你可以向`application.properties`文件添加以下设置:
+
+属性
+
+```
+info.app.encoding=UTF-8
+info.app.java.source=11
+info.app.java.target=11
+```
+
+Yaml
+
+```
+info:
+ app:
+ encoding: "UTF-8"
+ java:
+ source: "11"
+ target: "11"
+```
+
+| |而不是硬编码这些值,你也可以[在构建时展开信息属性](howto.html#howto.properties-and-configuration.expand-properties),
假设你使用 Maven,你可以将前面的示例改写如下:
属性
``
[电子邮件受保护]@
[电子邮件受保护]@
<
<>><<<<>>>>><<590">>>><<<<>>>>>>>><<<<<>>>>>>>>>><<<<<<<<>>>>>>>>>>>>>>>><<<<<<|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.10.3.Git 提交信息
+
+`info`端点的另一个有用的特性是,它能够在构建项目时发布有关你的`git`源代码库状态的信息。如果`Git属性` Bean 是可用的,则可以使用`info`端点来公开这些属性。
+
+| |如果`Git属性` Bean 的根目录下有`git.properties`文件,则`Git属性`是自动配置的。
有关更多详细信息,请参见“[如何生成 Git 信息](howto.html#howto.build.generate-git-info)”。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+默认情况下,端点公开`git.branch`、`git.commit.id`和`git.commit.time`属性(如果存在的话)。如果不希望在端点响应中包含任何这些属性,则需要将它们从`git.properties`文件中排除。如果要显示完整的 Git 信息(即`git.properties`的完整内容),请使用`management.info.git.mode`属性,如下所示:
+
+属性
+
+```
+management.info.git.mode=full
+```
+
+Yaml
+
+```
+management:
+ info:
+ git:
+ mode: "full"
+```
+
+要完全禁用来自`info`端点的 Git 提交信息,请将`management.info.git.enabled`属性设置为`false`,如下所示:
+
+属性
+
+```
+management.info.git.enabled=false
+```
+
+Yaml
+
+```
+management:
+ info:
+ git:
+ enabled: false
+```
+
+#### 2.10.4.建立信息
+
+如果`Build属性` Bean 是可用的,那么`info`端点也可以发布有关你的构建的信息。如果`META-INF/build-info.properties`文件在 Classpath 中可用,就会发生这种情况。
+
+| |Maven 和 Gradle 插件都可以生成该文件。
有关更多详细信息,请参见“[如何生成构建信息](howto.html#howto.build.generate-info)”。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.10.5.Java 信息
+
+`info`端点发布有关你的 Java 运行时环境的信息,有关更多详细信息,请参见[`JavaInfo`](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/info/JavaInfo.html)。
+
+#### 2.10.6.编写自定义信息贡献者
+
+要提供自定义应用程序信息,你可以注册实现[“信息贡献者”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/info/InfoContributor.java)接口的 Spring bean。
+
+下面的示例以单个值贡献一个`example`条目:
+
+```
+import java.util.Collections;
+
+import org.springframework.boot.actuate.info.Info;
+import org.springframework.boot.actuate.info.InfoContributor;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyInfoContributor implements InfoContributor {
+
+ @Override
+ public void contribute(Info.Builder builder) {
+ builder.withDetail("example", Collections.singletonMap("key", "value"));
+ }
+
+}
+
+```
+
+如果你到达`info`端点,你应该会看到一个包含以下附加条目的响应:
+
+```
+{
+ "example": {
+ "key" : "value"
+ }
+}
+```
+
+## 3. 基于 HTTP 的监控和管理
+
+如果你正在开发一个 Web 应用程序, Spring Boot Actuator 会自动配置所有启用的端点,以便通过 HTTP 公开。默认的约定是使用前缀`/actuator`的端点的`id`作为 URL 路径。例如,`health`被暴露为`/actuator/health`。
+
+| |Spring MVC、 Spring WebFlux 和 Jersey 原生地支持致动器。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |Jackson 是一个必需的依赖项,以便获得 API 文档中记录的正确的 JSON 响应([HTML](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/htmlsingle)或[PDF](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/pdf/spring-boot-actuator-web-api.pdf))。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 3.1.自定义管理端点路径 ###
+
+有时,定制管理端点的前缀是有用的。例如,你的应用程序可能已经将`/actuator`用于其他目的。可以使用`management.endpoints.web.base-path`属性更改管理端点的前缀,如下例所示:
+
+属性
+
+```
+management.endpoints.web.base-path=/manage
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ base-path: "/manage"
+```
+
+前面的`application.properties`示例将端点从`/actuator/{id}`更改为`/manage/{id}`(例如,`/manage/info`)。
+
+| |除非管理端口已被配置为[使用不同的 HTTP 端口公开端点](#actuator.monitoring.customizing-management-server-port),否则`management.endpoints.web.base-path`相对于`server.servlet.context-path`(对于 Servlet Web 应用程序)或`spring.webflux.base-path`(对于反应性 Web 应用程序)。
如果配置了`management.endpoints.web.base-path`,则`management.endpoints.web.base-path`相对于`management.server.base-path`。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+如果希望将端点映射到不同的路径,可以使用`management.endpoints.web.path-mapping`属性。
+
+下面的示例将`/actuator/health`重新映射到`/healthcheck`:
+
+属性
+
+```
+management.endpoints.web.base-path=/
+management.endpoints.web.path-mapping.health=healthcheck
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ base-path: "/"
+ path-mapping:
+ health: "healthcheck"
+```
+
+### 3.2.自定义管理服务器端口
+
+对于基于云的部署,使用默认的 HTTP 端口公开管理端点是一个明智的选择。但是,如果你的应用程序在你自己的数据中心内运行,那么你可能更喜欢使用不同的 HTTP 端口来公开端点。
+
+你可以设置`management.server.port`属性来更改 HTTP 端口,如下例所示:
+
+属性
+
+```
+management.server.port=8081
+```
+
+Yaml
+
+```
+management:
+ server:
+ port: 8081
+```
+
+| |在 Cloud Foundry 上,默认情况下,应用程序仅在端口 8080 上接收用于 HTTP 和 TCP 路由的请求。
如果你想在 Cloud Foundry 上使用自定义管理端口,则需要显式地设置应用程序的路由以将流量转发到自定义端口。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 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
+```
+
+Yaml
+
+```
+server:
+ port: 8443
+ ssl:
+ enabled: true
+ key-store: "classpath:store.jks"
+ key-password: "secret"
+management:
+ server:
+ port: 8080
+ 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
+```
+
+Yaml
+
+```
+server:
+ port: 8443
+ ssl:
+ enabled: true
+ key-store: "classpath:main.jks"
+ key-password: "secret"
+management:
+ server:
+ port: 8080
+ ssl:
+ enabled: true
+ key-store: "classpath:management.jks"
+ key-password: "secret"
+```
+
+### 3.4.自定义管理服务器地址
+
+你可以通过设置`management.server.address`属性来定制管理端点可用的地址。如果你只想监听内部或面向 Ops 的网络,或者只监听来自`localhost`的连接,那么这样做是有用的。
+
+| |只有当端口与主服务器端口不同时,你才可以在不同的地址上进行侦听。|
+|---|-------------------------------------------------------------------------------------------|
+
+以下示例`application.properties`不允许远程管理连接:
+
+属性
+
+```
+management.server.port=8081
+management.server.address=127.0.0.1
+```
+
+Yaml
+
+```
+management:
+ server:
+ port: 8081
+ address: "127.0.0.1"
+```
+
+### 3.5.禁用 HTTP 端点
+
+如果不想在 HTTP 上公开端点,可以将管理端口设置为`-1`,如下例所示:
+
+属性
+
+```
+management.server.port=-1
+```
+
+Yaml
+
+```
+management:
+ server:
+ port: -1
+```
+
+你也可以通过使用`management.endpoints.web.exposure.exclude`属性来实现这一点,如下例所示:
+
+属性
+
+```
+management.endpoints.web.exposure.exclude=*
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ web:
+ exposure:
+ exclude: "*"
+```
+
+## 4. JMX 的监控与管理
+
+Java 管理扩展提供了一种标准的机制来监视和管理应用程序。默认情况下,不启用此功能。你可以通过将`spring.jmx.enabled`配置属性设置为`true`来打开它。 Spring 引导将最合适的`MBeanServer`公开为 ID 为`mbeanServer`的 Bean。你的任何带有 Spring JMX 注释(@managedresource`,`@ManagedAttribute`,或`@ManagedOperation`)的 bean 都会暴露给它。
+
+如果你的平台提供了一个标准的`MBeanServer`, Spring boot 将使用它,并在必要时默认为 VM`MBeanServer`。如果所有这些都失败了,将创建一个新的`MBeanServer`。
+
+有关更多详细信息,请参见[JMXAutoConfiguration’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jmx/JmxAutoConfiguration.java)类。
+
+默认情况下, Spring 引导还将管理端点作为`org.springframework.boot`域下的 JMXMBeans 公开。要完全控制 JMX 域中的端点注册,请考虑注册你自己的`EndpointObjectNameFactory`实现。
+
+### 4.1.自定义 MBean 名称
+
+MBean 的名称通常是从端点的`id`生成的。例如,将`health`端点暴露为`org.springframework.boot:type=Endpoint,name=Health`。
+
+如果你的应用程序包含多个 Spring `ApplicationContext`,则可能会发现名称冲突。要解决此问题,可以将`spring.jmx.unique-names`属性设置为`true`,这样 MBean 名称就始终是唯一的。
+
+你还可以自定义公开端点的 JMX 域。以下设置在`application.properties`中显示了这样做的示例:
+
+属性
+
+```
+spring.jmx.unique-names=true
+management.endpoints.jmx.domain=com.example.myapp
+```
+
+Yaml
+
+```
+spring:
+ jmx:
+ unique-names: true
+management:
+ endpoints:
+ jmx:
+ domain: "com.example.myapp"
+```
+
+### 4.2.禁用 JMX 端点
+
+如果不想在 JMX 上公开端点,可以将`management.endpoints.jmx.exposure.exclude`属性设置为`*`,如下例所示:
+
+属性
+
+```
+management.endpoints.jmx.exposure.exclude=*
+```
+
+Yaml
+
+```
+management:
+ endpoints:
+ jmx:
+ exposure:
+ exclude: "*"
+```
+
+### 4.3.在 HTTP 上使用 Jolokia 进行 JMX
+
+Jolokia 是一个 JMX-HTTP 桥,它提供了一种访问 JMX Bean 的替代方法。若要使用 Jolokia,请包含对`org.jolokia:jolokia-core`的依赖关系。例如,在 Maven 中,你将添加以下依赖项:
+
+```
+
+ org.jolokia
+ jolokia-core
+
+```
+
+然后,你可以通过向`management.endpoints.web.exposure.include`属性添加`jolokia`或`*`来公开 Jolokia 端点。然后,你可以使用管理 HTTP 服务器上的`/actuator/jolokia`访问它。
+
+| |Jolokia 端点将 Jolokia 的 Servlet 公开为执行器端点。结果,它是特定于 Servlet 环境的,例如 Spring MVC 和 Jersey。端点在 WebFlux 应用程序中是不可用的。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 4.3.1.定制 Jolokia
+
+Jolokia 有许多设置,你通常会通过设置 Servlet 参数来配置这些设置。通过 Spring 引导,你可以使用`application.properties`文件。要这样做,请在参数前缀`management.endpoint.jolokia.config.`,如下例所示:
+
+属性
+
+```
+management.endpoint.jolokia.config.debug=true
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ jolokia:
+ config:
+ debug: true
+```
+
+#### 4.3.2.禁用 Jolokia
+
+如果你使用 Jolokia,但不希望 Spring Boot 对其进行配置,请将`management.endpoint.jolokia.enabled`属性设置为`false`,如下所示:
+
+属性
+
+```
+management.endpoint.jolokia.enabled=false
+```
+
+Yaml
+
+```
+management:
+ endpoint:
+ jolokia:
+ enabled: false
+```
+
+## 5. 伐木工
+
+Spring 启动执行器包括在运行时查看和配置应用程序的日志级别的能力。你可以查看整个列表,也可以查看单个日志程序的配置,该配置由显式配置的日志级别以及日志框架赋予它的有效日志级别组成。这些级别可以是:
+
+* `TRACE`
+
+* `DEBUG`
+
+* `INFO`
+
+* `WARN`
+
+* `ERROR`
+
+* `FATAL`
+
+* `OFF`
+
+* `null`
+
+`null`表示没有显式配置。
+
+### 5.1.配置记录器
+
+要配置给定的记录器,`POST`将一个部分实体配置到资源的 URI,如下例所示:
+
+```
+{
+ "configuredLevel": "DEBUG"
+}
+```
+
+| |要“重置”记录器的特定级别(并使用默认配置),你可以将值`null`传递为`configuredLevel`。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------|
+
+## 6. 度量
+
+Spring Boot Actuator 为[Micrometer](https://micrometer.io)提供依赖管理和自动配置,这是一个支持[众多的监测系统](https://micrometer.io/docs)的应用程序度量外观,包括:
+
+* [AppOptics](#actuator.metrics.export.appoptics)
+
+* [Atlas](#actuator.metrics.export.atlas)
+
+* [Datadog](#actuator.metrics.export.datadog)
+
+* [Dynatrace](#actuator.metrics.export.dynatrace)
+
+* [Elastic](#actuator.metrics.export.elastic)
+
+* [Ganglia](#actuator.metrics.export.ganglia)
+
+* [Graphite](#actuator.metrics.export.graphite)
+
+* [Humio](#actuator.metrics.export.humio)
+
+* [Influx](#actuator.metrics.export.influx)
+
+* [JMX](#actuator.metrics.export.jmx)
+
+* [KairosDB](#actuator.metrics.export.kairos)
+
+* [New Relic](#actuator.metrics.export.newrelic)
+
+* [Prometheus](#actuator.metrics.export.prometheus)
+
+* [SignalFx](#actuator.metrics.export.signalfx)
+
+* [简单(内存中)](#actuator.metrics.export.simple)
+
+* [Stackdriver](#actuator.metrics.export.stackdriver)
+
+* [StatsD](#actuator.metrics.export.statsd)
+
+* [Wavefront](#actuator.metrics.export.wavefront)
+
+| |要了解有关千分尺功能的更多信息,请参见其[参考文献](https://micrometer.io/docs),特别是[概念部分](https://micrometer.io/docs/concepts)。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 6.1.开始
+
+Spring 引导自动配置组合`MeterRegistry`,并为其在 Classpath 上找到的每个受支持的实现向组合添加注册表。在运行时 Classpath 中对`micrometer-registry-{system}`具有依赖关系就足以使 Spring 引导配置注册表。
+
+大多数注册中心都有共同的特征。例如,可以禁用特定的注册中心,即使在 Classpath 上实现了微米注册中心。以下示例禁用 Datadog:
+
+属性
+
+```
+management.metrics.export.datadog.enabled=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ datadog:
+ enabled: false
+```
+
+除非特定于注册中心的属性另有说明,否则你也可以禁用所有注册中心,如下例所示:
+
+属性
+
+```
+management.metrics.export.defaults.enabled=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ defaults:
+ enabled: false
+```
+
+Spring Boot 还将任何自动配置的注册中心添加到`Metrics`类上的全局静态复合注册中心,除非你明确地告诉它不要:
+
+Properties
+
+```
+management.metrics.use-global-registry=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ use-global-registry: false
+```
+
+你可以注册任意数量的`MeterRegistryCustomizer`bean,以进一步配置注册表,例如在向注册表注册任何米之前应用公共标记:
+
+```
+import io.micrometer.core.instrument.MeterRegistry;
+
+import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyMeterRegistryConfiguration {
+
+ @Bean
+ public MeterRegistryCustomizer metricsCommonTags() {
+ return (registry) -> registry.config().commonTags("region", "us-east-1");
+ }
+
+}
+
+```
+
+你可以通过更具体地说明泛型类型来对特定的注册中心实现应用自定义:
+
+```
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.config.NamingConvention;
+import io.micrometer.graphite.GraphiteMeterRegistry;
+
+import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyMeterRegistryConfiguration {
+
+ @Bean
+ public MeterRegistryCustomizer graphiteMetricsNamingConvention() {
+ return (registry) -> registry.config().namingConvention(this::name);
+ }
+
+ private String name(String name, Meter.Type type, String baseUnit) {
+ return ...
+ }
+
+}
+
+```
+
+Spring 还可以启动[配置内置的仪表](#actuator.metrics.supported),你可以通过配置或专用的注释标记对其进行控制。
+
+### 6.2.支持的监测系统
+
+这一节简要介绍了每个支持的监控系统。
+
+#### 6.2.1.APPATICS
+
+默认情况下,AppOptics 注册中心会定期将指标推到`[api.appoptics.com/v1/measurements](https://api.appoptics.com/v1/measurements)`。要将度量导出到 SaaS[AppOptics](https://micrometer.io/docs/registry/appOptics),必须提供你的 API 令牌:
+
+Properties
+
+```
+management.metrics.export.appoptics.api-token=YOUR_TOKEN
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ appoptics:
+ api-token: "YOUR_TOKEN"
+```
+
+#### 6.2.2.阿特拉斯
+
+默认情况下,指标导出到在本地机器上运行的[Atlas](https://micrometer.io/docs/registry/atlas)。你可以提供[Atlas server](https://github.com/Netflix/atlas)的位置:
+
+Properties
+
+```
+management.metrics.export.atlas.uri=https://atlas.example.com:7101/api/v1/publish
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ atlas:
+ uri: "https://atlas.example.com:7101/api/v1/publish"
+```
+
+#### 6.2.3.Datadog
+
+Datadog 注册中心定期将指标推到[datadoghq](https://www.datadoghq.com)。要将指标导出到[Datadog](https://micrometer.io/docs/registry/datadog),你必须提供你的 API 键:
+
+Properties
+
+```
+management.metrics.export.datadog.api-key=YOUR_KEY
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ datadog:
+ api-key: "YOUR_KEY"
+```
+
+你还可以更改将指标发送到 Datadog 的时间间隔:
+
+Properties
+
+```
+management.metrics.export.datadog.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ datadog:
+ step: "30s"
+```
+
+#### 6.2.4.Dynatrace
+
+Dynatrace 提供了两个吸收 API 的指标,这两个指标都是为[Micrometer](https://micrometer.io/docs/registry/dynatrace)实现的。`v1`名称空间中的配置属性仅在导出到[TimeSeries V1API](https://www.dynatrace.com/support/help/dynatrace-api/environment-api/metric-v1/)时才应用。`v2`名称空间中的配置属性仅在导出到[Metrics V2API](https://www.dynatrace.com/support/help/dynatrace-api/environment-api/metric-v2/post-ingest-metrics/)时才应用。请注意,这种集成一次只能导出到 API 的`v1`或`v2`版本。如果`device-id`(v1 需要,但在 v2 中不使用)在`v1`命名空间中设置,则将度量导出到`v1`端点。否则,假定`v2`。
+
+##### v2 API
+
+你可以通过两种方式使用 V2API。
+
+如果本地 OneAgent 在主机上运行,则度量指标将自动导出到[本地一个代理摄取端点](https://www.dynatrace.com/support/help/how-to-use-dynatrace/metrics/metric-ingestion/ingestion-methods/local-api/)。摄取端点将指标转发到 Dynatrace 后端。这是默认的行为,除了对`io.micrometer:micrometer-registry-dynatrace`的依赖外,不需要特殊的设置。
+
+如果没有运行本地 OneAgent,则需要[Metrics v2 API](https://www.dynatrace.com/support/help/dynatrace-api/environment-api/metric-v2/post-ingest-metrics/)的端点和一个 API 令牌。[API token](https://www.dynatrace.com/support/help/dynatrace-api/basics/dynatrace-api-authentication/)必须具有“ingest metrics”(“metrics.ingest”)权限集。我们建议将令牌的范围限制为这个权限。你必须确保端点 URI 包含以下路径(例如,`/api/v2/metrics/ingest`):
+
+根据你的部署选项,Metrics API v2Ingest 端点的 URL 是不同的:
+
+* SaaS:`https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest`
+
+* 托管部署:`https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest`
+
+下面的示例使用`example`环境 ID 配置指标导出:
+
+Properties
+
+```
+management.metrics.export.dynatrace.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
+management.metrics.export.dynatrace.api-token=YOUR_TOKEN
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ dynatrace:
+ uri: "https://example.live.dynatrace.com/api/v2/metrics/ingest"
+ api-token: "YOUR_TOKEN"
+```
+
+在使用 Dynatrace V2API 时,可以使用以下可选特性:
+
+* 公制密钥前缀:设置一个前缀,该前缀用于所有导出的公制密钥。
+
+* 丰富 Dynatrace 元数据:如果正在运行一个 Agent 或 Dynatrace 操作符,则使用额外的元数据(例如,关于主机、进程或 POD)丰富度量。
+
+* 默认维度:指定添加到所有导出度量中的键-值对。如果使用 Micrometer 指定了具有相同键值的标记,则它们会覆盖默认的尺寸。
+
+可以不指定 URI 和 API 令牌,如下面的示例所示。在此场景中,使用本地 OneAgent 端点:
+
+Properties
+
+```
+management.metrics.export.dynatrace.v2.metric-key-prefix=your.key.prefix
+management.metrics.export.dynatrace.v2.enrich-with-dynatrace-metadata=true
+management.metrics.export.dynatrace.v2.default-dimensions.key1=value1
+management.metrics.export.dynatrace.v2.default-dimensions.key2=value2
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ dynatrace:
+ # Specify uri and api-token here if not using the local OneAgent endpoint.
+ v2:
+ metric-key-prefix: "your.key.prefix"
+ enrich-with-dynatrace-metadata: true
+ default-dimensions:
+ key1: "value1"
+ key2: "value2"
+```
+
+##### V1API(旧版)
+
+Dynatrace V1API metrics 注册中心通过使用[TimeSeries V1API](https://www.dynatrace.com/support/help/dynatrace-api/environment-api/metric-v1/)定期将指标推送到配置的 URI。对于与现有设置的向后兼容性,当设置`device-id`时(对于 V1 是必需的,但在 V2 中不使用),度量值将导出到 TimeSeries V1 端点。要将指标导出到[Dynatrace](https://micrometer.io/docs/registry/dynatrace),必须提供你的 API 令牌、设备 ID 和 URI:
+
+属性
+
+```
+management.metrics.export.dynatrace.uri=https://{your-environment-id}.live.dynatrace.com
+management.metrics.export.dynatrace.api-token=YOUR_TOKEN
+management.metrics.export.dynatrace.v1.device-id=YOUR_DEVICE_ID
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ dynatrace:
+ uri: "https://{your-environment-id}.live.dynatrace.com"
+ api-token: "YOUR_TOKEN"
+ v1:
+ device-id: "YOUR_DEVICE_ID"
+```
+
+对于 V1API,你必须指定没有路径的基本环境 URI,因为 V1 端点路径是自动添加的。
+
+##### 与版本无关的设置
+
+除了 API 端点和令牌,你还可以更改将指标发送到 Dynatrace 的时间间隔。默认的导出间隔是`60s`。以下示例将导出间隔设置为 30 秒:
+
+属性
+
+```
+management.metrics.export.dynatrace.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ dynatrace:
+ step: "30s"
+```
+
+你可以在[千分尺文档](https://micrometer.io/docs/registry/dynatrace)中找到有关如何设置 Dynatrace 千分尺出口商的更多信息。
+
+#### 6.2.5.弹性
+
+默认情况下,指标导出到在本地机器上运行的[Elastic](https://micrometer.io/docs/registry/elastic)。可以使用以下属性提供要使用的 Elastic 服务器的位置:
+
+属性
+
+```
+management.metrics.export.elastic.host=https://elastic.example.com:8086
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ elastic:
+ host: "https://elastic.example.com:8086"
+```
+
+#### 6.2.6.神经节
+
+默认情况下,指标导出到在本地机器上运行的[Ganglia](https://micrometer.io/docs/registry/ganglia)。你可以提供[Ganglia server](http://ganglia.sourceforge.net)主机和端口,如下例所示:
+
+属性
+
+```
+management.metrics.export.ganglia.host=ganglia.example.com
+management.metrics.export.ganglia.port=9649
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ ganglia:
+ host: "ganglia.example.com"
+ port: 9649
+```
+
+#### 6.2.7.石墨
+
+默认情况下,指标导出到在本地机器上运行的[Graphite](https://micrometer.io/docs/registry/graphite)。你可以提供[Graphite server](https://graphiteapp.org)主机和端口,如下例所示:
+
+属性
+
+```
+management.metrics.export.graphite.host=graphite.example.com
+management.metrics.export.graphite.port=9004
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ graphite:
+ host: "graphite.example.com"
+ port: 9004
+```
+
+Micrometer 提供了一个默认的`HierarchicalNameMapper`,它控制一个维度表 ID 是[映射到平面层次结构名称](https://micrometer.io/docs/registry/graphite#_hierarchical_name_mapping)的方式。
+
+| |来控制这种行为,定义你的`GraphiteMeterRegistry`并提供你自己的`HierarchicalNameMapper`。
自动配置的`GraphiteConfig`而`Clock`bean 是提供的,除非你自己定义:
``
Import io.Micrometer.Core.Instrument.Clock;
Import io.Micrometer.Core.Core.Instrument.Config.NamingConvention;Import778.Micrometer.Micrometer.Core.Core.Core.Core.Core.Importor.ArchalNameMaMaMaMaMaMaMe;返回新的 GraphiteMeterRegistry(配置,时钟,this::TohierarchicalName);
私有字符串 TohierarchicalName{
return.....
<”<<<<<>>|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.2.8.Humio
+
+默认情况下,Humio 注册中心会定期将指标推到[cloud.humio.com](https://cloud.humio.com)。要将指标导出到 SaaS[Humio](https://micrometer.io/docs/registry/humio),你必须提供你的 API 令牌:
+
+属性
+
+```
+management.metrics.export.humio.api-token=YOUR_TOKEN
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ humio:
+ api-token: "YOUR_TOKEN"
+```
+
+你还应该配置一个或多个标记,以标识将指标推送到的数据源:
+
+属性
+
+```
+management.metrics.export.humio.tags.alpha=a
+management.metrics.export.humio.tags.bravo=b
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ humio:
+ tags:
+ alpha: "a"
+ bravo: "b"
+```
+
+#### 6.2.9.涌入
+
+默认情况下,指标将导出到使用默认配置在本地计算机上运行的[Influx](https://micrometer.io/docs/registry/influx)V1 实例。要将指标导出到 InfluxDB V2,请配置`org`、`bucket`以及用于编写指标的身份验证`token`。你可以通过以下方式提供要使用的[Influx server](https://www.influxdata.com)的位置:
+
+属性
+
+```
+management.metrics.export.influx.uri=https://influx.example.com:8086
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ influx:
+ uri: "https://influx.example.com:8086"
+```
+
+#### 6.2.10.JMX
+
+Micrometer 提供了到[JMX](https://micrometer.io/docs/registry/jmx)的层次映射,主要是作为一种本地查看度量的廉价且便携的方式。默认情况下,指标导出到`metrics`JMX 域。你可以通过以下方式提供要使用的域:
+
+属性
+
+```
+management.metrics.export.jmx.domain=com.example.app.metrics
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ jmx:
+ domain: "com.example.app.metrics"
+```
+
+Micrometer 提供了一个默认的`HierarchicalNameMapper`,它控制着维度表 ID 的大小[映射到平面层次结构名称](https://micrometer.io/docs/registry/jmx#_hierarchical_name_mapping)。
+
+| |来控制这种行为,定义你的`JmxMeterRegistry`并提供你自己的`HierarchicalNameMapper`。
自动配置的`JmxConfig`而`Clock`bean 是提供的,除非你自己定义:
``
Import io.Micrometer.Core.Instrument.Clock;
Import io.Micrometer.Core.Instrument.Meter;返回新的 JMXMeterRegistry(配置,时钟,this::TohierarchicalName);
私有字符串 TohierarchicalName{
return....
}
><>>>|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.2.11.KairosDB
+
+默认情况下,指标导出到在本地机器上运行的[KairosDB](https://micrometer.io/docs/registry/kairos)。你可以通过以下方式提供要使用的[KairosDB server](https://kairosdb.github.io/)的位置:
+
+属性
+
+```
+management.metrics.export.kairos.uri=https://kairosdb.example.com:8080/api/v1/datapoints
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ kairos:
+ uri: "https://kairosdb.example.com:8080/api/v1/datapoints"
+```
+
+#### 6.2.12.新遗迹
+
+一个新的 Relic 注册中心定期将指标推到[New Relic](https://micrometer.io/docs/registry/new-relic)。要将指标导出到[New Relic](https://newrelic.com),你必须提供你的 API 密钥和帐户 ID:
+
+属性
+
+```
+management.metrics.export.newrelic.api-key=YOUR_KEY
+management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_ID
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ newrelic:
+ api-key: "YOUR_KEY"
+ account-id: "YOUR_ACCOUNT_ID"
+```
+
+你还可以更改将指标发送到 New Relic 的时间间隔:
+
+属性
+
+```
+management.metrics.export.newrelic.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ newrelic:
+ step: "30s"
+```
+
+默认情况下,度量是通过 REST 调用发布的,但是如果你在 Classpath 上有 Java Agent API,那么你也可以使用它:
+
+属性
+
+```
+management.metrics.export.newrelic.client-provider-type=insights-agent
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ newrelic:
+ client-provider-type: "insights-agent"
+```
+
+最后,你可以通过定义自己的`NewRelicClientProvider` Bean 来获得完全控制。
+
+#### 6.2.13.Prometheus
+
+[Prometheus](https://micrometer.io/docs/registry/prometheus)期望抓取或轮询单个应用程序实例以获取度量。 Spring Boot 在`/actuator/prometheus`处提供致动器端点,以用适当的格式呈现[普罗米修斯刮](https://prometheus.io)。
+
+| |默认情况下,端点不可用,必须公开。有关更多详细信息,请参见[公开端点](#actuator.endpoints.exposing)。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------|
+
+下面的示例`scrape_config`将添加到`prometheus.yml`:
+
+```
+scrape_configs:
+ - job_name: "spring"
+ metrics_path: "/actuator/prometheus"
+ static_configs:
+ - targets: ["HOST:PORT"]
+```
+
+对于可能存在的时间不够长而无法被抓取的临时或批处理作业,可以使用[普罗米修斯 · 普什盖特](https://github.com/prometheus/pushgateway)支持将度量公开给普罗米修斯。要启用 Prometheus PushGateway 支持,请在项目中添加以下依赖项:
+
+```
+
+ io.prometheus
+ simpleclient_pushgateway
+
+```
+
+当 Classpath 上存在 Prometheus PushGateway 依赖项并且`management.metrics.export.prometheus.pushgateway.enabled`属性设置为`true`时,将自动配置`PrometheusPushGatewayManager` Bean。这管理了将指标推送到 Prometheus PushGateway 的过程。
+
+你可以通过使用`management.metrics.export.prometheus.pushgateway`下的属性来调优`PrometheusPushGatewayManager`。对于高级配置,还可以提供自己的`PrometheusPushGatewayManager` Bean。
+
+#### 6.2.14.SignalFX
+
+SignalFX Registry 定期将指标推到[SignalFx](https://micrometer.io/docs/registry/signalFx)。要将指标导出到[SignalFx](https://www.signalfx.com),你必须提供访问令牌:
+
+属性
+
+```
+management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKEN
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ signalfx:
+ access-token: "YOUR_ACCESS_TOKEN"
+```
+
+你还可以更改将指标发送到 SignalFX 的间隔时间:
+
+属性
+
+```
+management.metrics.export.signalfx.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ signalfx:
+ step: "30s"
+```
+
+#### 6.2.15.简单
+
+Micrometer 附带了一个简单的内存后端,如果没有配置其他注册中心,该后端将自动用作后备。这让你看到在[指标端点](#actuator.metrics.endpoint)中收集了哪些指标。
+
+一旦你使用任何其他可用的后端,内存中的后端就会禁用它自己。你还可以显式地禁用它:
+
+属性
+
+```
+management.metrics.export.simple.enabled=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ simple:
+ enabled: false
+```
+
+#### 6.2.16.Stackdriver
+
+StackDriver 注册表定期将指标推到[Stackdriver](https://cloud.google.com/stackdriver/)。要将指标导出到 SaaS[Stackdriver](https://micrometer.io/docs/registry/stackdriver),你必须提供你的 Google Cloud 项目 ID:
+
+属性
+
+```
+management.metrics.export.stackdriver.project-id=my-project
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ stackdriver:
+ project-id: "my-project"
+```
+
+你还可以更改将指标发送到 StackDriver 的间隔时间:
+
+属性
+
+```
+management.metrics.export.stackdriver.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ stackdriver:
+ step: "30s"
+```
+
+#### 6.2.17.统计 d
+
+STATSD 注册中心急切地将 UDP 上的指标推送到 STATSD 代理。默认情况下,指标被导出到在本地机器上运行的[StatsD](https://micrometer.io/docs/registry/statsD)代理。你可以使用以下方法提供要使用的 STATSD 代理主机、端口和协议:
+
+属性
+
+```
+management.metrics.export.statsd.host=statsd.example.com
+management.metrics.export.statsd.port=9125
+management.metrics.export.statsd.protocol=udp
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ statsd:
+ host: "statsd.example.com"
+ port: 9125
+ protocol: "udp"
+```
+
+你也可以将 STATSD 行协议更改为使用(默认为 Datadog):
+
+属性
+
+```
+management.metrics.export.statsd.flavor=etsy
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ statsd:
+ flavor: "etsy"
+```
+
+#### 6.2.18.波阵面
+
+Wavefront 注册中心定期将指标推到[Wavefront](https://micrometer.io/docs/registry/wavefront)。如果要直接将指标导出到[Wavefront](https://www.wavefront.com/),则必须提供你的 API 令牌:
+
+属性
+
+```
+management.metrics.export.wavefront.api-token=YOUR_API_TOKEN
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ wavefront:
+ api-token: "YOUR_API_TOKEN"
+```
+
+或者,你可以在你的环境中使用 Wavefront 侧车或内部代理将度量数据转发到 Wavefront API 主机:
+
+属性
+
+```
+management.metrics.export.wavefront.uri=proxy://localhost:2878
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ wavefront:
+ uri: "proxy://localhost:2878"
+```
+
+| |如果将指标发布到 Wavefront 代理(如[Wavefront 文档](https://docs.wavefront.com/proxies_installing.html)中所述),则主机必须为`proxy://HOST:PORT`格式。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+你还可以更改将指标发送到 Wavefront 的间隔时间:
+
+属性
+
+```
+management.metrics.export.wavefront.step=30s
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ export:
+ wavefront:
+ step: "30s"
+```
+
+### 6.3.支持的度量和计量器
+
+Spring Boot 为各种各样的技术提供了自动仪表注册。在大多数情况下,默认值提供了合理的度量,可以将其发布到任何受支持的监视系统。
+
+#### 6.3.1.JVM 度量
+
+自动配置通过使用核心 Micrometer 类来实现 JVM 度量。JVM 度量以`jvm.`度量名称发布。
+
+提供了以下 JVM 指标:
+
+* 各种内存和缓冲池详细信息
+
+* 与垃圾收集相关的统计信息
+
+* 线程利用率
+
+* 加载和卸载的类的数量
+
+#### 6.3.2.系统度量
+
+自动配置通过使用核心微米表类来实现系统度量。系统度量在`system.`、`process.`和`disk.`表名称下发布。
+
+提供了以下系统指标:
+
+* CPU 度量
+
+* 文件描述符度量
+
+* 正常运行时间指标(应用程序运行的时间和绝对启动时间的固定指标)
+
+* 可用磁盘空间
+
+#### 6.3.3.应用程序启动度量
+
+自动配置公开应用程序启动时间指标:
+
+* `application.started.time`:启动应用程序所需的时间。
+
+* `application.ready.time`:应用程序准备好服务请求所需的时间。
+
+度量由应用程序类的完全限定名称标记。
+
+#### 6.3.4.记录器指标
+
+自动配置可以为 logback 和 log4j2 启用事件度量。详细信息在`log4j2.events.`或`logback.events.`表名称下发布。
+
+#### 6.3.5.任务执行和调度指标
+
+自动配置允许对所有可用的`ThreadPoolTaskExecutor`和`ThreadPoolTaskScheduler`bean 进行插装,只要下面的`ThreadPoolExecutor`可用。度量由执行器的名称标记,该名称来自 Bean 名称。
+
+#### 6.3.6. Spring MVC 度量
+
+自动配置允许检测由 Spring MVC 控制器和功能处理程序处理的所有请求。默认情况下,度量值以`http.server.requests`的名称生成。你可以通过设置`management.metrics.web.server.request.metric-name`属性来定制名称。
+
+`@Timed`批注在`@Controller`类和`@RequestMapping`方法上都是支持的(详见[@ 定时注释支持](#actuator.metrics.supported.timed-annotation))。如果不想记录所有 Spring MVC 请求的度量,可以将`management.metrics.web.server.request.autotime.enabled`设置为`false`,并专门使用`@Timed`注释。
+
+默认情况下, Spring MVC 相关度量标记有以下信息:
+
+| Tag |说明|
+|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`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}`)|
+
+要添加到默认标记中,请提供一个或多个实现`@Bean`的`WebMvcTagsContributor`s。要替换默认标记,请提供一个实现`WebMvcTagsProvider`的`@Bean`。
+
+| |在某些情况下,在 Web 控制器中处理的异常不被记录为请求度量标记。
应用程序可以通过[将已处理的异常设置为请求属性](web.html#web.servlet.spring-mvc.error-handling)OPT 并记录异常。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.3.7. Spring WebFlux 度量
+
+自动配置允许检测由 Spring WebFlux 控制器和功能处理程序处理的所有请求。默认情况下,度量值以`http.server.requests`的名称生成。你可以通过设置`management.metrics.web.server.request.metric-name`属性来定制名称。
+
+`@Timed`在`@Controller`类和`@RequestMapping`方法上支持`@Timed`注释(有关详细信息,请参见[@ 定时注释支持](#actuator.metrics.supported.timed-annotation))。如果不想记录所有 Spring WebFlux 请求的度量,则可以将`management.metrics.web.server.request.autotime.enabled`设置为`false`,并专门使用`@Timed`注释。
+
+默认情况下,WebFlux 相关度量标记有以下信息:
+
+| Tag |说明|
+|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`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}`)|
+
+要添加到默认标记中,请提供一个或多个实现`WebFluxTagsContributor`的 bean。要替换默认标记,请提供实现`WebFluxTagsProvider`的 Bean。
+
+| |在某些情况下,在控制器和处理程序函数中处理的异常不被记录为请求度量标记。
应用程序可以通过[将已处理的异常设置为请求属性](web.html#web.reactive.webflux.error-handling)OPT 并记录异常。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.3.8.泽西服务器指标
+
+自动配置支持对 Jersey JAX-RS 实现处理的所有请求进行检测。默认情况下,度量值以`http.server.requests`的名称生成。你可以通过设置`management.metrics.web.server.request.metric-name`属性来定制名称。
+
+`@Timed`在请求处理类和方法上支持注释(有关详细信息,请参见[@ 定时注释支持](#actuator.metrics.supported.timed-annotation))。如果不想记录所有 Jersey 请求的度量,可以将`management.metrics.web.server.request.autotime.enabled`设置为`false`,并专门使用`@Timed`注释。
+
+默认情况下,Jersey Server Metrics 使用以下信息进行标记:
+
+| Tag |说明|
+|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`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}`)|
+
+要定制标记,请提供一个实现`@Bean`的`JerseyTagsProvider`。
+
+#### 6.3.9.HTTP 客户端度量
+
+Spring 引导致动器管理`RestTemplate`和`WebClient`两者的仪表。为此,你必须插入自动配置的生成器,并使用它创建实例:
+
+* `RestTemplateBuilder`表示`RestTemplate`
+
+* `WebClient.Builder`表示`WebClient`
+
+你还可以手动应用负责此检测的定制程序,即`MetricsRestTemplateCustomizer`和`Cache`。
+
+默认情况下,度量值以`http.client.requests`的名称生成。你可以通过设置`management.metrics.web.client.request.metric-name`属性来定制名称。
+
+默认情况下,由检测过的客户机生成的度量值被标记为以下信息:
+
+| Tag |说明|
+|------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`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}`)|
+
+为了自定义标记,并且根据你对客户机的选择,你可以提供一个`@Bean`,它实现`RestTemplateExchangeTagsProvider`或`WebClientExchangeTagsProvider`。在`RestTemplateExchangeTags`和`WebClientExchangeTags`中有方便的静态函数。
+
+#### 6.3.10. Tomcat 指标
+
+只有在启用`MBeanRegistry`时,自动配置才能启用 Tomcat 的插装。默认情况下,`MBeanRegistry`是禁用的,但是你可以通过将`server.tomcat.mbeanregistry.enabled`设置为`true`来启用它。
+
+Tomcat 度量在`tomcat.`度量名称下发布。
+
+#### 6.3.11.缓存度量
+
+自动配置允许在启动时检测所有可用的`Cache`实例,其度量值前缀为`cache`。缓存检测是针对一组基本的度量标准进行标准化的。另外,特定于缓存的指标也是可用的。
+
+支持以下缓存库:
+
+* 咖啡因
+
+* Ehcache2
+
+* 黑泽尔卡斯特
+
+* 任何兼容的 JCache(JSR-107)实现
+
+* 雷迪斯
+
+度量由缓存的名称和`CacheManager`的名称标记,该名称来自 Bean 名称。
+
+| |只有在启动时配置的缓存才绑定到注册中心。
对于在缓存配置中未定义的缓存,例如在运行中或在启动阶段之后以编程方式创建的缓存,需要进行显式注册。
还提供了`CacheMetricsRegistrar` Bean,以使该过程更容易。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.3.12.数据源度量
+
+自动配置允许对所有可用的`DataSource`对象进行插装,这些对象的度量前缀为`jdbc.connections`。数据源插装产生的量规表示池中当前活动的、空闲的、最大允许的和最小允许的连接。
+
+度量值也由基于 Bean 名称计算的`DataSource`的名称标记。
+
+| |默认情况下, Spring Boot 为所有支持的数据源提供元数据。
如果不支持你喜欢的数据源,你可以添加额外的`DataSourcePoolMetadataProvider`bean。
参见`DataSourcePoolMetadataProvidersConfiguration`示例。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+此外,特定于光的度量以`hikaricp`前缀公开。每个度量都由池的名称标记(你可以使用`spring.datasource.name`来控制它)。
+
+#### 6.3.13. Hibernate 指标
+
+如果`org.hibernate:hibernate-micrometer`在 Classpath 上,则所有启用了统计信息的可用 Hibernate `EntityManagerFactory`实例都将使用一个名为`hibernate`的度量指标进行检测。
+
+度量指标还被`EntityManagerFactory`的名称标记,该名称来自 Bean 名称。
+
+要启用统计信息,标准 JPA 属性`hibernate.generate_statistics`必须设置为`true`。你可以在自动配置的
上启用该功能:
+
+属性
+
+```
+spring.jpa.properties[hibernate.generate_statistics]=true
+```
+
+Yaml
+
+```
+spring:
+ jpa:
+ properties:
+ "[hibernate.generate_statistics]": true
+```
+
+#### 6.3.14. Spring 数据存储库度量
+
+自动配置使所有 Spring 数据`Repository`方法调用的检测成为可能。默认情况下,度量值以`spring.data.repository.invocations`的名称生成。你可以通过设置`management.metrics.data.repository.metric-name`属性来定制名称。
+
+`@Timed`在`Repository`类和方法上支持[@ 定时注释支持](#actuator.metrics.supported.timed-annotation)注释(有关详细信息,请参见[@ 定时注释支持](#actuator.metrics.supported.timed-annotation))。如果不想记录所有`Repository`调用的度量,则可以将`management.metrics.data.repository.autotime.enabled`设置为`false`,并专门使用`@Timed`注释。
+
+默认情况下,存储库调用相关的度量被标记为以下信息:
+
+| Tag |说明|
+|------------|---------------------------------------------------------------------------|
+|`repository`|源的简单类名`Repository`。|
+| `method` |调用的`Repository`方法的名称。|
+| `state` |结果状态(’success’,`ERROR`,`CANCELED`,或`RUNNING`)。|
+|`exception` |从调用中抛出的任何异常的简单类名。|
+
+要替换默认标记,请提供一个实现`RepositoryTagsProvider`的`@Bean`。
+
+#### 6.3.15.RabbitMQ 度量
+
+自动配置允许使用名为`rabbitmq`的度量来检测所有可用的 RabbitMQ 连接工厂。
+
+#### 6.3.16. Spring 集成度量
+
+Spring 只要`MeterRegistry` Bean 可用,集成就会自动提供[千分尺支持](https://docs.spring.io/spring-integration/docs/5.5.9/reference/html/system-management.html#micrometer-integration)。度量以`spring.integration.`度量名称发布。
+
+#### 6.3.17.卡夫卡指标
+
+自动配置分别为自动配置的消费者工厂和生产者工厂注册了`MicrometerConsumerListener`和`MicrometerProducerListener`。它还为`StreamsBuilderFactoryBean`注册了`KafkaStreamsMicrometerListener`。有关更多详细信息,请参见 Spring Kafka 文档的[千分尺本机度量](https://docs.spring.io/spring-kafka/docs/2.8.3/reference/html/#micrometer-native)部分。
+
+#### 6.3.18.MongoDB 度量
+
+本节简要介绍 MongoDB 的可用度量。
+
+##### MongoDB 命令度量
+
+自动配置寄存器`MongoMetricsCommandListener`和自动配置的。
+
+为发出给底层 MongoDB 驱动程序的每个命令创建一个名为`mongodb.driver.commands`的计时器度量。默认情况下,每个度量标准都带有以下信息:
+
+| Tag |说明|
+|----------------|------------------------------------------------------------|
+| `command` |发出的命令的名称。|
+| `cluster.id` |将命令发送到的集群的标识符。|
+|`server.address`|该命令被发送到的服务器的地址。|
+| `status` |命令的结果(“success”或`FAILED`)。|
+
+要替换默认的度量标记,请定义`MongoCommandTagsProvider` Bean,如下例所示:
+
+```
+import io.micrometer.core.instrument.binder.mongodb.MongoCommandTagsProvider;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyCommandTagsProviderConfiguration {
+
+ @Bean
+ public MongoCommandTagsProvider customCommandTagsProvider() {
+ return new CustomCommandTagsProvider();
+ }
+
+}
+
+```
+
+要禁用自动配置的命令度量,请设置以下属性:
+
+属性
+
+```
+management.metrics.mongo.command.enabled=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ mongo:
+ command:
+ enabled: false
+```
+
+##### MongoDB 连接池指标
+
+自动配置寄存器`MongoMetricsConnectionPoolListener`和自动配置的`MongoClient`。
+
+为连接池创建了以下度量指标:
+
+* `mongodb.driver.pool.size`报告连接池的当前大小,包括空闲成员和正在使用的成员。
+
+* `false`报告当前正在使用的连接数。
+
+* `mongodb.driver.pool.waitqueuesize`报告池中连接的等待队列的当前大小。
+
+默认情况下,每个度量标准都带有以下信息:
+
+| Tag |说明|
+|----------------|-----------------------------------------------------------------------|
+| `cluster.id` |连接池对应的群集的标识符。|
+|`server.address`|连接池对应的服务器的地址。|
+
+要替换默认的度量标记,请定义`MongoConnectionPoolTagsProvider` Bean:
+
+```
+import io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyConnectionPoolTagsProviderConfiguration {
+
+ @Bean
+ public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
+ return new CustomConnectionPoolTagsProvider();
+ }
+
+}
+
+```
+
+要禁用自动配置的连接池指标,请设置以下属性:
+
+属性
+
+```
+management.metrics.mongo.connectionpool.enabled=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ mongo:
+ connectionpool:
+ enabled: false
+```
+
+#### 6.3.19. Jetty 指标
+
+通过使用 Micrometer 的`JettyServerThreadPoolMetrics`,自动配置绑定了 Jetty 的`ThreadPool`的度量。 Jetty 的`Connector`实例的指标通过使用千分尺的`JettyConnectionMetrics`绑定,并且,当`server.ssl.enabled`设置为`true`时,千分尺的`JettySslHandshakeMetrics`。
+
+#### 6.3.20.@ 定时注释支持
+
+你可以将`@Timed`包中的`io.micrometer.core.annotation`注释与前面介绍的几种受支持的技术一起使用。如果支持,可以在类级别或方法级别使用注释。
+
+例如,下面的代码显示了如何使用注释来检验`@RestController`中的所有请求映射:
+
+```
+import java.util.List;
+
+import io.micrometer.core.annotation.Timed;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Timed
+public class MyController {
+
+ @GetMapping("/api/addresses")
+ public List listAddress() {
+ return ...
+ }
+
+ @GetMapping("/api/people")
+ public List listPeople() {
+ return ...
+ }
+
+}
+
+```
+
+如果你只想使用一个映射,那么可以使用方法上的注释,而不是类:
+
+```
+import java.util.List;
+
+import io.micrometer.core.annotation.Timed;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class MyController {
+
+ @GetMapping("/api/addresses")
+ public List listAddress() {
+ return ...
+ }
+
+ @GetMapping("/api/people")
+ @Timed
+ public List listPeople() {
+ return ...
+ }
+
+}
+
+```
+
+如果你想更改特定方法的时间细节,还可以合并类级和方法级注释:
+
+```
+import java.util.List;
+
+import io.micrometer.core.annotation.Timed;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Timed
+public class MyController {
+
+ @GetMapping("/api/addresses")
+ public List listAddress() {
+ return ...
+ }
+
+ @GetMapping("/api/people")
+ @Timed(extraTags = { "region", "us-east-1" })
+ @Timed(value = "all.people", longTask = true)
+ public List listPeople() {
+ return ...
+ }
+
+}
+
+```
+
+| |带有`@Timed`注释的`longTask = true`将为该方法启用一个长任务计时器。
长任务计时器需要一个单独的度量名称,并且可以堆叠一个短任务计时器。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.3.21.Redis 度量
+
+自动配置为自动配置的`LettuceConnectionFactory`寄存器 a`MicrometerCommandLatencyRecorder`。有关更多详细信息,请参见生菜文档的[千分尺计量部分](https://lettuce.io/core/6.1.6.RELEASE/reference/index.html#command.latency.metrics.micrometer)。
+
+### 6.4.注册自定义度量
+
+要注册自定义度量,请将`MeterRegistry`插入到组件中:
+
+```
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyBean {
+
+ private final Dictionary dictionary;
+
+ public MyBean(MeterRegistry registry) {
+ this.dictionary = Dictionary.load();
+ registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size());
+ }
+
+}
+
+```
+
+如果你的指标依赖于其他 bean,我们建议你使用`MeterBinder`来注册它们:
+
+```
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.binder.MeterBinder;
+
+import org.springframework.context.annotation.Bean;
+
+public class MyMeterBinderConfiguration {
+
+ @Bean
+ public MeterBinder queueSize(Queue queue) {
+ return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
+ }
+
+}
+
+```
+
+使用`MeterBinder`可以确保设置了正确的依赖关系,并且在检索到度量值时 Bean 是可用的。如果你发现你在组件或应用程序之间反复测试一套度量标准,那么`MeterBinder`实现也会很有用。
+
+| |默认情况下,来自所有`Connector`bean 的指标都会自动绑定到 Spring 管理的。|
+|---|---------------------------------------------------------------------------------------------------------------|
+
+### 6.5.自定义单个指标
+
+如果需要对特定的`Meter`实例应用自定义,则可以使用`io.micrometer.core.instrument.config.MeterFilter`接口。
+
+例如,如果要将`percentiles-histogram`标记重命名为`mytag.area`,以`com.example`开头的所有仪表 ID,可以执行以下操作:
+
+```
+import io.micrometer.core.instrument.config.MeterFilter;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyMetricsFilterConfiguration {
+
+ @Bean
+ public MeterFilter renameRegionTagMeterFilter() {
+ return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
+ }
+
+}
+
+```
+
+| |默认情况下,所有`MeterFilter`bean 都自动绑定到 Spring 管理的`MeterRegistry`。
确保通过使用 Spring 管理的`MeterRegistry`来注册你的度量,而不是使用`Metrics`上的任何静态方法。
这些方法使用的是不是 Spring 管理的全局注册中心。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.5.1.公共标签
+
+常见的标记通常用于对操作环境(如主机、实例、区域、堆栈等)进行维度下钻。Commons 标记应用于所有仪表,并且可以进行配置,如下例所示:
+
+属性
+
+```
+management.metrics.tags.region=us-east-1
+management.metrics.tags.stack=prod
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ tags:
+ region: "us-east-1"
+ stack: "prod"
+```
+
+前面的示例将`region`和`stack`标记分别添加到所有值为`us-east-1`和`prod`的仪表上。
+
+| |如果使用 Graphite,公共标记的顺序很重要。
由于使用这种方法无法保证公共标记的顺序,建议 Graphite 用户定义一个自定义的`MeterFilter`。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 6.5.2.每米属性
+
+除了`MeterFilter`bean 之外,你还可以通过使用属性在每米的基础上应用一组有限的定制。每表自定义应用于以给定名称开始的任何表 ID。下面的示例禁用 ID 为`server.ssl.enabled`的任何仪表。
+
+属性
+
+```
+management.metrics.enable.example.remote=false
+```
+
+Yaml
+
+```
+management:
+ metrics:
+ enable:
+ example:
+ remote: false
+```
+
+以下属性允许按米定制:
+
+| Property |说明|
+|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `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.expiry`, `management.metrics.distribution.buffer-length` |通过在可配置到期后旋转的环形缓冲区中积累最近的样本,并使用
可配置缓冲区长度,从而赋予它们更大的权重。|
+| `management.metrics.distribution.slo` |使用由你的服务级别目标定义的桶发布累积直方图。|
+
+有关`percentiles-histogram`、`percentiles`和`percentiles`背后的概念的更多详细信息,请参见千分尺文档的[“直方图和百分位”部分](https://micrometer.io/docs/concepts#_histograms_and_percentiles)。
+
+### 6.6.指标端点
+
+Spring Boot 提供了一个`metrics`端点,你可以诊断地使用该端点来检查应用程序收集的指标。默认情况下端点不可用,必须公开。有关更多详细信息,请参见[公开端点](#actuator.endpoints.exposing)。
+
+导航到`/actuator/metrics`将显示可用的仪表名称列表。你可以向下钻取以查看有关特定仪表的信息,方法是将其名称提供为选择器——例如,[公开端点](#actuator.endpoints.exposing)。
+
+| |你在这里使用的名称应该与代码中使用的名称相匹配,而不是与它已被用于所运到的监视系统的命名约定规范化之后的名称相匹配,换句话说,在前面的示例中,返回的`Value`统计值是“代码缓存”、“压缩类空间”的最大内存足迹的总和,以及堆的“元空间”区域。
如果你只想看到“元空间”的最大大小,则可以添加一个额外的`tag=id:Metaspace`,即`/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace`。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+## 7. 审计
+
+一旦 Spring 安全性发挥作用, Spring 启动执行器具有灵活的审计框架,该框架发布事件(默认情况下,“身份验证成功”、“失败”和“拒绝访问”异常)。这个特性对于报告和实现基于身份验证失败的锁定策略非常有用。
+
+你可以通过在应用程序的配置中提供类型的 Bean 来启用审核。 Spring 为了方便起见,Boot 提供了`InMemoryAuditEventRepository`。InmemoryAuditeVentrepository’的功能有限,我们建议仅在开发环境中使用它。对于生产环境,考虑创建你自己的替代`AuditEventRepository`实现。
+
+### 7.1.自定义审计
+
+要定制已发布的安全事件,你可以提供你自己的`AbstractAuthenticationAuditListener`和`AbstractAuthorizationAuditListener`的实现。
+
+你还可以为自己的业务事件使用审计服务。要做到这一点,可以将`AuditEventRepository` Bean 注入到你自己的组件中并直接使用它,或者使用 Spring `AuditApplicationEvent`发布`AuditApplicationEvent`(通过实现`ApplicationEventPublisherAware`)。
+
+## 8. HTTP 追踪
+
+你可以通过在应用程序的配置中提供`ApplicationEventPublisherAware`类型的 Bean 来启用 HTTP 跟踪。为了方便起见, Spring Boot 提供了`InMemoryHttpTraceRepository`,它存储了最近 100 次(默认)请求-响应交换的跟踪。与其他跟踪解决方案相比,InmemoryHttpTraceRepository’是有限的,我们建议仅在开发环境中使用它。对于生产环境,我们建议使用生产就绪的跟踪或可观察性解决方案,例如 Zipkin 或 Spring Cloud Sleuth。或者,你可以创建自己的`HttpTraceRepository`。
+
+你可以使用`httptrace`端点来获取有关存储在`HttpTraceRepository`中的请求-响应交换的信息。
+
+### 8.1.自定义 HTTP 跟踪
+
+要自定义每个跟踪中包含的项,请使用`management.trace.http.include`配置属性。对于高级定制,可以考虑注册自己的`HttpExchangeTracer`实现。
+
+## 9. 过程监控
+
+在模块中,你可以找到两个类来创建通常对过程监控有用的文件:
+
+* `ApplicationPidFileWriter`创建一个包含应用程序 PID 的文件(默认情况下,在文件名为`application.pid`的应用程序目录中)。
+
+* `WebServerPortFileWriter`创建一个包含运行中的 Web 服务器端口的文件(或多个文件)(默认情况下,在文件名为`application.port`的应用程序目录中)。
+
+默认情况下,这些编写器不会被激活,但你可以启用它们:
+
+* [通过扩展配置](#actuator.process-monitoring.configuration)
+
+* [以编程方式启用过程监控](#actuator.process-monitoring.programmatically)
+
+### 9.1.扩展配置
+
+在`META-INF/spring.factories`文件中,你可以激活写入 PID 文件的侦听器(或多个侦听器):
+
+```
+org.springframework.context.ApplicationListener=\
+org.springframework.boot.context.ApplicationPidFileWriter,\
+org.springframework.boot.web.context.WebServerPortFileWriter
+```
+
+### 9.2.以编程方式启用过程监控
+
+还可以通过调用`SpringApplication.addListeners(…)`方法并传递适当的`Writer`对象来激活侦听器。这个方法还允许你在`Writer`构造函数中自定义文件名和路径。
+
+## 10. Cloud Foundry 支持
+
+Spring Boot 的致动器模块包括额外的支持,该支持在部署到兼容的 Cloud Foundry 实例时被激活。`/cloudfoundryapplication`路径为所有`@Endpoint`bean 提供了一个可选的安全路由。
+
+Spring 启动执行器信息增强了扩展的支持,使 Cloud Foundry 管理 UIS(例如你可以用于查看已部署的应用程序的 Web 应用程序)得到增强。例如,应用程序状态页面可以包含完整的健康信息,而不是典型的“运行”或“停止”状态。
+
+| |普通用户无法直接访问`/cloudfoundryapplication`路径。
要使用端点,必须与请求一起传递有效的 UAA 令牌。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 10.1.禁用扩展的 Cloud Foundry 执行器支持
+
+如果要完全禁用`/cloudfoundryapplication`端点,可以在`application.properties`文件中添加以下设置:
+
+属性
+
+```
+management.cloudfoundry.enabled=false
+```
+
+Yaml
+
+```
+management:
+ cloudfoundry:
+ enabled: false
+```
+
+### 10.2.Cloud Foundry 自签名证书
+
+默认情况下,`/cloudfoundryapplication`Endpoints 的安全验证使 SSL 调用到各种 Cloud Foundry 服务。如果你的 Cloud Foundry UAA 或 Cloud Controller 服务使用自签名证书,则需要设置以下属性:
+
+属性
+
+```
+management.cloudfoundry.skip-ssl-validation=true
+```
+
+Yaml
+
+```
+management:
+ cloudfoundry:
+ skip-ssl-validation: true
+```
+
+### 10.3.自定义上下文路径
+
+如果服务器的上下文路径已被配置为`/`以外的任何内容,则在应用程序的根目录下,Cloud Foundry 端点是不可用的。例如,如果`server.servlet.context-path=/app`,则可在`/app/cloudfoundryapplication/*`上获得 Cloud Foundry 端点。
+
+如果你希望 Cloud Foundry 端点始终在`/cloudfoundryapplication/*`上可用,那么无论服务器的上下文路径如何,你都需要在应用程序中显式地配置它。根据使用的 Web 服务器的不同,配置也会有所不同。对于 Tomcat,你可以添加以下配置:
+
+```
+import java.io.IOException;
+import java.util.Collections;
+
+import javax.servlet.GenericServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.catalina.Host;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.startup.Tomcat;
+
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyCloudFoundryConfiguration {
+
+ @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 (classes, 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("/*");
+ };
+ }
+
+}
+
+```
+
+## 11. 接下来读什么?
+
+你可能想了解有关绘图工具的信息,例如[Graphite](https://graphiteapp.org)。
+
+否则,你可以继续阅读有关[“部署选项”](deployment.html#deployment)的内容,或者提前查看有关 Spring Boot 的[构建工具插件](build-tool-plugins.html#build-tool-plugins)的一些深入信息。
diff --git a/docs/spring-boot/build-tool-plugins.md b/docs/spring-boot/build-tool-plugins.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..02aae6acc87f070f8e34261531c6cf1d4ecd766c 100644
--- a/docs/spring-boot/build-tool-plugins.md
+++ b/docs/spring-boot/build-tool-plugins.md
@@ -0,0 +1,192 @@
+# 构建工具插件
+
+Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了各种特性,包括可执行 JAR 的打包。本节提供了有关这两个插件的更多详细信息,以及在需要扩展不受支持的构建系统时提供的一些帮助。如果你刚刚开始,你可能需要先阅读“[using.html](using.html#using.build-systems)”一节中的“[using.html](using.html#using)”。
+
+## 1.1 Spring 引导 Maven 插件
+
+Spring boot Maven 插件在 Maven 中提供了 Spring boot 支持,允许你打包可执行文件 jar 或战争归档文件并“就地”运行应用程序。要使用它,你必须使用 Maven 3.2(或更高版本)。
+
+查看该插件的文档以了解更多信息:
+
+* 引用([HTML](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/)和[PDF](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/pdf/spring-boot-maven-plugin-reference.pdf))
+
+* [API](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/api/)
+
+## 1.2. Spring 引导 Gradle 插件
+
+Spring boot Gradle 插件在 Gradle 中提供 Spring 引导支持,允许你打包可执行文件 jar 或战争归档文件,运行 Spring 引导应用程序,并使用`spring-boot-dependencies`提供的依赖管理。它需要 Gradle 6.8、6.9 或 7.x。查看该插件的文档以了解更多信息:
+
+* 参考文献([HTML](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/)和[PDF](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/pdf/spring-boot-gradle-plugin-reference.pdf))
+
+* [API](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/api/)
+
+## 3. Spring 启动 Antlib 模块
+
+Spring 启动 Antlib 模块为 Apache Ant 提供了基本的 Spring 启动支持。你可以使用该模块创建可执行 JAR。要使用该模块,你需要在你的`build.xml`中声明一个额外的`spring-boot`名称空间,如以下示例所示:
+
+```
+
+ ...
+
+```
+
+你需要记住使用`-lib`选项启动 Ant,如以下示例所示:
+
+```
+$ ant -lib
+```
+
+> “使用 Spring 引导”部分包括[using Apache Ant with `spring-boot-antlib`](using.html#using.build-systems.ant)的更完整示例。
+
+### 3.1. Spring 引导 Ant 任务
+
+一旦声明了`spring-boot-antlib`名称空间,就可以执行以下附加任务:
+
+* [使用“exejar”任务](#build-tool-plugins.antlib.tasks.exejar)
+
+* [使用“FindMainclass”任务](#build-tool-plugins.antlib.findmainclass)
+
+#### 3.1.1.使用“exejar”任务
+
+你可以使用`exejar`任务来创建 Spring 引导可执行文件 jar。该任务支持以下属性:
+
+| Attribute | Description |必需的|
+|-------------|--------------------------------------|-------------------------------------------------------------------------|
+| `destfile` | The destination jar file to create |是的|
+| `classes` |The root directory of Java class files|是的|
+|`start-class`| The main application class to run |否*(the default is the first class found that declares a `main` method)*|
+
+以下嵌套元素可与任务一起使用:
+
+| Element |说明|
+|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`resources`|一个或多个[资源收集](https://ant.apache.org/manual/Types/resources.html#collection),描述一组[Resources](https://ant.apache.org/manual/Types/resources.html),该集合应被添加到所创建的 jar 文件的内容中。|
+| `lib` |应该将一个或多个[资源收集](https://ant.apache.org/manual/Types/resources.html#collection)添加到构成应用程序运行时依赖项 Classpath 的 jar 库集合中。|
+
+#### 3.1.2.例子
+
+本节展示了 Ant 任务的两个示例。
+
+指定起始类
+
+```
+
+
+
+
+
+
+
+
+```
+
+检测起始类
+
+```
+
+
+
+
+
+```
+
+### 3.2.使用“FindMainclass”任务
+
+`findmainclass`任务由`exejar`内部使用,用于定位声明`main`的类。如果有必要,你也可以在构建中直接使用此任务。支持以下属性:
+
+| Attribute |说明| Required |
+|-------------|----------------------------------------------------|-------------------------------------------|
+|`classesroot`|Java 类文件的根目录| Yes *(unless `mainclass` is specified)* |
+| `mainclass` |可用于短路`main`类搜索| No |
+| `property` |应与结果一起设置的 Ant 属性|No *(result will be logged if unspecified)*|
+
+#### 3.2.1.例子
+
+本节包含使用`findmainclass`的三个示例。
+
+查找并记录
+
+```
+
+```
+
+查找并设置
+
+```
+
+```
+
+覆盖和设置
+
+```
+
+```
+
+## 4. 支持其他构建系统
+
+如果你想使用 Maven、 Gradle 或 Ant 以外的构建工具,那么你可能需要开发自己的插件。可执行 JAR 需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参见附录中的“[executable jar format](executable-jar.html#appendix.executable-jar)”部分)。
+
+Spring boot Maven 和 Gradle 插件都使用`spring-boot-loader-tools`来实际生成 JAR。如果需要,可以直接使用这个库。
+
+### 4.1.重新包装档案
+
+要重新打包现有的归档文件,使其成为一个自包含的可执行归档文件,请使用`org.springframework.boot.loader.tools.Repackager`。`Repackager`类接受一个构造函数参数,该参数引用现有的 jar 或 WAR 归档。使用两个可用的`repackage()`方法中的一个来替换原始文件或写入新的目标。在运行 Repackager 之前,还可以在其上配置各种设置。
+
+### 4.2.嵌套库
+
+在重新打包归档文件时,可以使用`org.springframework.boot.loader.tools.Libraries`接口来包含对依赖项文件的引用。这里我们不提供`Libraries`的任何具体实现,因为它们通常是特定于构建系统的。
+
+如果你的归档文件已经包含库,那么你可以使用`Libraries.NONE`。
+
+### 4.3.寻找主类
+
+如果你不使用`Repackager.setMainClass()`来指定主类,则 Repackager 将使用[ASM](https://asm.ow2.io/)来读取类文件,并尝试使用`public static void main(String[] args)`方法找到合适的类。如果发现一个以上的候选者,将抛出一个异常。
+
+### 4.4.示例重新打包实现
+
+下面的示例展示了一个典型的重新打包实现:
+
+```
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.springframework.boot.loader.tools.Library;
+import org.springframework.boot.loader.tools.LibraryCallback;
+import org.springframework.boot.loader.tools.LibraryScope;
+import org.springframework.boot.loader.tools.Repackager;
+
+public class MyBuildTool {
+
+ public void build() throws IOException {
+ File sourceJarFile = ...
+ Repackager repackager = new Repackager(sourceJarFile);
+ repackager.setBackupSource(false);
+ repackager.repackage(this::getLibraries);
+ }
+
+ private void getLibraries(LibraryCallback callback) throws IOException {
+ // Build system specific implementation, callback for each dependency
+ for (File nestedJar : getCompileScopeJars()) {
+ callback.library(new Library(nestedJar, LibraryScope.COMPILE));
+ }
+ // ...
+ }
+
+ private List getCompileScopeJars() {
+ return ...
+ }
+
+}
+
+```
+
+## 5. 接下来读什么?
+
+如果你对构建工具插件的工作方式感兴趣,可以查看 Github 上的[`spring-boot-tools`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-tools)模块。可执行 jar 格式的更多技术细节在[the appendix](executable-jar.html#appendix.executable-jar)中进行了介绍。
+
+如果你有特定的与构建相关的问题,请参阅“[how-to](howto.html#howto)”指南。
+
diff --git a/docs/spring-boot/cli.md b/docs/spring-boot/cli.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ded130be9f70936134fde8b630e530c9815c0cd4 100644
--- a/docs/spring-boot/cli.md
+++ b/docs/spring-boot/cli.md
@@ -0,0 +1,338 @@
+# Spring 引导 CLI
+
+Spring 引导 CLI 是一个命令行工具,如果你想快速开发 Spring 应用程序,可以使用它。它允许你运行 Groovy 脚本,这意味着你有一个熟悉的类似 Java 的语法,而不需要那么多样板代码。你还可以引导一个新项目,或者为它编写自己的命令。
+
+## 1. 安装 CLI
+
+可以使用 SDKMAN 手动安装 Spring boot cli(命令行界面)!(SDK 管理器),或者如果你是 OSX 用户,则使用 Homebrew 或 MacPorts。有关全面的安装说明,请参见“开始”部分中的*[getting-started.html](getting-started.html#getting-started.installing.cli)*。
+
+## 2. 使用 CLI
+
+一旦安装了 CLI,就可以通过输入`spring`并在命令行按 Enter 来运行它。如果你在没有任何参数的情况下运行`spring`,将显示一个帮助屏幕,如下所示:
+
+```
+$ spring
+usage: spring [--help] [--version]
+ []
+
+Available commands are:
+
+ run [options] [--] [args]
+ Run a spring groovy script
+
+ _... more command help is shown here_
+```
+
+你可以键入`spring help`来获得有关任何支持的命令的更多详细信息,如以下示例所示:
+
+```
+$ spring help run
+spring run - Run a spring groovy script
+
+usage: spring run [options] [--] [args]
+
+Option Description
+------ -----------
+--autoconfigure [Boolean] Add autoconfigure compiler
+ transformations (default: true)
+--classpath, -cp Additional classpath entries
+--no-guess-dependencies Do not attempt to guess dependencies
+--no-guess-imports Do not attempt to guess imports
+-q, --quiet Quiet logging
+-v, --verbose Verbose logging of dependency
+ resolution
+--watch Watch the specified file for changes
+```
+
+`version`命令提供了一种快速的方法来检查你正在使用的 Spring 启动版本,如下所示:
+
+```
+$ spring version
+Spring CLI v2.6.4
+```
+
+### 2.1.使用 CLI 运行应用程序
+
+你可以使用`run`命令编译和运行 Groovy 源代码。 Spring 引导 CLI 是完全自包含的,因此不需要任何外部 Groovy 安装。
+
+下面的示例展示了一个用 Groovy 编写的“Hello World”Web 应用程序:
+
+你好。Groovy
+
+```
+@RestController
+class WebApplication {
+
+ @RequestMapping("/")
+ String home() {
+ "Hello World!"
+ }
+
+}
+
+```
+
+要编译和运行应用程序,请键入以下命令:
+
+```
+$ spring run hello.groovy
+```
+
+要将命令行参数传递给应用程序,请使用`--`将命令与“ Spring”命令参数分开,如以下示例所示:
+
+```
+$ spring run hello.groovy -- --server.port=9000
+```
+
+要设置 JVM 命令行参数,可以使用`JAVA_OPTS`环境变量,如以下示例所示:
+
+```
+$ JAVA_OPTS=-Xmx1024m spring run hello.groovy
+```
+
+| |在 Microsoft Windows 上设置`JAVA_OPTS`时,请确保引用整个指令,例如`set "JAVA_OPTS=-Xms256m -Xmx2048m"`。
这样做可以确保将值正确地传递给进程。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.1.1.推导出“抓取”依赖项
+
+标准 Groovy 包含一个`@Grab`注释,它允许你声明对第三方库的依赖关系。这一有用的技术让 Groovy 以与 Maven 或 Gradle 相同的方式下载 JAR,但不需要使用构建工具。
+
+Spring Boot 进一步扩展了这种技术,并试图根据你的代码推断出要“抓取”哪些库。例如,由于前面显示的`WebApplication`代码使用`@RestController`注释, Spring 引导抓取“ Tomcat”和“ Spring MVC”。
+
+以下项目被用作“抓取提示”:
+
+|项目| Grabs |
+|----------------------------------------------------------|------------------------------|
+|`JdbcTemplate`, `NamedParameterJdbcTemplate`, `DataSource`| JDBC Application. |
+|`@EnableJms`| JMS Application. |
+|`@EnableCaching`| Caching abstraction. |
+|`@Test`| JUnit. |
+|`@EnableRabbit`| RabbitMQ. |
+|扩展`Specification`| Spock test. |
+|`@EnableBatchProcessing`| Spring Batch. |
+|`@MessageEndpoint` `@EnableIntegration`| Spring Integration. |
+|`@Controller` `@RestController` `@EnableWebMvc`|Spring MVC + Embedded Tomcat. |
+|`@EnableWebSecurity`| Spring Security. |
+|`@EnableTransactionManagement`|Spring Transaction Management.|
+
+| |请参阅 Spring Boot CLI 源代码中[“编译器自动配置”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/CompilerAutoConfiguration.java)的子类,以确切了解如何应用自定义。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.1.2.推导出的“抓取”坐标
+
+Spring Boot 扩展了 Groovy 的标准`@Grab`支持,允许你指定一个没有组或版本的依赖项(例如,`@Grab('freemarker')`)。这样做会参考 Spring Boot 的默认依赖关系元数据来推断工件的组和版本。
+
+| |默认的元数据与你使用的 CLI 版本绑定,
只有当你移动到新版本的 CLI 时,它才会发生变化,让你控制依赖项的版本何时可能更改。
在[appendix](dependency-versions.html#appendix.dependency-versions)中可以找到一个表,该表显示了默认元数据中包含的依赖项及其版本。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.1.3.默认导入语句
+
+为了帮助减少 Groovy 代码的大小,会自动包含几个`import`语句。注意前面的示例是如何引用`@Component`、`@RestController`和`@RequestMapping`而不需要使用完全限定的名称或`import`语句的。
+
+| |许多 Spring 注释在不使用`import`语句的情况下工作。
在添加导入之前,尝试运行你的应用程序以查看失败的原因。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 2.1.4.自动主法
+
+与等效的 Java 应用程序不同,你不需要在`Groovy`脚本中包含`public static void main(String[] args)`方法。将自动创建`SpringApplication`,你的编译代码将充当`source`。
+
+#### 2.1.5.自定义依赖管理
+
+默认情况下,CLI 在解析`@Grab`依赖关系时使用在`spring-boot-dependencies`中声明的依赖关系管理。可以通过使用`@DependencyManagementBom`注释来配置额外的依赖管理,该管理覆盖了默认的依赖管理。注释的值应该指定一个或多个 Maven boms 的坐标(“groupid:artifactid:version”)。
+
+例如,考虑以下声明:
+
+```
+@DependencyManagementBom("com.example.custom-bom:1.0.0")
+
+```
+
+前面的声明在 Maven 存储库中的`com/example/custom-versions/1.0.0/`下获取`custom-bom-1.0.0.pom`。
+
+当你指定多个 BOM 时,它们将按照你声明它们的顺序应用,如下例所示:
+
+```
+@DependencyManagementBom([
+ "com.example.custom-bom:1.0.0",
+ "com.example.another-bom:1.0.0"])
+
+```
+
+前面的示例表明,`another-bom`中的依赖管理重写了`custom-bom`中的依赖管理。
+
+你可以在任何可以使用`@DependencyManagementBom`的地方使用`@Grab`。然而,为了确保依赖管理的一致顺序,你可以在应用程序中最多使用`@DependencyManagementBom`一次。
+
+### 2.2.具有多个源文件的应用程序
+
+你可以在所有接受文件输入的命令中使用“shell globbing”。这样做可以让你从一个目录中使用多个文件,如下面的示例所示:
+
+```
+$ spring run *.groovy
+```
+
+### 2.3.打包你的应用程序
+
+你可以使用`jar`命令将你的应用程序打包成一个自包含的可执行文件 jar,如下例所示:
+
+```
+$ spring jar my-app.jar *.groovy
+```
+
+jar 结果包含通过编译应用程序产生的类和应用程序的所有依赖项,这样就可以使用`java -jar`运行它。 jar 文件还包含来自应用程序 Classpath 的条目。可以通过使用`--include`和`--exclude`来添加和删除 jar 的显式路径。两者都是用逗号分隔的,并且都接受前缀,以“+”和“-”的形式表示它们应该从默认值中删除。默认值包括以下内容:
+
+```
+public/**, resources/**, static/**, templates/**, META-INF/**, *
+```
+
+默认排除如下:
+
+```
+.*, repository/**, build/**, target/**, **/*.jar, **/*.groovy
+```
+
+有关详细信息,请在命令行上键入`spring help jar`。
+
+### 2.4.初始化一个新项目
+
+`init`命令允许你在不离开 shell 的情况下使用[start.spring.io](https://start.spring.io)创建一个新项目,如下面的示例所示:
+
+```
+$ spring init --dependencies=web,data-jpa my-project
+Using service at https://start.spring.io
+Project extracted to '/Users/developer/example/my-project'
+```
+
+前面的示例使用基于 Maven 的项目创建`my-project`目录,该项目使用`spring-boot-starter-web`和`spring-boot-starter-data-jpa`。你可以使用`--list`标志列出服务的功能,如以下示例所示:
+
+```
+$ spring init --list
+=======================================
+Capabilities of https://start.spring.io
+=======================================
+
+Available dependencies:
+-----------------------
+actuator - Actuator: Production ready features to help you monitor and manage your application
+...
+web - Web: Support for full-stack web development, including Tomcat and spring-webmvc
+websocket - Websocket: Support for WebSocket development
+ws - WS: Support for Spring Web Services
+
+Available project types:
+------------------------
+gradle-build - Gradle Config [format:build, build:gradle]
+gradle-project - Gradle Project [format:project, build:gradle]
+maven-build - Maven POM [format:build, build:maven]
+maven-project - Maven Project [format:project, build:maven] (default)
+
+...
+```
+
+`init`命令支持许多选项。有关更多详细信息,请参见`help`输出。例如,下面的命令创建了一个使用 Java8 和`war`打包的 Gradle 项目:
+
+```
+$ spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip
+Using service at https://start.spring.io
+Content saved to 'sample-app.zip'
+```
+
+### 2.5.使用嵌入式外壳
+
+Spring 引导包括用于 bash 和 zsh shell 的命令行完成脚本。如果不使用这两个 shell 中的任何一个(也许你是 Windows 用户),则可以使用`shell`命令来启动一个集成的 shell,如下例所示:
+
+```
+$ spring shell
+Spring Boot (v2.6.4)
+Hit TAB to complete. Type \'help' and hit RETURN for help, and \'exit' to quit.
+```
+
+在嵌入的 shell 中,你可以直接运行其他命令:
+
+```
+$ version
+Spring CLI v2.6.4
+```
+
+嵌入式外壳支持 ANSI 颜色输出以及`tab`补全。如果需要运行本机命令,可以使用`!`前缀。要退出嵌入的 shell,请按`ctrl-c`。
+
+### 2.6.向 CLI 添加扩展
+
+你可以使用`install`命令向 CLI 添加扩展。该命令以`group:artifact:version`的格式接受一组或多组工件坐标,如以下示例所示:
+
+```
+$ spring install com.example:spring-boot-cli-extension:1.0.0.RELEASE
+```
+
+除了安装由你提供的坐标标识的工件外,还安装了所有工件的依赖关系。
+
+要卸载依赖项,请使用`uninstall`命令。与`install`命令一样,它以`group:artifact:version`的格式接受一组或多组工件坐标,如以下示例所示:
+
+```
+$ spring uninstall com.example:spring-boot-cli-extension:1.0.0.RELEASE
+```
+
+它卸载由你提供的坐标和它们的依赖关系所标识的工件。
+
+要卸载所有附加依赖项,可以使用`--all`选项,如以下示例所示:
+
+```
+$ spring uninstall --all
+```
+
+## 3. 使用 Groovy Beans DSL 开发应用程序
+
+Spring Framework4.0 对`beans{}`“DSL”(借用自[Grails](https://grails.org/))具有原生支持,并且你可以通过使用相同的格式在 Groovy 应用程序脚本中嵌入 Bean 定义。这有时是一种很好的方式,可以包含外部特性,比如中间件声明,如下例所示:
+
+```
+@Configuration(proxyBeanMethods = false)
+class Application implements CommandLineRunner {
+
+ @Autowired
+ SharedService service
+
+ @Override
+ void run(String... args) {
+ println service.message
+ }
+
+}
+
+import my.company.SharedService
+
+beans {
+ service(SharedService) {
+ message = "Hello World"
+ }
+}
+
+```
+
+你可以在同一个文件中将类声明与`beans{}`混合在一起,只要它们保持在顶层,或者,如果你愿意,可以将 bean DSL 放在一个单独的文件中。
+
+## 4. 使用 settings.xml 配置 CLI
+
+Spring 引导 CLI 使用 Maven resolver( Maven 的依赖项解析引擎)来解析依赖项。CLI 使用`~/.m2/settings.xml`中的 Maven 配置来配置 Maven 解析器。以下配置设置由 CLI 执行:
+
+* 离线
+
+* 镜子
+
+* 服务器
+
+* 代理
+
+* 配置文件
+
+ * 激活
+
+ * 存储库
+
+* 活动配置文件
+
+有关更多信息,请参见[Maven’s settings documentation](https://maven.apache.org/settings.html)。
+
+## 5. 接下来读什么?
+
+GitHub 存储库中有一些[Groovy 脚本示例](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-cli/samples)可用,你可以使用它们来尝试 Spring 引导 CLI。在[source code](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli)中也有大量的 Javadoc。
+
+如果你发现你已经达到了 CLI 工具的极限,那么你可能希望将你的应用程序转换为完整的 Gradle 或 Maven 构建的“Groovy 项目”。下一节将介绍 Spring boot 的“[构建工具插件](build-tool-plugins.html#build-tool-plugins)”,你可以在 Gradle 或 Maven 中使用它。
diff --git a/docs/spring-boot/container-images.md b/docs/spring-boot/container-images.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9c6391eca152a9203248a046dab24bd2c0d55e85 100644
--- a/docs/spring-boot/container-images.md
+++ b/docs/spring-boot/container-images.md
@@ -0,0 +1,135 @@
+# 容器图像
+
+Spring 引导应用程序可以是容器化的[使用 DockerFiles](#container-images.dockerfiles),也可以是容器化的[使用本地云构建包创建优化的 Docker 兼容容器映像,可以在任何地方运行](#container-images.buildpacks)。
+
+## 1. 高效的容器图像
+
+
+将 Spring 引导 fat jar 打包为 Docker 映像是很容易的。然而,复制和运行 Docker 映像中的 fat jar 有各种缺点。在不拆包的情况下运行 A fat jar 时,总会有一定的开销,在集装箱化的环境中,这一点是显而易见的。另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像中的一个层中是次优的。由于你重新编译代码的次数可能比升级所使用的启动版本更多,所以更好的做法通常是多分离一些东西。如果将 jar 个文件放在应用程序类之前的层中,Docker 通常只需要更改最底层的文件,就可以从其缓存中获取其他文件。
+
+### 1.1.打开 fat jar
+
+如果你是从一个容器运行你的应用程序,那么你可以使用一个可执行文件 jar,但通常也有一个优势,那就是将其分解并以不同的方式运行它。某些 PaaS 实现还可能选择在运行归档文件之前对其进行解包。例如,Cloud Foundry 就是这样运作的。运行未打包归档文件的一种方法是启动适当的启动器,如下所示:
+
+```
+$ jar -xf myapp.jar
+$ java org.springframework.boot.loader.JarLauncher
+```
+
+这实际上在启动时(取决于 jar 的大小)比在未爆炸的归档文件中运行稍微快一些。在运行时,你不应该期望有任何差异。
+
+打开 jar 文件后,还可以通过使用“自然”主方法(而不是`JarLauncher`)运行应用程序来增加启动时间。例如:
+
+```
+$ jar -xf myapp.jar
+$ java -cp BOOT-INF/classes:BOOT-INF/lib/* com.example.MyApplication
+```
+
+| |在应用程序的主方法上使用`JarLauncher`具有可预测的 Classpath 顺序的附加好处。
jar 包含一个`classpath.idx`文件,该文件由`JarLauncher`在构造 Classpath 时使用。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 1.2.分层 Docker 图像
+
+为了使创建优化的 Docker 映像更容易, Spring 启动支持向 jar 添加层索引文件。它提供了层的列表和 jar 中应该包含在其中的部分。索引中的层列表是根据将层添加到 Docker/OCI 图像中的顺序进行排序的。在开箱即用的情况下,支持以下层:
+
+* `dependencies`(用于常规发布的依赖项)
+
+* `spring-boot-loader`(对于`org/springframework/boot/loader`下的所有内容)
+
+* `snapshot-dependencies`(用于快照依赖关系)
+
+* `application`(用于应用程序类和资源)
+
+下面显示了`layers.idx`文件的示例:
+
+```
+- "dependencies":
+ - BOOT-INF/lib/library1.jar
+ - BOOT-INF/lib/library2.jar
+- "spring-boot-loader":
+ - org/springframework/boot/loader/JarLauncher.class
+ - org/springframework/boot/loader/jar/JarEntry.class
+- "snapshot-dependencies":
+ - BOOT-INF/lib/library3-SNAPSHOT.jar
+- "application":
+ - META-INF/MANIFEST.MF
+ - BOOT-INF/classes/a/b/C.class
+```
+
+这种分层设计是为了根据在应用程序构建之间更改代码的可能性来分离代码。库代码在两次构建之间更改的可能性较小,因此将其放置在自己的层中,以允许工具重新使用缓存中的层。应用程序代码更有可能在构建之间进行更改,因此它被隔离在一个单独的层中。
+
+Spring 在`layers.idx`的帮助下,引导还支持对 WAR 文件进行分层。
+
+对于 Maven,请参阅[packaging layered jar or war section](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#repackage-layers)以获取有关向归档文件添加图层索引的更多详细信息。有关 Gradle,请参见 Gradle 插件文档的[packaging layered jar or war section](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#packaging-layered-archives)。
+
+## 2. DockerFiles
+
+虽然只需在 Dockerfile 中的几行就可以将 Spring 启动 fat jar 转换为 Docker 映像,但我们将使用[分层特征](#container-images.efficient-images.layering)来创建优化的 Docker 映像。当你创建包含层索引文件的 jar 时,`spring-boot-jarmode-layertools` jar 将作为依赖项添加到 jar 中。有了这个 jar 在 Classpath 上,你可以以一种特殊的模式启动你的应用程序,该模式允许引导代码运行与你的应用程序完全不同的东西,例如,提取层的东西。
+
+| |`layertools`模式不能与包含启动脚本的[fully executable Spring Boot archive](deployment.html#deployment.installing)一起使用。
在构建打算与`layertools`一起使用的 jar 文件时禁用启动脚本配置。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+以下是使用`layertools` jar 模式启动 jar 的方法:
+
+```
+$ java -Djarmode=layertools -jar my-app.jar
+```
+
+这将提供以下产出:
+
+```
+Usage:
+ java -Djarmode=layertools -jar my-app.jar
+
+Available commands:
+ list List layers from the jar that can be extracted
+ extract Extracts layers from the jar for image creation
+ help Help about any command
+```
+
+`extract`命令可以用来轻松地将应用程序分割成要添加到 DockerFile 中的层。下面是一个使用`jarmode`的 DockerFile 的示例。
+
+```
+FROM adoptopenjdk:11-jre-hotspot as builder
+WORKDIR application
+ARG JAR_FILE=target/*.jar
+COPY ${JAR_FILE} application.jar
+RUN java -Djarmode=layertools -jar application.jar extract
+
+FROM adoptopenjdk:11-jre-hotspot
+WORKDIR application
+COPY --from=builder application/dependencies/ ./
+COPY --from=builder application/spring-boot-loader/ ./
+COPY --from=builder application/snapshot-dependencies/ ./
+COPY --from=builder application/application/ ./
+ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
+```
+
+假设上面的`Dockerfile`在当前目录中,你的 Docker 映像可以使用`docker build .`构建,或者可选地指定应用程序的路径 jar,如以下示例所示:
+
+```
+$ docker build --build-arg JAR_FILE=path/to/myapp.jar .
+```
+
+这是一个多阶段的 DockerFile。构建器阶段提取以后需要的目录。每个`COPY`命令都与 JARMODE 提取的层有关。
+
+当然,可以在不使用 JARMODE 的情况下编写 DockerFile。你可以使用`unzip`和`mv`的一些组合来将事情移动到正确的层,但是 Jarmode 简化了这一点。
+
+## 3. 云原生构建包
+
+DockerFiles 只是构建 Docker 映像的一种方式。另一种构建 Docker 映像的方法是直接从 Maven 或 Gradle 插件中使用 buildpacks。如果你曾经使用过 Cloud Foundry 或 Heroku 之类的应用程序平台,那么你很可能使用过 BuildPack。构建包是平台的一部分,它接收应用程序并将其转换为平台可以实际运行的内容。例如,Cloud Foundry 的 Java BuildPack 会注意到,你正在推送一个`.jar`文件,并自动添加一个相关的 JRE。
+
+使用 Cloud Native 构建包,你可以创建可以在任何地方运行的与 Docker 兼容的映像。 Spring 引导包括直接针对 Maven 和 Gradle 的 BuildPack 支持。这意味着你只需键入一个命令,就可以快速地在本地运行的 Docker 守护程序中获得一个合理的映像。
+
+请参阅有关如何使用[Maven](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#build-image)和[Gradle](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#build-image)构建包的单个插件文档。
+
+| |[Paketo Spring Boot buildpack](https://github.com/paketo-buildpacks/spring-boot)也已更新,以支持`layers.idx`文件,因此应用于该文件的任何定制都将反映在 BuildPack 创建的图像中。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |为了实现可重复的构建和容器映像缓存,构建包可以操作应用程序资源元数据(例如文件“上次修改”信息)。
你应该确保你的应用程序在运行时不依赖于该元数据。
Spring 引导在服务静态资源时可以使用该信息,但这可以用`spring.web.resources.cache.use-last-modified`禁用|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+## 4. 接下来读什么?
+
+一旦你了解了如何构建高效的容器映像,你就可以了解[将应用程序部署到云平台](deployment.html#deployment.cloud.kubernetes),比如 Kubernetes。
+
diff --git a/docs/spring-boot/data.md b/docs/spring-boot/data.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ec15dc9483bda895d6a4b473d5073749c947966c 100644
--- a/docs/spring-boot/data.md
+++ b/docs/spring-boot/data.md
@@ -0,0 +1,1496 @@
+# 数据
+
+Spring Boot 集成了许多数据技术,包括 SQL 和 NoSQL。
+
+# 1. SQL 数据库
+----------
+
+[Spring Framework](https://spring.io/projects/spring-framework)为使用 SQL 数据库提供了广泛的支持,从使用`JdbcTemplate`直接访问 JDBC 到完成诸如 Hibernate 之类的“对象关系映射”技术。[Spring Data](https://spring.io/projects/spring-data)提供了一个额外的功能级别:直接从接口创建`Repository`实现,并使用约定从你的方法名称生成查询。
+
+### 1.1.配置数据源
+
+Java 的`javax.sql.DataSource`接口提供了一种处理数据库连接的标准方法。传统上,“数据源”使用`URL`以及一些凭据来建立数据库连接。
+
+| |有关更高级的示例,请参见[“操作指南”部分](howto.html#howto.data-access.configure-custom-datasource),通常用于完全控制数据源的配置。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.1.1.嵌入式数据库支持
+
+使用内存式嵌入式数据库开发应用程序通常是很方便的。显然,内存数据库不提供持久存储。你需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。
+
+| |“how-to”部分包括[关于如何初始化数据库的一节](howto.html#howto.data-initialization)。|
+|---|----------------------------------------------------------------------------------------------------------------|
+
+Spring 引导可以自动配置嵌入式[H2](https://www.h2database.com)、[HSQL](http://hsqldb.org/)和[Derby](https://db.apache.org/derby/)数据库。你不需要提供任何连接 URL。你只需要对要使用的嵌入式数据库包含一个构建依赖项。如果在 Classpath 上有多个嵌入式数据库,请设置`spring.datasource.embedded-database-connection`配置属性来控制使用哪个数据库。将属性设置为`none`将禁用嵌入式数据库的自动配置。
+
+| |如果在测试中使用此功能,你可能会注意到,无论你使用的应用程序上下文的数量如何,整个测试套件都可以重用相同的数据库,如果你想确保每个上下文都有一个单独的嵌入式数据库,
,你应该将`spring.datasource.generate-unique-name`设置为`true`。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+例如,典型的 POM 依赖关系如下:
+
+```
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.hsqldb
+ hsqldb
+ runtime
+
+```
+
+| |你需要对`spring-jdbc`有一个依赖关系,才能自动配置嵌入式数据库。
在本例中,它是通过`spring-boot-starter-data-jpa`传递地拉入的。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |无论出于何种原因,如果你确实为嵌入式数据库配置了连接 URL,请注意确保禁用数据库的自动关闭。
如果你使用 H2,你应该使用`DB_CLOSE_ON_EXIT=FALSE`来实现这一点。
如果你使用 HSQLDB,你应该确保不使用`shutdown=true`。
禁用数据库的自动关机可以在数据库关闭时进行引导控制,从而确保在不再需要访问数据库时发生这种情况。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.1.2.与生产数据库的连接
+
+还可以通过使用池`DataSource`自动配置生产数据库连接。
+
+#### 1.1.3.数据源配置
+
+数据源配置由`spring.datasource.*`中的外部配置属性控制。例如,你可以在`application.properties`中声明以下部分:
+
+属性
+
+```
+spring.datasource.url=jdbc:mysql://localhost/test
+spring.datasource.username=dbuser
+spring.datasource.password=dbpass
+```
+
+Yaml
+
+```
+spring:
+ datasource:
+ url: "jdbc:mysql://localhost/test"
+ username: "dbuser"
+ password: "dbpass"
+```
+
+| |你至少应该通过设置`spring.datasource.url`属性来指定 URL。
否则, Spring 引导将尝试自动配置嵌入式数据库。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |Spring 引导可以从 URL 中推断出大多数数据库的 JDBC 驱动程序类。
如果需要指定特定的类,可以使用`spring.datasource.driver-class-name`属性。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |对于要创建的池`DataSource`,我们需要能够验证一个有效的`Driver`类是可用的,所以我们在做任何事情之前都要检查它。
换句话说,如果你设置`spring.datasource.driver-class-name=com.mysql.jdbc.Driver`,那么这个类必须是可加载的。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+有关更多支持的选项,请参见[“数据资源属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSource属性.java)。无论[实际执行情况](features.html#data.sql.datasource.connection-pool)如何,这些都是标准选项。也可以通过使用它们各自的前缀(` Spring.datasource.hikari.*`,`spring.datasource.tomcat.*`,`spring.datasource.dbcp2.*`和`spring.datasource.oracleucp.*`)来微调实现特定的设置。有关更多详细信息,请参见你正在使用的连接池实现的文档。
+
+例如,如果使用[Tomcat connection pool](https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html#Common_Attributes),则可以自定义许多其他设置,如下例所示:
+
+属性
+
+```
+spring.datasource.tomcat.max-wait=10000
+spring.datasource.tomcat.max-active=50
+spring.datasource.tomcat.test-on-borrow=true
+```
+
+Yaml
+
+```
+spring:
+ datasource:
+ tomcat:
+ max-wait: 10000
+ max-active: 50
+ test-on-borrow: true
+```
+
+这将设置池等待 10000ms,然后在没有可用连接的情况下抛出异常,将最大连接数量限制为 50,并在从池中借用连接之前验证连接。
+
+#### 1.1.4.支持的连接池
+
+Spring 启动使用以下算法来选择具体的实现方式:
+
+1. 我们更喜欢[Hikaricp](https://github.com/brettwooldridge/HikariCP)的性能和并发性。如果有 Hikaricp,我们总是选择它。
+
+2. 否则,如果 Tomcat 池`DataSource`可用,我们就使用它。
+
+3. 否则,如果[Commons DBCP2](https://commons.apache.org/proper/commons-dbcp/)是可用的,我们就使用它。
+
+4. 如果 HIKARICP、 Tomcat 和 DBCP2 都不可用,并且如果 Oracle UCP 可用,我们就使用它。
+
+| |如果使用`spring-boot-starter-jdbc`或`spring-boot-starter-data-jpa`“starters”,则会自动获得对`HikariCP`的依赖关系。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------|
+
+你可以完全绕过该算法,并通过设置`spring.datasource.type`属性来指定要使用的连接池。如果你在 Tomcat 容器中运行应用程序,这一点尤其重要,因为`tomcat-jdbc`是默认提供的。
+
+总是可以使用`DataSourceBuilder`手动配置其他连接池。如果你定义了自己的`DataSource` Bean,则不会发生自动配置。`DataSourceBuilder`支持以下连接池:
+
+* HikariCP
+
+* Tomcat 池`Datasource`
+
+* Commons DBCP2
+
+* Oracle UCP&`OracleDataSource`
+
+* Spring 框架的`SimpleDriverDataSource`
+
+* h2`JdbcDataSource`
+
+* PostgreSQL`PGSimpleDataSource`
+
+#### 1.1.5.连接到 JNDI 数据源
+
+如果你将 Spring 引导应用程序部署到应用程序服务器,你可能希望通过使用应用程序服务器的内置功能来配置和管理你的数据源,并通过使用 JNDI 访问它。
+
+`spring.datasource.jndi-name`属性可以用作`spring.datasource.url`、`spring.datasource.username`和`spring.datasource.password`属性的替代选项,以从特定的 JNDI 位置访问`DataSource`。例如,`application.properties`中的以下部分显示了如何按照`DataSource`的定义访问 JBoss:
+
+属性
+
+```
+spring.datasource.jndi-name=java:jboss/datasources/customers
+```
+
+Yaml
+
+```
+spring:
+ datasource:
+ jndi-name: "java:jboss/datasources/customers"
+```
+
+### 1.2.使用 JDBCTemplate
+
+Spring 的`JdbcTemplate`和`NamedParameterJdbcTemplate`类是自动配置的,并且你可以将它们`@Autowire`直接放入你自己的 bean 中,如以下示例所示:
+
+```
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyBean {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ public MyBean(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ public void doSomething() {
+ this.jdbcTemplate ...
+ }
+
+}
+
+```
+
+你可以使用`spring.jdbc.template.*`属性自定义模板的一些属性,如下例所示:
+
+属性
+
+```
+spring.jdbc.template.max-rows=500
+```
+
+Yaml
+
+```
+spring:
+ jdbc:
+ template:
+ max-rows: 500
+```
+
+| |`NamedParameterJdbcTemplate`在幕后重用相同的`JdbcTemplate`实例。
如果定义了多个`JdbcTemplate`且不存在主要候选项,则`NamedParameterJdbcTemplate`不会自动配置。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 1.3. JPA 和 Spring 数据 JPA
+
+Java Persistence API 是一种标准技术,它允许你将对象“映射”到关系数据库。`spring-boot-starter-data-jpa` POM 提供了一种快速启动的方法。它提供了以下关键依赖项:
+
+* Hibernate:最流行的实现方式之一 JPA。
+
+* Spring 数据 JPA:帮助你实现基于 JPA 的存储库。
+
+* Spring ORM:来自 Spring 框架的核心 ORM 支持。
+
+| |在这里,我们不会详细讨论 JPA 或[Spring Data](https://spring.io/projects/spring-data)的细节。
你可以按照[“Accessing Data with JPA”](https://spring.io/guides/gs/accessing-data-jpa/)中的[“Accessing Data with JPA”](https://spring.io/guides/gs/accessing-data-jpa/)指南,并阅读[Spring Data JPA](https://spring.io/projects/spring-data-jpa)和[Hibernate](https://hibernate.org/orm/documentation/)参考文档。|
+|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.3.1.实体类别
+
+传统上, JPA“实体”类是在`persistence.xml`文件中指定的。在 Spring 启动时,这个文件不是必需的,而是使用“实体扫描”。默认情况下,将搜索主配置类下面的所有包(注释为`@EnableAutoConfiguration`或`@SpringBootApplication`的包)。
+
+任何带有`@Entity`、`@Embeddable`或`@MappedSuperclass`注释的类都将被考虑。典型的实体类类似于以下示例:
+
+```
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class City implements Serializable {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Column(nullable = false)
+ private String name;
+
+ @Column(nullable = false)
+ private String state;
+
+ // ... additional members, often include @OneToMany mappings
+
+ protected City() {
+ // no-args constructor required by JPA spec
+ // this one is protected since it should not be used directly
+ }
+
+ public City(String name, String state) {
+ this.name = name;
+ this.state = state;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getState() {
+ return this.state;
+ }
+
+ // ... etc
+
+}
+
+```
+
+| |你可以使用`@EntityScan`注释自定义实体扫描位置。
参见“[howto.html](howto.html#howto.data-access.separate-entity-definitions-from-spring-configuration)”操作方法。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.3.2. Spring 数据 JPA 存储库
+
+[Spring Data JPA](https://spring.io/projects/spring-data-jpa)存储库是你可以定义以访问数据的接口。 JPA 查询是根据你的方法名称自动创建的。例如,一个`CityRepository`接口可以声明一个`findAllByState(String state)`方法来查找给定状态下的所有城市。
+
+对于更复杂的查询,你可以使用 Spring data 的[`Query`](https://docs.spring.io/spring-data/jpa/docs/2.6.2/api/org/springframework/data/jpa/repository/Query.html)注释来注释你的方法。
+
+Spring 数据存储库通常从[`Repository`](https://docs.spring.io/spring-data/commons/docs/2.6.2/api/org/springframework/data/repository/Repository.html)或[“粗栓剂”](https://docs.spring.io/spring-data/commons/docs/2.6.2/api/org/springframework/data/repository/CrudRepository.html)接口扩展。如果使用自动配置,那么存储库将从包含主配置类(用`@EnableAutoConfiguration`或`@SpringBootApplication`注释的类)的包中进行搜索。
+
+下面的示例显示了典型的 Spring 数据存储库接口定义:
+
+```
+import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.City;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.repository.Repository;
+
+public interface CityRepository extends Repository {
+
+ Page findAll(Pageable pageable);
+
+ City findByNameAndStateAllIgnoringCase(String name, String state);
+
+}
+
+```
+
+Spring 数据 JPA 存储库支持三种不同的引导模式:默认模式、延迟模式和惰性模式。要启用延迟引导或延迟引导,将`spring.data.jpa.repositories.bootstrap-mode`属性分别设置为`deferred`或`lazy`。当使用延迟或延迟引导时,自动配置的`EntityManagerFactoryBuilder`将使用上下文的`AsyncTaskExecutor`(如果有的话)作为引导执行器。如果存在多个选项,将使用名为`applicationTaskExecutor`的选项。
+
+| |当使用延迟引导或延迟引导时,请确保在应用程序上下文引导阶段之后推迟对 JPA 基础架构的任何访问。
你可以使用`SmartInitializingSingleton`来调用任何需要 JPA 基础架构的初始化。
对于创建为 Spring bean 的 JPA 组件(例如转换器),使用`ObjectProvider`来延迟依赖关系的解决(如果有)。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |我们几乎没有触及 Spring 数据 JPA 的表面。
有关完整的详细信息,请参见[Spring Data JPA reference documentation](https://docs.spring.io/spring-data/jpa/docs/2.6.2/reference/html)。|
+|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.3.3. Spring 数据影响存储库
+
+如果[Spring Data Envers](https://spring.io/projects/spring-data-envers)可用, JPA 存储库将自动配置为支持典型的 Envers 查询。
+
+要使用 Spring data envers,请确保你的存储库从`RevisionRepository`扩展,如下例所示:
+
+```
+import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.Country;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.history.RevisionRepository;
+
+public interface CountryRepository extends RevisionRepository, Repository {
+
+ Page findAll(Pageable pageable);
+
+}
+
+```
+
+| |有关更多详细信息,请查看[Spring Data Envers reference documentation](https://docs.spring.io/spring-data/envers/docs/2.6.2/reference/html/)。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.3.4.创建和删除 JPA 数据库
+
+默认情况下,如果使用嵌入式数据库(H2、HSQL 或 Derby), JPA 数据库将自动创建**只是**。你可以使用`spring.jpa.*`属性显式地配置 JPA 设置。例如,要创建和删除表格,你可以在`application.properties`中添加以下行:
+
+属性
+
+```
+spring.jpa.hibernate.ddl-auto=create-drop
+```
+
+Yaml
+
+```
+spring:
+ jpa:
+ hibernate.ddl-auto: "create-drop"
+```
+
+| |Hibernate 自己的内部属性名称(如果你能更好地记住它的话)是`hibernate.hbm2ddl.auto`,
,你可以将其与其他 Hibernate 本机属性一起设置,通过使用`spring.jpa.properties.*`(前缀在将其添加到实体管理器之前被剥离)。
下面的一行显示了为 Hibernate 设置 JPA 属性的示例:|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+属性
+
+```
+spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
+```
+
+Yaml
+
+```
+spring:
+ jpa:
+ properties:
+ hibernate:
+ "globally_quoted_identifiers": "true"
+```
+
+前面示例中的行将`hibernate.globally_quoted_identifiers`属性的值`true`传递给 Hibernate 实体管理器。
+
+默认情况下,DDL 的执行(或验证)被推迟到`ApplicationContext`已经开始时。还有一个`spring.jpa.generate-ddl`标志,但如果 Hibernate 自动配置是活动的,则不会使用它,因为`ddl-auto`设置的粒度更细。
+
+#### 1.3.5.在视图中打开 EntityManager
+
+如果你正在运行一个 Web 应用程序, Spring 在默认情况下引导寄存器[“OpenEntityManagerinViewInterceptor”](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.html)以应用“Open EntityManager in View”模式,从而允许在 Web 视图中进行延迟加载。如果不希望发生这种行为,则应在`application.properties`中将`spring.jpa.open-in-view`设置为`false`。
+
+### 1.4. Spring 数据 JDBC
+
+Spring 数据包括对 JDBC 的存储库支持,并且将为`CrudRepository`上的方法自动生成 SQL。对于更高级的查询,提供了`@Query`注释。
+
+Spring 当必要的依赖关系在 Classpath 上时,启动将自动配置 Spring 数据的 JDBC 存储库。它们可以通过对`spring-boot-starter-data-jdbc`的单一依赖添加到你的项目中。如果有必要,你可以通过向应用程序添加`@EnableJdbcRepositories`注释或`JdbcConfiguration`子类来控制 Spring 数据 JDBC 的配置。
+
+| |有关 Spring 数据 JDBC 的完整详细信息,请参见[参考文献](https://docs.spring.io/spring-data/jdbc/docs/2.3.2/reference/html/)。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------|
+
+### 1.5.使用 H2 的网络控制台
+
+[H2 database](https://www.h2database.com)提供了一个[基于浏览器的控制台](https://www.h2database.com/html/quickstart.html#h2_console), Spring 引导可以为你自动配置。当满足以下条件时,控制台将自动配置:
+
+* 你正在开发一个基于 Servlet 的 Web 应用程序。
+
+* `com.h2database:h2`在 Classpath 上。
+
+* 你使用的是[Spring Boot’s developer tools](using.html#using.devtools)。
+
+| |如果你不使用 Spring Boot 的开发工具,但仍想使用 H2 的控制台,则可以配置值为`spring.h2.console.enabled`的`true`属性。|
+|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |H2 控制台仅用于开发过程中,因此你应该注意确保在生产过程中不将`spring.h2.console.enabled`设置为`true`。|
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.5.1.改变 H2 控制台的路径
+
+默认情况下,控制台位于`/h2-console`。你可以使用`spring.h2.console.path`属性来定制控制台的路径。
+
+### 1.6.使用 Jooq
+
+Jooq 面向对象查询([jOOQ](https://www.jooq.org/))是[Data Geekery](https://www.datageekery.com/)中的一种流行产品,它从你的数据库生成 Java 代码,并允许你通过其 Fluent API 构建类型安全的 SQL 查询。商业版和开放源代码版都可以与 Spring boot 一起使用。
+
+#### 1.6.1.代码生成
+
+为了使用 Jooq 类型安全查询,你需要从数据库模式生成 Java 类。你可以按照[Jooq 用户手册](https://www.jooq.org/doc/3.14.15/manual-single-page/#jooq-in-7-steps-step3)中的说明进行操作。如果你使用`jooq-codegen-maven`插件,并且还使用`spring-boot-starter-parent`“parent POM”,则可以安全地省略该插件的``标记。你还可以使用 Spring 引导定义的版本变量(例如`h2.version`)来声明插件的数据库依赖关系。下面的清单展示了一个示例:
+
+```
+
+ org.jooq
+ jooq-codegen-maven
+
+ ...
+
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
+ org.h2.Driver
+ jdbc:h2:~/yourdatabase
+
+
+ ...
+
+
+
+```
+
+#### 1.6.2.使用 DSLContext
+
+由 Jooq 提供的 Fluent API 是通过`org.jooq.DSLContext`接口启动的。 Spring 引导自动将`DSLContext`配置为 Spring Bean,并将其连接到你的应用程序`DataSource`。要使用`DSLContext`,你可以注入它,如以下示例所示:
+
+```
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import org.jooq.DSLContext;
+
+import org.springframework.stereotype.Component;
+
+import static org.springframework.boot.docs.data.sql.jooq.dslcontext.Tables.AUTHOR;
+
+@Component
+public class MyBean {
+
+ private final DSLContext create;
+
+ public MyBean(DSLContext dslContext) {
+ this.create = dslContext;
+ }
+
+}
+
+```
+
+| |Jooq 手册倾向于使用一个名为`create`的变量来保持`DSLContext`。|
+|---|--------------------------------------------------------------------------------|
+
+然后,你可以使用`DSLContext`来构造查询,如下例所示:
+
+```
+public List authorsBornAfter1980() {
+ return this.create.selectFrom(AUTHOR)
+ .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
+ .fetch(AUTHOR.DATE_OF_BIRTH);
+
+```
+
+#### 1.6.3.Jooq SQL 方言
+
+除非已经配置了`spring.jooq.sql-dialect`属性,否则 Spring boot 将确定要用于数据源的 SQL 方言。如果 Spring boot 无法检测到该方言,则使用`DEFAULT`。
+
+| |Spring 启动只能自动配置由开源版本的 Jooq 支持的方言。|
+|---|------------------------------------------------------------------------------------------|
+
+#### 1.6.4.定制 Jooq
+
+可以通过定义你自己的`DefaultConfigurationCustomizer` Bean 来实现更高级的自定义,该自定义将在创建`org.jooq.Configuration``@Bean`之前被调用。这优先于自动配置所应用的任何内容。
+
+如果你想完全控制 Jooq 配置,还可以创建自己的`org.jooq.Configuration``@Bean`。
+
+### 1.7.使用 R2DBC
+
+反应式关系数据库连接([R2DBC](https://r2dbc.io))项目将反应式编程 API 引入到关系数据库中。R2DBC 的`io.r2dbc.spi.Connection`提供了一种处理非阻塞数据库连接的标准方法。使用`ConnectionFactory`提供连接,类似于使用 JDBC 提供`DataSource`。
+
+`ConnectionFactory`配置由`spring.r2dbc.*`中的外部配置属性控制。例如,你可以在`application.properties`中声明以下部分:
+
+属性
+
+```
+spring.r2dbc.url=r2dbc:postgresql://localhost/test
+spring.r2dbc.username=dbuser
+spring.r2dbc.password=dbpass
+```
+
+Yaml
+
+```
+spring:
+ r2dbc:
+ url: "r2dbc:postgresql://localhost/test"
+ username: "dbuser"
+ password: "dbpass"
+```
+
+| |你不需要指定驱动程序类名,因为 Spring Boot 从 R2DBC 的连接工厂发现获得驱动程序。|
+|---|-------------------------------------------------------------------------------------------------------------------------------|
+
+| |至少应该提供 URL。
URL 中指定的信息优先于单个属性,即`name`、`username`、`password`和池选项。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+| |“how-to”部分包括[关于如何初始化数据库的一节](howto.html#howto.data-initialization.using-basic-sql-scripts)。|
+|---|----------------------------------------------------------------------------------------------------------------------------------------|
+
+要自定义由`ConnectionFactory`创建的连接,即设置在中央数据库配置中不希望(或不能)配置的特定参数,可以使用`ConnectionFactoryOptionsBuilderCustomizer``@Bean`。下面的示例展示了如何手动重写数据库端口,而其余的选项将从应用程序配置中获取:
+
+```
+import io.r2dbc.spi.ConnectionFactoryOptions;
+
+import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyR2dbcConfiguration {
+
+ @Bean
+ public ConnectionFactoryOptionsBuilderCustomizer connectionFactoryPortCustomizer() {
+ return (builder) -> builder.option(ConnectionFactoryOptions.PORT, 5432);
+ }
+
+}
+
+```
+
+以下示例展示了如何设置一些 PostgreSQL 连接选项:
+
+```
+import java.util.HashMap;
+import java.util.Map;
+
+import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider;
+
+import org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryOptionsBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+public class MyPostgresR2dbcConfiguration {
+
+ @Bean
+ public ConnectionFactoryOptionsBuilderCustomizer postgresCustomizer() {
+ Map options = new HashMap<>();
+ options.put("lock_timeout", "30s");
+ options.put("statement_timeout", "60s");
+ return (builder) -> builder.option(PostgresqlConnectionFactoryProvider.OPTIONS, options);
+ }
+
+}
+
+```
+
+当`ConnectionFactory` Bean 可用时,常规的 JDBC`DataSource`自动配置将退出。如果你希望保留 JDBC`DataSource`自动配置,并且对在反应性应用程序中使用阻塞的 JDBC API 的风险感到满意,那么在应用程序中的`@Import(DataSourceAutoConfiguration.class)`类上添加`@Import(DataSourceAutoConfiguration.class)`以重新启用它。
+
+#### 1.7.1.嵌入式数据库支持
+
+与[JDBC 支持](features.html#data.sql.datasource.embedded)类似, Spring 引导可以自动配置嵌入式数据库,以进行反应性使用。你不需要提供任何连接 URL。你只需要对要使用的嵌入式数据库包含一个构建依赖项,如以下示例所示:
+
+```
+
+ io.r2dbc
+ r2dbc-h2
+ runtime
+
+```
+
+| |如果你在测试中使用此功能,你可能会注意到,无论你使用的应用程序上下文的数量如何,整个测试套件都可以重用相同的数据库,如果你想确保每个上下文都有一个单独的嵌入式数据库,
,你应该将`spring.r2dbc.generate-unique-name`设置为`true`。|
+|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+
+#### 1.7.2.使用 DatabaseClient
+
+a`DatabaseClient` Bean 是自动配置的,你可以`@Autowire`它直接进入你自己的 bean 中,如以下示例所示:
+
+```
+import java.util.Map;
+
+import reactor.core.publisher.Flux;
+
+import org.springframework.r2dbc.core.DatabaseClient;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyBean {
+
+ private final DatabaseClient databaseClient;
+
+ public MyBean(DatabaseClient databaseClient) {
+ this.databaseClient = databaseClient;
+ }
+
+ // ...
+
+ public Flux