diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 19228687ef6f63542235d0dbd1da917cc46daf07..c4f17ef049b7260b6c9739af05d5c79948e7f791 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -193,6 +193,48 @@ module.exports = { initialOpenGroupIndex: 0 // 可选的, 默认值是 0 } ], + '/en/spring-data/': [ + { + title: 'Spring Data', + sidebarDepth: 2, + collapsable: false, + children: [ + "/en/spring-data/spring-data.md" + ], + initialOpenGroupIndex: 0 // 可选的, 默认值是 0 + } + ], + '/en/spring-cloud/': [ + { + title: 'Spring Cloud', + sidebarDepth: 2, + collapsable: false, + children: [ + "/en/spring-cloud/legal.md", + "/en/spring-cloud/documentation-overview.md", + "/en/spring-cloud/spring-cloud-build.md", + "/en/spring-cloud/spring-cloud-bus.md", + "/en/spring-cloud/spring-cloud-circuitbreaker.md", + "/en/spring-cloud/spring-cloud-cli.md", + "/en/spring-cloud/spring-cloud-cloudfoundry.md", + "/en/spring-cloud/spring-cloud-commons.md", + "/en/spring-cloud/spring-cloud-config.md", + "/en/spring-cloud/spring-cloud-consul.md", + "/en/spring-cloud/spring-cloud-contract.md", + "/en/spring-cloud/spring-cloud-function.md", + "/en/spring-cloud/spring-cloud-gateway.md", + "/en/spring-cloud/spring-cloud-kubernetes.md", + "/en/spring-cloud/spring-cloud-netflix.md", + "/en/spring-cloud/spring-cloud-openfeign.md", + "/en/spring-cloud/spring-cloud-sleuth.md", + "/en/spring-cloud/spring-cloud-stream.md", + "/en/spring-cloud/spring-cloud-task.md", + "/en/spring-cloud/spring-cloud-vault.md", + "/en/spring-cloud/spring-cloud-zookeeper.md", + ], + initialOpenGroupIndex: 0 // 可选的, 默认值是 0 + } + ], // fallback '/en/': @@ -352,6 +394,48 @@ module.exports = { initialOpenGroupIndex: 0 // 可选的, 默认值是 0 } ], + '/spring-data/': [ + { + title: 'Spring Data 文档', + sidebarDepth: 2, + collapsable: false, + children: [ + "/spring-data/spring-data.md" + ], + initialOpenGroupIndex: 0 // 可选的, 默认值是 0 + } + ], + '/spring-cloud/': [ + { + title: 'Spring Cloud 文档', + sidebarDepth: 2, + collapsable: false, + children: [ + "/spring-cloud/legal.md", + "/spring-cloud/documentation-overview.md", + "/spring-cloud/spring-cloud-build.md", + "/spring-cloud/spring-cloud-bus.md", + "/spring-cloud/spring-cloud-circuitbreaker.md", + "/spring-cloud/spring-cloud-cli.md", + "/spring-cloud/spring-cloud-cloudfoundry.md", + "/spring-cloud/spring-cloud-commons.md", + "/spring-cloud/spring-cloud-config.md", + "/spring-cloud/spring-cloud-consul.md", + "/spring-cloud/spring-cloud-contract.md", + "/spring-cloud/spring-cloud-function.md", + "/spring-cloud/spring-cloud-gateway.md", + "/spring-cloud/spring-cloud-kubernetes.md", + "/spring-cloud/spring-cloud-netflix.md", + "/spring-cloud/spring-cloud-openfeign.md", + "/spring-cloud/spring-cloud-sleuth.md", + "/spring-cloud/spring-cloud-stream.md", + "/spring-cloud/spring-cloud-task.md", + "/spring-cloud/spring-cloud-vault.md", + "/spring-cloud/spring-cloud-zookeeper.md" + ], + initialOpenGroupIndex: 0 // 可选的, 默认值是 0 + } + ], // fallback '/': [{ diff --git a/docs/en/spring-amqp/READEME.md b/docs/en/spring-amqp/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-batch/READEME.md b/docs/en/spring-batch/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-cloud-data-flow/READEME.md b/docs/en/spring-cloud-data-flow/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-cloud/documentation-overview.md b/docs/en/spring-cloud/documentation-overview.md index de332ab6b4ae4f2d01f9d8e48e072d07f9dd0e4f..329c741492730f9e12ed3a76ecd72835433b8b74 100644 --- a/docs/en/spring-cloud/documentation-overview.md +++ b/docs/en/spring-cloud/documentation-overview.md @@ -1,11 +1,5 @@ # Spring Cloud Documentation -Table of Contents - -- [Spring Cloud Documentation](#spring-cloud-documentation) - - [[1. About the Documentation](#documentation-about)](#1-about-the-documentation) - - [[2. Getting Help](#documentation-getting-help)](#2-getting-help) - This section provides a brief overview of Spring Cloud reference documentation. It serves as a map for the rest of the document. diff --git a/docs/en/spring-cloud/spring-cloud-build.md b/docs/en/spring-cloud/spring-cloud-build.md index 29485e542e6cb9ea54a21725a4694faf948d51c4..315aa361932542f538b5563b3ef9ac4c3b103619 100644 --- a/docs/en/spring-cloud/spring-cloud-build.md +++ b/docs/en/spring-cloud/spring-cloud-build.md @@ -1,29 +1,5 @@ # Spring Cloud Build -Table of Contents - -- [Spring Cloud Build](#spring-cloud-build) - - [Building and Deploying](#building-and-deploying) - - [Contributing](#contributing) - - [Sign the Contributor License Agreement](#sign-the-contributor-license-agreement) - - [Code of Conduct](#code-of-conduct) - - [Code Conventions and Housekeeping](#code-conventions-and-housekeeping) - - [Checkstyle](#checkstyle) - - [Checkstyle configuration](#checkstyle-configuration) - - [IDE setup](#ide-setup) - - [Intellij IDEA](#intellij-idea) - - [Duplicate Finder](#duplicate-finder) - - [Duplicate Finder configuration](#duplicate-finder-configuration) - - [Flattening the POMs](#flattening-the-poms) - - [Reusing the documentation](#reusing-the-documentation) - - [Updating the guides](#updating-the-guides) - -* [Flattening the POMs](#_flattening_the_poms) -* [Reusing the documentation](#_reusing_the_documentation) -* [Updating the guides](#_updating_the_guides) - -[![Build](https://github.com/spring-cloud/spring-cloud-build/workflows/Build/badge.svg?branch=main&style=svg)](https://github.com/spring-cloud/spring-cloud-build/actions) - Spring Cloud Build is a common utility project for Spring Cloud to use for plugin and dependency management. diff --git a/docs/en/spring-cloud/spring-cloud-bus.md b/docs/en/spring-cloud/spring-cloud-bus.md index ef061b91aba024b47384ff88f2ac9379d5d4523b..9e959baf4342f97b05f4141ddda154f7db2dc633 100644 --- a/docs/en/spring-cloud/spring-cloud-bus.md +++ b/docs/en/spring-cloud/spring-cloud-bus.md @@ -1,28 +1,5 @@ # Spring Cloud Bus -Table of Contents - -* [1. Quick Start](#quick-start) -* [2. Bus Endpoints](#bus-endpoints) - * [2.1. Bus Refresh Endpoint](#bus-refresh-endpoint) - * [2.2. Bus Env Endpoint](#bus-env-endpoint) - -- [Spring Cloud Bus](#spring-cloud-bus) - - [[1. Quick Start](#quick-start)](#1-quick-start) - - [[2. Bus Endpoints](#bus-endpoints)](#2-bus-endpoints) - - [[2.1. Bus Refresh Endpoint](#bus-refresh-endpoint)](#21-bus-refresh-endpoint) - - [[2.2. Bus Env Endpoint](#bus-env-endpoint)](#22-bus-env-endpoint) - - [[3. Addressing an Instance](#addressing-an-instance)](#3-addressing-an-instance) - - [[4. Addressing All Instances of a Service](#addressing-all-instances-of-a-service)](#4-addressing-all-instances-of-a-service) - - [[5. Service ID Must Be Unique](#service-id-must-be-unique)](#5-service-id-must-be-unique) - - [[6. Customizing the Message Broker](#customizing-the-message-broker)](#6-customizing-the-message-broker) - - [[7. Tracing Bus Events](#tracing-bus-events)](#7-tracing-bus-events) - - [[8. Broadcasting Your Own Events](#broadcasting-your-own-events)](#8-broadcasting-your-own-events) - - [[8.1. Registering events in custom packages](#registering-events-in-custom-packages)](#81-registering-events-in-custom-packages) - - [[9. Configuration properties](#configuration-properties)](#9-configuration-properties) - -* [9. Configuration properties](#configuration-properties) - Spring Cloud Bus links the nodes of a distributed system with a lightweight message broker. This broker can then be used to broadcast state changes (such as configuration changes) or other management instructions. A key idea is that the bus is like a diff --git a/docs/en/spring-cloud/spring-cloud-circuitbreaker.md b/docs/en/spring-cloud/spring-cloud-circuitbreaker.md index 750b589710ebaf76f3473213b98612092cd96160..e9fbf48c299ad5f5c39eed113587e4f0dafc33e4 100644 --- a/docs/en/spring-cloud/spring-cloud-circuitbreaker.md +++ b/docs/en/spring-cloud/spring-cloud-circuitbreaker.md @@ -1,51 +1,5 @@ # Spring Cloud Circuit Breaker -Table of Contents - -* [1. Usage Documentation](#usage-documentation) - * [1.1. Configuring Resilience4J Circuit Breakers](#configuring-resilience4j-circuit-breakers) - * [1.1.1. Starters](#starters) - * [1.1.2. Auto-Configuration](#auto-configuration) - * [1.1.3. Default Configuration](#default-configuration) - * [Reactive Example](#reactive-example) - - * [1.1.4. Specific Circuit Breaker Configuration](#specific-circuit-breaker-configuration) - * [Reactive Example](#reactive-example-2) - - * [1.1.5. Circuit Breaker Properties Configuration](#circuit-breaker-properties-configuration) - * [1.1.6. Bulkhead pattern supporting](#bulkhead-pattern-supporting) - * [1.1.7. Specific Bulkhead Configuration](#specific-bulkhead-configuration) - * [Bulkhead Example](#bulkhead-example) - * [Thread Pool Bulkhead Example](#thread-pool-bulkhead-example) - - * [1.1.8. Bulkhead Properties Configuration](#bulkhead-properties-configuration) - * [1.1.9. Collecting Metrics](#collecting-metrics) - - * [1.2. Configuring Spring Retry Circuit Breakers](#configuring-spring-retry-circuit-breakers) - * [1.2.1. Default Configuration](#default-configuration-2) - * [1.2.2. Specific Circuit Breaker Configuration](#specific-circuit-breaker-configuration-2) - -* [2. Building](#building) - * [2.1. Basic Compile and Test](#basic-compile-and-test) - * [2.2. Documentation](#documentation) - * [2.3. Working with the code](#working-with-the-code) - * [2.3.1. Activate the Spring Maven profile](#activate-the-spring-maven-profile) - * [2.3.2. Importing into eclipse with m2eclipse](#importing-into-eclipse-with-m2eclipse) - * [2.3.3. Importing into eclipse without m2eclipse](#importing-into-eclipse-without-m2eclipse) - -* [3. Contributing](#contributing) - * [3.1. Sign the Contributor License Agreement](#sign-the-contributor-license-agreement) - * [3.2. Code of Conduct](#code-of-conduct) - * [3.3. Code Conventions and Housekeeping](#code-conventions-and-housekeeping) - * [3.4. Checkstyle](#checkstyle) - * [3.4.1. Checkstyle configuration](#checkstyle-configuration) - - * [3.5. IDE setup](#ide-setup) - * [3.5.1. Intellij IDEA](#intellij-idea) - - * [3.6. Duplicate Finder](#duplicate-finder) - * [3.6.1. Duplicate Finder configuration](#duplicate-finder-configuration) - **2.1.1** ## [](#usage-documentation)[1. Usage Documentation](#usage-documentation) diff --git a/docs/en/spring-cloud/spring-cloud-cli.md b/docs/en/spring-cloud/spring-cloud-cli.md index fb077d178e7cac78694d48e6405646428cc995a1..e3c768ec93099efbf2e94a8abf5477600199006e 100644 --- a/docs/en/spring-cloud/spring-cloud-cli.md +++ b/docs/en/spring-cloud/spring-cloud-cli.md @@ -1,17 +1,5 @@ # Spring Boot Cloud CLI -Table of Contents - -- [Spring Boot Cloud CLI](#spring-boot-cloud-cli) - - [Installation](#installation) - - [Running Spring Cloud Services in Development](#running-spring-cloud-services-in-development) - - [Adding Additional Applications](#adding-additional-applications) - - [Writing Groovy Scripts and Running Applications](#writing-groovy-scripts-and-running-applications) - - [Encryption and Decryption](#encryption-and-decryption) - -* [Writing Groovy Scripts and Running Applications](#_writing_groovy_scripts_and_running_applications) -* [Encryption and Decryption](#_encryption_and_decryption) - Spring Boot CLI provides [Spring Boot](https://projects.spring.io/spring-boot) command line features for [Spring Cloud](https://github.com/spring-cloud). You can write Groovy scripts to run Spring Cloud component diff --git a/docs/en/spring-cloud/spring-cloud-cloudfoundry.md b/docs/en/spring-cloud/spring-cloud-cloudfoundry.md index 3a474d2ac0376bd186c3a99e930c3dfac432da7f..8b05c4800d56225957b9fe1da46a53f83997f5da 100644 --- a/docs/en/spring-cloud/spring-cloud-cloudfoundry.md +++ b/docs/en/spring-cloud/spring-cloud-cloudfoundry.md @@ -1,12 +1,5 @@ # Spring Cloud for Cloud Foundry -Table of Contents - -- [Spring Cloud for Cloud Foundry](#spring-cloud-for-cloud-foundry) - - [[1. Discovery](#discovery)](#1-discovery) - - [[2. Single Sign On](#single-sign-on)](#2-single-sign-on) - - [[3. Configuration](#configuration)](#3-configuration) - Spring Cloud for Cloudfoundry makes it easy to run[Spring Cloud](https://github.com/spring-cloud) apps in[Cloud Foundry](https://github.com/cloudfoundry) (the Platform as a Service). Cloud Foundry has the notion of a "service", which is middlware that you "bind" to an app, essentially providing it with an diff --git a/docs/en/spring-cloud/spring-cloud-commons.md b/docs/en/spring-cloud/spring-cloud-commons.md index 34bb09347ad2b78b2443f884e843f13fbd1e88b9..d25cec164ec7ec667af70aab245ebfa3dd47144f 100644 --- a/docs/en/spring-cloud/spring-cloud-commons.md +++ b/docs/en/spring-cloud/spring-cloud-commons.md @@ -1,91 +1,5 @@ # Cloud Native Applications -Table of Contents - -* [1. Spring Cloud Context: Application Context Services](#spring-cloud-context-application-context-services) - * [1.1. The Bootstrap Application Context](#the-bootstrap-application-context) - * [1.2. Application Context Hierarchies](#application-context-hierarchies) - * [1.3. Changing the Location of Bootstrap Properties](#customizing-bootstrap-properties) - * [1.4. Overriding the Values of Remote Properties](#overriding-bootstrap-properties) - * [1.5. Customizing the Bootstrap Configuration](#customizing-the-bootstrap-configuration) - * [1.6. Customizing the Bootstrap Property Sources](#customizing-bootstrap-property-sources) - * [1.7. Logging Configuration](#logging-configuration) - * [1.8. Environment Changes](#environment-changes) - * [1.9. Refresh Scope](#refresh-scope) - * [1.10. Encryption and Decryption](#encryption-and-decryption) - * [1.11. Endpoints](#endpoints) - -* [2. Spring Cloud Commons: Common Abstractions](#spring-cloud-commons-common-abstractions) - * [2.1. The `@EnableDiscoveryClient` Annotation](#discovery-client) - * [2.1.1. Health Indicators](#health-indicators) - * [DiscoveryClientHealthIndicator](#discoveryclienthealthindicator) - * [DiscoveryCompositeHealthContributor](#discoverycompositehealthcontributor) - - * [2.1.2. Ordering `DiscoveryClient` instances](#ordering-discoveryclient-instances) - * [2.1.3. SimpleDiscoveryClient](#simplediscoveryclient) - - * [2.2. ServiceRegistry](#serviceregistry) - * [2.2.1. ServiceRegistry Auto-Registration](#serviceregistry-auto-registration) - * [ServiceRegistry Auto-Registration Events](#serviceregistry-auto-registration-events) - - * [2.2.2. Service Registry Actuator Endpoint](#service-registry-actuator-endpoint) - - * [2.3. Spring RestTemplate as a Load Balancer Client](#rest-template-loadbalancer-client) - * [2.4. Spring WebClient as a Load Balancer Client](#webclinet-loadbalancer-client) - * [2.4.1. Retrying Failed Requests](#retrying-failed-requests) - - * [2.5. Multiple `RestTemplate` Objects](#multiple-resttemplate-objects) - * [2.6. Multiple WebClient Objects](#multiple-webclient-objects) - * [2.7. Spring WebFlux `WebClient` as a Load Balancer Client](#loadbalanced-webclient) - * [2.7.1. Spring WebFlux `WebClient` with `ReactorLoadBalancerExchangeFilterFunction`](#webflux-with-reactive-loadbalancer) - * [2.7.2. Spring WebFlux `WebClient` with a Non-reactive Load Balancer Client](#load-balancer-exchange-filter-function) - - * [2.8. Ignore Network Interfaces](#ignore-network-interfaces) - * [2.9. HTTP Client Factories](#http-clients) - * [2.10. Enabled Features](#enabled-features) - * [2.10.1. Feature types](#feature-types) - * [2.10.2. Declaring features](#declaring-features) - - * [2.11. Spring Cloud Compatibility Verification](#spring-cloud-compatibility-verification) - -* [3. Spring Cloud LoadBalancer](#spring-cloud-loadbalancer) - * [3.1. Switching between the load-balancing algorithms](#switching-between-the-load-balancing-algorithms) - * [3.2. Spring Cloud LoadBalancer integrations](#spring-cloud-loadbalancer-integrations) - * [3.3. Spring Cloud LoadBalancer Caching](#loadbalancer-caching) - * [3.3.1. Caffeine-backed LoadBalancer Cache Implementation](#caffeine-backed-loadbalancer-cache-implementation) - * [3.3.2. Default LoadBalancer Cache Implementation](#default-loadbalancer-cache-implementation) - * [3.3.3. LoadBalancer Cache Configuration](#loadbalancer-cache-configuration) - - * [3.4. Zone-Based Load-Balancing](#zone-based-load-balancing) - * [3.5. Instance Health-Check for LoadBalancer](#instance-health-check-for-loadbalancer) - * [3.6. Same instance preference for LoadBalancer](#same-instance-preference-for-loadbalancer) - * [3.7. Request-based Sticky Session for LoadBalancer](#request-based-sticky-session-for-loadbalancer) - * [3.8. Spring Cloud LoadBalancer Hints](#spring-cloud-loadbalancer-hints) - * [3.9. Hint-Based Load-Balancing](#hints-based-loadbalancing) - * [3.10. Transform the load-balanced HTTP request](#transform-the-load-balanced-http-request) - * [3.11. Spring Cloud LoadBalancer Starter](#spring-cloud-loadbalancer-starter) - * [3.12. Passing Your Own Spring Cloud LoadBalancer Configuration](#custom-loadbalancer-configuration) - * [3.13. Spring Cloud LoadBalancer Lifecycle](#loadbalancer-lifecycle) - * [3.14. Spring Cloud LoadBalancer Statistics](#loadbalancer-micrometer-stats-lifecycle) - * [3.15. Configuring Individual LoadBalancerClients](#configuring-individual-loadbalancerclients) - -* [4. Spring Cloud Circuit Breaker](#spring-cloud-circuit-breaker) - * [4.1. Introduction](#introduction) - * [4.1.1. Supported Implementations](#supported-implementations) - - * [4.2. Core Concepts](#core-concepts) - * [4.2.1. Circuit Breakers In Reactive Code](#circuit-breakers-in-reactive-code) - - * [4.3. Configuration](#configuration) - -* [5. CachedRandomPropertySource](#cachedrandompropertysource) -* [6. Security](#spring-cloud-security) - * [6.1. Single Sign On](#spring-cloud-security-single-sign-on) - * [6.1.1. Client Token Relay](#spring-cloud-security-client-token-relay) - * [6.1.2. Resource Server Token Relay](#spring-cloud-security-resource-server-token-relay) - -* [7. Configuration Properties](#configuration-properties) - [Cloud Native](https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook) is a style of application development that encourages easy adoption of best practices in the areas of continuous delivery and value-driven development. A related discipline is that of building [12-factor Applications](https://12factor.net/), in which development practices are aligned with delivery and operations goals — for instance, by using declarative programming and management and monitoring. Spring Cloud facilitates these styles of development in a number of specific ways. diff --git a/docs/en/spring-cloud/spring-cloud-config.md b/docs/en/spring-cloud/spring-cloud-config.md index 7617f79ff0102dbc86a3096626c224fe63f486b0..51069e66ad0fa008941dfe41dca32f2e6b8444b6 100644 --- a/docs/en/spring-cloud/spring-cloud-config.md +++ b/docs/en/spring-cloud/spring-cloud-config.md @@ -1,41 +1,5 @@ # Spring Cloud Config -Table of Contents - -* [Quick Start](#_quick_start) - * [Client Side Usage](#_client_side_usage) - -* [Spring Cloud Config Server](#_spring_cloud_config_server) - * [Environment Repository](#_environment_repository) - * [Health Indicator](#_health_indicator) - * [Security](#_security) - * [Actuator and Security](#_actuator_and_security) - * [Encryption and Decryption](#_encryption_and_decryption) - * [Key Management](#_key_management) - * [Creating a Key Store for Testing](#_creating_a_key_store_for_testing) - * [Using Multiple Keys and Key Rotation](#_using_multiple_keys_and_key_rotation) - * [Serving Encrypted Properties](#_serving_encrypted_properties) - -* [Serving Alternative Formats](#_serving_alternative_formats) -* [Serving Plain Text](#_serving_plain_text) - * [Git, SVN, and Native Backends](#spring-cloud-config-serving-plain-text-git-svn-native-backends) - * [AWS S3](#spring-cloud-config-serving-plain-text-aws-s3) - * [Decrypting Plain Text](#_decrypting_plain_text) - -* [Embedding the Config Server](#_embedding_the_config_server) -* [Push Notifications and Spring Cloud Bus](#_push_notifications_and_spring_cloud_bus) -* [Spring Cloud Config Client](#_spring_cloud_config_client) - * [Spring Boot Config Data Import](#config-data-import) - * [Config First Bootstrap](#config-first-bootstrap) - * [Config Client Fail Fast](#config-client-fail-fast) - * [Config Client Retry](#config-client-retry) - * [Config Client Retry with spring.config.import](#_config_client_retry_with_spring_config_import) - * [Locating Remote Configuration Resources](#_locating_remote_configuration_resources) - * [Specifying Multiple Urls for the Config Server](#_specifying_multiple_urls_for_the_config_server) - * [Configuring Timeouts](#_configuring_timeouts) - * [Security](#_security_2) - * [Nested Keys In Vault](#_nested_keys_in_vault) - **3.1.1** Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. diff --git a/docs/en/spring-cloud/spring-cloud-consul.md b/docs/en/spring-cloud/spring-cloud-consul.md index b7f6edf580255a17d20b9408a4e26e57906321d2..7f49caf121eef6d057f8a4b1ecc1c9bc70b0a7cb 100644 --- a/docs/en/spring-cloud/spring-cloud-consul.md +++ b/docs/en/spring-cloud/spring-cloud-consul.md @@ -1,52 +1,5 @@ # Spring Cloud Consul -Table of Contents - -* [1. Quick Start](#quick-start) - * [1.1. Discovery Client Usage](#discovery-client-usage) - * [1.2. Distributed Configuration Usage](#distributed-configuration-usage) - -* [2. Install Consul](#spring-cloud-consul-install) -* [3. Consul Agent](#spring-cloud-consul-agent) -* [4. Service Discovery with Consul](#spring-cloud-consul-discovery) - * [4.1. How to activate](#how-to-activate) - * [4.2. Registering with Consul](#registering-with-consul) - * [4.2.1. Registering Management as a Separate Service](#registering-management-as-a-separate-service) - * [4.2.2. HTTP Health Check](#http-health-check) - * [Applying Headers](#applying-headers) - - * [4.2.3. Actuator Health Indicator(s)](#actuator-health-indicators) - * [DiscoveryClientHealthIndicator](#discoveryclienthealthindicator) - * [ConsulHealthIndicator](#consulhealthindicator) - - * [4.2.4. Metadata](#metadata) - * [Generated Metadata](#generated-metadata) - - * [4.2.5. Making the Consul Instance ID Unique](#making-the-consul-instance-id-unique) - - * [4.3. Looking up services](#looking-up-services) - * [4.3.1. Using Load-balancer](#using-load-balancer) - * [4.3.2. Using the DiscoveryClient](#using-the-discoveryclient) - - * [4.4. Consul Catalog Watch](#consul-catalog-watch) - -* [5. Distributed Configuration with Consul](#spring-cloud-consul-config) - * [5.1. How to activate](#how-to-activate-2) - * [5.2. Spring Boot Config Data Import](#config-data-import) - * [5.3. Customizing](#customizing) - * [5.4. Config Watch](#spring-cloud-consul-config-watch) - * [5.5. YAML or Properties with Config](#spring-cloud-consul-config-format) - * [5.6. git2consul with Config](#spring-cloud-consul-config-git2consul) - * [5.7. Fail Fast](#spring-cloud-consul-failfast) - -* [6. Consul Retry](#spring-cloud-consul-retry) -* [7. Spring Cloud Bus with Consul](#spring-cloud-consul-bus) - * [7.1. How to activate](#how-to-activate-3) - -* [8. Circuit Breaker with Hystrix](#spring-cloud-consul-hystrix) -* [9. Hystrix metrics aggregation with Turbine and Consul](#spring-cloud-consul-turbine) -* [10. Configuration Properties](#configuration-properties) - **3.1.0** This project provides Consul integrations for Spring Boot apps through autoconfiguration diff --git a/docs/en/spring-cloud/spring-cloud-gateway.md b/docs/en/spring-cloud/spring-cloud-gateway.md index 252065ef7a2bc971ded2e6f0155e5c8500f99397..43f4db3fddb5c11ec08a5e2660ac8bc248dbbc0e 100644 --- a/docs/en/spring-cloud/spring-cloud-gateway.md +++ b/docs/en/spring-cloud/spring-cloud-gateway.md @@ -1,127 +1,5 @@ # Spring Cloud Gateway -Table of Contents - -* [1. How to Include Spring Cloud Gateway](#gateway-starter) -* [2. Glossary](#glossary) -* [3. How It Works](#gateway-how-it-works) -* [4. Configuring Route Predicate Factories and Gateway Filter Factories](#configuring-route-predicate-factories-and-gateway-filter-factories) - * [4.1. Shortcut Configuration](#shortcut-configuration) - * [4.2. Fully Expanded Arguments](#fully-expanded-arguments) - -* [5. Route Predicate Factories](#gateway-request-predicates-factories) - * [5.1. The After Route Predicate Factory](#the-after-route-predicate-factory) - * [5.2. The Before Route Predicate Factory](#the-before-route-predicate-factory) - * [5.3. The Between Route Predicate Factory](#the-between-route-predicate-factory) - * [5.4. The Cookie Route Predicate Factory](#the-cookie-route-predicate-factory) - * [5.5. The Header Route Predicate Factory](#the-header-route-predicate-factory) - * [5.6. The Host Route Predicate Factory](#the-host-route-predicate-factory) - * [5.7. The Method Route Predicate Factory](#the-method-route-predicate-factory) - * [5.8. The Path Route Predicate Factory](#the-path-route-predicate-factory) - * [5.9. The Query Route Predicate Factory](#the-query-route-predicate-factory) - * [5.10. The RemoteAddr Route Predicate Factory](#the-remoteaddr-route-predicate-factory) - * [5.10.1. Modifying the Way Remote Addresses Are Resolved](#modifying-the-way-remote-addresses-are-resolved) - - * [5.11. The Weight Route Predicate Factory](#the-weight-route-predicate-factory) - * [5.12. The XForwarded Remote Addr Route Predicate Factory](#the-xforwarded-remote-addr-route-predicate-factory) - -* [6. `GatewayFilter` Factories](#gatewayfilter-factories) - * [6.1. The `AddRequestHeader` `GatewayFilter` Factory](#the-addrequestheader-gatewayfilter-factory) - * [6.2. The `AddRequestParameter` `GatewayFilter` Factory](#the-addrequestparameter-gatewayfilter-factory) - * [6.3. The `AddResponseHeader` `GatewayFilter` Factory](#the-addresponseheader-gatewayfilter-factory) - * [6.4. The `DedupeResponseHeader` `GatewayFilter` Factory](#the-deduperesponseheader-gatewayfilter-factory) - * [6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) - * [6.5.1. Tripping The Circuit Breaker On Status Codes](#circuit-breaker-status-codes) - - * [6.6. The `FallbackHeaders` `GatewayFilter` Factory](#fallback-headers) - * [6.7. The `MapRequestHeader` `GatewayFilter` Factory](#the-maprequestheader-gatewayfilter-factory) - * [6.8. The `PrefixPath` `GatewayFilter` Factory](#the-prefixpath-gatewayfilter-factory) - * [6.9. The `PreserveHostHeader` `GatewayFilter` Factory](#the-preservehostheader-gatewayfilter-factory) - * [6.10. The `RequestRateLimiter` `GatewayFilter` Factory](#the-requestratelimiter-gatewayfilter-factory) - * [6.10.1. The Redis `RateLimiter`](#the-redis-ratelimiter) - - * [6.11. The `RedirectTo` `GatewayFilter` Factory](#the-redirectto-gatewayfilter-factory) - * [6.12. The `RemoveRequestHeader` GatewayFilter Factory](#the-removerequestheader-gatewayfilter-factory) - * [6.13. `RemoveResponseHeader` `GatewayFilter` Factory](#removeresponseheader-gatewayfilter-factory) - * [6.14. The `RemoveRequestParameter` `GatewayFilter` Factory](#the-removerequestparameter-gatewayfilter-factory) - * [6.15. The `RewritePath` `GatewayFilter` Factory](#the-rewritepath-gatewayfilter-factory) - * [6.16. `RewriteLocationResponseHeader` `GatewayFilter` Factory](#rewritelocationresponseheader-gatewayfilter-factory) - * [6.17. The `RewriteResponseHeader` `GatewayFilter` Factory](#the-rewriteresponseheader-gatewayfilter-factory) - * [6.18. The `SaveSession` `GatewayFilter` Factory](#the-savesession-gatewayfilter-factory) - * [6.19. The `SecureHeaders` `GatewayFilter` Factory](#the-secureheaders-gatewayfilter-factory) - * [6.20. The `SetPath` `GatewayFilter` Factory](#the-setpath-gatewayfilter-factory) - * [6.21. The `SetRequestHeader` `GatewayFilter` Factory](#the-setrequestheader-gatewayfilter-factory) - * [6.22. The `SetResponseHeader` `GatewayFilter` Factory](#the-setresponseheader-gatewayfilter-factory) - * [6.23. The `SetStatus` `GatewayFilter` Factory](#the-setstatus-gatewayfilter-factory) - * [6.24. The `StripPrefix` `GatewayFilter` Factory](#the-stripprefix-gatewayfilter-factory) - * [6.25. The Retry `GatewayFilter` Factory](#the-retry-gatewayfilter-factory) - * [6.26. The `RequestSize` `GatewayFilter` Factory](#the-requestsize-gatewayfilter-factory) - * [6.27. The `SetRequestHostHeader` `GatewayFilter` Factory](#the-setrequesthostheader-gatewayfilter-factory) - * [6.28. Modify a Request Body `GatewayFilter` Factory](#modify-a-request-body-gatewayfilter-factory) - * [6.29. Modify a Response Body `GatewayFilter` Factory](#modify-a-response-body-gatewayfilter-factory) - * [6.30. Token Relay `GatewayFilter` Factory](#token-relay-gatewayfilter-factory) - * [6.31. The `CacheRequestBody` `GatewayFilter` Factory](#the-cacherequestbody-gatewayfilter-factory) - * [6.32. Default Filters](#default-filters) - -* [7. Global Filters](#global-filters) - * [7.1. Combined Global Filter and `GatewayFilter` Ordering](#gateway-combined-global-filter-and-gatewayfilter-ordering) - * [7.2. Forward Routing Filter](#forward-routing-filter) - * [7.3. The `ReactiveLoadBalancerClientFilter`](#reactive-loadbalancer-client-filter) - * [7.4. The Netty Routing Filter](#the-netty-routing-filter) - * [7.5. The Netty Write Response Filter](#the-netty-write-response-filter) - * [7.6. The `RouteToRequestUrl` Filter](#the-routetorequesturl-filter) - * [7.7. The Websocket Routing Filter](#the-websocket-routing-filter) - * [7.8. The Gateway Metrics Filter](#the-gateway-metrics-filter) - * [7.9. Marking An Exchange As Routed](#marking-an-exchange-as-routed) - -* [8. HttpHeadersFilters](#httpheadersfilters) - * [8.1. Forwarded Headers Filter](#forwarded-headers-filter) - * [8.2. RemoveHopByHop Headers Filter](#removehopbyhop-headers-filter) - * [8.3. XForwarded Headers Filter](#xforwarded-headers-filter) - -* [9. TLS and SSL](#tls-and-ssl) - * [9.1. TLS Handshake](#tls-handshake) - -* [10. Configuration](#configuration) - * [10.1. RouteDefinition Metrics](#routedefinition-metrics) - -* [11. Route Metadata Configuration](#route-metadata-configuration) -* [12. Http timeouts configuration](#http-timeouts-configuration) - * [12.1. Global timeouts](#global-timeouts) - * [12.2. Per-route timeouts](#per-route-timeouts) - * [12.3. Fluent Java Routes API](#fluent-java-routes-api) - * [12.4. The `DiscoveryClient` Route Definition Locator](#the-discoveryclient-route-definition-locator) - * [12.4.1. Configuring Predicates and Filters For `DiscoveryClient` Routes](#configuring-predicates-and-filters-for-discoveryclient-routes) - -* [13. Reactor Netty Access Logs](#reactor-netty-access-logs) -* [14. CORS Configuration](#cors-configuration) -* [15. Actuator API](#actuator-api) - * [15.1. Verbose Actuator Format](#verbose-actuator-format) - * [15.2. Retrieving Route Filters](#retrieving-route-filters) - * [15.2.1. Global Filters](#gateway-global-filters) - * [15.2.2. Route Filters](#gateway-route-filters) - - * [15.3. Refreshing the Route Cache](#refreshing-the-route-cache) - * [15.4. Retrieving the Routes Defined in the Gateway](#retrieving-the-routes-defined-in-the-gateway) - * [15.5. Retrieving Information about a Particular Route](#gateway-retrieving-information-about-a-particular-route) - * [15.6. Creating and Deleting a Particular Route](#creating-and-deleting-a-particular-route) - * [15.7. Recap: The List of All endpoints](#recap-the-list-of-all-endpoints) - * [15.8. Sharing Routes between multiple Gateway instances](#sharing-routes-between-multiple-gateway-instances) - -* [16. Troubleshooting](#troubleshooting) - * [16.1. Log Levels](#log-levels) - * [16.2. Wiretap](#wiretap) - -* [17. Developer Guide](#developer-guide) - * [17.1. Writing Custom Route Predicate Factories](#writing-custom-route-predicate-factories) - * [17.2. Writing Custom GatewayFilter Factories](#writing-custom-gatewayfilter-factories) - * [17.2.1. Naming Custom Filters And References In Configuration](#naming-custom-filters-and-references-in-configuration) - - * [17.3. Writing Custom Global Filters](#writing-custom-global-filters) - -* [18. Building a Simple Gateway by Using Spring MVC or Webflux](#building-a-simple-gateway-by-using-spring-mvc-or-webflux) -* [19. Configuration properties](#configuration-properties) - **3.1.1** This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 5, Spring Boot 2 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency. @@ -154,7 +32,7 @@ If you include the starter, but you do not want the gateway to be enabled, set ` The following diagram provides a high-level overview of how Spring Cloud Gateway works: -![Spring Cloud Gateway Diagram](./images/spring_cloud_gateway_diagram.png) +![Spring Cloud Gateway Diagram](https://docs.spring.io/spring-cloud-gateway/docs/3.1.1/reference/html/images/spring_cloud_gateway_diagram.png) Clients make requests to Spring Cloud Gateway. If the Gateway Handler Mapping determines that a request matches a route, it is sent to the Gateway Web Handler. This handler runs the request through a filter chain that is specific to the request. @@ -1965,7 +1843,7 @@ In addition, through the property `spring.cloud.gateway.metrics.tags.path.enable * `path`: Path of the request. -These metrics are then available to be scraped from `/actuator/metrics/spring.cloud.gateway.requests` and can be easily integrated with Prometheus to create a [Grafana](images/gateway-grafana-dashboard.jpeg) [dashboard](gateway-grafana-dashboard.json). +These metrics are then available to be scraped from `/actuator/metrics/spring.cloud.gateway.requests` and can be easily integrated with Prometheus to create a [Grafana](https://docs.spring.io/spring-cloud-gateway/docs/3.1.1/reference/html/images/gateway-grafana-dashboard.jpeg) [dashboard](gateway-grafana-dashboard.json). | |To enable the prometheus endpoint, add `micrometer-registry-prometheus` as a project dependency.| |---|------------------------------------------------------------------------------------------------| diff --git a/docs/en/spring-cloud/spring-cloud-kubernetes.md b/docs/en/spring-cloud/spring-cloud-kubernetes.md index 9e4de63bb2c9fd5b94d93502f7ba297f97edbe92..be58ad732ab4b683e6e5adf47cb6ba9f319a753c 100644 --- a/docs/en/spring-cloud/spring-cloud-kubernetes.md +++ b/docs/en/spring-cloud/spring-cloud-kubernetes.md @@ -1,82 +1,5 @@ # Spring Cloud Kubernetes -Table of Contents - -* [1. Why do you need Spring Cloud Kubernetes?](#why-do-you-need-spring-cloud-kubernetes) -* [2. Starters](#starters) -* [3. DiscoveryClient for Kubernetes](#discoveryclient-for-kubernetes) -* [4. Kubernetes native service discovery](#kubernetes-native-service-discovery) -* [5. Kubernetes PropertySource implementations](#kubernetes-propertysource-implementations) - * [5.1. Using a `ConfigMap` `PropertySource`](#configmap-propertysource) - * [5.2. Secrets PropertySource](#secrets-propertysource) - * [5.3. Namespace resolution](#namespace-resolution) - * [5.4. `PropertySource` Reload](#propertysource-reload) - -* [6. Kubernetes Ecosystem Awareness](#kubernetes-ecosystem-awareness) - * [6.1. Kubernetes Profile Autoconfiguration](#kubernetes-profile-autoconfiguration) - * [6.2. Istio Awareness](#istio-awareness) - -* [7. Pod Health Indicator](#pod-health-indicator) -* [8. Info Contributor](#info-contributor) -* [9. Leader Election](#leader-election) -* [10. LoadBalancer for Kubernetes](#loadbalancer-for-kubernetes) -* [11. Security Configurations Inside Kubernetes](#security-configurations-inside-kubernetes) - * [11.1. Namespace](#namespace) - * [11.2. Service Account](#service-account) - -* [12. Service Registry Implementation](#service-registry-implementation) -* [13. Spring Cloud Kubernetes Configuration Watcher](#spring-cloud-kubernetes-configuration-watcher) - * [13.1. Deployment YAML](#deployment-yaml) - * [13.2. Monitoring ConfigMaps and Secrets](#monitoring-configmaps-and-secrets) - * [13.3. HTTP Implementation](#http-implementation) - * [13.3.1. Non-Default Management Port and Actuator Path](#non-default-management-port-and-actuator-path) - - * [13.4. Messaging Implementation](#messaging-implementation) - * [13.5. Configuring RabbitMQ](#configuring-rabbitmq) - * [13.6. Configuring Kafka](#configuring-kafka) - -* [14. Spring Cloud Kubernetes Config Server](#spring-cloud-kubernetes-configserver) - * [14.1. Configuration](#configuration) - * [14.1.1. Enabling The Kubernetes Environment Repository](#enabling-the-kubernetes-environment-repository) - * [14.1.2. Config Map and Secret PropertySources](#config-map-and-secret-propertysources) - * [14.1.3. Fetching Config Map and Secret Data From Additional Namespaces](#fetching-config-map-and-secret-data-from-additional-namespaces) - * [14.1.4. Kubernetes Access Controls](#kubernetes-access-controls) - - * [14.2. Deployment Yaml](#deployment-yaml-2) - -* [15. Spring Cloud Kubernetes Discovery Server](#spring-cloud-kubernetes-discoveryserver) - * [15.1. Permissions](#permissions) - * [15.2. Endpoints](#endpoints) - * [15.2.1. `/apps`](#apps) - * [15.2.2. `/app/{name}`](#appname) - * [15.2.3. `/app/{name}/{instanceid}`](#appnameinstanceid) - - * [15.3. Deployment YAML](#deployment-yaml-3) - -* [16. Examples](#examples) -* [17. Other Resources](#other-resources) -* [18. Configuration properties](#configuration-properties) -* [19. Building](#building) - * [19.1. Basic Compile and Test](#basic-compile-and-test) - * [19.2. Documentation](#documentation) - * [19.3. Working with the code](#working-with-the-code) - * [19.3.1. Activate the Spring Maven profile](#activate-the-spring-maven-profile) - * [19.3.2. Importing into eclipse with m2eclipse](#importing-into-eclipse-with-m2eclipse) - * [19.3.3. Importing into eclipse without m2eclipse](#importing-into-eclipse-without-m2eclipse) - -* [20. Contributing](#contributing) - * [20.1. Sign the Contributor License Agreement](#sign-the-contributor-license-agreement) - * [20.2. Code of Conduct](#code-of-conduct) - * [20.3. Code Conventions and Housekeeping](#code-conventions-and-housekeeping) - * [20.4. Checkstyle](#checkstyle) - * [20.4.1. Checkstyle configuration](#checkstyle-configuration) - - * [20.5. IDE setup](#ide-setup) - * [20.5.1. Intellij IDEA](#intellij-idea) - - * [20.6. Duplicate Finder](#duplicate-finder) - * [20.6.1. Duplicate Finder configuration](#duplicate-finder-configuration) - This reference guide covers how to use Spring Cloud Kubernetes. ## [](#why-do-you-need-spring-cloud-kubernetes)[1. Why do you need Spring Cloud Kubernetes?](#why-do-you-need-spring-cloud-kubernetes) diff --git a/docs/en/spring-cloud/spring-cloud-netflix.md b/docs/en/spring-cloud/spring-cloud-netflix.md index edd6f1ba05c275c515f6a192ab40d34d5b367b65..d0641f833c10eb464b05af498f147d1594d33790 100644 --- a/docs/en/spring-cloud/spring-cloud-netflix.md +++ b/docs/en/spring-cloud/spring-cloud-netflix.md @@ -1,40 +1,5 @@ # Spring Cloud Netflix -Table of Contents - -* [1. Service Discovery: Eureka Clients](#service-discovery-eureka-clients) - * [1.1. How to Include Eureka Client](#netflix-eureka-client-starter) - * [1.2. Registering with Eureka](#registering-with-eureka) - * [1.3. Authenticating with the Eureka Server](#authenticating-with-the-eureka-server) - * [1.4. Status Page and Health Indicator](#status-page-and-health-indicator) - * [1.5. Registering a Secure Application](#registering-a-secure-application) - * [1.6. Eureka’s Health Checks](#eurekas-health-checks) - * [1.7. Eureka Metadata for Instances and Clients](#eureka-metadata-for-instances-and-clients) - * [1.7.1. Using Eureka on Cloud Foundry](#using-eureka-on-cloud-foundry) - * [1.7.2. Using Eureka on AWS](#using-eureka-on-aws) - * [1.7.3. Changing the Eureka Instance ID](#changing-the-eureka-instance-id) - - * [1.8. Using the EurekaClient](#using-the-eurekaclient) - * [1.8.1. EurekaClient with Jersey](#eurekaclient-with-jersey) - - * [1.9. Alternatives to the Native Netflix EurekaClient](#alternatives-to-the-native-netflix-eurekaclient) - * [1.10. Why Is It so Slow to Register a Service?](#why-is-it-so-slow-to-register-a-service) - * [1.11. Zones](#zones) - * [1.12. Refreshing Eureka Clients](#refreshing-eureka-clients) - * [1.13. Using Eureka with Spring Cloud LoadBalancer](#using-eureka-with-spring-cloud-loadbalancer) - -* [2. Service Discovery: Eureka Server](#spring-cloud-eureka-server) - * [2.1. How to Include Eureka Server](#netflix-eureka-server-starter) - * [2.2. How to Run a Eureka Server](#spring-cloud-running-eureka-server) - * [2.3. High Availability, Zones and Regions](#spring-cloud-eureka-server-zones-and-regions) - * [2.4. Standalone Mode](#spring-cloud-eureka-server-standalone-mode) - * [2.5. Peer Awareness](#spring-cloud-eureka-server-peer-awareness) - * [2.6. When to Prefer IP Address](#spring-cloud-eureka-server-prefer-ip-address) - * [2.7. Securing The Eureka Server](#securing-the-eureka-server) - * [2.8. JDK 11 Support](#jdk-11-support) - -* [3. Configuration properties](#configuration-properties) - **3.1.1** This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration diff --git a/docs/en/spring-cloud/spring-cloud-openfeign.md b/docs/en/spring-cloud/spring-cloud-openfeign.md index 4b6784b1fecc6fadb7d4922275ee0914094281f7..9d57919dd1234cc9ca2413a2543d8e7ee6db1f74 100644 --- a/docs/en/spring-cloud/spring-cloud-openfeign.md +++ b/docs/en/spring-cloud/spring-cloud-openfeign.md @@ -1,36 +1,5 @@ # Spring Cloud OpenFeign -Table of Contents - -* [1. Declarative REST Client: Feign](#spring-cloud-feign) - * [1.1. How to Include Feign](#netflix-feign-starter) - * [1.2. Overriding Feign Defaults](#spring-cloud-feign-overriding-defaults) - * [1.2.1. `SpringEncoder` configuration](#springencoder-configuration) - - * [1.3. Timeout Handling](#timeout-handling) - * [1.4. Creating Feign Clients Manually](#creating-feign-clients-manually) - * [1.5. Feign Spring Cloud CircuitBreaker Support](#spring-cloud-feign-circuitbreaker) - * [1.6. Feign Spring Cloud CircuitBreaker Fallbacks](#spring-cloud-feign-circuitbreaker-fallback) - * [1.7. Feign and `@Primary`](#feign-and-primary) - * [1.8. Feign Inheritance Support](#spring-cloud-feign-inheritance) - * [1.9. Feign request/response compression](#feign-requestresponse-compression) - * [1.10. Feign logging](#feign-logging) - * [1.11. Feign Capability support](#feign-capability-support) - * [1.12. Feign metrics](#feign-metrics) - * [1.13. Feign Caching](#feign-caching) - * [1.14. Feign @QueryMap support](#feign-querymap-support) - * [1.15. HATEOAS support](#hateoas-support) - * [1.16. Spring @MatrixVariable Support](#spring-matrixvariable-support) - * [1.17. Feign `CollectionFormat` support](#feign-collectionformat-support) - * [1.18. Reactive Support](#reactive-support) - * [1.18.1. Early Initialization Errors](#early-initialization-errors) - - * [1.19. Spring Data Support](#spring-data-support) - * [1.20. Spring `@RefreshScope` Support](#spring-refreshscope-support) - * [1.21. OAuth2 Support](#oauth2-support) - -* [2. Configuration properties](#configuration-properties) - **3.1.1** This project provides OpenFeign integrations for Spring Boot apps through autoconfiguration diff --git a/docs/en/spring-cloud/spring-cloud-task.md b/docs/en/spring-cloud/spring-cloud-task.md index 1d5249edf0d101f8c35e968d74f4f75f196afda9..9844660cb0053363aa5540b230208646ca7b0050 100644 --- a/docs/en/spring-cloud/spring-cloud-task.md +++ b/docs/en/spring-cloud/spring-cloud-task.md @@ -1,91 +1,5 @@ # Spring Cloud Task Reference Guide -Michael Minella, Glenn Renfro, Jay Bryant - -Table of Contents - -* [Preface](#preface) - * [1. About the documentation](#about-the-documentation) - * [2. Getting help](#task-documentation-getting-help) - * [3. First Steps](#task-documentation-first-steps) - -* [Getting started](#getting-started) - * [4. Introducing Spring Cloud Task](#getting-started-introducing-spring-cloud-task) - * [5. System Requirements](#getting-started-system-requirements) - * [5.1. Database Requirements](#database-requirements) - - * [6. Developing Your First Spring Cloud Task Application](#getting-started-developing-first-task) - * [6.1. Creating the Spring Task Project using Spring Initializr](#getting-started-creating-project) - * [6.2. Writing the Code](#getting-started-writing-the-code) - * [6.3. Running the Example](#getting-started-running-the-example) - -* [Features](#features) - * [7. The lifecycle of a Spring Cloud Task](#features-lifecycle) - * [7.1. The TaskExecution](#features-task-execution-details) - * [7.2. Mapping Exit Codes](#features-lifecycle-exit-codes) - - * [8. Configuration](#features-configuration) - * [8.1. DataSource](#features-data-source) - * [8.2. Table Prefix](#features-table-prefix) - * [8.3. Enable/Disable table initialization](#features-table-initialization) - * [8.4. Externally Generated Task ID](#features-generated_task_id) - * [8.5. External Task Id](#features-external_task_id) - * [8.6. Parent Task Id](#features-parent_task_id) - * [8.7. TaskConfigurer](#features-task-configurer) - * [8.8. Task Name](#features-task-name) - * [8.9. Task Execution Listener](#features-task-execution-listener) - * [8.10. Restricting Spring Cloud Task Instances](#features-single-instance-enabled) - * [8.11. Disabling Spring Cloud Task Auto Configuration](#disabling-spring-cloud-task-auto-configuration) - * [8.12. Closing the Context](#closing-the-context) - -* [Batch](#batch) - * [9. Associating a Job Execution to the Task in which It Was Executed](#batch-association) - * [9.1. Overriding the TaskBatchExecutionListener](#batch-association-override) - - * [10. Remote Partitioning](#batch-partitioning) - * [10.1. Notes on Developing a Batch-partitioned application for the Kubernetes Platform](#notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform) - * [10.2. Notes on Developing a Batch-partitioned Application for the Cloud Foundry Platform](#notes-on-developing-a-batch-partitioned-application-for-the-cloud-foundry-platform) - - * [11. Batch Informational Messages](#batch-informational-messages) - * [12. Batch Job Exit Codes](#batch-failures-and-tasks) - -* [Single Step Batch Job Starter](#batch-job-starter) - * [13. Defining a Job](#job-definition) - * [13.1. Properties](#job-definition-properties) - - * [14. Autoconfiguration for ItemReader Implementations](#item-readers) - * [14.1. AmqpItemReader](#amqpitemreader) - * [14.2. FlatFileItemReader](#flatfileitemreader) - * [14.3. JdbcCursorItemReader](#jdbcCursorItemReader) - * [14.4. KafkaItemReader](#kafkaItemReader) - - * [15. ItemProcessor Configuration](#item-processors) - * [16. Autoconfiguration for ItemWriter implementations](#item-writers) - * [16.1. AmqpItemWriter](#amqpitemwriter) - * [16.2. FlatFileItemWriter](#flatfileitemwriter) - * [16.3. JdbcBatchItemWriter](#jdbcitemwriter) - * [16.4. KafkaItemWriter](#kafkaitemwriter) - -* [Spring Cloud Stream Integration](#stream-integration) - * [17. Launching a Task from a Spring Cloud Stream](#stream-integration-launching-sink) - * [17.1. Spring Cloud Data Flow](#stream-integration-launching-sink-dataflow) - - * [18. Spring Cloud Task Events](#stream-integration-events) - * [18.1. Disabling Specific Task Events](#stream-integration-disable-task-events) - - * [19. Spring Batch Events](#stream-integration-batch-events) - * [19.1. Sending Batch Events to Different Channels](#sending-batch-events-to-different-channels) - * [19.2. Disabling Batch Events](#disabling-batch-events) - * [19.3. Emit Order for Batch Events](#emit-order-for-batch-events) - -* [Appendices](#appendix) - * [20. Task Repository Schema](#appendix-task-repository-schema) - * [20.1. Table Information](#table-information) - * [20.2. SQL Server](#sql-server) - - * [21. Building This Documentation](#appendix-building-the-documentation) - * [22. Running a Task App on Cloud Foundry](#appendix-cloud-foundry) - Version 2.4.1 © 2009-2021 VMware, Inc. All rights reserved. @@ -1328,7 +1242,7 @@ spring.cloud.task.batch.events.skip-order=5 This appendix provides an ERD for the database schema used in the task repository. -![task schema](./images/task_schema.png) +![task schema](https://docs.spring.io/spring-cloud-task/docs/2.4.1/reference/html/images/task_schema.png) ### [](#table-information)[20.1. Table Information](#table-information) diff --git a/docs/en/spring-cloud/spring-cloud-vault.md b/docs/en/spring-cloud/spring-cloud-vault.md index 04866f2db52613ee26968ee319c4169da22192c3..f8b911c149143b1a54028257fae115a5a716fdf3 100644 --- a/docs/en/spring-cloud/spring-cloud-vault.md +++ b/docs/en/spring-cloud/spring-cloud-vault.md @@ -2,67 +2,6 @@ version 3.1.0 -Table of Contents - -* [1. New & Noteworthy](#new-noteworthy) - * [1.1. New in Spring Cloud Vault 3.0](#new-in-3.0.0) - -* [2. Quick Start](#quick-start) -* [3. Client Side Usage](#client-side-usage) - * [3.1. Authentication](#authentication) - -* [4. ConfigData API](#vault.configdata) - * [4.1. ConfigData Locations](#vault.configdata.locations) - * [4.2. Conditionally enable/disable Vault Configuration](#vault.configdata.location.optional) - * [4.3. Infrastructure Customization](#vault.configdata.customization) - -* [5. Authentication methods](#vault.config.authentication) - * [5.1. Token authentication](#vault.config.authentication.token) - * [5.2. Vault Agent authentication](#vault.config.authentication.vault-agent) - * [5.3. AppId authentication](#vault.config.authentication.appid) - * [5.4. AppRole authentication](#approle-authentication) - * [5.5. AWS-EC2 authentication](#vault.config.authentication.awsec2) - * [5.6. AWS-IAM authentication](#vault.config.authentication.awsiam) - * [5.7. Azure MSI authentication](#vault.config.authentication.azuremsi) - * [5.8. TLS certificate authentication](#vault.config.authentication.clientcert) - * [5.9. Cubbyhole authentication](#vault.config.authentication.cubbyhole) - * [5.10. GCP-GCE authentication](#vault.config.authentication.gcpgce) - * [5.11. GCP-IAM authentication](#vault.config.authentication.gcpiam) - * [5.12. Kubernetes authentication](#vault.config.authentication.kubernetes) - * [5.13. Pivotal CloudFoundry authentication](#vault.config.authentication.pcf) - -* [6. ACL Requirements](#vault.config.acl) - * [6.1. Authentication](#authentication-2) - * [6.2. KeyValue Mount Discovery](#keyvalue-mount-discovery) - * [6.3. SecretLeaseContainer](#secretleasecontainer) - * [6.4. Session Management](#session-management) - -* [7. Secret Backends](#vault.config.backends) - * [7.1. Key-Value Backend](#vault.config.backends.kv.versioned) - * [7.2. Consul](#vault.config.backends.consul) - * [7.3. RabbitMQ](#vault.config.backends.rabbitmq) - * [7.4. AWS](#vault.config.backends.aws) - -* [8. Database backends](#vault.config.backends.database-backends) - * [8.1. Database](#vault.config.backends.database) - * [8.2. Multiple Databases](#vault.config.backends.databases) - * [8.3. Apache Cassandra](#vault.config.backends.cassandra) - * [8.4. Couchbase Database](#vault.config.backends.couchbase) - * [8.5. Elasticsearch](#vault.config.backends.elasticsearch) - * [8.6. MongoDB](#vault.config.backends.mongodb) - * [8.7. MySQL](#vault.config.backends.mysql) - * [8.8. PostgreSQL](#vault.config.backends.postgresql) - -* [9. Customize which secret backends to expose as PropertySource](#vault.config.backends.configurer) -* [10. Custom Secret Backend Implementations](#vault.config.backends.custom) -* [11. Service Registry Configuration](#service-registry-configuration) -* [12. Vault Client Fail Fast](#vault.config.fail-fast) -* [13. Vault Enterprise Namespace Support](#vault.config.namespaces) -* [14. Vault Client SSL configuration](#vault.config.ssl) -* [15. Lease lifecycle management (renewal and revocation)](#vault-lease-renewal) -* [16. Session token lifecycle management (renewal, re-login and revocation)](#vault-session-lifecycle) -* [Appendix A: Common application properties](#common-application-properties) - © 2016-2021 the original authors. | |*Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.*| diff --git a/docs/en/spring-cloud/spring-cloud-zookeeper.md b/docs/en/spring-cloud/spring-cloud-zookeeper.md index 5523718adc9f38592b459e7cbe1334d43126dff0..38231d38595e41a984437768b156a8628ca65f75 100644 --- a/docs/en/spring-cloud/spring-cloud-zookeeper.md +++ b/docs/en/spring-cloud/spring-cloud-zookeeper.md @@ -1,38 +1,3 @@ -Table of Contents - -* [Spring Cloud Zookeeper](#_spring_cloud_zookeeper) - * [1. Quick Start](#quick-start) - * [1.1. Discovery Client Usage](#discovery-client-usage) - * [1.2. Distributed Configuration Usage](#distributed-configuration-usage) - - * [2. Install Zookeeper](#spring-cloud-zookeeper-install) - * [3. Service Discovery with Zookeeper](#spring-cloud-zookeeper-discovery) - * [3.1. Activating](#activating) - * [3.2. Registering with Zookeeper](#registering-with-zookeeper) - * [3.3. Using the DiscoveryClient](#using-the-discoveryclient) - - * [4. Using Spring Cloud Zookeeper with Spring Cloud Components](#spring-cloud-zookeeper-other-componentes) - * [4.1. Spring Cloud LoadBalancer with Zookeeper](#spring-cloud-loadbalancer-with-zookeeper) - - * [5. Spring Cloud Zookeeper and Service Registry](#spring-cloud-zookeeper-service-registry) - * [5.1. Instance Status](#instance-status) - - * [6. Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies) - * [6.1. Using the Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-using) - * [6.2. Activating Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-activating) - * [6.3. Setting up Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-setting-up) - * [6.4. Configuring Spring Cloud Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-configuring) - - * [7. Spring Cloud Zookeeper Dependency Watcher](#spring-cloud-zookeeper-dependency-watcher) - * [7.1. Activating](#activating-2) - * [7.2. Registering a Listener](#registering-a-listener) - * [7.3. Using the Presence Checker](#spring-cloud-zookeeper-dependency-watcher-presence-checker) - - * [8. Distributed Configuration with Zookeeper](#spring-cloud-zookeeper-config) - * [8.1. Activating](#activating-3) - * [8.2. Spring Boot Config Data Import](#config-data-import) - * [8.3. Customizing](#customizing) - * [8.4. Access Control Lists (ACLs)](#access-control-lists-acls) # [Spring Cloud Zookeeper](#_spring_cloud_zookeeper) diff --git a/docs/en/spring-credhub/READEME.md b/docs/en/spring-credhub/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-flo/READEME.md b/docs/en/spring-flo/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-for-apache-kafka/READEME.md b/docs/en/spring-for-apache-kafka/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-for-graphql/READEME.md b/docs/en/spring-for-graphql/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-hateoas/READEME.md b/docs/en/spring-hateoas/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-integration/READEME.md b/docs/en/spring-integration/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-ldap/READEME.md b/docs/en/spring-ldap/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-rest-docs/READEME.md b/docs/en/spring-rest-docs/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-security/READEME.md b/docs/en/spring-security/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-session/READEME.md b/docs/en/spring-session/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-shell/READEME.md b/docs/en/spring-shell/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-statemachine/READEME.md b/docs/en/spring-statemachine/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-vault/READEME.md b/docs/en/spring-vault/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-web-flow/READEME.md b/docs/en/spring-web-flow/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/en/spring-web-services/READEME.md b/docs/en/spring-web-services/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-amqp/READEME.md b/docs/spring-amqp/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-batch/READEME.md b/docs/spring-batch/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-boot/actuator.md b/docs/spring-boot/actuator.md index 57978f0f72bac1cd3c77071fed2b9fdf1f75802f..71ea72e22150ac72fe8864f0d2ba58572decc572 100644 --- a/docs/spring-boot/actuator.md +++ b/docs/spring-boot/actuator.md @@ -4,7 +4,7 @@ Spring 启动包括许多额外的功能,以帮助你在将应用程序推向 ## 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”上添加一个依赖项。 +[`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”的依赖关系。 执行器的定义 @@ -69,7 +69,7 @@ dependencies { | ID |说明| |------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `heapdump` |返回堆转储文件。
在热点 JVM 上,将返回一个`HPROF`-format 文件。
在 OpenJ9JVM 上,将返回一个`PHD`-format 文件。| -| `jolokia` |当 Jolokia 在 Classpath 上时,通过 HTTP 公开 JMX Bean(WebFlux 不可用)。
需要对`jolokia-core`的依赖关系。| +| `jolokia` |当 Jolokia 在 Classpath 上时,在 HTTP 上公开 JMX Bean(WebFlux 不可用)。
需要依赖于`jolokia-core`。| | `logfile` |返回日志文件的内容(如果设置了`logging.file.name`或`logging.file.path`属性)。
支持使用 http`Range`头来检索日志文件的部分内容。| |`prometheus`|以 Prometheus 服务器可以抓取的格式公开度量数据。
需要对`micrometer-registry-prometheus`具有依赖关系。| @@ -112,7 +112,7 @@ management: enabled: true ``` -| |禁用的端点将从应用程序上下文中完全删除。
如果你只想更改公开端点的技术,请使用[`include` and `exclude` properties](#actuator.endpoints.exposing)。| +| |已禁用的端点将从应用程序上下文中完全删除。
如果只想更改公开端点的技术,请使用[`include`和`exclude`属性](#actuator.endpoints.explosing)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 2.2.公开端点 @@ -209,14 +209,14 @@ management: 出于安全目的,除`/health`以外的所有执行器都默认禁用。你可以使用`management.endpoints.web.exposure.include`属性来启用执行器。 -| |在设置`management.endpoints.web.exposure.include`之前,请确保暴露的执行器不包含敏感信息,通过将它们放置在防火墙后面来进行安全保护,或者通过 Spring 安全性之类的方法进行安全保护。| +| |在设置`management.endpoints.web.exposure.include`之前,请确保暴露的执行器不包含敏感信息,通过将它们放置在防火墙后面来进行安全保护,或者通过 Spring 之类的安全性来进行安全保护。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果 Spring 安全性在 Classpath 上,并且不存在其他`WebSecurityConfigurerAdapter`或`SecurityFilterChain` Bean,则除`/health`以外的所有致动器都由 Spring 引导自动配置来保护。如果你定义了自定义的`WebSecurityConfigurerAdapter`或`SecurityFilterChain` Bean, Spring 引导自动配置就会后退,并允许你完全控制执行器访问规则。 如果你希望为 HTTP 端点配置自定义安全性(例如,仅允许具有特定角色的用户访问它们), Spring Boot 提供了一些方便的`RequestMatcher`对象,你可以将这些对象与 Spring 安全性结合使用。 -Spring 典型的安全配置可能类似于以下示例: +典型的 Spring 安全配置可能类似于以下示例: ``` import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; @@ -283,12 +283,12 @@ public class MySecurityConfiguration { ``` -| |在上述两个示例中,配置仅适用于执行器端点。
由于 Spring boot 的安全配置在存在任何`SecurityFilterChain` Bean 的情况下完全退缩,你需要配置一个附加的`SecurityFilterChain` Bean,其规则适用于应用程序的其余部分。| +| |在上述两个示例中,配置仅适用于执行器端点。
由于 Spring boot 的安全配置在存在任何`SecurityFilterChain` Bean 的情况下完全退缩,因此需要配置一个附加的`SecurityFilterChain` Bean,其规则适用于应用程序的其余部分。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.3.1.跨站点请求伪造保护 -由于 Spring 启动依赖于 Spring 安全性的默认值,因此 CSRF 保护在默认情况下是打开的。这意味着要求执行器端点`POST`(关机和记录器端点)、`PUT`或`DELETE`的端点在使用默认安全配置时会得到 403(禁止)错误。 +由于 Spring boot 依赖于 Spring Security 的默认值,因此 CSRF 保护在默认情况下是打开的。这意味着要求执行器端点`POST`(关机和记录器端点)、`PUT`或`DELETE`的端点在使用默认安全配置时会得到 403(禁止)错误。 | |我们建议仅当你正在创建一个由非浏览器客户端使用的服务时,才完全禁用 CSRF 保护。| |---|-------------------------------------------------------------------------------------------------------------------------| @@ -366,7 +366,7 @@ management: 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)。| +| |参见[`CorsEndpoint属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator-autofigure/SRC/main/java/org/springframework/boot/actuate/autofigure/endpoint/web/corsendpointproperties.java)以获取完整的选项列表。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 2.7.实现自定义端点 @@ -387,7 +387,7 @@ public CustomData getData() { 你可以使用`@EndpointWebExtension`和`@EndpointJmxExtension`来编写特定于技术的扩展。这些注释允许你提供特定于技术的操作,以增强现有的端点。 -最后,如果需要访问特定于 Web Framework 的功能,则可以实现 Servlet 或 Spring `@Controller`和`@RestController`端点,代价是它们不能在 JMX 上或在使用不同的 Web 框架时可用。 +最后,如果需要访问特定于 Web Framework 的功能,则可以实现 Servlet 或 Spring `@Controller`和`@RestController`端点,但代价是它们不能在 JMX 上或在使用不同的 Web 框架时可用。 #### 2.7.1.接收输入 @@ -415,7 +415,7 @@ public void updateData(String name, int counter) { | |由于端点与技术无关,因此只能在方法签名中指定简单的类型。
特别是,声明带有`CustomData`类型的单个参数,该类型定义了`name`和`counter`属性,不受支持。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |为了让输入映射到操作方法的参数,实现端点的 Java 代码应该使用`-parameters`进行编译, Kotlin 实现端点的代码应该用`-java-parameters`编译。
如果你使用 Spring boot 的 Gradle 插件,或者如果你使用 Maven 和`spring-boot-starter-parent`,这将自动发生。| +| |为了让输入映射到操作方法的参数,实现端点的 Java 代码应该使用`-parameters`进行编译,实现端点的代码应该用`-java-parameters`编译。
如果你使用 Spring boot 的 Gradle 插件,或者如果你使用 Maven 和`spring-boot-starter-parent`,这将自动发生。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### 输入类型转换 @@ -475,15 +475,15 @@ public void updateData(String name, int counter) { ##### Web 端点安全 -在 Web 端点或特定于 Web 的端点扩展上的操作可以接收当前的`java.security.Principal`或`org.springframework.boot.actuate.endpoint.SecurityContext`作为方法参数。前者通常与`@Nullable`结合使用,以为经过身份验证的和未经身份验证的用户提供不同的行为。后者通常通过使用其`isUserInRole(String)`方法来执行授权检查。 +在 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`注释。 +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`注释。 +可以使用`@ControllerEndpoint`和`@RestControllerEndpoint`来实现仅由 Spring MVC 或 Spring WebFlux 公开的端点。方法通过使用 Spring MVC 和 Spring WebFlux 的标准注释进行映射,例如`@RequestMapping`和`@GetMapping`,并使用端点的 ID 作为路径的前缀。控制器端点提供了与 Spring 的 Web 框架的更深入集成,但以牺牲可移植性为代价。只要有可能,就应该首选`@Endpoint`和`@WebEndpoint`注释。 ### 2.8.健康信息 @@ -492,15 +492,15 @@ Servlet 可以通过实现一个用`@ServletEndpoint`注释的类公开为端点 | Name |说明| |-----------------|-------------------------------------------------------------------------------------------------------------------------------| | `never` |细节从未显示。| -|`when-authorized`|详细信息仅向授权用户显示。
授权角色可以通过使用`management.endpoint.health.roles`进行配置。| +|`when-authorized`|详细信息仅显示给授权用户。
授权角色可以通过使用`management.endpoint.health.roles`进行配置。| | `always` |详细信息将向所有用户显示。| -默认值为`never`。当用户处于端点的一个或多个角色中时,该用户被视为获得授权。如果端点没有配置的角色(默认值),则所有经过身份验证的用户都被认为是经过授权的。你可以使用`management.endpoint.health.roles`属性来配置角色。 +默认值为`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`,并且还可以编写自己的。 +健康信息是从一个[`HealthContributorRegistry`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/java/org/org/org/org/org/SpringtorFramework/boot/Actuate/health/HealthtorRegistry.java)的内容中收集的(默认情况下,所有[在前面的示例中,健康信息在名为`my`的条目中可用。| +| |给定的`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`配置属性来配置默认实现。 +除了 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/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/org/springframework/boot/actuate/actuate/health/statusaggregator.javator.java)接口的自定义实现,或者你必须使用如果你需要注册一个常规的`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`实现的示例: +要从反应性 API 提供自定义的健康信息,你可以注册实现[`ReactiveHealthIndicator`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/org/springframework/boot/actuate/actuate/healthindicator.java)接口的 Spring bean。下面的代码显示了`ReactiveHealthIndicator`实现的示例: ``` import reactor.core.publisher.Mono; @@ -673,12 +673,12 @@ public class MyReactiveHealthIndicator implements ReactiveHealthIndicator { | 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. | +| `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/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/actuate/couchbase/couchbase/couchbasereactivehealthindicator.jav| Checks that a Couchbase cluster is up. | +|`elasticsearch`|[`ElasticsearchReactiveHealthIndicator`](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/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/actuate/mongo/mongoreactivehealthindicator.java)| Checks that a Mongo database is up. | +| `neo4j` |[`Neo4jReactiveHealthIndicator`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/org/springframework/boot/actuate/actuate/NEO4j/NEO4jreactivehealthindicator.java)| Checks that a Neo4j database is up. | +| `redis` |[`RedisReactiveHealthIndicator`](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`都会自动包装。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------| @@ -759,14 +759,14 @@ management: | |如果需要注册自定义`StatusAggregator`或`HttpCodeStatusMapper`bean 以用于组,则可以使用`@Qualifier("groupname")`bean。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------| -健康组也可以包括/排除`CompositeHealthContributor`。你也可以只包含/排除`CompositeHealthContributor`中的某个组件。这可以使用组件的完全限定名称来完成,如下所示: +健康组还可以包括/排除`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`组之外。 +在上面的示例中,`custom`组将包括名为`HealthContributor`的`primary`,这是组合`test`的一个组件。在这里,`primary`本身是一个组合,而名称为`b`的`HealthContributor`将被排除在`custom`组之外。 可以在主端口或管理端口的附加路径上提供健康组。这在 Kubernetes 等云环境中很有用,在这种环境中,出于安全目的,对执行器端点使用单独的管理端口是很常见的。拥有一个单独的端口可能会导致不可靠的健康检查,因为即使健康检查成功,主应用程序也可能无法正常工作。可以将健康组配置为以下附加路径: @@ -784,7 +784,7 @@ management.endpoint.health.group.live.additional-path="server:/healthz" 部署在 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 探针公开。 +默认情况下, Spring boot 管理你的[应用程序可用性状态](features.html#features.spring-application.application-availability)。如果部署在 Kubernetes 环境中,致动器将从`ApplicationAvailability`接口收集“活性”和“就绪”信息,并在专用[健康指标](#actuator.endpoints.health.auto-configured-health-indicators)中使用该信息:`LivenessStateHealthIndicator`和`ReadinessStateHealthIndicator`。这些指标显示在全球健康端点(`"/actuator/health"`)上。通过使用[健康团体](#actuator.endpoints.health.groups):`"/actuator/health/liveness"`和`"/actuator/health/readiness"`,它们也可以作为单独的 HTTP 探针公开。 然后,你可以使用以下端点信息来配置 Kubernetes 基础架构: @@ -804,7 +804,7 @@ readinessProbe: periodSeconds: ... ``` -| |``应该设置为执行器端点可用的端口。
如果`"management.server.port"`属性已设置,它可以是主 Web 服务器端口或单独的管理端口。| +| |``应该设置为执行器端点可用的端口。
如果`"management.server.port"`属性已设置,则它可以是主 Web 服务器端口或单独的管理端口。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 只有当应用程序[在 Kubernetes 环境中运行](deployment.html#deployment.cloud.kubernetes)时,这些健康组才会自动启用。你可以通过使用`management.endpoint.health.probes.enabled`配置属性在任何环境中启用它们。 @@ -812,7 +812,7 @@ readinessProbe: | |如果一个应用程序的启动时间超过了配置的活动周期,Kubernetes 提到`"startupProbe"`是一个可能的解决方案。
这里不一定需要`"startupProbe"`,因为`"readinessProbe"`在完成所有启动任务之前都会失败。参见描述[探针在应用程序生命周期中的行为](#actuator.endpoints.kubernetes-probes.lifecycle)的部分。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果你的执行器端点部署在单独的管理上下文中,那么端点不使用与主应用程序相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序不能正常工作(例如,它不能接受新的连接),探测检查也可能是成功的。出于这个原因,在主服务器端口上提供`liveness`和`readiness`健康组是一个好主意。这可以通过设置以下属性来完成: +如果你的执行器端点部署在单独的管理上下文中,那么端点不使用与主应用程序相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序不能正常工作(例如,它不能接受新的连接),探测检查也可能是成功的。出于这个原因,在主服务器端口上启用`liveness`和`readiness`健康组是一个好主意。这可以通过设置以下属性来完成: ``` management.endpoint.health.probes.add-additional-paths=true @@ -845,16 +845,16 @@ management: “活性”调查不应依赖于外部系统的健康检查。如果[应用程序的活性状态](features.html#features.spring-application.application-availability.liveness)被破坏,Kubernetes 将尝试通过重新启动应用程序实例来解决该问题。这意味着,如果外部系统(例如数据库、Web API 或外部缓存)发生故障,Kubernetes 可能会重新启动所有应用程序实例并产生级联故障。 -至于“就绪”调查,检查外部系统的选择必须由应用程序开发人员仔细做出。出于这个原因, Spring Boot 不包括在准备状态探测中的任何额外的健康检查。如果[应用程序实例的准备状态](features.html#features.spring-application.application-availability.readiness)未准备好,则 Kubernetes 不会将通信量路由到该实例。一些外部系统可能不会被应用程序实例共享,在这种情况下,它们可能会被包含在就绪状态探测中。其他外部系统可能对应用程序不是必需的(应用程序可能有断路器和后备),在这种情况下,它们绝对不应该被包含。不幸的是,所有应用程序实例共享的外部系统是常见的,你必须做出判断:将其纳入准备状态调查,并期望当外部服务关闭或将其排除在外时,应用程序将退出服务,并处理堆栈中更高的故障,也许通过在呼叫者中使用断路器。 +至于“就绪”调查,检查外部系统的选择必须由应用程序开发人员仔细做出。出于这个原因, Spring 引导不包括在准备状态探测中的任何额外的健康检查。如果[应用程序实例的准备状态](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 两种情况下都很有可能发生。| +| |如果应用程序的所有实例都没有准备好,那么带有`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/),它可能会对从负载均衡器取出的应用程序做出不同的反应,这取决于它的自动定标器配置。 +此外,如果一个应用程序使用 Kubernetes[自动缩放](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/),它可能会对从负载均衡器取出的应用程序做出不同的反应,这取决于它的自动定标器配置。 #### 2.9.2.应用程序生命周期和探测状态 -Kubernetes Probes 支持的一个重要方面是它与应用程序生命周期的一致性。在`AvailabilityState`(这是应用程序在内存中的内部状态)和实际的探测(公开该状态)之间存在显著差异。根据应用程序生命周期的阶段,探测可能不可用。 +Kubernetes Probes 支持的一个重要方面是它与应用程序生命周期的一致性。在`AvailabilityState`(这是应用程序在内存中的内部状态)和实际的探测(它公开了该状态)之间存在显著差异。根据应用程序生命周期的阶段,探测可能不可用。 Spring 引导发布[启动和关闭过程中的应用程序事件](features.html#features.spring-application.application-events-and-listeners),并且探测可以侦听这样的事件并公开`AvailabilityState`信息。 @@ -881,7 +881,7 @@ Spring 引导发布[启动和关闭过程中的应用程序事件](features.html ### 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。 +应用程序信息公开了从所有[`InfoContributor`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/org/org/springframework/boot/actuate/actuate/info/infrocontributor.java)bean 中收集的各种信息,这些 bean 定义在你的.enabled`属性控制。不同的贡献者对此属性有不同的默认值,这取决于他们的先决条件和他们公开的信息的性质。 -由于没有先决条件来表明应该启用它们,`env`和`java`贡献者默认情况下是禁用的。你可以通过将`management.info.env.enabled`或`management.info.java.enabled`属性设置为`true`来启用它们。 +由于没有先决条件表明应该启用它们,`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`文件添加以下设置: +当`env`contributor 被启用时,你可以通过设置`info.*` Spring 属性来定制由`info`端点公开的数据。在`info`键下的所有`Environment`属性都会自动公开。例如,你可以在`application.properties`文件中添加以下设置: 属性 @@ -923,14 +923,14 @@ info: target: "11" ``` -| |而不是硬编码这些值,你也可以[在构建时展开信息属性](howto.html#howto.properties-and-configuration.expand-properties),

假设你使用 Maven,你可以将前面的示例改写如下:

属性

``
[电子邮件受保护]@
[电子邮件受保护]@
<
<>><<<<>>>>><<590">>>><<<<>>>>>>>><<<<<>>>>>>>>>><<<<<<<<>>>>>>>>>>>>>>>><<<<<<| +| |而不是硬编码这些值,你也可以[在构建时展开信息属性](howto.html#howto.properties-and-configuration.expand-properties)。

假设你使用 Maven,你可以将前面的示例重写如下:

属性


593<582">>>| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.10.3.Git 提交信息 -`info`端点的另一个有用的特性是,它能够在构建项目时发布有关你的`git`源代码库状态的信息。如果`Git属性` Bean 是可用的,则可以使用`info`端点来公开这些属性。 +`info`端点的另一个有用特性是,它能够在构建项目时发布有关你的`git`源代码库状态的信息。如果`Git属性` Bean 是可用的,则可以使用`info`端点来公开这些属性。 -| |如果`Git属性` Bean 的根目录下有`git.properties`文件,则`Git属性`是自动配置的。
有关更多详细信息,请参见“[如何生成 Git 信息](howto.html#howto.build.generate-git-info)”。| +| |如果`git.properties`文件在 Classpath 的根目录下可用,则`Git属性` Bean 是自动配置的。
有关更多详细信息,请参见“[如何生成 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`属性,如下所示: @@ -976,11 +976,11 @@ management: #### 2.10.5.Java 信息 -`info`端点发布有关你的 Java 运行时环境的信息,有关更多详细信息,请参见[`JavaInfo`](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/info/JavaInfo.html)。 +`info`端点发布有关你的 Java 运行时环境的信息,有关更多详细信息,请参见[`JavaInfo`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/info/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。 +要提供自定义的应用程序信息,你可以注册实现[`InfoContributor`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/org/springframework/boot/actuate/actuate/info/info/infutor.java)接口的 Spring bean。 下面的示例以单个值贡献一个`example`条目: @@ -1015,7 +1015,7 @@ public class MyInfoContributor implements InfoContributor { ## 3. 基于 HTTP 的监控和管理 -如果你正在开发一个 Web 应用程序, Spring Boot Actuator 会自动配置所有启用的端点,以便通过 HTTP 公开。默认的约定是使用前缀`/actuator`的端点的`id`作为 URL 路径。例如,`health`被暴露为`/actuator/health`。 +如果你正在开发一个 Web 应用程序, Spring Boot Actuator 自动配置所有启用的端点,以便通过 HTTP 公开。默认的约定是使用前缀`/actuator`的端点的`id`作为 URL 路径。例如,`health`被暴露为`/actuator/health`。 | |Spring MVC、 Spring WebFlux 和 Jersey 原生地支持致动器。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。| |---|------------------------------------------------------------------------------------------------------------------------------------------------| @@ -1044,7 +1044,7 @@ management: 前面的`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`。| +| |除非管理端口已被配置为[使用不同的 HTTP 端口公开端点](#actuator.monitoring.customizing-management-server-port),否则`management.endpoints.web.base-path`相对于`server.servlet.context-path`(对于 Servlet Web 应用程序)或`spring.webflux.base-path`(对于反应性 Web 应用程序)。
如果配置了`management.server.port`,则`management.endpoints.web.base-path`相对于`management.server.base-path`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果希望将端点映射到不同的路径,可以使用`management.endpoints.web.path-mapping`属性。 @@ -1094,7 +1094,7 @@ management: ### 3.3.配置特定于管理的 SSL -当配置为使用自定义端口时,你还可以通过使用各种`management.server.ssl.*`属性来配置具有自己的 SSL 的管理服务器。例如,这样做可以让管理服务器在 HTTP 上可用,而主应用程序使用 HTTPS,如下列属性设置所示: +当配置为使用自定义端口时,你还可以通过使用各种`management.server.ssl.*`属性,将管理服务器配置为它自己的 SSL。例如,这样做可以让管理服务器在 HTTP 上可用,而主应用程序使用 HTTPS,如下列属性设置所示: 属性 @@ -1158,9 +1158,9 @@ management: ### 3.4.自定义管理服务器地址 -你可以通过设置`management.server.address`属性来定制管理端点可用的地址。如果你只想监听内部或面向 Ops 的网络,或者只监听来自`localhost`的连接,那么这样做是有用的。 +你可以通过设置`management.server.address`属性来定制管理端点可用的地址。如果你只想监听内部或面向 Ops 的网络,或者只监听`localhost`中的连接,那么这样做会很有用。 -| |只有当端口与主服务器端口不同时,你才可以在不同的地址上进行侦听。| +| |只有当端口与主服务器端口不同时,你才可以在不同的地址上监听。| |---|-------------------------------------------------------------------------------------------| 以下示例`application.properties`不允许远程管理连接: @@ -1219,11 +1219,11 @@ management: ## 4. JMX 的监控与管理 -Java 管理扩展提供了一种标准的机制来监视和管理应用程序。默认情况下,不启用此功能。你可以通过将`spring.jmx.enabled`配置属性设置为`true`来打开它。 Spring 引导将最合适的`MBeanServer`公开为 ID 为`mbeanServer`的 Bean。你的任何带有 Spring JMX 注释(@managedresource`,`@ManagedAttribute`,或`@ManagedOperation`)的 bean 都会暴露给它。 +Java 管理扩展提供了一种标准的机制来监视和管理应用程序。默认情况下,不启用此功能。你可以通过将`spring.jmx.enabled`配置属性设置为`true`来打开它。 Spring 引导将最合适的`MBeanServer`公开为具有`mbeanServer`的 ID 的 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)类。 +参见[`JmxAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/jmx/jmxautofconfiguration.java)类获取更多详细信息。 默认情况下, Spring 引导还将管理端点作为`org.springframework.boot`域下的 JMXMBeans 公开。要完全控制 JMX 域中的端点注册,请考虑注册你自己的`EndpointObjectNameFactory`实现。 @@ -1276,7 +1276,7 @@ management: ### 4.3.在 HTTP 上使用 Jolokia 进行 JMX -Jolokia 是一个 JMX-HTTP 桥,它提供了一种访问 JMX Bean 的替代方法。若要使用 Jolokia,请包含对`org.jolokia:jolokia-core`的依赖关系。例如,在 Maven 中,你将添加以下依赖项: +Jolokia 是一个 JMX-HTTP 桥,它提供了一种访问 JMX Bean 的替代方法。若要使用 Jolokia,请包含对`org.jolokia:jolokia-core`的依赖关系。例如,对于 Maven,你将添加以下依赖项: ``` @@ -1287,12 +1287,12 @@ Jolokia 是一个 JMX-HTTP 桥,它提供了一种访问 JMX Bean 的替代方 然后,你可以通过向`management.endpoints.web.exposure.include`属性添加`jolokia`或`*`来公开 Jolokia 端点。然后,你可以使用管理 HTTP 服务器上的`/actuator/jolokia`访问它。 -| |Jolokia 端点将 Jolokia 的 Servlet 公开为执行器端点。结果,它是特定于 Servlet 环境的,例如 Spring MVC 和 Jersey。端点在 WebFlux 应用程序中是不可用的。| +| |Jolokia 端点将 Jolokia 的 Servlet 公开为执行器端点。
结果,它是特定于 Servlet 环境的,例如 Spring MVC 和 Jersey。
端点在 WebFlux 应用程序中是不可用的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 4.3.1.定制 Jolokia -Jolokia 有许多设置,你通常会通过设置 Servlet 参数来配置这些设置。通过 Spring 引导,你可以使用`application.properties`文件。要这样做,请在参数前缀`management.endpoint.jolokia.config.`,如下例所示: +Jolokia 有许多设置,你通常会通过设置 Servlet 参数来配置这些设置。通过 Spring 引导,你可以使用你的`application.properties`文件。要这样做,请在参数前缀`management.endpoint.jolokia.config.`,如下例所示: 属性 @@ -1312,7 +1312,7 @@ management: #### 4.3.2.禁用 Jolokia -如果你使用 Jolokia,但不希望 Spring Boot 对其进行配置,请将`management.endpoint.jolokia.enabled`属性设置为`false`,如下所示: +如果你使用 Jolokia,但不希望 Spring 引导来配置它,请将`management.endpoint.jolokia.enabled`属性设置为`false`,如下所示: 属性 @@ -1329,7 +1329,7 @@ management: enabled: false ``` -## 5. 伐木工 +## 5. 日志记录器 Spring 启动执行器包括在运行时查看和配置应用程序的日志级别的能力。你可以查看整个列表,也可以查看单个日志程序的配置,该配置由显式配置的日志级别以及日志框架赋予它的有效日志级别组成。这些级别可以是: @@ -1361,12 +1361,12 @@ Spring 启动执行器包括在运行时查看和配置应用程序的日志级 } ``` -| |要“重置”记录器的特定级别(并使用默认配置),你可以将值`null`传递为`configuredLevel`。| +| |要“重置”记录器的特定级别(并使用默认配置),可以将值`null`传递为`configuredLevel`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------| ## 6. 度量 -Spring Boot Actuator 为[Micrometer](https://micrometer.io)提供依赖管理和自动配置,这是一个支持[众多的监测系统](https://micrometer.io/docs)的应用程序度量外观,包括: +Spring Boot Actuator 为[Micrometer](https://micrometer.io)提供依赖管理和自动配置,这是一种支持[众多的监测系统](https://micrometer.io/docs)的应用程序度量外观,包括: * [AppOptics](#actuator.metrics.export.appoptics) @@ -1409,9 +1409,9 @@ Spring Boot Actuator 为[Micrometer](https://micrometer.io)提供依赖管理和 ### 6.1.开始 -Spring 引导自动配置组合`MeterRegistry`,并为其在 Classpath 上找到的每个受支持的实现向组合添加注册表。在运行时 Classpath 中对`micrometer-registry-{system}`具有依赖关系就足以使 Spring 引导配置注册表。 +Spring 引导自动配置组合`MeterRegistry`,并为其在 Classpath 上找到的每个支持的实现向组合添加注册表。在运行时 Classpath 中对`micrometer-registry-{system}`具有依赖关系就足以使 Spring 引导配置注册表。 -大多数注册中心都有共同的特征。例如,可以禁用特定的注册中心,即使在 Classpath 上实现了微米注册中心。以下示例禁用 Datadog: +大多数注册中心都有共同的特征。例如,即使在 Classpath 上的微米表注册实现也可以禁用特定的注册中心。以下示例禁用 Datadog: 属性 @@ -1449,7 +1449,7 @@ management: Spring Boot 还将任何自动配置的注册中心添加到`Metrics`类上的全局静态复合注册中心,除非你明确地告诉它不要: -Properties +属性 ``` management.metrics.use-global-registry=false @@ -1511,7 +1511,7 @@ public class MyMeterRegistryConfiguration { ``` -Spring 还可以启动[配置内置的仪表](#actuator.metrics.supported),你可以通过配置或专用的注释标记对其进行控制。 +Spring 还可以启动[配置内置的仪表](#actuator.metrics.supported),这可以通过配置或专用注释标记来控制。 ### 6.2.支持的监测系统 @@ -1521,7 +1521,7 @@ Spring 还可以启动[配置内置的仪表](#actuator.metrics.supported),你 默认情况下,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 @@ -1539,7 +1539,7 @@ management: #### 6.2.2.阿特拉斯 -默认情况下,指标导出到在本地机器上运行的[Atlas](https://micrometer.io/docs/registry/atlas)。你可以提供[Atlas server](https://github.com/Netflix/atlas)的位置: +默认情况下,指标导出到在本地机器上运行的[Atlas](https://micrometer.io/docs/registry/atlas)。你可以提供[Atlas 服务器](https://github.com/Netflix/atlas)的位置: Properties @@ -1597,15 +1597,15 @@ management: #### 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`。 +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 你可以通过两种方式使用 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 在主机上运行,则度量指标将自动导出到[本地一个代理摄取端点](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`): +如果没有运行本地 OneAgent,则需要[Metrics V2API](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/)必须具有“摄入指标”(`metrics.ingest`)权限集。我们建议将令牌的范围限制为这个权限。你必须确保端点 URI 包含以下路径(例如,`/api/v2/metrics/ingest`): 根据你的部署选项,Metrics API v2Ingest 端点的 URL 是不同的: @@ -1715,11 +1715,11 @@ management: step: "30s" ``` -你可以在[千分尺文档](https://micrometer.io/docs/registry/dynatrace)中找到有关如何设置 Dynatrace 千分尺出口商的更多信息。 +你可以在[千分尺文档](https://micrometer.io/docs/registry/dynatrace)中找到有关如何为千分尺设置 Dynatrace Exporter 的更多信息。 #### 6.2.5.弹性 -默认情况下,指标导出到在本地机器上运行的[Elastic](https://micrometer.io/docs/registry/elastic)。可以使用以下属性提供要使用的 Elastic 服务器的位置: +默认情况下,指标导出到在本地机器上运行的[Elastic](https://micrometer.io/docs/registry/elastic)。你可以使用以下属性提供要使用的 Elastic 服务器的位置: 属性 @@ -1739,7 +1739,7 @@ management: #### 6.2.6.神经节 -默认情况下,指标导出到在本地机器上运行的[Ganglia](https://micrometer.io/docs/registry/ganglia)。你可以提供[Ganglia server](http://ganglia.sourceforge.net)主机和端口,如下例所示: +默认情况下,指标导出到在本地机器上运行的[Ganglia](https://micrometer.io/docs/registry/ganglia)。你可以提供[Ganglia 服务器](http://ganglia.sourceforge.net)主机和端口,如下例所示: 属性 @@ -1761,7 +1761,7 @@ management: #### 6.2.7.石墨 -默认情况下,指标导出到在本地机器上运行的[Graphite](https://micrometer.io/docs/registry/graphite)。你可以提供[Graphite server](https://graphiteapp.org)主机和端口,如下例所示: +默认情况下,指标导出到在本地机器上运行的[Graphite](https://micrometer.io/docs/registry/graphite)。你可以提供[石墨服务器](https://graphiteapp.org)主机和端口,如下例所示: 属性 @@ -1783,7 +1783,7 @@ management: 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.....
<”<<<<<>>| +| |要控制此行为,请定义你的`GraphiteMeterRegistry`并提供你自己的`HierarchicalNameMapper`。
提供自动配置的`GraphiteConfig`和`Clock`bean,除非你定义自己的:

| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 6.2.8.Humio @@ -1829,7 +1829,7 @@ management: #### 6.2.9.涌入 -默认情况下,指标将导出到使用默认配置在本地计算机上运行的[Influx](https://micrometer.io/docs/registry/influx)V1 实例。要将指标导出到 InfluxDB V2,请配置`org`、`bucket`以及用于编写指标的身份验证`token`。你可以通过以下方式提供要使用的[Influx server](https://www.influxdata.com)的位置: +默认情况下,指标将导出到使用默认配置在本地计算机上运行的[Influx](https://micrometer.io/docs/registry/influx)V1 实例。要将指标导出到 InfluxDB V2,请配置`org`、`bucket`以及用于编写指标的身份验证`token`。你可以通过以下方式提供要使用的[influg 服务器](https://www.influxdata.com)的位置: 属性 @@ -1867,14 +1867,14 @@ management: domain: "com.example.app.metrics" ``` -Micrometer 提供了一个默认的`HierarchicalNameMapper`,它控制着维度表 ID 的大小[映射到平面层次结构名称](https://micrometer.io/docs/registry/jmx#_hierarchical_name_mapping)。 +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;长任务计时器需要一个单独的度量名称,并且可以堆叠一个短任务计时器。| +| |带有`@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)。 +自动配置寄存器`MicrometerCommandLatencyRecorder`用于自动配置的`LettuceConnectionFactory`。有关更多详细信息,请参见生菜文档的[千分尺计量部分](https://lettuce.io/core/6.1.6.RELEASE/reference/index.html#command.latency.metrics.micrometer)。 ### 6.4.注册自定义度量 @@ -2663,14 +2663,14 @@ public class MyMeterBinderConfiguration { 使用`MeterBinder`可以确保设置了正确的依赖关系,并且在检索到度量值时 Bean 是可用的。如果你发现你在组件或应用程序之间反复测试一套度量标准,那么`MeterBinder`实现也会很有用。 -| |默认情况下,来自所有`Connector`bean 的指标都会自动绑定到 Spring 管理的。| +| |默认情况下,来自所有`MeterBinder`bean 的指标都会自动绑定到 Spring 管理的`MeterRegistry`。| |---|---------------------------------------------------------------------------------------------------------------| ### 6.5.自定义单个指标 如果需要对特定的`Meter`实例应用自定义,则可以使用`io.micrometer.core.instrument.config.MeterFilter`接口。 -例如,如果要将`percentiles-histogram`标记重命名为`mytag.area`,以`com.example`开头的所有仪表 ID,可以执行以下操作: +例如,如果你想将`mytag.region`标记重命名为`mytag.area`,用于所有以`com.example`开头的仪表 ID,那么你可以执行以下操作: ``` import io.micrometer.core.instrument.config.MeterFilter; @@ -2690,7 +2690,7 @@ public class MyMetricsFilterConfiguration { ``` -| |默认情况下,所有`MeterFilter`bean 都自动绑定到 Spring 管理的`MeterRegistry`。
确保通过使用 Spring 管理的`MeterRegistry`来注册你的度量,而不是使用`Metrics`上的任何静态方法。
这些方法使用的是不是 Spring 管理的全局注册中心。| +| |默认情况下,所有`MeterFilter`bean 都自动绑定到 Spring-managed`MeterRegistry`。
确保通过使用 Spring-managed 的`MeterRegistry`来注册你的度量,而不是使用`Metrics`上的任何静态方法。
这些方法使用不是 Spring-managed 的全局注册中心。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 6.5.1.公共标签 @@ -2721,7 +2721,7 @@ management: #### 6.5.2.每米属性 -除了`MeterFilter`bean 之外,你还可以通过使用属性在每米的基础上应用一组有限的定制。每表自定义应用于以给定名称开始的任何表 ID。下面的示例禁用 ID 为`server.ssl.enabled`的任何仪表。 +除了`MeterFilter`bean 之外,你还可以通过使用属性在每米的基础上应用一组有限的定制。每表自定义应用于以给定名称开始的任何表 ID。下面的示例禁用 ID 为的任何仪表。 属性 @@ -2747,50 +2747,50 @@ management: | `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.expiry`, `management.metrics.distribution.buffer-length` |通过在可配置的缓冲区长度
后旋转的环缓冲区中积累最近的样本,从而赋予它们更大的权重。| | `management.metrics.distribution.slo` |使用由你的服务级别目标定义的桶发布累积直方图。| -有关`percentiles-histogram`、`percentiles`和`percentiles`背后的概念的更多详细信息,请参见千分尺文档的[“直方图和百分位”部分](https://micrometer.io/docs/concepts#_histograms_and_percentiles)。 +有关`percentiles-histogram`、`percentiles`和`slo`背后的概念的更多详细信息,请参见千分尺文档的[“直方图和百分位”部分](https://micrometer.io/docs/concepts#_histograms_and_percentiles)。 ### 6.6.指标端点 -Spring Boot 提供了一个`metrics`端点,你可以诊断地使用该端点来检查应用程序收集的指标。默认情况下端点不可用,必须公开。有关更多详细信息,请参见[公开端点](#actuator.endpoints.exposing)。 +Spring 引导提供了一个`metrics`端点,你可以诊断地使用该端点来检查应用程序收集的指标。默认情况下端点不可用,必须公开。有关更多详细信息,请参见`MeterBinder`。 -导航到`/actuator/metrics`将显示可用的仪表名称列表。你可以向下钻取以查看有关特定仪表的信息,方法是将其名称提供为选择器——例如,[公开端点](#actuator.endpoints.exposing)。 +导航到`/actuator/metrics`将显示可用的仪表名称列表。你可以向下钻取以查看有关特定仪表的信息,方法是将其名称提供为选择器——例如,`/actuator/metrics/jvm.memory.max`。 -| |你在这里使用的名称应该与代码中使用的名称相匹配,而不是与它已被用于所运到的监视系统的命名约定规范化之后的名称相匹配,换句话说,在前面的示例中,返回的`Value`统计值是“代码缓存”、“压缩类空间”的最大内存足迹的总和,以及堆的“元空间”区域。
如果你只想看到“元空间”的最大大小,则可以添加一个额外的`tag=id:Metaspace`,即`/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace`。| +| |报告的测量值是所有与仪表名称匹配的仪表的统计数据的*总和*,以及已应用的任何标记,
在前面的示例中,返回的`Value`统计数据是“代码缓存”、“压缩类空间”的最大内存足迹的总和,以及堆的“元空间”区域。
如果你只想看到“元空间”的最大大小,则可以添加一个额外的`tag=id:Metaspace`,即`/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 7. 审计 -一旦 Spring 安全性发挥作用, Spring 启动执行器具有灵活的审计框架,该框架发布事件(默认情况下,“身份验证成功”、“失败”和“拒绝访问”异常)。这个特性对于报告和实现基于身份验证失败的锁定策略非常有用。 +一旦 Spring 安全性发挥作用, Spring 启动执行器具有一个灵活的审计框架,该框架发布事件(默认情况下,“身份验证成功”、“失败”和“拒绝访问”异常)。这个特性对于报告和实现基于身份验证失败的锁定策略非常有用。 -你可以通过在应用程序的配置中提供类型的 Bean 来启用审核。 Spring 为了方便起见,Boot 提供了`InMemoryAuditEventRepository`。InmemoryAuditeVentrepository’的功能有限,我们建议仅在开发环境中使用它。对于生产环境,考虑创建你自己的替代`AuditEventRepository`实现。 +你可以通过在应用程序的配置中提供`AuditEventRepository`类型的 Bean 来启用审核。为了方便起见, Spring Boot 提供了`InMemoryAuditEventRepository`。`InMemoryAuditEventRepository`的功能有限,我们建议仅在开发环境中使用它。对于生产环境,考虑创建你自己的替代`AuditEventRepository`实现。 ### 7.1.自定义审计 要定制已发布的安全事件,你可以提供你自己的`AbstractAuthenticationAuditListener`和`AbstractAuthorizationAuditListener`的实现。 -你还可以为自己的业务事件使用审计服务。要做到这一点,可以将`AuditEventRepository` Bean 注入到你自己的组件中并直接使用它,或者使用 Spring `AuditApplicationEvent`发布`AuditApplicationEvent`(通过实现`ApplicationEventPublisherAware`)。 +你还可以为自己的业务事件使用审计服务。要做到这一点,可以将`AuditEventRepository` Bean 注入到你自己的组件中并直接使用它,或者使用 Spring `jvm.memory.max`发布`AbstractAuthenticationAuditListener`(通过实现`ApplicationEventPublisherAware`)。 -## 8. HTTP 追踪 +## 8. HTTP 跟踪 -你可以通过在应用程序的配置中提供`ApplicationEventPublisherAware`类型的 Bean 来启用 HTTP 跟踪。为了方便起见, Spring Boot 提供了`InMemoryHttpTraceRepository`,它存储了最近 100 次(默认)请求-响应交换的跟踪。与其他跟踪解决方案相比,InmemoryHttpTraceRepository’是有限的,我们建议仅在开发环境中使用它。对于生产环境,我们建议使用生产就绪的跟踪或可观察性解决方案,例如 Zipkin 或 Spring Cloud Sleuth。或者,你可以创建自己的`HttpTraceRepository`。 +你可以通过在应用程序的配置中提供`HttpTraceRepository`类型的 Bean 来启用 HTTP 跟踪。为了方便起见, Spring Boot 提供`/cloudfoundryapplication`,它存储最近 100 次(默认)请求-响应交换的跟踪。`InMemoryHttpTraceRepository`与其他跟踪解决方案相比是有限的,我们建议仅在开发环境中使用它。对于生产环境,我们建议使用生产就绪的跟踪或可观察性解决方案,例如 Zipkin 或 Spring Cloud Sleuth。或者,你可以创建自己的`HttpTraceRepository`。 你可以使用`httptrace`端点来获取有关存储在`HttpTraceRepository`中的请求-响应交换的信息。 ### 8.1.自定义 HTTP 跟踪 -要自定义每个跟踪中包含的项,请使用`management.trace.http.include`配置属性。对于高级定制,可以考虑注册自己的`HttpExchangeTracer`实现。 +要自定义每个跟踪中包含的项,请使用`management.trace.http.include`配置属性。对于高级定制,可以考虑注册你自己的`HttpExchangeTracer`实现。 ## 9. 过程监控 -在模块中,你可以找到两个类来创建通常对过程监控有用的文件: +在`spring-boot`模块中,你可以找到两个类来创建通常对过程监控有用的文件: * `ApplicationPidFileWriter`创建一个包含应用程序 PID 的文件(默认情况下,在文件名为`application.pid`的应用程序目录中)。 @@ -2814,15 +2814,15 @@ org.springframework.boot.web.context.WebServerPortFileWriter ### 9.2.以编程方式启用过程监控 -还可以通过调用`SpringApplication.addListeners(…​)`方法并传递适当的`Writer`对象来激活侦听器。这个方法还允许你在`Writer`构造函数中自定义文件名和路径。 +还可以通过调用`SpringApplication.addListeners(…​)`方法并传递适当的
对象来激活侦听器。这个方法还允许你在`Writer`构造函数中自定义文件名和路径。 ## 10. Cloud Foundry 支持 Spring Boot 的致动器模块包括额外的支持,该支持在部署到兼容的 Cloud Foundry 实例时被激活。`/cloudfoundryapplication`路径为所有`@Endpoint`bean 提供了一个可选的安全路由。 -Spring 启动执行器信息增强了扩展的支持,使 Cloud Foundry 管理 UIS(例如你可以用于查看已部署的应用程序的 Web 应用程序)得到增强。例如,应用程序状态页面可以包含完整的健康信息,而不是典型的“运行”或“停止”状态。 +Spring 启动执行器信息增强了扩展的支持,使 Cloud Foundry 管理 UIS(例如你可以用于查看已部署应用程序的 Web 应用程序)得到增强。例如,应用程序状态页面可以包含完整的健康信息,而不是典型的“运行”或“停止”状态。 -| |普通用户无法直接访问`/cloudfoundryapplication`路径。
要使用端点,必须与请求一起传递有效的 UAA 令牌。| +| |普通用户无法直接访问
路径。
要使用端点,必须与请求一起传递有效的 UAA 令牌。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------| ### 10.1.禁用扩展的 Cloud Foundry 执行器支持 @@ -2863,9 +2863,9 @@ management: ### 10.3.自定义上下文路径 -如果服务器的上下文路径已被配置为`/`以外的任何内容,则在应用程序的根目录下,Cloud Foundry 端点是不可用的。例如,如果`server.servlet.context-path=/app`,则可在`/app/cloudfoundryapplication/*`上获得 Cloud Foundry 端点。 +如果服务器的上下文路径已被配置为`application.properties`以外的任何内容,那么在应用程序的根目录下,Cloud Foundry 端点是不可用的。例如,如果`server.servlet.context-path=/app`,则可在`/app/cloudfoundryapplication/*`上获得 Cloud Foundry 端点。 -如果你希望 Cloud Foundry 端点始终在`/cloudfoundryapplication/*`上可用,那么无论服务器的上下文路径如何,你都需要在应用程序中显式地配置它。根据使用的 Web 服务器的不同,配置也会有所不同。对于 Tomcat,你可以添加以下配置: +如果你希望 Cloud Foundry 端点始终在`/cloudfoundryapplication/*`上可用,那么无论服务器的上下文路径如何,你都需要在应用程序中显式地配置它。根据所使用的 Web 服务器的不同,配置也会有所不同。对于 Tomcat,你可以添加以下配置: ``` import java.io.IOException; @@ -2929,8 +2929,8 @@ public class MyCloudFoundryConfiguration { ``` -## 11. 接下来读什么? +## 11. 接下来要读什么? 你可能想了解有关绘图工具的信息,例如[Graphite](https://graphiteapp.org)。 -否则,你可以继续阅读有关[“部署选项”](deployment.html#deployment)的内容,或者提前查看有关 Spring Boot 的[构建工具插件](build-tool-plugins.html#build-tool-plugins)的一些深入信息。 +否则,你可以继续阅读有关[“部署选项”](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 02aae6acc87f070f8e34261531c6cf1d4ecd766c..682454b0cb21c090e17833c42130acf2d6b50642 100644 --- a/docs/spring-boot/build-tool-plugins.md +++ b/docs/spring-boot/build-tool-plugins.md @@ -1,6 +1,6 @@ # 构建工具插件 -Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了各种特性,包括可执行 JAR 的打包。本节提供了有关这两个插件的更多详细信息,以及在需要扩展不受支持的构建系统时提供的一些帮助。如果你刚刚开始,你可能需要先阅读“[using.html](using.html#using.build-systems)”一节中的“[using.html](using.html#using)”。 +Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了各种特性,包括可执行 JAR 的打包。本节提供了有关这两个插件的更多详细信息,以及在需要扩展不受支持的构建系统时提供的一些帮助。如果你刚刚开始,那么你可能需要先阅读“[using.html](using.html#using.build-systems)”一节中的“[using.html](using.html#using)”。 ## 1.1 Spring 引导 Maven 插件 @@ -38,7 +38,7 @@ Spring 启动 Antlib 模块为 Apache Ant 提供了基本的 Spring 启动支持 $ ant -lib ``` -> “使用 Spring 引导”部分包括[using Apache Ant with `spring-boot-antlib`](using.html#using.build-systems.ant)的更完整示例。 +> “使用 Spring 引导”部分包括一个更完整的[使用`spring-boot-antlib`的 Apache Ant 示例](使用.html#using.build-systems. Ant)。 ### 3.1. Spring 引导 Ant 任务 @@ -50,13 +50,13 @@ $ ant -lib #### 3.1.1.使用“exejar”任务 -你可以使用`exejar`任务来创建 Spring 引导可执行文件 jar。该任务支持以下属性: +你可以使用`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)*| +|`start-class`| The main application class to run |否 *(默认值是发现的第一个类,它声明了`main`方法)*| 以下嵌套元素可与任务一起使用: @@ -67,7 +67,7 @@ $ ant -lib #### 3.1.2.例子 -本节展示了 Ant 任务的两个示例。 +本节展示了 Ant 项任务的两个示例。 指定起始类 @@ -101,7 +101,7 @@ $ ant -lib |-------------|----------------------------------------------------|-------------------------------------------| |`classesroot`|Java 类文件的根目录| Yes *(unless `mainclass` is specified)* | | `mainclass` |可用于短路`main`类搜索| No | -| `property` |应与结果一起设置的 Ant 属性|No *(result will be logged if unspecified)*| +| `property` |Ant 应与结果一起设置的属性|No *(result will be logged if unspecified)*| #### 3.2.1.例子 @@ -127,7 +127,7 @@ $ ant -lib ## 4. 支持其他构建系统 -如果你想使用 Maven、 Gradle 或 Ant 以外的构建工具,那么你可能需要开发自己的插件。可执行 JAR 需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参见附录中的“[executable jar format](executable-jar.html#appendix.executable-jar)”部分)。 +如果你希望使用 Maven、 Gradle 或 Ant 以外的构建工具,那么你可能需要开发自己的插件。可执行 JAR 需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参见附录中的“[executable jar format](executable-jar.html#appendix.executable-jar)”部分)。 Spring boot Maven 和 Gradle 插件都使用`spring-boot-loader-tools`来实际生成 JAR。如果需要,可以直接使用这个库。 @@ -143,7 +143,7 @@ Spring boot Maven 和 Gradle 插件都使用`spring-boot-loader-tools`来实际 ### 4.3.寻找主类 -如果你不使用`Repackager.setMainClass()`来指定主类,则 Repackager 将使用[ASM](https://asm.ow2.io/)来读取类文件,并尝试使用`public static void main(String[] args)`方法找到合适的类。如果发现一个以上的候选者,将抛出一个异常。 +如果你没有使用`Repackager.setMainClass()`来指定主类,那么 Repackager 将使用[ASM](https://asm.ow2.io/)来读取类文件,并尝试使用`public static void main(String[] args)`方法找到合适的类。如果发现一个以上的候选者,将抛出一个异常。 ### 4.4.示例重新打包实现 @@ -184,9 +184,9 @@ public class MyBuildTool { ``` -## 5. 接下来读什么? +## 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)中进行了介绍。 +如果你对构建工具插件的工作方式感兴趣,可以查看 Github 上的[`spring-boot-tools`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-tools)模块。可执行 jar 格式的更多技术细节在[附录](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 ded130be9f70936134fde8b630e530c9815c0cd4..8f19b95ba594e7328498c4dd944c0bb7311c1c6b 100644 --- a/docs/spring-boot/cli.md +++ b/docs/spring-boot/cli.md @@ -1,10 +1,10 @@ # Spring 引导 CLI -Spring 引导 CLI 是一个命令行工具,如果你想快速开发 Spring 应用程序,可以使用它。它允许你运行 Groovy 脚本,这意味着你有一个熟悉的类似 Java 的语法,而不需要那么多样板代码。你还可以引导一个新项目,或者为它编写自己的命令。 +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)*。 +可以使用 SDKMAN 手动安装 Spring boot cli(命令行界面)!(SDK 管理器),或者如果你是 OSX 用户,则使用 Homebrew 或 MacPorts。有关全面的安装说明,请参见“入门”部分中的 *[getting-started.html](getting-started.html#getting-started.installing.cli)*。 ## 2. 使用 CLI @@ -23,7 +23,7 @@ Available commands are: _... more command help is shown here_ ``` -你可以键入`spring help`来获得有关任何支持的命令的更多详细信息,如以下示例所示: +你可以键入`spring help`来获取有关任何支持的命令的更多详细信息,如以下示例所示: ``` $ spring help run @@ -115,7 +115,7 @@ Spring Boot 进一步扩展了这种技术,并试图根据你的代码推断 |`@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)的子类,以确切了解如何应用自定义。| +| |参见[`CompilerAutoConfiguration`](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/compiler/compilerautorfigation.java)的子类,在 Spring bootcli 源代码中了解定制是如何应用的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.1.2.推导出的“抓取”坐标 @@ -138,7 +138,7 @@ Spring Boot 扩展了 Groovy 的标准`@Grab`支持,允许你指定一个没 #### 2.1.5.自定义依赖管理 -默认情况下,CLI 在解析`@Grab`依赖关系时使用在`spring-boot-dependencies`中声明的依赖关系管理。可以通过使用`@DependencyManagementBom`注释来配置额外的依赖管理,该管理覆盖了默认的依赖管理。注释的值应该指定一个或多个 Maven boms 的坐标(“groupid:artifactid:version”)。 +默认情况下,CLI 在解析`@Grab`依赖关系时使用在`spring-boot-dependencies`中声明的依赖关系管理。可以通过使用`@DependencyManagementBom`注释来配置附加的依赖项管理,该管理覆盖了默认的依赖项管理。注释的值应该指定一个或多个 Maven boms 的坐标(`groupId:artifactId:version`)。 例如,考虑以下声明: @@ -178,7 +178,7 @@ $ spring run *.groovy $ spring jar my-app.jar *.groovy ``` -jar 结果包含通过编译应用程序产生的类和应用程序的所有依赖项,这样就可以使用`java -jar`运行它。 jar 文件还包含来自应用程序 Classpath 的条目。可以通过使用`--include`和`--exclude`来添加和删除 jar 的显式路径。两者都是用逗号分隔的,并且都接受前缀,以“+”和“-”的形式表示它们应该从默认值中删除。默认值包括以下内容: +jar 结果包含通过编译应用程序产生的类和应用程序的所有依赖项,这样就可以使用`java -jar`运行它。 jar 文件还包含来自应用程序 Classpath 的条目。可以使用`--include`和`--exclude`来添加和删除 jar 的显式路径。两者都是用逗号分隔的,并且都接受前缀,以“+”和“-”的形式表示它们应该从默认值中删除。默认值包括以下内容: ``` public/**, resources/**, static/**, templates/**, META-INF/**, * @@ -281,7 +281,7 @@ $ spring uninstall --all ## 3. 使用 Groovy Beans DSL 开发应用程序 -Spring Framework4.0 对`beans{}`“DSL”(借用自[Grails](https://grails.org/))具有原生支持,并且你可以通过使用相同的格式在 Groovy 应用程序脚本中嵌入 Bean 定义。这有时是一种很好的方式,可以包含外部特性,比如中间件声明,如下例所示: +Spring Framework4.0 对`beans{}`“DSL”(借鉴自[Grails](https://grails.org/))具有原生支持,并且你可以通过使用相同的格式在 Groovy 应用程序脚本中嵌入 Bean 定义。这有时是一种很好的方式,可以包含外部特性,比如中间件声明,如下例所示: ``` @Configuration(proxyBeanMethods = false) @@ -331,8 +331,8 @@ Spring 引导 CLI 使用 Maven resolver( Maven 的依赖项解析引擎)来 有关更多信息,请参见[Maven’s settings documentation](https://maven.apache.org/settings.html)。 -## 5. 接下来读什么? +## 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。 +GitHub 存储库中有一些[Groovy 脚本示例](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-cli/samples)可用,你可以使用它们来尝试 Spring 引导 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)中也有大量的 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 9c6391eca152a9203248a046dab24bd2c0d55e85..d9c541d2ad02f48e642cb6756946adddc711ab17 100644 --- a/docs/spring-boot/container-images.md +++ b/docs/spring-boot/container-images.md @@ -1,11 +1,11 @@ # 容器图像 -Spring 引导应用程序可以是容器化的[使用 DockerFiles](#container-images.dockerfiles),也可以是容器化的[使用本地云构建包创建优化的 Docker 兼容容器映像,可以在任何地方运行](#container-images.buildpacks)。 +Spring 引导应用程序可以是容器化的[使用 DockerFiles](#container-images.dockerfiles),也可以是容器化的[使用本地云构建包创建可在任何地方运行的优化的 Docker 兼容容器映像](#container-images.buildpacks)。 ## 1. 高效的容器图像 -将 Spring 引导 fat jar 打包为 Docker 映像是很容易的。然而,复制和运行 Docker 映像中的 fat jar 有各种缺点。在不拆包的情况下运行 A fat jar 时,总会有一定的开销,在集装箱化的环境中,这一点是显而易见的。另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像中的一个层中是次优的。由于你重新编译代码的次数可能比升级所使用的启动版本更多,所以更好的做法通常是多分离一些东西。如果将 jar 个文件放在应用程序类之前的层中,Docker 通常只需要更改最底层的文件,就可以从其缓存中获取其他文件。 +将 Spring 引导 fat jar 打包为 Docker 映像是很容易的。然而,复制和运行 Docker 映像中的 fat jar 有各种缺点。在不拆包的情况下运行 A fat jar 时,总会有一定的开销,在集装箱化的环境中,这一点可能是显而易见的。另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像中的一个层中是次优的。由于你重新编译代码的次数可能比升级所使用的启动版本更多,所以更好的做法通常是多分离一些代码。如果将 jar 个文件放在应用程序类之前的层中,Docker 通常只需要更改最底层的文件,就可以从其缓存中获取其他文件。 ### 1.1.打开 fat jar @@ -56,9 +56,9 @@ $ java -cp BOOT-INF/classes:BOOT-INF/lib/* com.example.MyApplication - BOOT-INF/classes/a/b/C.class ``` -这种分层设计是为了根据在应用程序构建之间更改代码的可能性来分离代码。库代码在两次构建之间更改的可能性较小,因此将其放置在自己的层中,以允许工具重新使用缓存中的层。应用程序代码更有可能在构建之间进行更改,因此它被隔离在一个单独的层中。 +这种分层设计是为了根据在应用程序构建之间更改代码的可能性来分离代码。库代码不太可能在构建之间发生变化,因此将其放置在自己的层中,以允许工具重新使用缓存中的层。应用程序代码更有可能在不同的构建之间进行更改,因此它被隔离在一个单独的层中。 -Spring 在`layers.idx`的帮助下,引导还支持对 WAR 文件进行分层。 +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)。 @@ -119,7 +119,7 @@ $ docker build --build-arg JAR_FILE=path/to/myapp.jar . DockerFiles 只是构建 Docker 映像的一种方式。另一种构建 Docker 映像的方法是直接从 Maven 或 Gradle 插件中使用 buildpacks。如果你曾经使用过 Cloud Foundry 或 Heroku 之类的应用程序平台,那么你很可能使用过 BuildPack。构建包是平台的一部分,它接收应用程序并将其转换为平台可以实际运行的内容。例如,Cloud Foundry 的 Java BuildPack 会注意到,你正在推送一个`.jar`文件,并自动添加一个相关的 JRE。 -使用 Cloud Native 构建包,你可以创建可以在任何地方运行的与 Docker 兼容的映像。 Spring 引导包括直接针对 Maven 和 Gradle 的 BuildPack 支持。这意味着你只需键入一个命令,就可以快速地在本地运行的 Docker 守护程序中获得一个合理的映像。 +使用 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)构建包的单个插件文档。 @@ -129,7 +129,7 @@ DockerFiles 只是构建 Docker 映像的一种方式。另一种构建 Docker | |为了实现可重复的构建和容器映像缓存,构建包可以操作应用程序资源元数据(例如文件“上次修改”信息)。
你应该确保你的应用程序在运行时不依赖于该元数据。
Spring 引导在服务静态资源时可以使用该信息,但这可以用`spring.web.resources.cache.use-last-modified`禁用| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -## 4. 接下来读什么? +## 4. 接下来要读什么? 一旦你了解了如何构建高效的容器映像,你就可以了解[将应用程序部署到云平台](deployment.html#deployment.cloud.kubernetes),比如 Kubernetes。 diff --git a/docs/spring-boot/data.md b/docs/spring-boot/data.md index ec15dc9483bda895d6a4b473d5073749c947966c..3aa821f3cde7fa56b6f16d510d2a3405cd8223cd 100644 --- a/docs/spring-boot/data.md +++ b/docs/spring-boot/data.md @@ -16,14 +16,14 @@ Java 的`javax.sql.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 引导可以自动配置嵌入式[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`。| +| |如果你在测试中使用此功能,你可能会注意到,无论你使用的应用程序上下文的数量如何,整个测试套件都可以重用相同的数据库,如果你想确保每个上下文都有一个单独的嵌入式数据库,
,你应该将`spring.datasource.generate-unique-name`设置为`true`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 例如,典型的 POM 依赖关系如下: @@ -43,7 +43,7 @@ Spring 引导可以自动配置嵌入式[H2](https://www.h2database.com)、[HSQL | |你需要对`spring-jdbc`有一个依赖关系,才能自动配置嵌入式数据库。
在本例中,它是通过`spring-boot-starter-data-jpa`传递地拉入的。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |无论出于何种原因,如果你确实为嵌入式数据库配置了连接 URL,请注意确保禁用数据库的自动关闭。
如果你使用 H2,你应该使用`DB_CLOSE_ON_EXIT=FALSE`来实现这一点。
如果你使用 HSQLDB,你应该确保不使用`shutdown=true`。
禁用数据库的自动关机可以在数据库关闭时进行引导控制,从而确保在不再需要访问数据库时发生这种情况。| +| |无论出于何种原因,如果你确实为嵌入式数据库配置了连接 URL,请注意确保禁用数据库的自动关闭。
如果你使用 H2,则应使用`DB_CLOSE_ON_EXIT=FALSE`,如果你使用 HSQLDB,请使用
,你应该确保不使用`shutdown=true`。
禁用数据库的自动关机可以在数据库关闭时进行引导控制,从而确保在不再需要访问数据库时发生这种情况。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.2.与生产数据库的连接 @@ -75,13 +75,13 @@ spring: | |你至少应该通过设置`spring.datasource.url`属性来指定 URL。
否则, Spring 引导将尝试自动配置嵌入式数据库。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |Spring 引导可以从 URL 中推断出大多数数据库的 JDBC 驱动程序类。
如果需要指定特定的类,可以使用`spring.datasource.driver-class-name`属性。| +| |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.*`)来微调实现特定的设置。有关更多详细信息,请参见你正在使用的连接池实现的文档。 +参见[`DataSource属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/jdbc/dasourceproperties.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),则可以自定义许多其他设置,如下例所示: @@ -112,7 +112,7 @@ Spring 启动使用以下算法来选择具体的实现方式: 1. 我们更喜欢[Hikaricp](https://github.com/brettwooldridge/HikariCP)的性能和并发性。如果有 Hikaricp,我们总是选择它。 -2. 否则,如果 Tomcat 池`DataSource`可用,我们就使用它。 +2. 否则,如果 Tomcat 池`DataSource`可用,则使用它。 3. 否则,如果[Commons DBCP2](https://commons.apache.org/proper/commons-dbcp/)是可用的,我们就使用它。 @@ -141,7 +141,7 @@ Spring 启动使用以下算法来选择具体的实现方式: #### 1.1.5.连接到 JNDI 数据源 -如果你将 Spring 引导应用程序部署到应用程序服务器,你可能希望通过使用应用程序服务器的内置功能来配置和管理你的数据源,并通过使用 JNDI 访问它。 +如果你将 Spring 引导应用程序部署到应用程序服务器,那么你可能希望通过使用应用程序服务器的内置功能来配置和管理你的数据源,并通过使用 JNDI 访问它。 `spring.datasource.jndi-name`属性可以用作`spring.datasource.url`、`spring.datasource.username`和`spring.datasource.password`属性的替代选项,以从特定的 JNDI 位置访问`DataSource`。例如,`application.properties`中的以下部分显示了如何按照`DataSource`的定义访问 JBoss: @@ -206,7 +206,7 @@ spring: ### 1.3. JPA 和 Spring 数据 JPA -Java Persistence API 是一种标准技术,它允许你将对象“映射”到关系数据库。`spring-boot-starter-data-jpa` POM 提供了一种快速启动的方法。它提供了以下关键依赖项: +Java Persistence API 是一种标准技术,它允许你将对象“映射”到关系数据库。`spring-boot-starter-data-jpa` POM 提供了一种快速入门的方法。它提供了以下关键依赖项: * Hibernate:最流行的实现方式之一 JPA。 @@ -214,7 +214,7 @@ Java Persistence API 是一种标准技术,它允许你将对象“映射” * 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/)参考文档。| +| |在这里,我们不会对 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.实体类别 @@ -277,9 +277,9 @@ public class City implements Serializable { [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 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 数据存储库通常扩展自[`Repository`](https://DOCS. Spring.io/ Spring-data/commons/DOCS/2.6.2/api/org/springframework/data/repository/repository.html)或[`CrudRepository`(https://DOCS. Spring.io/ Spring-data/commons/DOCS/2.6.2/api/org/springframFramework/data/depository.html)接口。如果使用自动配置,那么存储库将从包含主配置类(用`@EnableAutoConfiguration`或`@SpringBootApplication`注释的类)的包中向下搜索。 下面的示例显示了典型的 Spring 数据存储库接口定义: @@ -301,7 +301,7 @@ public interface CityRepository extends Repository { Spring 数据 JPA 存储库支持三种不同的引导模式:默认模式、延迟模式和惰性模式。要启用延迟引导或延迟引导,将`spring.data.jpa.repositories.bootstrap-mode`属性分别设置为`deferred`或`lazy`。当使用延迟或延迟引导时,自动配置的`EntityManagerFactoryBuilder`将使用上下文的`AsyncTaskExecutor`(如果有的话)作为引导执行器。如果存在多个选项,将使用名为`applicationTaskExecutor`的选项。 -| |当使用延迟引导或延迟引导时,请确保在应用程序上下文引导阶段之后推迟对 JPA 基础架构的任何访问。
你可以使用`SmartInitializingSingleton`来调用任何需要 JPA 基础架构的初始化。
对于创建为 Spring bean 的 JPA 组件(例如转换器),使用`ObjectProvider`来延迟依赖关系的解决(如果有)。| +| |当使用延迟引导或延迟引导时,请确保在应用程序上下文引导阶段之后推迟对 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)。| @@ -333,7 +333,7 @@ public interface CountryRepository extends RevisionRepository authorsBornAfter1980() { #### 1.6.4.定制 Jooq -可以通过定义你自己的`DefaultConfigurationCustomizer` Bean 来实现更高级的自定义,该自定义将在创建`org.jooq.Configuration``@Bean`之前被调用。这优先于自动配置所应用的任何内容。 +可以通过定义你自己的`DefaultConfigurationCustomizer` Bean 来实现更高级的自定义,该自定义将在创建`org.jooq.Configuration``@Bean`之前调用。这优先于自动配置所应用的任何内容。 如果你想完全控制 Jooq 配置,还可以创建自己的`org.jooq.Configuration``@Bean`。 @@ -573,11 +573,11 @@ public class MyPostgresR2dbcConfiguration { ``` -当`ConnectionFactory` Bean 可用时,常规的 JDBC`DataSource`自动配置将退出。如果你希望保留 JDBC`DataSource`自动配置,并且对在反应性应用程序中使用阻塞的 JDBC API 的风险感到满意,那么在应用程序中的`@Import(DataSourceAutoConfiguration.class)`类上添加`@Import(DataSourceAutoConfiguration.class)`以重新启用它。 +当`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。你只需要对要使用的嵌入式数据库包含一个构建依赖项,如以下示例所示: +与[JDBC 支持](features.html#data.sql.datasource.embedded)类似, Spring 引导可以自动配置嵌入式数据库以用于被动使用。你不需要提供任何连接 URL。你只需要对要使用的嵌入式数据库包含一个构建依赖项,如以下示例所示: ``` @@ -587,7 +587,7 @@ public class MyPostgresR2dbcConfiguration { ``` -| |如果你在测试中使用此功能,你可能会注意到,无论你使用的应用程序上下文的数量如何,整个测试套件都可以重用相同的数据库,如果你想确保每个上下文都有一个单独的嵌入式数据库,
,你应该将`spring.r2dbc.generate-unique-name`设置为`true`。| +| |如果在测试中使用此功能,你可能会注意到,无论你使用的应用程序上下文的数量如何,整个测试套件都可以重用相同的数据库,如果你想确保每个上下文都有一个单独的嵌入式数据库,
,你应该将`spring.r2dbc.generate-unique-name`设置为`true`。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.7.2.使用 DatabaseClient @@ -623,11 +623,11 @@ public class MyBean { #### 1.7.3. Spring 数据 R2DBC 存储库 -[Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc)存储库是你可以定义以访问数据的接口。查询是根据你的方法名称自动创建的。例如,一个`CityRepository`接口可以声明一个`findAllByState(String state)`方法来查找给定状态下的所有城市。 +[Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc)存储库是你可以定义以访问数据的接口。查询是根据你的方法名称自动创建的。例如,`CityRepository`接口可以声明一个`findAllByState(String state)`方法来查找给定州中的所有城市。 -对于更复杂的查询,你可以使用 Spring data 的[`Query`](https://docs.spring.io/spring-data/r2dbc/docs/1.4.2/api/org/springframework/data/r2dbc/repository/Query.html)注释来注释你的方法。 +对于更复杂的查询,你可以使用 Spring data 的[`Query`](https://DOCS. Spring.io/ Spring-data/r2dbc/DOCS/1.4.2/api/org/springframework/data/r2dbc/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 数据存储库通常扩展自[`Repository`](https://DOCS. Spring.io/ Spring-data/commons/DOCS/2.6.2/api/org/springframework/data/repository/repository.html)或[`CrudRepository`](https://DOCS. Spring.io/ Spring-data/commons/DOCS/2.6.2/api/org/springframform/data/repository.html)接口。如果使用自动配置,那么存储库将从包含主配置类(用`@EnableAutoConfiguration`或`@SpringBootApplication`注释的类)的包中向下搜索。 下面的示例显示了典型的 Spring 数据存储库接口定义: @@ -650,7 +650,7 @@ public interface CityRepository extends Repository { ## 2. 使用 NoSQL 技术 ---------- -Spring Data 提供了额外的项目,这些项目帮助你访问各种 NoSQL 技术,包括: +Spring Data 提供了帮助你访问各种 NoSQL 技术的附加项目,这些技术包括: * [MongoDB](https://spring.io/projects/spring-data-mongodb) @@ -674,14 +674,14 @@ Spring Boot 为 Redis、MongoDB、NEO4J、SOLR、ElasticSearch、Cassandra、Cou [Redis](https://redis.io/)是一个缓存、消息代理和功能丰富的键值存储。 Spring Boot 为[Lettuce](https://github.com/lettuce-io/lettuce-core/)和[Jedis](https://github.com/xetorthio/jedis/)客户端库以及[Spring Data Redis](https://github.com/spring-projects/spring-data-redis)在它们之上提供的抽象提供了基本的自动配置。 -有一个`spring-boot-starter-data-redis`“starter”可以方便地收集依赖项。默认情况下,它使用[Lettuce](https://github.com/lettuce-io/lettuce-core/)。该启动器同时处理传统应用程序和被动应用程序。 +有一个`spring-boot-starter-data-redis`“starter”,可以方便地收集依赖项。默认情况下,它使用[Lettuce](https://github.com/lettuce-io/lettuce-core/)。该启动器同时处理传统应用程序和被动应用程序。 | |我们还提供了`spring-boot-starter-data-redis-reactive`“starter”,以便与具有反应性支持的其他存储保持一致。| |---|----------------------------------------------------------------------------------------------------------------------------------| #### 2.1.1.连接到 Redis -可以像其他任何实例 Spring Bean 一样,注入一个自动配置的`RedisConnectionFactory`、`StringRedisTemplate`或 vanilla`RedisTemplate`实例。默认情况下,实例尝试以`localhost:6379`连接到 Redis 服务器。下面的清单显示了这样的示例 Bean: +可以像其他任何实例 Spring Bean 一样,注入一个自动配置的`RedisConnectionFactory`、`StringRedisTemplate`或 vanilla`RedisTemplate`实例。默认情况下,实例尝试连接到`localhost:6379`的 Redis 服务器。下面的清单显示了这样的示例 Bean: ``` import org.springframework.data.redis.core.StringRedisTemplate; @@ -706,10 +706,10 @@ public class MyBean { ``` -| |你还可以注册任意数量的实现`LettuceClientConfigurationBuilderCustomizer`的 bean,以进行更高级的自定义。“clientresources”也可以使用`ClientResourcesBuilderCustomizer`进行自定义。
如果你使用 JEDIS,`JedisClientConfigurationBuilderCustomizer`也是可用的。
或者,你可以注册类型为`RedisStandaloneConfiguration`、`RedisSentinelConfiguration`的 Bean,或`RedisClusterConfiguration`来完全控制配置。| +| |你还可以注册任意数量的实现`LettuceClientConfigurationBuilderCustomizer`的 bean 以进行更高级的自定义。`ClientResources`也可以使用`ClientResourcesBuilderCustomizer`进行自定义。
如果你使用 JEDIS,`JedisClientConfigurationBuilderCustomizer`也是可用的。
或者,你可以注册类型`RedisStandaloneConfiguration`的 Bean,`RedisSentinelConfiguration`,或`RedisClusterConfiguration`以完全控制配置。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果你添加了你自己的`@Bean`的任何自动配置的类型,它将替换默认的类型(除了在`RedisTemplate`的情况下,当排除是基于 Bean 名称时,`redisTemplate`,而不是它的类型)。 +如果你添加了你自己的`@Bean`的任何自动配置的类型,它将替换默认的类型(除了在`RedisTemplate`的情况下,当排除是基于 Bean 名称时,`redisTemplate`,而不是其类型)。 默认情况下,如果`commons-pool2`在 Classpath 上,则自动配置池连接工厂。 @@ -751,7 +751,7 @@ public class MyBean { 如果你已经定义了自己的`MongoClient`,它将被用来自动配置一个合适的`MongoDatabaseFactory`。 -自动配置的`MongoClient`是使用`MongoClientSettings` Bean 创建的。如果你已经定义了自己的`MongoClientSettings`,则将不加修改地使用它,并且`spring.data.mongodb`属性将被忽略。否则,将自动配置`MongoClientSettings`,并将`spring.data.mongodb`属性应用到它。在这两种情况下,都可以声明一个或多个`MongoClientSettingsBuilderCustomizer`bean 来微调`MongoClientSettings`配置。每个都将按顺序调用`MongoClientSettings.Builder`,这是用来构建`MongoClientSettings`的。 +自动配置的`MongoClient`是使用`MongoClientSettings` Bean 创建的。如果你已经定义了自己的`MongoClientSettings`,则将不加修改地使用它,并且`spring.data.mongodb`属性将被忽略。否则,将自动配置`MongoClientSettings`,并将`spring.data.mongodb`属性应用到它。在这两种情况下,都可以声明一个或多个`MongoClientSettingsBuilderCustomizer`bean 来微调`MongoClientSettings`配置。将按顺序调用每个函数,并使用用于构建`MongoClientSettings`的`MongoClientSettings.Builder`。 你可以设置`spring.data.mongodb.uri`属性来更改 URL 并配置其他设置,例如*复制集*,如下例所示: @@ -798,7 +798,7 @@ spring: | |如果没有指定`spring.data.mongodb.port`,则使用`27017`的默认值。
你可以从前面显示的示例中删除这一行。| |---|----------------------------------------------------------------------------------------------------------------------------------------------| -| |如果不使用 Spring data MongoDB,则可以注入`MongoClient` Bean 而不是使用`MongoDatabaseFactory`。
如果你想完全控制建立 MongoDB 连接,还可以声明你自己的`MongoDatabaseFactory`或`MongoClient` Bean。| +| |如果不使用 Spring dataMongoDB,则可以注入 Bean 而不是使用如果你想完全控制建立 MongoDB 连接,还可以声明你自己的 Bean。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |如果你使用的是反应式驱动程序,则 SSL 需要 Netty。
如果 Netty 可用,并且使用的工厂尚未自定义,则自动配置将自动配置该工厂。| @@ -806,7 +806,7 @@ spring: #### 2.2.2.MongoTemplate -[Spring Data MongoDB](https://spring.io/projects/spring-data-mongodb)提供了一个[`MongoTemplate`](https://docs.spring.io/spring-data/mongodb/docs/3.3.2/api/org/springframework/data/mongodb/core/MongoTemplate.html)类,其设计与 Spring 的`JdbcTemplate`非常相似。与`JdbcTemplate`一样, Spring 引导自动配置一个 Bean,以便你插入模板,如下所示: +[Spring Data MongoDB](https://spring.io/projects/spring-data-mongodb)提供了一个[`MongoTemplate`](https://DOCS. Spring.io/ Spring-data/MongoDB/DOCS/3.3.2/api/org/SpringFramework/data/MongoDB/Core/MongoTemplate.html)类,其设计与 Spring 的`JdbcTemplate`非常相似。与`JdbcTemplate`一样, Spring 引导自动配置一个 Bean 以供你插入模板,如下所示: ``` import com.mongodb.client.MongoCollection; @@ -834,13 +834,13 @@ public class MyBean { ``` -有关完整的详细信息,请参见[“蒙古行动”Javadoc](https://docs.spring.io/spring-data/mongodb/docs/3.3.2/api/org/springframework/data/mongodb/core/MongoOperations.html)。 +有关完整的详细信息,请参见[`MongoOperations`Javadoc](https://DOCS. Spring.io/ Spring-data/MongoDB/DOCS/3.3.2/api/org/SpringFramework/data/MongoDB/Core/MongoOperations.html)。 #### 2.2.3. Spring 数据 MongoDB 存储库 Spring 数据包括对 MongoDB 的存储库支持。与前面讨论的 JPA 存储库一样,基本原理是基于方法名自动构造查询。 -实际上, Spring data JPA 和 Spring data MongoDB 共享相同的公共基础设施。你可以使用前面的 JPA 示例,假设`City`现在是一个 MongoDB 数据类,而不是 JPA `@Entity`,它以相同的方式工作,如以下示例所示: +实际上, Spring 数据 JPA 和 Spring 数据 MongoDB 共享相同的公共基础设施。你可以使用前面的 JPA 示例,假设`City`现在是一个 MongoDB 数据类,而不是 JPA `@Entity`,它以相同的方式工作,如以下示例所示: ``` import org.springframework.data.domain.Page; @@ -865,9 +865,9 @@ public interface CityRepository extends Repository { #### 2.2.4.嵌入式 Mongo -Spring Boot 为[Embedded Mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo)提供自动配置。要在 Spring 引导应用程序中使用它,请在`de.flapdoodle.embed:de.flapdoodle.embed.mongo`上添加一个依赖项,并将`spring.mongodb.embedded.version`属性设置为与应用程序将在生产中使用的 MongoDB 版本匹配。 +Spring Boot 提供了[嵌入式 Mongo](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo)的自动配置。要在 Spring 引导应用程序中使用它,请在`de.flapdoodle.embed:de.flapdoodle.embed.mongo`上添加一个依赖项,并将`spring.mongodb.embedded.version`属性设置为与你的应用程序将在生产中使用的 MongoDB 版本匹配。 -| |默认的下载配置允许访问[Embedded Mongo’s `Version` class](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/blob/de.flapdoodle.embed.mongo-3.0.0/src/main/java/de/flapdoodle/embed/mongo/distribution/Version.java)中列出的大多数版本以及其他一些版本。
在试图下载服务器时,配置一个不可访问的版本将导致一个错误。
这样的错误可以通过定义一个适当配置的`DownloadConfigBuilderCustomizer` Bean 来纠正。| +| |默认的下载配置允许访问[Embedded Mongo 的`Version`类]中列出的大多数版本(https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/blob/de.flapdoodle.embed.mongo-3.0.0/SRC/main/java/de/flapdoodle/embed/mongo/do/dismission/version.java)
在试图下载服务器时,配置一个不可访问的版本将导致一个错误。
这样的错误可以通过定义一个适当配置的`DownloadConfigBuilderCustomizer` Bean 来纠正。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 可以通过设置`spring.data.mongodb.port`属性来配置 Mongo 监听的端口。要使用随机分配的空闲端口,请使用 0。由`MongoAutoConfiguration`创建的`MongoClient`被自动配置为使用随机分配的端口。 @@ -877,7 +877,7 @@ Spring Boot 为[Embedded Mongo](https://github.com/flapdoodle-oss/de.flapdoodle. 如果在 Classpath 上有 SLF4J,则 Mongo 产生的输出将自动路由到名为`org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo`的记录器。 -你可以声明自己的`IMongodConfig`和`IRuntimeConfig`bean,以控制 Mongo 实例的配置和日志路由。可以通过声明`DownloadConfigBuilderCustomizer` Bean 来定制下载配置。 +你可以声明自己的`IMongodConfig`和`IRuntimeConfig`bean 来控制 Mongo 实例的配置和日志路由。可以通过声明`DownloadConfigBuilderCustomizer` Bean 来定制下载配置。 ### 2.3.NEO4J @@ -885,7 +885,7 @@ Spring Boot 为[Embedded Mongo](https://github.com/flapdoodle-oss/de.flapdoodle. #### 2.3.1.连接到 NEO4J 数据库 -要访问 NEO4J 服务器,可以插入自动配置的`org.neo4j.driver.Driver`。默认情况下,该实例尝试使用 Bolt 协议在`localhost:7687`处连接到 NEO4J 服务器。下面的示例展示了如何注入一个 NEO4j`Driver`,它使你能够访问`Session`,其中包括: +要访问 NEO4J 服务器,可以插入自动配置的`org.neo4j.driver.Driver`。默认情况下,实例尝试使用 Bolt 协议连接到 NEO4J 服务器`localhost:7687`。下面的示例展示了如何注入一个 NEO4j`Driver`,它使你能够访问`Session`,其中包括: ``` import org.neo4j.driver.Driver; @@ -941,7 +941,7 @@ spring: 自动配置的`Driver`是使用`ConfigBuilder`创建的。要微调其配置,请声明一个或多个`ConfigBuilderCustomizer`bean。每个都将按顺序调用`ConfigBuilder`,这是用来构建`Driver`的。 -#### 2.3.2. Spring 数据 NEO4j 存储库 +#### 2.3.2. Spring 数据 NEO4J 存储库 Spring 数据存储库包括对 NEO4j 的支持。有关 Spring 数据 NEO4j 的完整详细信息,请参见[参考文献](https://docs.spring.io/spring-data/neo4j/docs/6.2.2/reference/html/)。 @@ -960,20 +960,20 @@ public interface CityRepository extends Neo4jRepository { ``` -`spring-boot-starter-data-neo4j`“starter”支持存储库和事务管理。 Spring 使用`Neo4jTemplate`或`ReactiveNeo4jTemplate`bean,启动同时支持经典的和反应性的 NEO4j 存储库。 Classpath 上的项目反应器可用时,反应方式也是自动配置的。 +`spring-boot-starter-data-neo4j`“starter”支持存储库和事务管理。 Spring 使用`Neo4jTemplate`或`ReactiveNeo4jTemplate`bean,启动同时支持经典的和反应的 NEO4j 存储库。 Classpath 上的项目反应器是可用的时,反应方式也是自动配置的。 你可以通过在`@Configuration`- Bean 上分别使用`@EnableNeo4jRepositories`和`@EntityScan`来定制查找存储库和实体的位置。 -| |在使用反应样式的应用程序中,`ReactiveTransactionManager`不会自动配置。
以启用事务管理,以下 Bean 必须在你的配置中定义:

``
导入 org.NEO4j.driver.driver;

Import org.springframework.context.annotation. Bean;
import org.springframework.context.annation.contextation.conventation;import org.datforum.data.data4j.core.reactiveasr;



``| +| |在使用反应样式的应用程序中,a`ReactiveTransactionManager`不是自动配置的。
要启用事务管理,必须在你的配置中定义以下 Bean:

```
import org.neo4j.driver.Driver;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider;
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;

@Configuration(proxyBeanMethods = false)
public class MyNeo4jConfiguration {

@Bean
public ReactiveNeo4jTransactionManager reactiveTransactionManager(Driver driver,
ReactiveDatabaseSelectionProvider databaseNameProvider) {
return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider);
}

}

```| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 2.4.SOLR -[Apache Solr](https://lucene.apache.org/solr/)是一个搜索引擎。 Spring 启动提供了用于 SOLR5 客户端库的基本自动配置。 +[阿帕奇 SOLR](https://lucene.apache.org/solr/)是一个搜索引擎。 Spring 启动为 SOLR5 的客户端库提供了基本的自动配置。 #### 2.4.1.连接到 SOLR -你可以像注入任何其他 Spring Bean 一样注入一个自动配置的`SolrClient`实例。默认情况下,实例尝试连接到`[localhost:8983/solr](http://localhost:8983/solr)`的服务器。以下示例显示了如何注入 SOLR Bean: +你可以注入一个自动配置的`SolrClient`实例,就像你将注入任何其他 Spring Bean 实例一样。默认情况下,实例尝试连接到`[localhost:8983/solr](http://localhost:8983/solr)`的服务器。以下示例显示了如何注入 SOLR Bean: ``` import java.io.IOException; @@ -1003,13 +1003,13 @@ public class MyBean { ``` -如果你添加了你自己的`@Bean`类型的`SolrClient`,它将替换缺省值。 +如果你添加你自己的`@Bean`类型的`SolrClient`,它将替换缺省值。 ### 2.5.Elasticsearch [Elasticsearch](https://www.elastic.co/products/elasticsearch)是一个开源、分布式、RESTful 搜索和分析引擎。 Spring Boot 为 ElasticSearch 客户端提供了基本的自动配置。 -Spring 引导支持几个客户端: +Spring Boot 支持多个客户端: * 官方的 Java“low level”和“high level”REST 客户端 @@ -1019,7 +1019,7 @@ Spring Boot 提供了一个专用的“starter”,`spring-boot-starter-data-el #### 2.5.1.使用 REST 客户端连接到 ElasticSearch -ElasticSearch 附带[两个不同的 REST 客户机](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html),你可以使用它来查询集群:“低级别”客户端和“高级别”客户端。 Spring Boot 提供对“高级别”客户端的支持,该客户端附带`org.elasticsearch.client:elasticsearch-rest-high-level-client`。此外, Spring Boot 基于 Spring Framework 的`WebClient`提供了对反应式客户端的支持,该客户端附带`org.springframework.data:spring-data-elasticsearch`。默认情况下,客户机将以`[localhost:9200](http://localhost:9200)`为目标。你可以使用`spring.elasticsearch.*`属性来进一步优化客户机的配置方式,如下例所示: +ElasticSearch 附带[两个不同的 REST 客户机](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html),你可以使用它来查询集群:“低级别”客户端和“高级别”客户端。 Spring Boot 提供对“高级别”客户端的支持,该客户端附带`org.elasticsearch.client:elasticsearch-rest-high-level-client`。此外, Spring Boot 基于 Spring Framework 的`WebClient`提供对反应式客户端的支持,该客户端附带`org.springframework.data:spring-data-elasticsearch`。默认情况下,客户机将以`[localhost:9200](http://localhost:9200)`为目标。你可以使用`spring.elasticsearch.*`属性来进一步优化客户机的配置方式,如以下示例所示: 属性 @@ -1043,7 +1043,7 @@ spring: ##### 使用 resthigLevelClient 连接到 ElasticSearch#### -如果在 Classpath 上有`elasticsearch-rest-high-level-client`,则 Spring 引导将自动配置并注册一个`RestHighLevelClient` Bean。除了前面描述的属性之外,要微调`RestHighLevelClient`,你可以注册任意数量的 bean,这些 bean 实现`RestClientBuilderCustomizer`以进行更高级的自定义。要完全控制其注册,请定义`RestClientBuilder` Bean。 +如果在 Classpath 上有`elasticsearch-rest-high-level-client`, Spring 引导将自动配置并注册一个`RestHighLevelClient` Bean。除了前面描述的属性之外,要微调`RestHighLevelClient`,你可以注册任意数量的 bean,这些 bean 实现`RestClientBuilderCustomizer`以进行更高级的自定义。要完全控制其注册,请定义`RestClientBuilder` Bean。 | |如果你的应用程序需要访问“low level”`RestClient`,则可以通过在自动配置的`client.getLowLevelClient()`上调用`client.getLowLevelClient()`来获得它。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -1070,7 +1070,7 @@ spring: ##### 使用 ReactiveElasticSearchClient 连接到 ElasticSearch#### -[Spring Data Elasticsearch](https://spring.io/projects/spring-data-elasticsearch)提供`ReactiveElasticsearchClient`,用于以反应方式查询 ElasticSearch 实例。它是建立在 WebFlux 的`WebClient`之上的,因此`spring-boot-starter-elasticsearch`和`spring-boot-starter-webflux`依赖关系都有助于启用此支持。 +[Spring Data Elasticsearch](https://spring.io/projects/spring-data-elasticsearch)提供`ReactiveElasticsearchClient`用于以反应方式查询 ElasticSearch 实例。它是建立在 WebFlux 的`WebClient`之上的,因此`spring-boot-starter-elasticsearch`和`spring-boot-starter-webflux`依赖关系都有助于启用此支持。 默认情况下, Spring 启动将自动配置并注册`ReactiveElasticsearchClient`。除了前面描述的属性外,`spring.elasticsearch.webclient.*`属性还可用于配置特定于反应性的设置,如以下示例所示: @@ -1089,11 +1089,11 @@ spring: max-in-memory-size: "1MB" ``` -如果`spring.elasticsearch.`**and `spring.elasticsearch.webclient.`**配置属性不够,并且希望完全控制客户机配置,则可以注册一个自定义`ClientConfiguration` Bean。 +如果`spring.elasticsearch.`**和`spring.elasticsearch.webclient.`** 配置属性不够,并且希望完全控制客户机配置,则可以注册一个自定义的`ClientConfiguration` Bean。 #### 2.5.2.通过使用 Spring 数据 #### 连接到 ElasticSearch -要连接到 ElasticSearch,必须定义一个`RestHighLevelClient` Bean,通过 Spring 引导自动配置,或者由应用程序手动提供(请参见前面的部分)。有了这种配置,就可以像其他任何 Spring Bean 一样注入“ElasticSearchRestTemplate”,如以下示例所示: +要连接到 ElasticSearch,必须定义一个`RestHighLevelClient` Bean,通过 Spring 引导自动配置,或者由应用程序手动提供(请参见前面的部分)。有了这种配置,`ElasticsearchRestTemplate`可以像任何其他 Spring Bean 一样注入,如以下示例所示: ``` import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; @@ -1124,12 +1124,12 @@ public class MyBean { Spring 数据包括对 ElasticSearch 的存储库支持。与前面讨论的 JPA 存储库一样,基本原则是根据方法名自动为你构造查询。 -实际上, Spring 数据 JPA 和 Spring 数据弹性搜索共享相同的公共基础设施。你可以使用前面的 JPA 示例,并且假设`City`现在是 ElasticSearch`@Document`类,而不是 JPA `@Entity`类,它以同样的方式工作。 +实际上, Spring 数据 JPA 和 Spring 数据弹性搜索共享相同的公共基础设施。你可以以前面的 JPA 为例,假设`City`现在是一个 ElasticSearch`@Document`类,而不是 JPA `@Entity`,它以同样的方式工作。 -| |有关 Spring 数据弹性搜索的完整详细信息,请参见[参考文献](https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/)。| +| |有关 Spring 数据 ElasticSearch 的完整详细信息,请参见[参考文献](https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring 使用`ElasticsearchRestTemplate`或`ReactiveElasticsearchTemplate`bean,启动同时支持经典的和反应的 Elasticsearch 存储库。考虑到存在所需的依赖关系,这些 bean 很可能是通过 Spring 引导自动配置的。 +Spring Boot 使用`ElasticsearchRestTemplate`或`ReactiveElasticsearchTemplate`bean,支持经典的和反应的 Elasticsearch 存储库。考虑到存在所需的依赖关系,这些 bean 很可能是通过 Spring 引导自动配置的。 如果你希望使用自己的模板来支持 ElasticSearch 存储库,则可以添加自己的`ElasticsearchRestTemplate`或`ElasticsearchOperations``@Bean`,只要它的名称为`"elasticsearchTemplate"`。这同样适用于`ReactiveElasticsearchTemplate`和`ReactiveElasticsearchOperations`,其 Bean 名称为`"reactiveElasticsearchTemplate"`。 @@ -1153,11 +1153,11 @@ spring: ### 2.6.卡桑德拉 -[Cassandra](https://cassandra.apache.org/)是一个开源的分布式数据库管理系统,旨在处理跨许多商品服务器的大量数据。 Spring Boot 提供了用于 Cassandra 的自动配置以及由[Spring Data Cassandra](https://github.com/spring-projects/spring-data-cassandra)提供的在其之上的抽象。有一个`spring-boot-starter-data-cassandra`“starter”,可以方便地收集依赖项。 +[Cassandra](https://cassandra.apache.org/)是一个开源的分布式数据库管理系统,旨在处理跨许多商品服务器的大量数据。 Spring Boot 提供了对 Cassandra 的自动配置以及[Spring Data Cassandra](https://github.com/spring-projects/spring-data-cassandra)在其之上提供的抽象。有一个`spring-boot-starter-data-cassandra`“starter”可以方便地收集依赖项。 #### 2.6.1.连接到 Cassandra -可以像使用任何其他 Spring Bean 一样,注入一个自动配置的`CassandraTemplate`或一个 Cassandra`CqlSession`实例。`spring.data.cassandra.*`属性可用于自定义连接。通常,你提供`keyspace-name`和`contact-points`以及本地数据中心名称,如以下示例所示: +你可以插入一个自动配置的`CassandraTemplate`或一个 Cassandra`CqlSession`实例,就像你使用任何其他 Spring Bean 实例一样。`spring.data.cassandra.*`属性可用于自定义连接。通常,你提供`keyspace-name`和`contact-points`以及本地数据中心名称,如以下示例所示: 属性 @@ -1202,13 +1202,13 @@ spring: | |这两个示例与端口默认设置`9042`相同。
如果需要配置端口,请使用`spring.data.cassandra.port`。| |---|----------------------------------------------------------------------------------------------------------------------------------------| -| |Cassandra 驱动程序有自己的配置基础结构在 Classpath 的根位置加载`application.conf`。

Spring boot 默认情况下不查找这样的文件,但可以使用`spring.data.cassandra.config`加载一个文件。
如果一个属性在`spring.data.cassandra.*`和配置文件中都存在,`spring.data.cassandra.*`中的值优先。

对于更高级的驱动程序自定义,你可以注册任意数量的实现`DriverConfigLoaderBuilderCustomizer`的 bean。
`CqlSession`的`CqlSession`可以使用类型为`CqlSessionBuilderCustomizer`的 Bean 进行自定义。| +| |Cassandra 驱动程序有自己的配置基础结构在 Classpath 的根位置加载`application.conf`。

Spring boot 默认情况下不会查找这样的文件,但是可以使用`spring.data.cassandra.config`加载一个文件。
如果一个属性在`spring.data.cassandra.*`和配置文件中都存在,`spring.data.cassandra.*`中的值优先。

对于更高级的驱动程序自定义,你可以注册任意数量的实现`DriverConfigLoaderBuilderCustomizer`的 bean。
`CqlSession`可以使用类型为`CqlSessionBuilderCustomizer`的 Bean 进行自定义。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |如果使用`CqlSessionBuilder`创建多个`CqlSession`bean,请记住构建器是可变的,因此请确保为每个会话注入一个新的副本。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -下面的代码清单显示了如何注入 Cassandra Bean: +下面的代码清单展示了如何注入 Cassandra Bean: ``` import org.springframework.data.cassandra.core.CassandraTemplate; @@ -1233,9 +1233,9 @@ public class MyBean { ``` -如果你添加了你自己的`@Bean`类型的`CassandraTemplate`,它将替换缺省值。 +如果你添加你自己的`@Bean`类型的`CassandraTemplate`,它将替换缺省值。 -#### 2.6.2. Spring 数据 Cassandra 存储库 +#### 2.6.2. Spring 数据卡桑德拉存储库 Spring 数据包括对 Cassandra 的基本存储库支持。目前,这比前面讨论的 JPA 存储库更加有限,并且需要用`@Query`注释查找方法。 @@ -1244,7 +1244,7 @@ Spring 数据包括对 Cassandra 的基本存储库支持。目前,这比前 ### 2.7.Couchbase -[Couchbase](https://www.couchbase.com/)是一个开源的、分布式的、多模型的面向 NoSQL 文档的数据库,它为交互式应用程序进行了优化。 Spring Boot 提供了对 Couchbase 的自动配置,以及由[Spring Data Couchbase](https://github.com/spring-projects/spring-data-couchbase)提供的在其之上的抽象。有`spring-boot-starter-data-couchbase`和`spring-boot-starter-data-couchbase-reactive`“starter”用于以方便的方式收集依赖项。 +[Couchbase](https://www.couchbase.com/)是一个开源的、分布式的、多模型的面向 NoSQL 文档的数据库,它为交互式应用程序进行了优化。 Spring Boot 提供了对 CouchBase 的自动配置以及由[Spring Data Couchbase](https://github.com/spring-projects/spring-data-couchbase)提供的在其之上的抽象。有`spring-boot-starter-data-couchbase`和`spring-boot-starter-data-couchbase-reactive`“启动器”,可以方便地收集依赖项。 #### 2.7.1.连接到 Couchbase @@ -1298,7 +1298,7 @@ spring: Spring 数据包括对 CouchBase 的存储库支持。有关 Spring Data Couchbase 的完整详细信息,请参见[参考文献](https://docs.spring.io/spring-data/couchbase/docs/4.3.2/reference/html/)。 -如果`CouchbaseClientFactory` Bean 可用,则可以像使用任何其他 Spring Bean 一样注入自动配置的`CouchbaseTemplate`实例。如上所述,当`Cluster`可用时,并且指定了一个 bucket 名称时,就会发生这种情况: +你可以注入一个自动配置的`CouchbaseTemplate`实例,就像使用任何其他 Spring Bean 一样,前提是`CouchbaseClientFactory` Bean 是可用的。如上所述,当`Cluster`可用时,并且指定了一个 bucket 名称时,就会发生这种情况: 属性 @@ -1346,7 +1346,7 @@ public class MyBean { * a`CustomConversions``@Bean`,其名称为`couchbaseCustomConversions`。 -* a`CouchbaseTemplate``@Bean`,名称为`couchbaseTemplate`。 +* a`CouchbaseTemplate``@Bean`,其名称为`couchbaseTemplate`。 为了避免在自己的配置中对这些名称进行硬编码,你可以重用 Spring Data Couchbase 提供的`BeanNames`。例如,你可以自定义要使用的转换器,如下所示: @@ -1372,9 +1372,9 @@ public class MyCouchbaseConfiguration { ### 2.8.LDAP -[LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)(轻量级目录访问协议)是一种开放的、与供应商无关的行业标准应用程序协议,用于在 IP 网络上访问和维护分布式目录信息服务。 Spring Boot 提供了对任何兼容的 LDAP 服务器的自动配置,以及对来自[UnboundID](https://ldap.com/unboundid-ldap-sdk-for-java/)的嵌入式内存中 LDAP 服务器的支持。 +[LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)(轻量级目录访问协议)是一种开放的、与供应商无关的行业标准应用程序协议,用于在 IP 网络上访问和维护分布式目录信息服务。 Spring 启动提供了对任何兼容的 LDAP 服务器的自动配置,以及对来自[UnboundID](https://ldap.com/unboundid-ldap-sdk-for-java/)的嵌入式内存中 LDAP 服务器的支持。 -LDAP 抽象由[Spring Data LDAP](https://github.com/spring-projects/spring-data-ldap)提供。有一个`spring-boot-starter-data-ldap`“starter”可以方便地收集依赖项。 +LDAP 抽象由[Spring Data LDAP](https://github.com/spring-projects/spring-data-ldap)提供。有一个`spring-boot-starter-data-ldap`“starter”,可以方便地收集依赖项。 #### 2.8.1.连接到 LDAP 服务器 @@ -1435,7 +1435,7 @@ public class MyBean { #### 2.8.3.嵌入式内存 LDAP 服务器 -出于测试目的, Spring 引导支持从[UnboundID](https://ldap.com/unboundid-ldap-sdk-for-java/)自动配置内存中的 LDAP 服务器。要配置服务器,请向`com.unboundid:unboundid-ldapsdk`添加一个依赖项,并声明一个`spring.ldap.embedded.base-dn`属性,如下所示: +出于测试目的, Spring 引导支持[UnboundID](https://ldap.com/unboundid-ldap-sdk-for-java/)中的内存中 LDAP 服务器的自动配置。要配置服务器,请向`com.unboundid:unboundid-ldapsdk`添加一个依赖项,并声明一个`spring.ldap.embedded.base-dn`属性,如下所示: Properties @@ -1452,18 +1452,18 @@ spring: base-dn: "dc=spring,dc=io" ``` -| |可以定义多个 base-dn 值,但是,由于专有名称通常包含逗号,因此必须使用正确的符号来定义它们。

在 YAML 文件中,可以使用 YAML 列表符号。在属性文件中,必须将索引作为属性名称的一部分包括在内:

属性

``
ldap.embedded.base-dn[0]=dc=“542”/> Spring.ldap.ldap.embedded.base-dn Spring =dc=“dc=”/>gt=“dc=”/>pivottr==`544“/><>“lgt====5446”/>“lgt>”."peddlgt===| +| |可以定义多个 base-dn 值,但是,由于专有名称通常包含逗号,因此必须使用正确的符号来定义它们。

在 YAML 文件中,可以使用 YAML 列表符号。在属性文件中,必须将索引作为属性名称的一部分包括在内:

属性



yaml
```
spring.ldap.embedded.base-dn:
- "dc=spring,dc=io"
- "dc=pivotal,dc=io"
```| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 默认情况下,服务器从一个随机端口启动,并触发常规的 LDAP 支持。不需要指定`spring.ldap.urls`属性。 -如果在你的 Classpath 上有一个`schema.ldif`文件,则该文件将用于初始化服务器。如果希望从其他资源加载初始化脚本,还可以使用`spring.ldap.embedded.ldif`属性。 +如果在你的 Classpath 上有一个`schema.ldif`文件,它将用于初始化服务器。如果希望从其他资源加载初始化脚本,还可以使用`spring.ldap.embedded.ldif`属性。 默认情况下,标准模式用于验证`LDIF`文件。你可以通过设置`spring.ldap.embedded.validation.enabled`属性来完全关闭验证。如果你有自定义属性,你可以使用`spring.ldap.embedded.validation.schema`来定义你的自定义属性类型或对象类。 ### 2.9.影响 b -[InfluxDB](https://www.influxdata.com/)是一个开放源代码的时间序列数据库,该数据库经过优化,可快速、高可用性地存储和检索操作监控、应用度量、物联网传感器数据和实时分析等领域的时间序列数据。 +[InfluxDB](https://www.influxdata.com/)是一个开放源代码的时间序列数据库,该数据库经过优化,可用于快速、高可用性地存储和检索操作监控、应用度量、物联网传感器数据和实时分析等领域的时间序列数据。 #### 2.9.1.连接到 InfluxDB @@ -1489,8 +1489,8 @@ InfluxDB 依赖于 OkHTTP。如果你需要调优幕后使用的 HTTP 客户端` 如果需要对配置进行更多控制,可以考虑注册`InfluxDbCustomizer` Bean。 -## 3. 接下来读什么? +## 3. 接下来要读什么? ---------- -你现在应该对如何在各种数据技术中使用 Spring 引导有了一种感觉。从这里,你可以了解 Spring Boot 对各种[消息传递技术](messaging.html#messaging)的支持,以及如何在应用程序中启用它们。 +你现在应该对如何在各种数据技术中使用 Spring 引导有了一种感觉。从这里,你可以了解 Spring boot 对各种[消息传递技术](messaging.html#messaging)的支持,以及如何在应用程序中启用它们。 diff --git a/docs/spring-boot/deployment.md b/docs/spring-boot/deployment.md index a7cc240dea81664d935a1c73bebe6ce0339aa5cf..2d3f0a6e56f9c31e95845baf02c7796034525418 100644 --- a/docs/spring-boot/deployment.md +++ b/docs/spring-boot/deployment.md @@ -16,18 +16,18 @@ Heroku 和 Cloud Foundry 这两家颇受欢迎的云供应商采用了一种“B ### 1.1.Cloud Foundry -Cloud Foundry 提供了默认的构建包,如果没有指定其他构建包,这些构建包就会发挥作用。Cloud Foundry[Java buildpack](https://github.com/cloudfoundry/java-buildpack)对 Spring 应用程序具有出色的支持,包括 Spring 启动。你可以部署独立的可执行程序 jar 以及传统的`.war`打包应用程序。 +Cloud Foundry 提供了默认的构建包,如果没有指定其他构建包,这些构建包就会发挥作用。Cloud Foundry[Java BuildPack](https://github.com/cloudfoundry/java-buildpack)对 Spring 应用程序具有出色的支持,包括 Spring 启动。你可以部署独立的可执行应用程序以及传统的`.war`打包应用程序。 -一旦构建了应用程序(例如,通过使用`mvn clean package`)并拥有[installed the `cf` command line tool](https://docs.cloudfoundry.org/cf-cli/install-go-cli.html),就可以使用`cf push`命令部署应用程序,并替换已编译`.jar`的路径。在推送应用程序之前,一定要有[logged in with your `cf` command line client](https://docs.cloudfoundry.org/cf-cli/getting-started.html#login)。下面的一行显示了使用`cf push`命令部署应用程序的情况: +一旦你构建了你的应用程序(例如,通过使用`mvn clean package`)并[安装了`cf`命令行工具](https://DOCS.cloudfoundry.org/cf-cli/install-go-cli.html),就可以使用`cf push`命令部署你的应用程序,并替换到你编译的`.jar`的路径。在推送应用程序之前,一定要[用`cf`命令行客户端登录](https://DOCS.cloudfoundry.org/cf-cli/getting-started.html#login)。下面的一行显示了使用`cf push`命令部署应用程序的情况: ``` $ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar ``` -| |在前面的示例中,我们用`acloudyspringtime`代替你给出的任何值`cf`作为应用程序的名称。| +| |在前面的示例中,我们用`acloudyspringtime`替换你给出的任何值`cf`作为应用程序的名称。| |---|-----------------------------------------------------------------------------------------------------------------------------| -有关更多选项,请参见[“CF 推送”文档](https://docs.cloudfoundry.org/cf-cli/getting-started.html#push)。如果在同一目录中存在一个 Cloud Foundry[`manifest.yml`](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html)文件,则将考虑该文件。 +有关更多选项,请参见[`cf push`文档](https://DOCS.cloudfoundry.org/cf-cli/getting-started.html#push)。如果在同一目录中存在一个 Cloud Foundry[`manifest.yml`](https://DOCS.cloudfoundry.org/devguide/deploy-apps/manifest.html)文件,则将考虑该文件。 此时,`cf`开始上载应用程序,生成类似于以下示例的输出: @@ -57,7 +57,7 @@ App started 恭喜你!应用程序现已上线! -应用程序启用后,你可以使用`cf apps`命令来验证部署的应用程序的状态,如以下示例所示: +一旦你的应用程序处于活动状态,你就可以使用`cf apps`命令来验证部署的应用程序的状态,如以下示例所示: ``` $ cf apps @@ -70,7 +70,7 @@ acloudyspringtime started 1/1 512M 1G acloudyspring ... ``` -一旦 Cloud Foundry 确认你的应用程序已被部署,你就应该能够在给定的 URI 中找到该应用程序。在前面的示例中,你可以在`https://acloudyspringtime.cfapps.io/`处找到它。 +一旦 Cloud Foundry 确认你的应用程序已经部署,你就应该能够在给定的 URI 中找到该应用程序。在前面的示例中,你可以在`https://acloudyspringtime.cfapps.io/`处找到它。 #### 1.1.1.对服务的约束 @@ -108,11 +108,11 @@ public class MyBean implements EnvironmentAware { Spring 通过检查`"*_SERVICE_HOST"`和`"*_SERVICE_PORT"`变量的环境,引导自动检测 Kubernetes 部署环境。你可以使用`spring.main.cloud-platform`配置属性重写此检测。 -Spring boot 帮助你[管理应用程序的状态](features.html#features.spring-application.application-availability)并用[使用致动器的 HTTP Kubernetes 探测](actuator.html#actuator.endpoints.kubernetes-probes)导出它。 +Spring Boot 帮助你[管理应用程序的状态](features.html#features.spring-application.application-availability)并用[使用致动器的 HTTP Kubernetes 探测](actuator.html#actuator.endpoints.kubernetes-probes)导出它。 #### 1.2.1.Kubernetes 容器生命周期 -当 Kubernetes 删除一个应用程序实例时,关闭过程涉及多个并发的子系统:关闭钩子、取消注册服务、从负载平衡器中删除实例…,因为这个关闭过程是并行进行的(而且是由于分布式系统的性质),有一个窗口,在此期间,流量可以路由到一个也已开始关机处理的 pod。 +当 Kubernetes 删除一个应用程序实例时,关闭过程涉及多个并发的子系统:关闭钩子、取消注册服务、从负载平衡器中删除实例…,因为这种关闭过程是并行进行的(而且是由于分布式系统的性质),有一个窗口,在此期间,流量可以路由到一个也已开始关机处理的 pod。 你可以在 Prestop 处理程序中配置睡眠执行,以避免请求被路由到已经开始关闭的 POD。这种睡眠时间应该足够长,新的请求可以停止路由到 POD,其持续时间也会因部署而异。可以使用 POD 配置文件中的 PodSpec 对 Prestop 处理程序进行配置,具体如下: @@ -238,10 +238,10 @@ Amazon Web Services 提供了多种方式来安装 Spring 基于启动的应用 server.port=5000 ``` -| |上传二进制文件而不是源文件

默认情况下,Elastic Beanstalk 上传源文件并在 AWS 中进行编译。
但是,最好是上传二进制文件。
要这样做,在你的`.elasticbeanstalk/config.yml`文件中添加类似于以下的行:
`gt r=”87“/>r=”:<<87"/>r=”部署 88“/>:target/demo-0.0. jar-0.1-knapshot=”。| +| |上传二进制文件,而不是源文件

默认情况下,Elastic Beanstalk 上传源文件并在 AWS 中进行编译。
但是,最好是上传二进制文件。
要做到这一点,在你的`.elasticbeanstalk/config.yml`文件中添加类似于以下的行:
```
deploy:
artifact: target/demo-0.0.1-SNAPSHOT.jar
```| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |通过设置环境类型

来降低成本,默认情况下,弹性 Beanstalk 环境是负载平衡的,
负载平衡器有很大的成本,
为了避免这种成本,请将环境类型设置为“单实例”,如[亚马逊文档](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-create-wizard.html#environments-create-wizard-capacity).
中所述,还可以通过使用 CLI 和以下命令创建单个实例环境:

``
eb create-s
```| +| |通过设置环境类型

来降低成本,默认情况下,弹性 Beanstalk 环境是负载平衡的,
负载平衡器有很大的成本,
为了避免这种成本,请将环境类型设置为“单实例”,如[亚马逊文档](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-create-wizard.html#environments-create-wizard-capacity)中所述,
还可以通过使用 CLI 和以下命令创建单个实例环境:

```
eb create -s
```| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.5.2.摘要 @@ -258,9 +258,9 @@ server.port=5000 $ boxfuse run myapp-1.0.jar -env=prod ``` -有关更多选项,请参见[“BoxFuse 运行”文档](https://cloudcaptain.sh/docs/commandline/run.html)。如果当前目录中存在[`boxfuse.conf`](https://cloudcaptain.sh/docs/commandline/#configuration)文件,则考虑该文件。 +有关更多选项,请参见[`boxfuse run`文档](https://cloudcaptain.sh/DOCS/commandline/run.html)。如果当前目录中存在[`boxfuse.conf`](https://cloudcaptain.sh/DOCS/commandline/#configuration)文件,则考虑该文件。 -| |默认情况下,CloudCaptain 会在启动时激活一个名为`boxfuse`的 Spring 配置文件。
如果你的可执行文件 jar 或 WAR 包含一个[应用程序-boxfuse.properties](https://cloudcaptain.sh/docs/payloads/springboot.html#configuration)文件,CloudCaptain 的配置基于其包含的属性。| +| |默认情况下,CloudCaptain 在启动时激活一个名为`boxfuse`的 Spring 配置文件。
如果你的可执行文件 jar 或战争包含一个[`application-boxfuse.properties`](https://cloudcaptain.sh/DOCS/payloads/springboot.html#configuration)文件,Cloudcaptain 的配置基于它所包含的属性。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 此时,CloudCaptain 将为你的应用程序创建一个映像,将其上载,并在 AWS 上配置和启动必要的资源,其输出结果类似于以下示例: @@ -287,7 +287,7 @@ Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at h 你的应用程序现在应该已经启动并在 AWS 上运行。 -请参阅[deploying Spring Boot apps on EC2](https://cloudcaptain.sh/blog/spring-boot-ec2.html)上的博客文章以及[documentation for the CloudCaptain Spring Boot integration](https://cloudcaptain.sh/docs/payloads/springboot.html),以开始运行该应用程序的 Maven 构建。 +请参阅[deploying Spring Boot apps on EC2](https://cloudcaptain.sh/blog/spring-boot-ec2.html)上的博客文章以及[documentation for the CloudCaptain Spring Boot integration](https://cloudcaptain.sh/docs/payloads/springboot.html),以开始使用 Maven 构建来运行该应用程序。 ### 1.7.天蓝色 @@ -295,11 +295,11 @@ Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at h ### 1.8.谷歌云 -Google Cloud 有几种可用于启动 Spring 启动应用程序的选项。最容易开始使用的可能是 App Engine,但你也可以找到在具有容器引擎的容器中或在具有计算引擎的虚拟机上运行 Spring 启动的方法。 +Google Cloud 有几种可用于启动 Spring 启动应用程序的选项。最容易开始使用的可能是 App Engine,但你也可以找到在带有容器引擎的容器中或在带有计算引擎的虚拟机上运行 Spring boot 的方法。 -要在 App Engine 中运行,你可以首先在 UI 中创建一个项目,该项目为你设置唯一的标识符,还可以设置 HTTP 路由。将一个 Java 应用程序添加到项目中,并将其保持为空,然后使用[Google Cloud SDK](https://cloud.google.com/sdk/install)将你的 Spring 引导应用程序从命令行或 CI 构建推入该插槽。 +要在 App Engine 中运行,你可以首先在 UI 中创建一个项目,该项目为你设置唯一的标识符,还可以设置 HTTP 路由。将一个 Java 应用程序添加到项目中,并将其保持为空,然后使用[Google Cloud SDK](https://cloud.google.com/sdk/install)将你的 Spring 启动应用程序从命令行或 CI 构建推入该插槽。 -App Engine 标准要求你使用战争包装。按照[these steps](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java8/springboot-helloworld/README.md)将 App Engine 标准应用程序部署到 Google Cloud。 +App Engine 标准要求你使用战争包装。按照[这些步骤](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java8/springboot-helloworld/README.md)将 App Engine 标准应用程序部署到 Google Cloud。 或者,App Engine Flex 要求你创建`app.yaml`文件来描述应用程序所需的资源。通常,将此文件放入`src/main/appengine`,它应该类似于以下文件: @@ -343,12 +343,12 @@ env_variables: ## 2. 安装 Spring 启动应用程序 -Spring 除了通过使用`java -jar`运行启动应用程序外,还可以为 UNIX 系统制作完全可执行的应用程序。完全可执行的 jar 可以像任何其他可执行的二进制文件一样执行,也可以是[registered with `init.d` or `systemd`](#deployment.installing.nix-services)。这有助于在公共生产环境中安装和管理 Spring 引导应用程序。 +Spring 除了通过使用`java -jar`运行启动应用程序外,还可以为 UNIX 系统制作完全可执行的应用程序。完全可执行的 jar 可以像任何其他可执行的二进制文件一样执行,也可以[注册为`init.d`或`systemd`](#deployment.installing.nix-services)。这有助于在公共生产环境中安装和管理 Spring 引导应用程序。 -| |完全可执行的 JAR 通过在文件前面嵌入一个额外的脚本来工作。
目前,一些工具不接受这种格式,因此你可能不能总是使用这种技术。
例如,`jar -xf`可能无法自动提取已完全可执行的 jar 或 WAR,
建议仅在打算直接执行时才使 jar 或 WAR 完全可执行,而不是使用`java -jar`运行它,或者将其部署到 Servlet 容器中。| +| |完全可执行的 JAR 通过在文件的前面嵌入一个额外的脚本来工作。
目前,一些工具不接受这种格式,因此你可能不能总是使用这种技术。
,例如,`jar -xf`可能无法自动提取已完全可执行的 jar 或 WAR,
建议仅在打算直接执行时才使 jar 或 WAR 完全可执行,而不是使用`java -jar`运行它,或者将其部署到 Servlet 容器中。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |不能使 ZIP64 格式的 jar 文件完全可执行。
尝试这样做将导致在直接执行或使用`java -jar`执行时报告为已损坏的 jar 文件。
包含一个或多个 ZIP64 格式嵌套 JAR 的标准格式 jar 文件可以完全可执行。| +| |不能使 ZIP64 格式的 jar 文件完全可执行。
尝试这样做将导致 jar 文件在直接执行或使用`java -jar`执行时被报告为已损坏。
包含一个或多个 ZIP64 格式嵌套 JAR 的标准格式 jar 文件可以完全可执行。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 要使用 Maven 创建一个“完全可执行的” jar,请使用以下插件配置: @@ -427,7 +427,7 @@ $ chown bootapp:bootapp your-app.jar 在这种情况下,默认的可执行脚本以`bootapp`用户的身份运行应用程序。 -| |为了减少应用程序的用户帐户遭到破坏的可能性,你应该考虑阻止它使用登录 shell。
例如,你可以将帐户的 shell 设置为`/usr/sbin/nologin`。| +| |为了减少应用程序的用户帐户遭到破坏的可能性,你应该考虑防止它使用登录 shell。
例如,你可以将帐户的 shell 设置为`/usr/sbin/nologin`。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 你还应该采取措施,防止修改应用程序的 jar 文件。首先,配置其权限,使其不能被写入,只能由其所有者读取或执行,如以下示例所示: @@ -444,7 +444,7 @@ $ sudo chattr +i your-app.jar 这将阻止任何用户(包括根用户)修改 jar。 -如果使用 root 来控制应用程序的服务,并且你[use a `.conf` file](#deployment.installing.nix-services.script-customization.when-running.conf-file)自定义其启动,则根用户将读取`.conf`文件并对其进行评估。它应该得到相应的保护。使用`chmod`使文件只能由所有者读取,并使用`chown`使根用户成为所有者,如以下示例所示: +如果使用 root 来控制应用程序的服务,并且你[使用`.conf`文件](#deployment.installing.nix-services.script-customization.when-running.conf-file)来定制其启动,则根用户将读取`.conf`文件并对其进行评估。它应该得到相应的保护。使用`chmod`使文件只能由所有者读取,并使用`chown`使根用户成为所有者,如以下示例所示: ``` $ chmod 400 your-app.conf @@ -493,13 +493,12 @@ $ systemctl enable myapp.service ##### 在编写开始脚本时自定义 ##### -当开始脚本被写入 jar 文件时,定制它的元素通常是有意义的。例如,init.d 脚本可以提供一个“描述”。因为你预先知道描述(并且不需要更改),所以在生成 jar 时也可以提供它。 +当开始脚本被写入 jar 文件时,定制它的元素通常是有意义的。例如,init.d 脚本可以提供一个“描述”。由于你预先知道描述(并且它不需要更改),因此在生成 jar 时也可以提供它。 -要定制写入的元素,请使用 Spring boot Maven 插件的`embeddedLaunchScriptProperties`选项或[`properties` property of the Spring Boot Gradle plugin’s `launchScript`](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#packaging-executable-configuring-launch-script)。 +要定制编写的元素,可以使用 Spring boot Maven 插件的`embeddedLaunchScriptProperties`选项或 Spring boot Gradle 插件的`properties`属性`launchScript`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/ Gradle-plugin/reference/htmlsinger/#packaging-executable-configing-ling-launation-launch-script)。 默认脚本支持以下属性替换: - | Name |说明| Gradle default | Maven default | |--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|------------------------------------------------------------| | `mode` |脚本模式。| `auto` | `auto` | @@ -512,7 +511,7 @@ $ systemctl enable myapp.service | `initInfoDescription` |`Description`“init info”部分。| `${project.description}` (falling back to `${task.baseName}`) |`${project.description}` (falling back to `${project.name}`)| | `initInfoChkconfig` |`chkconfig`“init info”部分| `2345 99 01` | `2345 99 01` | | `confFolder` |`CONF_FOLDER`的默认值| Folder containing the jar | Folder containing the jar | -| `inlinedConfScript` |引用在默认启动脚本中应该内联的文件脚本。
在加载任何外部配置文件之前,这可以用来设置环境变量,例如`JAVA_OPTS`| | | +| `inlinedConfScript` |引用在默认启动脚本中应该内联的文件脚本。
在加载任何外部配置文件之前,这可以用于设置环境变量,例如`JAVA_OPTS`| | | | `logFolder` |`LOG_FOLDER`的默认值。
仅对`init.d`服务有效| | | | `logFilename` |`LOG_FILENAME`的默认值。
仅对`init.d`服务有效| | | | `pidFolder` |`PID_FOLDER`的默认值。
仅对`init.d`服务有效| | | @@ -522,35 +521,31 @@ $ systemctl enable myapp.service ##### 在脚本运行时自定义脚本 ##### -对于需要自定义*之后* jar 的脚本项,可以使用环境变量或[config file](#deployment.installing.nix-services.script-customization.when-running.conf-file)。 +对于需要自定义*之后* jar 已编写的脚本的项,可以使用环境变量或[配置文件](#deployment.installing.nix-services.script-customization.when-running.conf-file)。 默认脚本支持以下环境属性: - | Variable |说明| -|-----------------------|---------------| +|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `MODE` |操作的“模式”。
默认值取决于构建 jar 的方式,但通常是`auto`(这意味着它试图通过检查来猜测它是否是一个 init 脚本)如果它是一个名为`init.d`的目录中的符号链接)。
你可以显式地将它设置为`service`,这样 `stop|start|status|restart` commands work or to `run` if you want to run the script in the foreground.| | `RUN_AS_USER` |将用于运行该应用程序的用户。
当未设置时,将使用 OWNS jar 文件的用户。| |`USE_START_STOP_DAEMON`|是否应该使用`start-stop-daemon`命令来控制进程。
默认为`true`。| -| `PID_FOLDER` |PID 文件夹的根名(默认为 `/var/run’)。| -| `LOG_FOLDER` |放置日志文件的文件夹的名称(默认情况下为“/var/log”)。| +| `PID_FOLDER` |PID 文件夹的根名(默认情况下`/var/run`)。| +| `LOG_FOLDER` |将日志文件放入其中的文件夹名称(默认情况下`/var/log`)。| | `CONF_FOLDER` |读取.conf 文件的文件夹的名称(默认情况下与 jar-file 文件相同)。| -| `LOG_FILENAME` |在`LOG_FOLDER`(`.log` 默认情况下)中日志文件的名称。| -| `APP_NAME` |应用程序的名称。
如果 jar 是从符号链接运行的,则脚本猜测应用程序的名称。
如果不是符号链接,或者你希望显式设置应用程序名称,这可能是有用的。| +| `LOG_FILENAME` |在`LOG_FOLDER`(默认情况下`.log`)中的日志文件的名称。| +| `APP_NAME` |应用程序的名称。
如果 jar 是从符号链接运行的,则脚本将猜测应用程序的名称。
如果不是符号链接,或者你希望显式设置应用程序名称,这将非常有用。| | `RUN_ARGS` |要传递给程序( Spring 引导应用程序)的参数。| | `JAVA_HOME` |默认情况下,`java`可执行文件的位置是通过使用`PATH`发现的,但是如果在`$JAVA_HOME/bin/java`处有一个可执行文件,则可以显式地设置它。| | `JAVA_OPTS` |在 JVM 启动时传递给它的选项。| -| `JARFILE` |jar 文件的明确位置,以防该脚本被用来启动 jar 它实际上并未嵌入。| +| `JARFILE` |jar 文件的明确位置,以防该脚本被用来启动一个 jar 文件,该 jar 文件实际上并未被嵌入。| | `DEBUG` |如果不是空的,则在 shell 进程上设置`-x`标志,允许你查看脚本中的逻辑。| -| `STOP_WAIT_TIME` |在强制关闭应用程序之前,停止应用程序所需的等待时间(以秒为单位)(默认为 `60’)。| - - -> `PID_FOLDER`,`LOG_FOLDER`,和`LOG_FILENAME`变量仅对`init.d`服务有效。 -> 对于`systemd`,通过使用’service’脚本进行等效的自定义。 -> 有关更多详细信息,请参见[服务单元配置手册页](https://www.freedesktop.org/software/systemd/man/systemd.service.html)。 +| `STOP_WAIT_TIME` |在强制关机之前停止应用程序所需的等待时间(默认情况下`60`)。| +| |`PID_FOLDER`,`LOG_FOLDER`,和`LOG_FILENAME`变量仅对`init.d`服务有效。
对于`systemd`,通过使用’service’脚本进行等效的定制。有关更多详细信息,请参见<234r="232"/>。| +|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -除了`JARFILE`和`APP_NAME`之外,可以通过使用`.conf`文件配置上一节中列出的设置。该文件预计将位于 jar 文件的旁边,并且具有相同的名称,但后缀为`.conf`,而不是`.jar`。例如,名为`/var/myapp/myapp.jar`的 jar 使用名为`/var/myapp/myapp.conf`的配置文件,如以下示例所示: +除了`JARFILE`和`APP_NAME`之外,可以使用`.conf`文件配置上一节中列出的设置。该文件预计将位于 jar 文件的旁边,并且具有相同的名称,但后缀为`.conf`,而不是`.jar`。例如,名为`/var/myapp/myapp.jar`的 jar 使用名为`/var/myapp/myapp.conf`的配置文件,如以下示例所示: myapp.conf @@ -559,19 +554,20 @@ JAVA_OPTS=-Xmx1024M LOG_FOLDER=/custom/log/folder ``` -> 如果不喜欢将配置文件放在 jar 文件旁边,则可以设置`CONF_FOLDER`环境变量来定制配置文件的位置。 +| |如果不喜欢将配置文件放在 jar 文件旁边,则可以设置`CONF_FOLDER`环境变量来定制配置文件的位置。| +|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------| 要了解如何适当地保护此文件,请参见[获得 init.d 服务的指导方针](#deployment.installing.nix-services.init-d.securing)。 ### 2.3.Microsoft Windows 服务 -Spring 启动应用程序可以通过使用[`winsw`](https://github.com/kohsuke/winsw)作为 Windows 服务启动。 +Spring 启动应用程序可以通过使用[`winsw`]作为 Windows 服务启动。 a([单独维护的样本](https://github.com/snicoll/spring-boot-daemon))逐步描述了如何为 Spring 引导应用程序创建 Windows 服务。 -## 3. 接下来读什么? +## 3. 接下来要读什么? -有关 PaaS 可以提供的特性的更多信息,请参见[Cloud Foundry](https://www.cloudfoundry.org/)、[Heroku](https://www.heroku.com/)、[OpenShift](https://www.openshift.com)和[Boxfuse](https://boxfuse.com)网站。这些只是最受欢迎的 Java PaaS 提供商中的四个。 Spring 由于引导非常适合基于云的部署,因此你也可以自由地考虑其他提供商。 +有关 PaaS 可以提供的特性的更多信息,请参见[Cloud Foundry](https://www.cloudfoundry.org/)、[Heroku](https://www.heroku.com/)、[OpenShift](https://www.openshift.com)和[Boxfuse](https://boxfuse.com)网站。这些只是最受欢迎的 Java PaaS 提供商中的四个。由于 Spring 启动非常适合基于云的部署,因此你也可以自由地考虑其他提供商。 -下一节继续介绍*[Spring Boot CLI](cli.html#cli)*,或者你可以提前阅读有关*[构建工具插件](build-tool-plugins.html#build-tool-plugins)*的内容。 +下一节继续介绍 *[Spring Boot CLI](cli.html#cli)*,或者你可以提前阅读有关 *[构建工具插件](build-tool-plugins.html#build-tool-plugins)* 的内容。 diff --git a/docs/spring-boot/documentation.md b/docs/spring-boot/documentation.md index 54215da158ad1f470bed463979412e0d9886c1ef..14988500e0238dbf4339f4b364f36a45633ffb97 100644 --- a/docs/spring-boot/documentation.md +++ b/docs/spring-boot/documentation.md @@ -8,7 +8,7 @@ 如果你开始使用 Spring boot 或一般的“ Spring”,请从[以下主题](getting-started.html#getting-started)开始: -* **从零开始:** [Overview](getting-started.html#getting-started.introducing-spring-boot) | [Requirements](getting-started.html#getting-started.system-requirements) | [Installation](getting-started.html#getting-started.installing) +* **从零开始:** [Overview](getting-started.html#getting-started.introducing-spring-boot) | [所需经费](getting-started.html#getting-started.system-requirements) | [安装](getting-started.html#getting-started.installing) * **教程:** [Part 1](getting-started.html#getting-started.first-application) | [Part 2](getting-started.html#getting-started.first-application.code) @@ -32,13 +32,13 @@ * **构建系统:** [Maven](using.html#using.build-systems.maven) | [Gradle](using.html#using.build-systems.gradle) | [Ant](using.html#using.build-systems.ant) | [Starters](using.html#using.build-systems.starters) -* **最佳实践:** [Code Structure](using.html#using.structuring-your-code) | [@Configuration](using.html#using.configuration-classes) | [@enableAutoConfiguration](using.html#using.auto-configuration) | [bean 和依赖注入](using.html#using.spring-beans-and-dependency-injection) +* **最佳实践:** [代码结构](using.html#using.structuring-your-code) | [@ 配置](using.html#using.configuration-classes) | [@enableAutoConfiguration](using.html#using.auto-configuration) | [bean 和依赖注入](using.html#using.spring-beans-and-dependency-injection) * **运行你的代码:** [IDE](using.html#using.running-your-application.from-an-ide) | [Packaged](using.html#using.running-your-application.as-a-packaged-application) | [Maven](using.html#using.running-your-application.with-the-maven-plugin) | [Gradle](using.html#using.running-your-application.with-the-gradle-plugin) -* **打包应用程序:** [Production jars](using.html#using.packaging-for-production) +* **打包应用程序:** [生产罐子](using.html#using.packaging-for-production) -* **Spring Boot CLI:** [Using the CLI](cli.html#cli) +* **Spring Boot CLI:** [使用 CLI](cli.html#cli) ## 4. 学习 Spring 引导功能 @@ -98,7 +98,7 @@ * **石英:** [石英调度](io.html#io.quartz) -* **邮件:** [Sending Email](io.html#io.email) +* **邮件:** [发送电子邮件](io.html#io.email) * **验证:** [JSR-303 验证](io.html#io.validation) @@ -126,5 +126,5 @@ Spring Boot 为构建高效的容器映像提供了一流的支持。你可以 * **构建工具插件:** [Maven](build-tool-plugins.html#build-tool-plugins.maven) | [Gradle](build-tool-plugins.html#build-tool-plugins.gradle) -* **附录:** [应用程序属性](application-properties.html#appendix.application-properties) | [配置元数据](configuration-metadata.html#appendix.configuration-metadata) | [自动配置类](auto-configuration-classes.html#appendix.auto-configuration-classes) | [测试自动配置注释](test-auto-configuration.html#appendix.test-auto-configuration) | [Executable Jars](executable-jar.html#appendix.executable-jar) | [依赖版本](dependency-versions.html#appendix.dependency-versions) +* **附录:** [应用程序属性](application-properties.html#appendix.application-properties) | [配置元数据](configuration-metadata.html#appendix.configuration-metadata) | [自动配置类](auto-configuration-classes.html#appendix.auto-configuration-classes) | [测试自动配置注释](test-auto-configuration.html#appendix.test-auto-configuration) | [可执行 JAR](executable-jar.html#appendix.executable-jar) | [依赖版本](dependency-versions.html#appendix.dependency-versions) diff --git a/docs/spring-boot/features.md b/docs/spring-boot/features.md index cfccc70a6f8493fbe299c978d5440536a221e634..d50bf0e54d44fc67cd1999d926be1bfec9f75452 100644 --- a/docs/spring-boot/features.md +++ b/docs/spring-boot/features.md @@ -68,12 +68,12 @@ Action: Identify and stop the process that is listening on port 8080 or configure this application to listen on another port. ``` -| |Spring Boot 提供了许多`FailureAnalyzer`实现,并且可以[add your own](howto.html#howto.application.failure-analyzer)。| +| |Spring Boot 提供了许多`FailureAnalyzer`实现,并且可以[添加你自己的](howto.html#howto.application.failure-analyzer)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------| -如果没有故障分析器能够处理异常,则仍然可以显示完整的条件报告,以更好地了解出了什么问题。要这样做,你需要[enable the `debug` property](#features.external-config)或[enable `DEBUG` logging](#features.logging.log-levels)for`org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener`。 +如果没有故障分析器能够处理异常,则仍然可以显示完整的条件报告,以更好地了解出了什么问题。为此,你需要[启用`debug`属性]或[启用`DEBUG`日志](#features.logging.log-levels)来实现`org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener`。 -例如,如果你使用`java -jar`运行你的应用程序,你可以启用`debug`属性,如下所示: +例如,如果你正在使用`java -jar`运行你的应用程序,那么你可以启用`debug`属性,如下所示: ``` $ java -jar myproject-0.0.1-SNAPSHOT.jar --debug @@ -106,25 +106,25 @@ spring: ### 1.3.自定义横幅 -可以通过在 Classpath 中添加`banner.txt`文件或将`spring.banner.location`属性设置为此类文件的位置来更改在启动时打印的横幅。如果文件的编码不是 UTF-8,则可以设置`spring.banner.charset`。除了文本文件之外,还可以在 Classpath 中添加`banner.gif`、`banner.jpg`或`banner.png`图像文件,或者设置`spring.banner.image.location`属性。图像被转换为 ASCII 艺术表现,并打印在任何文本横幅之上。 +可以通过将`banner.txt`文件添加到 Classpath 或将`spring.banner.location`属性设置为此类文件的位置来更改在启动时打印的横幅。如果文件的编码不是 UTF-8,则可以设置`spring.banner.charset`。除了文本文件,还可以在 Classpath 中添加`banner.gif`、`banner.jpg`或`banner.png`图像文件,或者设置`spring.banner.image.location`属性。图像被转换为 ASCII 艺术表现,并打印在任何文本横幅之上。 在`banner.txt`文件中,你可以使用`Environment`中可用的任何键以及以下任何占位符: | Variable |说明| |--------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `${application.version}` |应用程序的版本号,如`MANIFEST.MF`中声明的。
例如,`Implementation-Version: 1.0`打印为`1.0`。| -| `${application.formatted-version}` |应用程序的版本号,如`MANIFEST.MF`中声明的那样,并进行了格式化以供显示(周围用括号包围,前缀为`v`)。
例如`(v1.0)`。| +| `${application.formatted-version}` |应用程序的版本号,如在`MANIFEST.MF`中声明的那样,并已格式化以供显示(周围用括号包围,前缀为`v`)。
例如`(v1.0)`。| | `${spring-boot.version}` |你正在使用的 Spring 引导版本。
例如`2.6.4`。| | `${spring-boot.formatted-version}` |你正在使用的 Spring 引导版本,格式为显示(周围用括号和前缀`v`)。
例如`(v2.6.4)`。| -|`${Ansi.NAME}` (or `${AnsiColor.NAME}`, `${AnsiBackground.NAME}`, `${AnsiStyle.NAME}`)|其中`NAME`是 ANSI 转义代码的名称。
有关详细信息,请参见[“AnsipropertySource”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiPropertySource.java)。| +|`${Ansi.NAME}` (or `${AnsiColor.NAME}`, `${AnsiBackground.NAME}`, `${AnsiStyle.NAME}`)|其中`NAME`是一个 ANSI 逃逸代码的名称。
详见[`AnsiPropertySource`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/boot/ansi/ansipropertysource.java)。| | `${application.title}` |在`MANIFEST.MF`中声明的应用程序的标题。
例如`Implementation-Title: MyApp`打印为`MyApp`。| | |如果你想以编程方式生成横幅,可以使用`SpringApplication.setBanner(…​)`方法。
使用`org.springframework.boot.Banner`接口并实现你自己的`printBanner()`方法。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -你还可以使用`spring.main.banner-mode`属性来确定横幅是否必须打印在`System.out`(`console’)上,发送到配置的日志程序(`log’),或者根本不生成(`off’)。 +你还可以使用`spring.main.banner-mode`属性来确定横幅是否必须在`System.out`(`console`)上打印、发送到配置的记录器(`log`),或者根本不产生(`off`)。 -打印的横幅被注册为单件 Bean,其名称如下:`springBootBanner`。 +打印的横幅以单件 Bean 的形式注册,其名称如下:`springBootBanner`。 | |只有当你使用 Spring 引导启动器时,`${application.version}`和`${application.formatted-version}`属性才可用。
这些值将不会被解析如果你正在运行一个 Unpacked jar 并以`java -cp `启动它。

这就是为什么我们建议你总是使用`java org.springframework.boot.loader.JarLauncher`启动 Unpacked JAR。
这将在构建 Classpath 并启动应用程序之前初始化`application.*`横幅变量。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -154,9 +154,9 @@ public class MyApplication { | |传递给`SpringApplication`的构造函数参数是 Spring bean 的配置源。
在大多数情况下,这些参数是对`@Configuration`类的引用,但它们也可以是直接引用`@Component`类。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -也可以通过使用`application.properties`文件配置`SpringApplication`。详见*[外部化配置](#features.external-config)*。 +也可以通过使用`application.properties`文件配置`SpringApplication`。详见 *[外部化配置](#features.external-config)*。 -有关配置选项的完整列表,请参见[“SpringApplication”Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/SpringApplication.html)。 +有关配置选项的完整列表,请参见[`SpringApplication`Javadoc](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/springapplication.html)。 ### 1.5.Fluent Builder API @@ -173,7 +173,7 @@ new SpringApplicationBuilder() ``` -| |创建`ApplicationContext`层次结构时有一些限制。
例如,Web 组件**必须**包含在子上下文中,并且相同的`Environment`用于父上下文和子上下文。
有关详细信息,请参见[SpringApplicationBuilder Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/builder/SpringApplicationBuilder.html)。| +| |在创建`ApplicationContext`层次结构时会有一些限制。
例如,Web 组件**必须**被包含在子上下文中,并且相同的`Environment`同时用于父上下文和子上下文。
参见[`SpringApplicationBuilder`Javadoc](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/org/applicationframework/applicbuilder/applicbuilder/applicbuilder/applatform/applicform/applicbuilder)以获取全部详细信息。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 1.6.应用程序可用性 @@ -186,7 +186,7 @@ new SpringApplicationBuilder() 应用程序的“活性”状态表示其内部状态是否允许其正确工作,或者在当前出现故障时是否允许其自行恢复。中断的“活性”状态意味着应用程序处于无法恢复的状态,基础结构应该重新启动应用程序。 -| |通常,“活性”状态不应该基于外部检查,例如[Health checks](actuator.html#actuator.endpoints.health)。
如果是这样,失败的外部系统(数据库、Web API、外部缓存)将触发大规模重启和跨平台的级联故障。| +| |通常,“活性”状态不应该基于外部检查,例如[健康检查](actuator.html#actuator.endpoints.health)。
如果是这样,失败的外部系统(数据库、Web API、外部缓存)将触发大规模重启和跨平台的级联故障。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Spring 引导应用程序的内部状态主要由 Spring `ApplicationContext`表示。 Spring 如果应用程序上下文已成功启动,则启动假定应用程序处于有效状态。一旦上下文被刷新,应用程序就被认为是实时的,请参见[Spring Boot application lifecycle and related Application Events](#features.spring-application.application-events-and-listeners)。 @@ -261,22 +261,22 @@ public class MyLocalCacheVerifier { ``` -Spring Boot 提供[Kubernetes HTTP 探测与执行器健康端点的“活性”和“准备状态”](actuator.html#actuator.endpoints.kubernetes-probes)。你可以获得更多关于[deploying Spring Boot applications on Kubernetes in the dedicated section](deployment.html#deployment.cloud.kubernetes)的指导。 +Spring Boot 提供[Kubernetes HTTP 探测与执行器健康端点的“活性”和“准备”](actuator.html#actuator.endpoints.kubernetes-probes)。你可以获得更多关于[deploying Spring Boot applications on Kubernetes in the dedicated section](deployment.html#deployment.cloud.kubernetes)的指导。 ### 1.7.应用程序事件和监听器 -Spring 除了通常的框架事件,例如[“Contextrefreshedevent”](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/context/event/ContextRefreshedEvent.html),一个`SpringApplication`发送一些额外的应用程序事件。 +除了通常的 Spring 框架事件,如[`ContextRefreshedEvent`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/context/event/contextrefreshedevent.html),a`SpringApplication`发送一些额外的应用程序事件。 -| |有些事件实际上是在`ApplicationContext`被创建之前被触发的,所以你不能在这些事件上注册一个侦听器作为`@Bean`。
你可以用`SpringApplication.addListeners(…​)`方法或`SpringApplicationBuilder.listeners(…​)`方法来注册它们,
如果你想要自动注册这些侦听器,无论创建应用程序的方式如何,你都可以通过使用`org.springframework.context.ApplicationListener`键将`META-INF/spring.factories`文件添加到你的项目中,并引用你的侦听器,如以下示例所示:

``
org.applingframework.context.context.aptationListener=com.example.project.myListener
``````| +| |有些事件实际上是在`ApplicationContext`被创建之前被触发的,所以你不能在这些事件上注册一个侦听器作为`@Bean`。
你可以用`SpringApplication.addListeners(…​)`方法或`SpringApplicationBuilder.listeners(…​)`方法来注册它们,

如果你想要自动注册这些侦听器,无论创建应用程序的方式如何,你都可以通过使用`org.springframework.context.ApplicationListener`键向项目添加`META-INF/spring.factories`文件并引用侦听器,如以下示例所示:

```
org.springframework.context.ApplicationListener=com.example.project.MyListener
```| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 在应用程序运行时,应用程序事件按以下顺序发送: 1. 一个`ApplicationStartingEvent`在运行开始时但在任何处理之前发送,除了注册侦听器和初始化器。 -2. 当要在上下文中使用的`Environment`是已知的但在创建上下文之前发送`ApplicationEnvironmentPreparedEvent`。 +2. 当要在上下文中使用的`Environment`是已知的但在创建上下文之前,则发送`ApplicationEnvironmentPreparedEvent`。 -3. 当`ApplicationContext`准备好并且在加载任何 Bean 定义之前调用了应用上下文初始化器时,将发送`ApplicationContextInitializedEvent`。 +3. 当`ApplicationContext`准备好并且在加载任何 Bean 定义之前调用了应用上下文初始化器时,发送`ApplicationContextInitializedEvent`。 4. 一个`ApplicationPreparedEvent`在刷新开始之前但是在 Bean 定义加载之后被发送。 @@ -288,11 +288,11 @@ Spring 除了通常的框架事件,例如[“Contextrefreshedevent”](https:/ 8. 在使用`ReadinessState.ACCEPTING_TRAFFIC`之后立即发送`AvailabilityChangeEvent`,以表明应用程序已准备好为请求提供服务。 -9. 如果启动时出现异常,则发送`ApplicationFailedEvent`。 +9. 如果启动时有异常,则发送`ApplicationFailedEvent`。 -上面的列表只包括与`SpringApplicationEvent`绑定的`SpringApplication`。除了这些,以下事件还发布在`ApplicationPreparedEvent`之后和`ApplicationStartedEvent`之前: +上面的列表只包含与`SpringApplication`绑定的`SpringApplicationEvent`。除了这些,以下事件还发布在`ApplicationPreparedEvent`之后和`ApplicationStartedEvent`之前: -* 在`WebServer`准备好之后发送`WebServerInitializedEvent`。“ServletWebServerInitializeDevent”和`ReactiveWebServerInitializedEvent`分别是 Servlet 和反应变量。 +* 在`WebServer`准备好之后发送`WebServerInitializedEvent`。`ServletWebServerInitializedEvent`和`ReactiveWebServerInitializedEvent`分别是 Servlet 和活性变量。 * 当刷新`ApplicationContext`时,将发送`ContextRefreshedEvent`。 @@ -304,7 +304,7 @@ Spring 除了通常的框架事件,例如[“Contextrefreshedevent”](https:/ 应用程序事件通过使用 Spring Framework 的事件发布机制发送。该机制的一部分确保在子上下文中发布给侦听器的事件也在任何祖先上下文中发布给侦听器。因此,如果应用程序使用`SpringApplication`实例的层次结构,则侦听器可能会接收同一类型的应用程序事件的多个实例。 -为了使侦听器能够区分其上下文的事件和子代上下文的事件,它应该请求注入其应用程序上下文,然后将注入的上下文与事件的上下文进行比较。上下文可以通过实现`ApplicationContextAware`来注入,或者,如果侦听器是 Bean,则可以通过使用`@Autowired`来注入。 +为了允许侦听器区分其上下文的事件和子代上下文的事件,它应该请求注入其应用程序上下文,然后将注入的上下文与事件的上下文进行比较。上下文可以通过实现`ApplicationContextAware`来注入,或者,如果侦听器是 Bean,则可以通过使用`@Autowired`来注入。 ### 1.8.网络环境 @@ -377,7 +377,7 @@ public class MyCommandLineRunner implements CommandLineRunner { ``` -如果定义了几个`CommandLineRunner`或`ApplicationRunner`bean,并且必须以特定的顺序进行调用,则可以另外实现`org.springframework.core.Ordered`接口或使用`org.springframework.core.annotation.Order`注释。 +如果定义了几个`CommandLineRunner`或`ApplicationRunner`bean,必须以特定的顺序进行调用,则可以另外实现`org.springframework.core.Ordered`接口或使用`org.springframework.core.annotation.Order`注释。 ### 1.11.应用程序退出 @@ -411,14 +411,14 @@ public class MyApplication { ### 1.12.管理功能 -通过指定`spring.application.admin.enabled`属性,可以为应用程序启用与管理相关的特性。这将在平台`MBeanServer`上公开[SpringApplication AdminMXBean’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/admin/SpringApplicationAdminMXBean.java)。你可以使用此功能远程管理你的 Spring 启动应用程序。这个特性对于任何服务包装器实现都是有用的。 +通过指定`spring.application.admin.enabled`属性,可以为应用程序启用与管理相关的特性。这暴露了平台上的[`SpringApplicationAdminMXBean`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot/SRC/main/java/org/springframework/boot/admin/applicationadmxbean.java)`MBeanServer`。你可以使用此功能远程管理你的 Spring 启动应用程序。这个特性对于任何服务包装器实现都是有用的。 | |如果你想知道应用程序在哪个 HTTP 端口上运行,请使用`local.server.port`的键获取该属性。| |---|----------------------------------------------------------------------------------------------------------------------| ### 1.13.应用程序启动跟踪 -在应用程序启动期间,`SpringApplication`和`ApplicationContext`执行许多与应用程序生命周期、bean 生命周期甚至处理应用程序事件有关的任务。使用[ApplicationStartup](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/core/metrics/ApplicationStartup.html), Spring 框架[allows you to track the application startup sequence with `StartupStep` objects](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/core.html#context-functionality-startup)。收集这些数据可以用于分析目的,或者仅仅是为了更好地了解应用程序启动过程。 +在应用程序启动期间,`SpringApplication`和`ApplicationContext`执行许多与应用程序生命周期、bean 生命周期甚至处理应用程序事件有关的任务。通过[`ApplicationStartup`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/core/metrics/applicationstartup.html), Spring Framework[允许你使用`StartupStep`对象跟踪应用程序启动序列](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/ception/core-funicity.html#context-function-收集这些数据可以用于分析目的,或者仅仅是为了更好地了解应用程序启动过程。 在设置`SpringApplication`实例时,可以选择`ApplicationStartup`实现。例如,要使用`BufferingApplicationStartup`,你可以写: @@ -440,15 +440,15 @@ public class MyApplication { ``` -第一个可用的实现,`FlightRecorderApplicationStartup`是由 Spring 框架提供的。它将 Spring 特定的启动事件添加到 Java 飞行记录器会话中,用于分析应用程序,并将其 Spring 上下文生命周期与 JVM 事件(例如分配、GCS、类加载……)关联起来。一旦配置完成,你就可以通过启用飞行记录器来运行应用程序来记录数据: +第一个可用的实现方式,`FlightRecorderApplicationStartup`是由 Spring 框架提供的。它将 Spring 特定的启动事件添加到 Java 飞行记录器会话中,用于分析应用程序,并将其 Spring 上下文生命周期与 JVM 事件(例如分配、GCS、类加载……)关联起来。一旦配置完成,你就可以通过启用飞行记录器来运行应用程序来记录数据: ``` $ java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar demo.jar ``` -Spring boot 附带`BufferingApplicationStartup`变体;该实现用于缓冲启动步骤并将其导入外部度量系统。应用程序可以在任何组件中请求类型`BufferingApplicationStartup`的 Bean。 +Spring boot 附带`BufferingApplicationStartup`变体;该实现用于缓冲启动步骤并将它们排入外部度量系统。应用程序可以在任何组件中请求类型`BufferingApplicationStartup`的 Bean。 -Spring 还可以将引导配置为公开一个[“启动”端点](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/htmlsingle/#startup),该[“启动”端点](https://docs.spring.io/spring-boot/docs/2.6.4/actuator-api/htmlsingle/#startup)作为 JSON 文档提供该信息。 +Spring 启动还可以被配置为公开一个[`startup`端点](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/actuator-api/htmlsingle/#startup),它将此信息作为 JSON 文档提供。 ## 2. 外部化配置 @@ -461,7 +461,7 @@ Spring 引导使用非常特殊的`PropertySource`顺序,该顺序被设计为 1. 默认属性(通过设置`SpringApplication.setDefault属性`指定)。 -2. [@PropertySource](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/context/annotation/PropertySource.html)类上的注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到`Environment`中。现在配置某些属性(如`logging.*`和`spring.main.*`)已经太晚了,这些属性是在开始刷新之前读取的。 +2. [`@PropertySource`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/context/annotation/propertysource.html)你的`@Configuration`类上的注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到`Environment`中。现在配置某些属性(如`logging.*`和`spring.main.*`)已经太晚了,这些属性是在开始刷新之前读取的。 3. 配置数据(如`application.properties`文件)。 @@ -469,7 +469,7 @@ Spring 引导使用非常特殊的`PropertySource`顺序,该顺序被设计为 5. OS 环境变量。 -6. java system properties(`system.get属性()’)。 +6. Java 系统属性(`System.get属性()`)。 7. 来自`java:comp/env`的 JNDI 属性。 @@ -482,23 +482,23 @@ Spring 引导使用非常特殊的`PropertySource`顺序,该顺序被设计为 11. 命令行参数。 12. `properties`测试中的属性。 - 在[@springboottest](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/test/context/SpringBootTest.html)和[测试用于测试应用程序的特定部分的注释](#features.testing.spring-boot-applications.autoconfigured-tests)上可用。 + 可在[`@SpringBootTest`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/test/context/springbootttest.html)和[测试用于测试应用程序的特定部分的注释](#features.testing.spring-boot-applications.autoconfigured-tests)上查阅。 -13. [@TestPropertySource](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/test/context/TestPropertySource.html)对测试的注释。 +13. [`@TestPropertySource`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/test/context/testpropertysource.html)测试上的注释。 14. 当 devtools 处于活动状态时,[DevTools 全局设置属性](using.html#using.devtools.globalsettings)在`$HOME/.config/spring-boot`目录中。 配置数据文件按以下顺序考虑: -1. [应用程序属性](#features.external-config.files)打包在你的 jar(`application.properties’和 YAML 变体)中。 +1. [应用程序属性](#features.external-config.files)封装在你的 jar 中(`application.properties`和 YAML 变体)。 -2. [特定于配置文件的应用程序属性](#features.external-config.files.profile-specific)打包在你的 jar(`application-{profile}.properties’和 YAML 变体)中。 +2. [特定于配置文件的应用程序属性](#features.external-config.files.profile-specific)封装在你的 jar 中(`application-{profile}.properties`和 YAML 变体)。 -3. [应用程序属性](#features.external-config.files)在你打包的 jar 之外(“application.properties”和 YAML 变体)。 +3. [应用程序属性](#features.external-config.files)在你打包的 jar 之外(`application.properties`和 YAML 变体)。 -4. [特定于配置文件的应用程序属性](#features.external-config.files.profile-specific)在你打包的 jar 之外(`application-{profile}.properties’和 YAML 变体)。 +4. [特定于配置文件的应用程序属性](#features.external-config.files.profile-specific)在你打包的 jar 之外(`application-{profile}.properties`和 YAML 变体)。 -| |对于整个应用程序,建议使用一种格式。如果你的配置文件中同时有`.properties`和`.yml`两种格式,则`.properties`优先。| +| |对于整个应用程序,建议使用一种格式。如果你的配置文件同时具有`.properties`和`.yml`两种格式,那么`.properties`将优先使用。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 为了提供一个具体的示例,假设你开发了一个`@Component`,它使用了`name`属性,如以下示例所示: @@ -519,7 +519,7 @@ public class MyBean { ``` -在你的应用程序 Classpath(例如,在你的 jar 内部)上,你可以拥有一个`application.properties`文件,该文件为`name`提供了一个合理的默认属性值。在新环境中运行时,可以在 jar 之外提供一个`application.properties`文件,该文件覆盖`name`。对于一次性测试,可以使用特定的命令行开关启动(例如,`java -jar app.jar --name="Spring"`)。 +在你的应用程序 Classpath 上(例如,在你的 jar 内部),你可以拥有一个`application.properties`文件,该文件为`name`提供了一个合理的默认属性值。在新环境中运行时,可以在 jar 之外提供一个`application.properties`文件,该文件覆盖`name`。对于一次性测试,可以使用特定的命令行开关启动(例如,`java -jar app.jar --name="Spring"`)。 | |`env`和`configprops`端点可以用于确定属性为什么具有特定值。
你可以使用这两个端点来诊断意外的属性值。
有关详细信息,请参见“[生产就绪功能](actuator.html#actuator.endpoints)一节。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -528,11 +528,11 @@ public class MyBean { 默认情况下,`SpringApplication`将任何命令行选项参数(即以`--`开头的参数,例如`--server.port=9000`)转换为`property`,并将其添加到 Spring `Environment`。如前所述,命令行属性总是优先于基于文件的属性源。 -如果不希望将命令行属性添加到`Environment`,则可以通过使用`SpringApplication.setAddCommandLine属性(false)`禁用它们。 +如果不希望将命令行属性添加到`Environment`,则可以使用`SpringApplication.setAddCommandLine属性(false)`禁用它们。 ### 2.2.JSON 应用程序属性 -环境变量和系统属性通常有一些限制,这意味着一些属性名称不能使用。 Spring Boot 允许你将一组属性编码到一个 JSON 结构中,以帮助实现这一点。 +环境变量和系统属性通常有一些限制,这意味着一些属性名称不能使用。为了帮助实现这一点, Spring Boot 允许你将一组属性编码到一个 JSON 结构中。 当应用程序启动时,任何`spring.application.json`或`SPRING_APPLICATION_JSON`属性都将被解析并添加到`Environment`中。 @@ -579,9 +579,9 @@ Spring 当应用程序启动时,启动将自动从以下位置查找并加载` 3. `/config`子目录的直接子目录 -该列表是按优先级排序的(来自较低项的值覆盖了较早的项)。来自加载的文件的文档被添加为`PropertySources`到 Spring `Environment`。 +该列表是按优先级排序的(来自较低项的值覆盖了较早的项)。来自加载的文件的文档以`PropertySources`的形式添加到 Spring `Environment`中。 -如果不喜欢`application`作为配置文件名,则可以通过指定`spring.config.name`环境属性切换到另一个文件名。例如,要查找`myproject.properties`和`myproject.yaml`文件,你可以按以下方式运行应用程序: +如果不喜欢将`application`作为配置文件名,则可以通过指定`spring.config.name`环境属性切换到另一个文件名。例如,要查找`myproject.properties`和`myproject.yaml`文件,你可以按以下方式运行应用程序: ``` $ java -jar myproject.jar --spring.config.name=myproject @@ -597,7 +597,7 @@ $ java -jar myproject.jar --spring.config.location=\ optional:classpath:/override.properties ``` -| |如果[位置是可选的](#features.external-config.files.optional-prefix),则使用前缀`optional:`,并且不介意它们是否不存在。| +| |如果[位置是可选的](#features.external-config.files.optional-prefix),则使用前缀`optional:`,如果它们不存在,则不介意。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------| | |`spring.config.name`、`spring.config.location`和`spring.config.additional-location`很早就被用于确定必须加载哪些文件。
它们必须被定义为一个环境属性(通常是一个 OS 环境变量、一个系统属性或一个命令行参数)。| @@ -610,7 +610,7 @@ $ java -jar myproject.jar --spring.config.location=\ 在大多数情况下,你添加的每个`spring.config.location`项都将引用一个文件或目录。位置是按照定义的顺序进行处理的,后面的位置可以覆盖前面的位置的值。 -如果你有一个复杂的位置设置,并且你使用特定于配置文件的配置文件,那么你可能需要提供进一步的提示,以便 Spring 引导知道它们应该如何分组。位置组是所有位置都在同一级别上被考虑的位置的集合。例如,你可能希望对所有 Classpath 位置进行分组,然后对所有外部位置进行分组。位置组中的项应该用`;`分隔。有关更多详细信息,请参见“[配置文件特定的文件](#features.external-config.files.profile-specific)”小节中的示例。 +如果你有一个复杂的位置设置,并且你使用了特定于配置文件的配置文件,那么你可能需要提供进一步的提示,以便 Spring 引导知道应该如何对它们进行分组。位置组是所有位置都在同一级别上被考虑的位置的集合。例如,你可能希望对所有 Classpath 位置进行分组,然后对所有外部位置进行分组。位置组中的项应该用`;`分隔。有关更多详细信息,请参见“[配置文件特定的文件](#features.external-config.files.profile-specific)”小节中的示例。 使用`spring.config.location`配置的位置替换默认位置。例如,如果`spring.config.location`被配置为值`optional:classpath:/custom-config/,optional:file:./custom-config/`,则考虑的完整位置集为: @@ -630,7 +630,7 @@ $ java -jar myproject.jar --spring.config.location=\ 这种搜索排序允许你在一个配置文件中指定默认值,然后有选择地重写另一个配置文件中的这些值。你可以在其中一个默认位置的`application.properties`(或你选择的任何其他带有`spring.config.name`的 basename)中为你的应用程序提供默认值。然后可以在运行时使用位于自定义位置之一中的不同文件重写这些默认值。 -| |如果使用环境变量而不是系统属性,大多数操作系统都不允许使用周期分隔的键名,但是可以使用下划线代替(例如,`SPRING_CONFIG_NAME`而不是`spring.config.name`)。
有关详细信息,请参见[来自环境变量的绑定](#features.external-config.typesafe-configuration-properties.relaxed-binding.environment-variables)。| +| |如果使用环境变量而不是系统属性,大多数操作系统都不允许使用周期分隔的键名,但可以使用下划线代替(例如,`SPRING_CONFIG_NAME`而不是`spring.config.name`)。
有关详细信息,请参见[来自环境变量的绑定](#features.external-config.typesafe-configuration-properties.relaxed-binding.environment-variables)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |如果你的应用程序运行在 Servlet 容器或应用程序服务器中,那么可以使用 JNDI 属性(在`java:comp/env`中)或 Servlet 上下文初始化参数来代替环境变量或系统属性。| @@ -640,7 +640,7 @@ $ java -jar myproject.jar --spring.config.location=\ 默认情况下,当指定的配置数据位置不存在时, Spring 启动将抛出`ConfigDataLocationNotFoundException`,并且你的应用程序将不会启动。 -如果你想指定一个位置,但并不介意它并不总是存在,那么可以使用`optional:`前缀。你可以在`spring.config.location`和`spring.config.additional-location`属性以及[`spring.config.import`](#features.external-config.files.importing)声明中使用此前缀。 +如果你想指定一个位置,但并不介意它并不总是存在,那么可以使用`optional:`前缀。你可以在`spring.config.location`和`spring.config.additional-location`属性以及[`spring.config.import`](#features.external-config.files.importing)声明中使用此前缀。 例如,`spring.config.import`值`optional:file:./myconfig.properties`允许你的应用程序启动,即使缺少`myconfig.properties`文件。 @@ -648,27 +648,27 @@ $ java -jar myproject.jar --spring.config.location=\ #### 2.3.2.通配符位置 -如果配置文件位置包括最后一个路径段的`*`字符,则将其视为通配符位置。在加载配置时,通配符将被展开,以便也检查直接的子目录。当存在多个配置属性源时,通配符位置在 Kubernetes 等环境中特别有用。 +如果配置文件位置包含最后一个路径段的`*`字符,则将其视为通配符位置。在加载配置时,通配符将被展开,以便也检查直接的子目录。当存在多个配置属性源时,通配符位置在 Kubernetes 等环境中特别有用。 例如,如果你有一些 Redis 配置和一些 MySQL 配置,那么你可能希望将这两个配置分开,同时要求这两个配置都存在于`application.properties`文件中。这可能会导致两个单独的`application.properties`文件安装在不同的位置,例如`/config/redis/application.properties`和`/config/mysql/application.properties`。在这种情况下,具有通配符位置`config/*/`,将导致这两个文件都被处理。 -默认情况下, Spring 引导在默认搜索位置中包括`config/*/`。这意味着你的 jar 之外的`/config`目录的所有子目录都将被搜索。 +默认情况下, Spring 引导在默认搜索位置中包括`config/*/`。这意味着将搜索 jar 之外`/config`目录的所有子目录。 -可以使用`spring.config.location`和`spring.config.additional-location`属性自己使用通配符位置。 +你可以使用`spring.config.location`和`spring.config.additional-location`属性自己使用通配符位置。 | |通配符位置必须只包含一个`*`,并且对于目录搜索位置以`*/`结尾,对于文件搜索位置以`*/`结尾。
通配符位置根据文件名的绝对路径按字母顺序排序。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |通配符位置只与外部目录一起工作。
在`classpath:`位置中不能使用通配符。| +| |通配符位置仅与外部目录一起工作。
在`classpath:`位置中不能使用通配符。| |---|-----------------------------------------------------------------------------------------------------------------| #### 2.3.3.配置文件特定的文件 除了`application`属性文件外, Spring 引导还将尝试使用命名约定`application-{profile}`加载配置文件特定的文件。例如,如果应用程序激活名为`prod`的配置文件并使用 YAML 文件,那么`application.yml`和`application-prod.yml`都将被考虑。 -配置文件特定的属性是从与标准`application.properties`相同的位置加载的,配置文件特定的文件总是覆盖非特定的文件。如果指定了多个配置文件,则应用最后胜出策略。例如,如果配置文件`prod,live`由`spring.profiles.active`属性指定,则`application-prod.properties`中的值可以被`application-live.properties`中的值覆盖。 +配置文件特定的属性是从与标准`application.properties`相同的位置加载的,配置文件特定的文件总是覆盖非特定的文件。如果指定了多个配置文件,则应用“最后胜出”策略。例如,如果配置文件`prod,live`由`spring.profiles.active`属性指定,则`application-prod.properties`中的值可以被`application-live.properties`中的值覆盖。 -| |Last-wins 策略适用于[location group](#features.external-config.files.location-groups)级别。
a`spring.config.location`of`classpath:/cfg/,classpath:/ext/`将不具有与`classpath:/cfg/;classpath:/ext/`相同的覆盖规则。

例如,继续我们上面的`prod,live`示例,我们可能会有以下文件:

``
/cfg
应用程序-live.properties
ext
应用程序-live.properties
应用程序-prod.properties
<<<<<>>的文件时,我们有一个>>>>>>>>>`/cfg/application-live.properties`

2。`/ext/application-prod.properties`

3。`/ext/application-live.properties`

当我们有`classpath:/cfg/;classpath:/ext/`代替(用`;`分隔符)时,我们在同一水平上处理`/cfg`和`/ext`:

1。`/ext/application-prod.properties`

2。`/cfg/application-live.properties`

3。`/ext/application-live.properties`| +| |Last-wins 策略适用于[位置组](#features.external-config.files.location-groups)级别。
a`spring.config.location`of`classpath:/cfg/,classpath:/ext/`将不会具有与`classpath:/cfg/;classpath:/ext/`相同的覆盖规则。

例如,继续上面的`prod,live`示例,我们可能有以下文件:

```
/cfg
application-live.properties
/ext
application-live.properties
application-prod.properties
```

当我们有`spring.config.location`of`classpath:/cfg/,classpath:/ext/`时,我们在所有`/ext`文件之前处理所有
文件:
1.`/cfg/application-live.properties`

2。`/ext/application-prod.properties`

3。`/ext/application-live.properties`

当我们有`classpath:/cfg/;classpath:/ext/`代替(用`;`分隔符)时,我们处理`/cfg`和`/ext`在同一水平上:

1。`/ext/application-prod.properties`

2。`/cfg/application-live.properties`

3。`/ext/application-live.properties`| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| `Environment`具有一组默认配置文件(默认情况下,`[default]`),如果未设置活动配置文件,则使用这些配置文件。换句话说,如果没有配置文件被显式激活,那么`application-default`中的属性将被考虑。 @@ -751,7 +751,7 @@ spring: 一些云平台不能向卷安装的文件添加文件扩展名。要导入这些无扩展文件,你需要给 Spring 引导一个提示,以便它知道如何加载它们。你可以通过在方括号中添加扩展提示来实现此目的。 -例如,假设你有一个`/etc/config/myconfig`文件,你希望将其导入为 YAML。你可以使用以下方法从`application.properties`导入它: +例如,假设你有一个`/etc/config/myconfig`文件,你希望将其导入为 YAML。你可以使用以下方法从你的`application.properties`导入它: 属性 @@ -771,7 +771,7 @@ spring: 在云平台(如 Kubernetes)上运行应用程序时,通常需要读取平台提供的配置值。为此目的使用环境变量并不少见,但这可能有缺点,特别是如果值应该保密的话。 -作为环境变量的一种替代方法,许多云平台现在允许你将配置映射到已安装的数据卷中。例如,Kubernetes 可以同时装载[`ConfigMaps`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#populate-a-volume-with-data-stored-in-a-configmap)和[`Secrets`](https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod)。 +作为环境变量的一种替代方法,许多云平台现在允许你将配置映射到已安装的数据卷中。例如,Kubernetes 可以同时挂载[`ConfigMaps`](https:/kubernetes.io/DOCS/tasks/configure-pod-configmap/#populate-a-volume-with-data-stored-in-a-configmap)和[`Secrets`(https://kubernetes.io/DOCS/concepts/configuration/sects/secret/#using-secrets-as-files-from-a-pod)。 可以使用两种常见的卷安装模式: @@ -781,7 +781,7 @@ spring: 对于第一种情况,可以使用`spring.config.import`直接导入 YAML 或属性文件,如[above](#features.external-config.files.importing)所述。对于第二种情况,你需要使用`configtree:`前缀,以便 Spring 引导知道需要将所有文件作为属性公开。 -作为一个例子,让我们想象一下 Kubernetes 已经安装了以下卷: +举个例子,让我们假设 Kubernetes 已经安装了以下卷: ``` etc/ @@ -809,18 +809,18 @@ spring: import: "optional:configtree:/etc/config/" ``` -然后可以以通常的方式从`Environment`访问或注入`myapp.username`和`myapp.password`属性。 +然后,你可以以通常的方式从`Environment`访问或注入`myapp.username`和`myapp.password`属性。 -| |配置树下的文件夹形成了属性名。
在上面的示例中,要访问属性为`username`和`password`,你可以将`spring.config.import`设置为`optional:configtree:/etc/config/myapp`。| +| |配置树下的文件夹形成属性名。
在上面的示例中,要访问属性为`username`和`password`,你可以将`spring.config.import`设置为`optional:configtree:/etc/config/myapp`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |例如,在上面的示例中,在`/etc/config`中名为`myapp.username`的文件将在`/etc/config`中产生`myapp.username`属性。| +| |例如,在上面的示例中,一个名为`myapp.username`的文件在`/etc/config`中将在`Environment`中产生一个`myapp.username`属性。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |根据预期的内容,配置树值可以绑定到字符串`String`和`byte[]`两种类型。| |---|---------------------------------------------------------------------------------------------------------------------| -如果有多个配置树要从同一个父文件夹导入,则可以使用通配符快捷方式。任何以`/*/`结尾的`configtree:`位置都将把所有直接的子节点作为配置树导入。 +如果有多个配置树要从同一个父文件夹导入,则可以使用通配符快捷方式。任何以`configtree:`结尾的`/*/`位置都将把所有直接的子节点作为配置树导入。 例如,给出以下卷: @@ -858,7 +858,7 @@ spring: | |使用通配符加载的目录是按字母顺序排序的。
如果需要不同的顺序,那么应该将每个位置作为单独的导入列表| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------| -配置树也可以用于 Docker 秘密。当 Docker Swarm 服务被授予对秘密的访问权限时,该秘密将被装载到容器中。例如,如果一个名为`db.password`的秘密被安装在位置`/run/secrets/`上,则可以使用以下方法使`db.password`对 Spring 环境可用: +配置树也可以用于 Docker 秘密。当 Docker Swarm 服务被授予对秘密的访问权限时,该秘密将被装载到容器中。例如,如果一个名为`db.password`的秘密被安装在位置`/run/secrets/`上,则可以使用以下方法使`db.password`环境对 Spring 环境可用: 属性 @@ -876,7 +876,7 @@ spring: #### 2.3.7.财产占位符 -`application.properties`和`application.yml`中的值在使用时会通过现有的`Environment`进行过滤,因此你可以引用以前定义的值(例如,从系统属性)。标准的`${name}`属性占位符语法可以在一个值的任何地方使用。 +`application.properties`和`application.yml`中的值在使用时会通过现有的`Environment`进行过滤,因此你可以引用以前定义的值(例如,从系统属性)。标准的`${name}`属性占位符语法可以在值的任何地方使用。 例如,下面的文件将`app.description`设置为“MyApp 是一个 Spring 启动应用程序”: @@ -895,12 +895,12 @@ app: description: "${app.name} is a Spring Boot application" ``` -| |你也可以使用此技术来创建现有 Spring 引导属性的“短”变体。
有关详细信息,请参见*[howto.html](howto.html#howto.properties-and-configuration.short-command-line-arguments)*。| +| |你也可以使用此技术来创建现有 Spring 引导属性的“短”变体。
有关详细信息,请参见 *[howto.html](howto.html#howto.properties-and-configuration.short-command-line-arguments)*how-to。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.3.8.使用多文档文件 -Spring 启动允许将单个物理文件拆分成多个逻辑文档,每个逻辑文档都是独立添加的。文件的处理顺序是从上到下的。后面的文档可以覆盖前面的文档中定义的属性。 +Spring 启动允许将单个物理文件拆分成多个独立添加的逻辑文档。文件的处理顺序是从上到下的。后面的文档可以覆盖前面的文档中定义的属性。 对于`application.yml`文件,使用标准的 YAML 多文档语法。三个连续的连字符表示一个文档的结束,和下一个文档的开始。 @@ -931,7 +931,7 @@ spring.config.activate.on-cloud-platform=kubernetes | |属性文件分隔符不能有任何前置空格,并且必须正好有三个连字符。
分隔符前后的行不得是注释。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |多文档属性文件通常与激活属性结合使用,例如`spring.config.activate.on-profile`。
有关详细信息,请参见[next section](#features.external-config.files.activation-properties)。| +| |多文档属性文件通常与激活属性结合使用,例如`spring.config.activate.on-profile`。
有关详细信息,请参见[下一节](#features.external-config.files.activation-properties)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |使用`@PropertySource`或`@TestPropertySource`注释无法加载多文档属性文件。| @@ -980,13 +980,13 @@ myotherprop: "sometimes-set" Spring 引导不提供任何内置的对加密属性值的支持,但是,它确实提供了修改包含在 Spring `Environment`中的值所必需的钩点。`EnvironmentPostProcessor`接口允许你在应用程序启动之前操作`Environment`。详见[howto.html](howto.html#howto.application.customize-the-environment-or-application-context)。 -如果你需要一种安全的方式来存储凭据和密码,[Spring Cloud Vault](https://cloud.spring.io/spring-cloud-vault/)项目提供了在[HashiCorp Vault](https://www.vaultproject.io/)中存储外部化配置的支持。 +如果你需要一种安全的方式来存储凭据和密码,[Spring Cloud Vault](https://cloud.spring.io/spring-cloud-vault/)项目提供了在[HashiCorp 保险库](https://www.vaultproject.io/)中存储外部化配置的支持。 ### 2.5.与 YAML 合作 [YAML](https://yaml.org)是 JSON 的超集,因此,是用于指定分层配置数据的一种方便的格式。只要在 Classpath 上有[SnakeYAML](https://bitbucket.org/asomov/snakeyaml)库,`SpringApplication`类就会自动支持 YAML 作为属性的替代。 -| |如果你使用“starter”,那么 SnakeYAML 将由`spring-boot-starter`自动提供。| +| |如果使用“starter”,那么 SnakeYAML 将由`spring-boot-starter`自动提供。| |---|------------------------------------------------------------------------------------| #### 2.5.1.将 YAML 映射到属性 @@ -1028,7 +1028,7 @@ my.servers[0]=dev.example.com my.servers[1]=another.example.com ``` -| |使用`[index]`表示法的属性可以使用 Spring boot 的`List`对象绑定到 Java`Set`对象`Binder`class.
有关更多详细信息,请参见下面的“[类型安全配置属性](#features.external-config.typesafe-configuration-properties)”小节。| +| |使用`[index]`表示法的属性可以使用 Spring boot 的[类型安全配置属性](#features.external-config.typesafe-configuration-properties)对象绑定到 Java`Set`对象。`Binder`class.
有关更多详细信息,请参见下面的“[类型安全配置属性](#features.external-config.typesafe-configuration-properties)”一节。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |无法通过使用`@PropertySource`或`@TestPropertySource`注释来加载 YAML 文件。
因此,在需要以这种方式加载值的情况下,需要使用属性文件。| @@ -1038,7 +1038,7 @@ my.servers[1]=another.example.com Spring Framework 提供了两个方便的类,它们可以用来加载 YAML 文档。`YamlPropertiesFactoryBean`将 YAML 加载为`Properties`,`YamlMapFactoryBean`将 YAML 加载为`Map`。 -如果希望将 YAML 加载为 Spring `PropertySource`,也可以使用`YamlPropertySourceLoader`类。 +如果希望以 Spring `PropertySource`的形式加载 YAML,也可以使用`YamlPropertySourceLoader`类。 ### 2.6.配置随机值 @@ -1071,7 +1071,7 @@ my: ### 2.7.配置系统环境属性 -Spring 引导支持为环境属性设置前缀。如果系统环境由具有不同配置需求的多个 Spring 引导应用程序共享,那么这是有用的。系统环境属性的前缀可以直接设置在`SpringApplication`上。 +Spring 引导支持为环境属性设置前缀。如果系统环境由具有不同配置要求的多个 Spring 引导应用程序共享,则这是有用的。系统环境属性的前缀可以直接设置在`SpringApplication`上。 例如,如果你将前缀设置为`input`,那么在系统环境中,诸如`remote.timeout`之类的属性也将解析为`input.remote.timeout`。 @@ -1079,7 +1079,7 @@ Spring 引导支持为环境属性设置前缀。如果系统环境由具有不 使用`@Value("${property}")`注释来注入配置属性有时会很麻烦,尤其是在使用多个属性或数据本质上是分层的情况下。 Spring 引导提供了一种处理属性的替代方法,该方法允许强类型 bean 控制和验证应用程序的配置。 -| |另见[differences between `@Value` and type-safe configuration properties](#features.external-config.typesafe-configuration-properties.vs-value-annotation)。| +| |另请参见[`@Value`和类型安全配置属性之间的区别]。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.8.1.JavaBean 属性绑定 @@ -1177,10 +1177,10 @@ public class MyProperties { * `my.service.security.roles`,其集合`String`默认为`USER`。 -| |映射到 Spring boot 中可用的`@ConfigurationProperties`类的属性(通过属性文件、YAML 文件、环境变量和其他机制进行配置)是公共 API,但是类本身的访问器(getters/setters)并不是直接使用的。| +| |映射到 Spring 引导中可用的`@ConfigurationProperties`类的属性(通过属性文件、YAML 文件、环境变量和其他机制进行配置)是公共 API,但是类本身的访问器(getters/setters)并不是直接使用的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |这种安排依赖于缺省的空构造函数,而 getter 和 setter 通常是强制性的,因为绑定是通过标准的 Java bean 属性描述符进行的,就像 Spring MVC 中一样。
在以下情况下,可以省略 setter:

* 映射,只要它们被初始化,需要一个 getter,但不一定是 setter,因为它们可以通过绑定程序进行变异,

* 集合和数组可以通过索引(通常使用 YAML)或使用一个逗号分隔的值(属性)进行访问,
在后一种情况下,setter 是强制性的。
我们建议总是为这样的类型添加一个 setter。
如果你初始化一个集合,请确保它不是不可变的(如前面的示例),

* 如果初始化了嵌套的 POJO 属性(如前面示例中的`Security`字段),setter 不是必需的。
如果你希望活页夹使用其默认构造函数动态地创建实例,你需要一个 setter。

有些人使用 Project Lombok 来自动添加 getter 和 setter。
确保 Lombok 不会为这样的类型生成任何特定的构造函数,因为容器会自动使用它来实例化对象。

最后,只考虑标准的 Java Bean 属性,不支持对静态属性的绑定。| +| |这种安排依赖于缺省的空构造函数,getter 和 setter 通常是强制性的,因为绑定是通过标准的 Java bean 属性描述符进行的,就像在 Spring MVC 中一样。
在以下情况下,可以省略 setter:

* 映射,只要它们被初始化,需要一个 getter,但不一定是 setter,因为它们可以通过绑定程序进行变异,

* 集合和数组可以通过索引(通常使用 YAML)或使用一个逗号分隔的值(属性)进行访问,
在后一种情况下,setter 是强制性的。
我们建议总是为这样的类型添加一个 setter。
如果你初始化一个集合,请确保它不是不可变的(如前面的示例),

* 如果初始化了嵌套的 POJO 属性(如前面示例中的`Security`字段),setter 不是必需的。
如果你想让 binder 使用其默认构造函数动态地创建实例,你需要一个 setter。

有些人使用 Project Lombok 来自动添加 getter 和 setter。
确保 Lombok 不会为这样的类型生成任何特定的构造函数,因为容器会自动使用它来实例化对象。

最后,只考虑标准的 Java Bean 属性,不支持对静态属性的绑定。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.8.2.构造函数绑定 @@ -1370,9 +1370,9 @@ public class MyService { #### 2.8.5.第三方配置 -除了使用`@ConfigurationProperties`对类进行注释外,你还可以在 public`@Bean`方法上使用它。当你希望将属性绑定到你无法控制的第三方组件时,这样做会特别有用。 +除了使用`@ConfigurationProperties`对类进行注释外,还可以在 public`@Bean`方法上使用它。当你希望将属性绑定到你无法控制的第三方组件时,这样做会特别有用。 -要从`Environment`属性配置 Bean,将`@ConfigurationProperties`添加到其 Bean 注册中,如以下示例所示: +要从`Environment`属性配置 Bean,请将`@ConfigurationProperties`添加到其 Bean 注册中,如以下示例所示: ``` import org.springframework.boot.context.properties.ConfigurationProperties; @@ -1392,11 +1392,11 @@ public class ThirdPartyConfiguration { ``` -任何用`another`前缀定义的 JavaBean 属性都映射到`AnotherComponent` Bean 上,其方式类似于前面的`SomeProperties`示例。 +任何用`another`前缀定义的 JavaBean 属性都以类似于前面的`SomeProperties`示例的方式映射到`AnotherComponent` Bean 上。 #### 2.8.6.松弛结合 -Spring Boot 使用一些宽松的规则将`Environment`属性绑定到`@ConfigurationProperties`bean,因此不需要在`Environment`属性名称和 Bean 属性名称之间进行精确匹配。这是有用的常见示例,包括 dash 分隔的环境属性(例如,`context-path`绑定到`contextPath`)和大写的环境属性(例如,`PORT`绑定到`port`)。 +Spring Boot 使用一些宽松的规则将`Environment`属性绑定到`@ConfigurationProperties`bean,因此不需要在`Environment`属性名称和 Bean 属性名称之间进行精确匹配。这很有用的常见示例包括 dash 分隔的环境属性(例如,`context-path`绑定到`contextPath`)和大写的环境属性(例如,`PORT`绑定到`port`)。 例如,考虑以下`@ConfigurationProperties`类: @@ -1424,12 +1424,12 @@ public class MyPersonProperties { | Property |注| |-----------------------------------|----------------------------------------------------------------------------------------------| -|`my.main-project.person.first-name`|烤肉串的情况下,这是建议在`.properties`和`.yml`文件中使用的。| +|`my.main-project.person.first-name`|烤肉串的情况下,这是建议在`.properties`和`.yml`文件中使用。| |`my.main-project.person.firstName` |标准的驼峰大小写语法。| |`my.main-project.person.first_name`|下划线符号,这是在`.properties`和`.yml`文件中使用的一种替代格式。| | `MY_MAINPROJECT_PERSON_FIRSTNAME` |大写格式,这是建议时,使用系统环境变量.| -| |注释`prefix`的值*必须*以烤串为例(小写并用`-`分隔,如`my.main-project.person`)。| +| |注释`prefix`的值*必须*以烤肉串为例(小写并用`-`分隔,如`my.main-project.person`)。| |---|---------------------------------------------------------------------------------------------------------------------------------| | Property Source |简单| List | @@ -1444,7 +1444,7 @@ public class MyPersonProperties { ##### 绑定地图 # -当绑定到`Map`属性时,你可能需要使用一个特殊的括号表示法,以便保留原来的`key`值。如果键不被`[]`包围,则删除所有不是 alpha-numeric,`-`或`.`的字符。 +当绑定到`Map`属性时,你可能需要使用特殊的括号表示法,以便保留原来的`key`值。如果键不被`[]`包围,则删除所有不是 alpha-numeric,`-`或`.`的字符。 例如,考虑将以下属性绑定到`Map`: @@ -1469,21 +1469,21 @@ my: | |对于 YAML 文件,括号中需要用引号包围,以便正确解析这些键。| |---|------------------------------------------------------------------------------------------------| -上面的属性将绑定到`Map`,其中`/key1`,`/key2`和`key3`作为映射中的键。斜杠已从`key3`中删除,因为它没有被方括号包围。 +上面的属性将绑定到`Map`,其中`/key1`、`/key2`和`key3`作为映射中的键。斜杠已从`key3`中删除,因为它没有被方括号包围。 如果你的`key`包含`.`并且绑定到非标量值,那么你有时也可能需要使用括号表示法。例如,将`a.b=c`绑定到`Map`将返回一个带有条目`{"a"={"b"="c"}}`的映射,而`[a.b]=c`将返回一个带有条目`{"a.b"="c"}`的映射。 ##### Binding from Environment Variables -大多数操作系统都对可用于环境变量的名称施加了严格的规则。例如,Linux shell 变量只能包含字母(`a`to`z`或`A`to`Z`)、数字(`0`to`9`)或下划线字符(`_`)。按照惯例,UNIX shell 变量的名称也将是大写的。 +大多数操作系统都对可用于环境变量的名称施加了严格的规则。例如,Linux Shell 变量只能包含字母(`a`到`z`或`A`到`Z`)、数字(`0`到`9`)或下划线字符(`_`)。按照惯例,UNIX shell 变量的名称也将是大写的。 -Spring Boot 的宽松绑定规则被尽可能地设计为与这些命名限制兼容。 +Spring Boot 的宽松的绑定规则尽可能地被设计为与这些命名限制兼容。 要将规范形式中的属性名转换为环境变量名,你可以遵循以下规则: -* 将点(`.’)改为下划线(`_’)。 +* 将点(`.`)替换为下划线(`_`)。 -* 删除任何破折号。 +* 删除任何破折号(`-`)。 * 转换为大写。 @@ -1650,7 +1650,7 @@ my: Spring 当绑定到`@ConfigurationProperties`bean 时,引导尝试强制将外部应用程序属性转换为正确的类型。如果需要自定义类型转换,可以提供`ConversionService` Bean(带有 Bean 名为`conversionService`)或自定义属性编辑器(通过`CustomEditorConfigurer` Bean)或自定义`Converters`(带有 Bean 注释为`@ConfigurationPropertiesBinding`的定义)。 -| |由于在应用程序生命周期中很早就请求了这个 Bean,因此请确保限制你的`ConversionService`正在使用的依赖关系。
通常,你所需要的任何依赖项在创建时可能不会完全初始化。
如果配置键强制不需要它,并且仅依赖用`@ConfigurationPropertiesBinding`限定的自定义转换器,那么你可能想要重命名自定义`ConversionService`。| +| |由于在应用程序生命周期的很早阶段就请求了这个 Bean,因此请确保限制你的`ConversionService`正在使用的依赖关系。
通常,你所需要的任何依赖项可能在创建时没有完全初始化。
如果配置键强制不需要它,并且仅依赖于用`@ConfigurationPropertiesBinding`限定的自定义转换器,那么你可能想要重命名自定义`ConversionService`。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### 转换持续时间 @@ -1659,9 +1659,9 @@ Spring Boot 具有用于表示持续时间的专用支持。如果你公开了`j * 一个常规的`long`表示(使用毫秒作为默认单位,除非指定了`@DurationUnit`) -* 标准的 ISO-8601 格式[used by `java.time.Duration`](https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-) +* 标准的 ISO-8601 格式[由`java.time.Duration`使用](https://DOCS.oracle.com/javase/8/DOCS/api/java/time/duration.html#parse-java.lang.charsequence-) -* 一种更易读的格式,其中的值和单位是耦合的(`10s’表示 10 秒) +* 一种更可读的格式,其中值和单位是耦合的(`10s`表示 10 秒) 考虑以下示例: @@ -1706,9 +1706,9 @@ public class MyProperties { 你也可以使用任何支持的单位。这些是: -* `ns`表示纳秒 +* `ns`为纳秒 -* `us`为微秒 +* `us`微秒 * `ms`毫秒 @@ -1718,7 +1718,7 @@ public class MyProperties { * `h`小时 -* `d`天数 +* `d`天 默认的单位是毫秒,可以使用`@DurationUnit`重写,如上面的示例所示。 @@ -1763,28 +1763,28 @@ public class MyProperties { ``` -| |如果你正在升级`Long`属性,请确保在不是毫秒的情况下定义该单元(使用`@DurationUnit`)。
这样做可以提供一个透明的升级路径,同时支持更丰富的格式。| +| |如果要升级`Long`属性,请确保在不是毫秒的情况下定义该单元(使用`@DurationUnit`)。
这样做可以提供透明的升级路径,同时支持更丰富的格式。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### 转换周期 -除了持续时间, Spring 引导还可以与`java.time.Period`类型一起工作。在应用程序属性中可以使用以下格式: +除了持续时间, Spring 启动还可以使用`java.time.Period`类型。在应用程序属性中可以使用以下格式: * 一个常规的`int`表示(使用天数作为默认单位,除非指定了`@PeriodUnit`) -* 标准的 ISO-8601 格式[used by `java.time.Period`](https://docs.oracle.com/javase/8/docs/api/java/time/Period.html#parse-java.lang.CharSequence-) +* 标准的 ISO-8601 格式[由`java.time.Period`使用](https://DOCS.oracle.com/javase/8/DOCS/api/java/time/period.html#parse-java.lang.charsequence-) -* 一种更简单的格式,其中的值和单位对是耦合的(`1y3d’表示 1 年零 3 天) +* 一种更简单的格式,其中值和单位对是耦合的(`1y3d`表示 1 年零 3 天) 以下单元以简单格式提供支持: -* `y`多年 +* 多年来`y` * `m`持续数月 -* `w`数周 +* `w`周 -* `d`天 +* 天`d` | |`java.time.Period`类型实际上不会存储周数,它是一种表示“7 天”的快捷方式。| |---|------------------------------------------------------------------------------------------------------------| @@ -1795,7 +1795,7 @@ Spring 框架具有`DataSize`值类型,该类型表示以字节为单位的大 * 一个常规的`long`表示(使用字节作为默认单位,除非指定了`@DataSizeUnit`) -* 一种更易读的格式,其中的值和单位是耦合的(“10MB”表示 10MB) +* 一种更可读的格式,其中的值和单位是耦合的(`10MB`表示 10 兆) 考虑以下示例: @@ -1845,7 +1845,7 @@ public class MyProperties { * `MB`代表兆字节 -* GB=“932”/> +* GB=“936”/> * `TB`用于 TB @@ -1930,7 +1930,7 @@ public class MyProperties { | |你还可以通过注释`@Bean`方法来触发验证,该方法使用`@Validated`创建配置属性。| |---|-----------------------------------------------------------------------------------------------------------------------------| -要确保始终为嵌套属性触发验证,即使没有找到属性,也必须用`@Valid`注释关联字段。下面的示例以前面的`MyProperties`示例为基础: +要确保始终为嵌套属性触发验证,即使没有找到属性,也必须用`@Valid`注释相关字段。下面的示例以前面的`MyProperties`示例为基础: ``` import java.net.InetAddress; @@ -1987,14 +1987,14 @@ public class MyProperties { ``` -还可以通过创建一个名为`configurationPropertiesValidator`的 Bean 定义来添加自定义 Spring `Validator`。应该声明`@Bean`方法`static`。配置属性验证器是在应用程序生命周期的很早阶段创建的,将`@Bean`方法声明为静态,可以在不需要实例化`@Configuration`类的情况下创建 Bean。这样做可以避免早期实例化可能带来的任何问题。 +还可以通过创建一个名为`configurationPropertiesValidator`的 Bean 定义来添加自定义 Spring `Validator`。应该声明`@Bean`方法`static`。配置属性验证器是在应用程序生命周期的早期创建的,将`@Bean`方法声明为 static 可以使 Bean 在无需实例化`@Configuration`类的情况下被创建。这样做可以避免早期实例化可能带来的任何问题。 -| |`spring-boot-actuator`模块包括一个公开所有`@ConfigurationProperties`bean 的端点。
将你的 Web 浏览器指向`/actuator/configprops`或使用等效的 JMX 端点。
有关详细信息,请参见“[生产就绪功能](actuator.html#actuator.endpoints)一节。| +| |`spring-boot-actuator`模块包括一个公开所有`@ConfigurationProperties`bean 的端点。
将你的 Web 浏览器指向`/actuator/configprops`或使用等效的 JMX 端点。
有关详细信息,请参见“[应用程序属性文件](#features.external-config.files)一节。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 2.8.10.@configrationProperties vs.@value -`@Value`注释是一个核心容器特性,它不提供与类型安全配置属性相同的特性。下表总结了`@Value`和`@Value`所支持的功能: +`@Value`注释是一个核心容器特性,它不提供与类型安全配置属性相同的特性。下表总结了`@ConfigurationProperties`和`@Value`支持的功能: | Feature |`@ConfigurationProperties`|`@Value`| |----------------------------------------------------------------------------------------------|--------------------------|----------------------------------------------------------------------------------------------------------------| @@ -2002,12 +2002,12 @@ public class MyProperties { | [Meta-data support](configuration-metadata.html#appendix.configuration-metadata) | Yes |无| | `SpEL` evaluation | No |是的| -| |如果你确实想使用`@Value`,我们建议你使用它们的规范形式(kebab-case 只使用小写字母)来引用属性名称。
这将允许 Spring 引导使用与放松绑定`@ConfigurationProperties`时相同的逻辑,例如,
,`@Value("{demo.item-price}")`将从`application.properties`文件中获取`demo.item-price`和`demo.itemPrice`窗体,以及从系统环境中获取`DEMO_ITEMPRICE`。
如果使用`@Value("{demo.itemPrice}")`代替,则不会考虑`demo.item-price`和`DEMO_ITEMPRICE`。| +| |如果你确实想使用`@Value`,我们建议你使用它们的规范形式(kebab-case 只使用小写字母)来引用属性名称,
这将允许 Spring 引导使用与放松绑定`@ConfigurationProperties`时相同的逻辑,例如,
,`@Value("{demo.item-price}")`将从`application.properties`文件中获取`demo.item-price`和`demo.itemPrice`窗体,以及从系统环境中获取`DEMO_ITEMPRICE`。
如果使用`@Value("{demo.itemPrice}")`代替,则不会考虑`demo.item-price`和`DEMO_ITEMPRICE`。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果你为自己的组件定义了一组配置键,那么我们建议你将它们分组到一个用`@ConfigurationProperties`注释的 POJO 中。这样做将为你提供结构化的、类型安全的对象,你可以将其注入到自己的 bean 中。 -`SpEL`来自[应用程序属性文件](#features.external-config.files)的表达式在解析这些文件和填充环境时不会被处理。但是,可以在`@Value`中写入`SpEL`表达式。如果应用程序属性文件中的属性的值是`SpEL`表达式,则在通过`@Value`使用时将对其进行求值。 +在解析这些文件和填充环境时,不会处理`SpEL`中的[应用程序属性文件](#features.external-config.files)表达式。但是,可以在`@Value`中写入`SpEL`表达式。如果来自应用程序属性文件的属性的值是`SpEL`表达式,则在通过`@Value`使用时将对其进行求值。 ## 3. 配置文件 @@ -2028,10 +2028,10 @@ public class ProductionConfiguration { ``` -| |如果`@Configuration属性`bean 是通过`@EnableConfiguration属性`而不是自动扫描来注册的,则需要在具有`@Configuration`注释的`@Configuration`类上指定
注释。
在`@Configuration属性`被扫描的情况下,`@Profile`可以在`@Configuration属性`类本身上指定。| +| |如果`@Configuration属性`bean 是通过`@EnableConfiguration属性`注册的,而不是通过自动扫描,则`@Profile`注释需要在具有`@Configuration`注释的类上指定。
在`@Configuration属性`被扫描的情况下,`@Profile`可以在`@Configuration属性`类本身上指定。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -你可以使用`spring.profiles.active``Environment`属性来指定哪些配置文件是活动的。你可以用本章前面描述的任何一种方式指定属性。例如,你可以将它包含在`application.properties`中,如以下示例所示: +你可以使用`spring.profiles.active``Environment`属性来指定哪些配置文件是活动的。你可以用本章前面描述的任何一种方式指定属性。例如,你可以在`application.properties`中包含它,如下例所示: 属性 @@ -2049,7 +2049,7 @@ spring: 你还可以通过使用以下开关在命令行中指定它:`--spring.profiles.active=dev,hsqldb`。 -如果没有配置文件处于活动状态,则启用默认配置文件。默认配置文件的名称是`default`,可以使用`spring.profiles.default``Environment`属性对其进行调优,如下例所示: +如果没有配置文件处于活动状态,则启用默认配置文件。默认配置文件的名称是`default`,可以使用`spring.profiles.default``Environment`属性对其进行调优,如以下示例所示: 属性 @@ -2067,9 +2067,9 @@ spring: ### 3.1.添加活动配置文件 -`spring.profiles.active`属性遵循与其他属性相同的排序规则:最高的`PropertySource`属性获胜。这意味着你可以使用命令行开关在`application.properties`中指定活动配置文件,然后在**替换**中指定它们。 +`PropertySource`属性遵循与其他属性相同的排序规则:最高的`PropertySource`属性获胜。这意味着你可以使用命令行开关在`application.properties`中指定活动配置文件,然后在**替换**中指定它们。 -有时,将**添加**的属性用于活动配置文件而不是替换它们是很有用的。`spring.profiles.active`入口点有一个用于设置附加配置文件的 Java API(即,在那些由`spring.profiles.active`属性激活的配置文件之上)。参见[SpringApplication](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/SpringApplication.html)中的`setAdditionalProfiles()`方法。在[next section](#features.profiles.groups)中描述的配置文件组也可以用于添加活动配置文件,如果给定的配置文件是活动的。 +有时,将**添加**的属性用于活动配置文件而不是替换它们是很有用的。`SpringApplication`入口点有一个用于设置附加配置文件的 Java API(即,在那些由`spring.profiles.active`属性激活的配置文件之上)。参见[SpringApplication](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/SpringApplication.html)中的`setAdditionalProfiles()`方法。在[下一节](#features.profiles.groups)中描述的配置文件组也可以用于在给定的配置文件处于活动状态时添加活动配置文件。 ### 3.2.配置文件组 @@ -2109,9 +2109,9 @@ spring: ## 4. 伐木 -Spring 启动对所有内部日志使用[Commons Logging](https://commons.apache.org/logging),但对底层日志实现保持开放。为[Java util 日志记录](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html)、[Log4J2](https://logging.apache.org/log4j/2.x/)和[Logback](https://logback.qos.ch/)提供了默认配置。在每种情况下,记录器都被预先配置为使用控制台输出,可选的文件输出也可用。 +Spring 启动对所有内部日志使用[共享日志记录](https://commons.apache.org/logging),但对底层日志实现保持开放。为[Java util 日志记录](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html)、[Log4J2](https://logging.apache.org/log4j/2.x/)和`@SpringBootApplication`提供了默认配置。在每种情况下,记录器都被预先配置为使用控制台输出,可选的文件输出也可用。 -默认情况下,如果你使用“starters”,则会使用回录进行日志记录。还包括适当的回登路由,以确保使用 Java util 日志、Commons 日志、log4j 或 SLF4j 的依赖库都能正确工作。 +默认情况下,如果你使用“starters”,则会使用回录来进行日志记录。还包括适当的回登路由,以确保使用 Java util 日志、Commons 日志、log4j 或 SLF4j 的依赖库都能正确工作。 | |有很多日志框架可用于 Java。
如果上面的列表看起来令人困惑,请不要担心。
通常,你不需要更改日志依赖项,并且 Spring 引导默认值工作得很好。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -2135,7 +2135,7 @@ Spring 引导的默认日志输出类似于以下示例: * 日期和时间:毫秒精度和容易排序. -* 日志级别:
,`WARN`,`INFO`,`DEBUG`,或`TRACE`。 +* 日志级别:`ERROR`,`WARN`,`INFO`,[下一节](#features.profiles.groups),或`TRACE`。 * 进程 ID。 @@ -2147,7 +2147,7 @@ Spring 引导的默认日志输出类似于以下示例: * 日志消息。 -| |注销没有`FATAL`级别。
它被映射到`production`。| +| |注销没有`FATAL`级别。
它被映射到`ERROR`。| |---|-------------------------------------------------------------------| ### 4.2.控制台输出 @@ -2161,13 +2161,13 @@ $ java -jar myapp.jar --debug | |你还可以在`application.properties`中指定`debug=true`。| |---|-------------------------------------------------------------------| -当调试模式被启用时,核心记录器(嵌入式容器、 Hibernate 和 Spring 引导)的选择被配置为输出更多信息。启用调试模式会*不是*配置你的应用程序以`DEBUG`级别记录所有消息。 +当调试模式被启用时,核心记录器(嵌入式容器、 Hibernate 和 Spring 引导)的选择被配置为输出更多信息。启用调试模式将*不是*配置你的应用程序以`DEBUG`级别记录所有消息。 或者,你可以通过使用`--trace`标志(或`trace=true`中的`application.properties`)启动应用程序来启用“跟踪”模式。这样做可以实现对核心记录器(嵌入式容器、 Hibernate 模式生成和整个 Spring 投资组合)的选择的跟踪日志记录。 #### 4.2.1.颜色编码输出 -如果你的终端支持 ANSI,则使用颜色输出来提高可读性。可以将`spring.output.ansi.enabled`设置为[supported value](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/ansi/AnsiOutput.Enabled.html)以覆盖自动检测。 +如果你的终端支持 ANSI,则使用颜色输出来提高可读性。可以将`spring.output.ansi.enabled`设置为[支持的值](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/ansi/AnsiOutput.Enabled.html)以覆盖自动检测。 颜色编码是通过使用`%clr`转换字来配置的。在最简单的形式中,转换器根据日志级别对输出进行着色,如以下示例所示: @@ -2222,12 +2222,12 @@ $ java -jar myapp.jar --debug 当日志文件达到 10MB 时会旋转,并且与控制台输出一样,`ERROR`-level,`WARN`-level 和`INFO`-level 消息在默认情况下会被记录。 -| |日志记录属性独立于实际的日志基础设施。因此,特定的配置键(例如用于日志恢复的`logback.configurationFile`)不受 Spring 引导的管理。| +| |日志记录属性独立于实际的日志基础设施。因此,特定的配置键(例如
用于回登)不受 Spring 引导的管理。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 4.4.文件旋转 -如果你使用的是回录,那么可以使用`application.properties`或`application.yaml`文件来微调日志旋转设置。对于所有其他日志系统,你将需要直接自己配置旋转设置(例如,如果你使用 log4j2,那么你可以添加`application.properties`或`log4j2-spring.xml`文件)。 +如果你使用的是回录,那么可以使用`application.properties`或`application.yaml`文件来微调日志旋转设置。对于所有其他日志系统,你将需要直接自己配置旋转设置(例如,如果你使用 log4j2,那么你可以添加`application.yaml`或`log4j2-spring.xml`文件)。 支持以下旋转策略属性: @@ -2241,7 +2241,7 @@ $ java -jar myapp.jar --debug ### 4.5.日志级别 -通过使用`application.properties`,所有受支持的日志系统都可以在 Spring `Environment`(例如,在`application.properties`)中设置日志程序级别,其中`level`是跟踪、调试、信息、警告、错误、致命或关闭的级别之一。可以使用`logging.level.root`配置`root`记录器。 +通过使用`logging.level.=`,所有受支持的日志系统都可以在 Spring `Environment`(例如,在`application.properties`)中设置日志程序级别,其中`application.properties`是跟踪、调试、信息、警告、错误、致命或关闭。`root`记录器可以通过使用`logging.level.root`进行配置。 下面的示例在`application.properties`中显示了潜在的日志设置: @@ -2263,9 +2263,9 @@ logging: org.hibernate: "error" ``` -也可以使用环境变量设置日志记录级别。例如,`logging.level.root`将`org.springframework.web`设置为`DEBUG`。 +也可以使用环境变量设置日志记录级别。例如,`LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG`将`org.springframework.web`设置为`DEBUG`。 -| |上述方法仅适用于包级别的日志记录。
由于放松绑定总是将环境变量转换为小写,因此不可能以这种方式为单个类配置日志记录。
如果需要为一个类配置日志记录,可以使用[the `SPRING_APPLICATION_JSON`](#features.external-config.application-json)变量。| +| |上述方法仅对包级日志记录有效。
由于放松绑定总是将环境变量转换为小写,因此不可能以这种方式为单个类配置日志记录。
如果需要为一个类配置日志记录,可以使用[the`SPRING_APPLICATION_JSON`]变量。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 4.6.日志组 @@ -2313,7 +2313,7 @@ Spring 启动包括以下预定义的记录组,这些记录组可以开箱即 ### 4.7.使用日志关闭钩子 -为了在应用程序终止时释放日志资源,提供了一个关闭钩子,该钩子将在 JVM 退出时触发日志系统清理。除非你的应用程序被部署为 WAR 文件,否则此关闭钩子将自动注册。如果你的应用程序具有复杂的上下文层次结构,那么关闭钩子可能无法满足你的需求。如果没有,请禁用关闭钩子,并调查底层日志系统直接提供的选项。例如,Logback 提供[上下文选择器](http://logback.qos.ch/manual/loggingSeparation.html),它允许在自己的上下文中创建每个记录器。你可以使用`logging.register-shutdown-hook`属性禁用关闭钩子。将其设置为`false`将禁用注册。你可以在`application.properties`或`application.yaml`文件中设置该属性: +为了在应用程序终止时释放日志资源,提供了一个关闭钩子,该钩子将在 JVM 退出时触发日志系统清理。除非你的应用程序被部署为 WAR 文件,否则此关闭钩子将自动注册。如果你的应用程序具有复杂的上下文层次结构,那么关闭钩子可能无法满足你的需求。如果没有,请禁用关闭钩子,并调查底层日志系统直接提供的选项。例如,Logback 提供[上下文选择器](http://logback.qos.ch/manual/loggingSeparation.html),允许在自己的上下文中创建每个记录器。你可以使用`logging.register-shutdown-hook`属性禁用关闭钩子。将其设置为`false`将禁用注册。你可以在`false`或`application.yaml`文件中设置该属性: Properties @@ -2332,23 +2332,23 @@ logging: 各种日志记录系统可以通过在 Classpath 上包括适当的库来激活,并且可以通过在 Classpath 的根目录中或在由下面的 Spring 指定的位置中提供适当的配置文件来进一步定制属性:。 -可以使用`org.springframework.boot.logging.LoggingSystem`系统属性强制 Spring 引导使用特定的日志系统。该值应该是`LoggingSystem`实现的完全限定类名称。你还可以使用`none`的值来完全禁用 Spring Boot 的日志配置。 +可以使用`org.springframework.boot.logging.LoggingSystem`系统属性强制 Spring 引导使用特定的日志系统。该值应该是`LoggingSystem`实现的完全限定类名称。还可以使用`@EnableScheduling`的值来完全禁用 Spring Boot 的日志配置。 -| |由于日志是初始化的**在此之前**已创建`ApplicationContext`,因此不可能在 Spring `@PropertySources`文件中控制来自`@PropertySources`的日志记录。
改变日志系统或完全禁用它的唯一方法是通过系统属性。| +| |由于日志是初始化的**在此之前**`ApplicationContext`已被创建,因此不可能在 Spring `@PropertySources`文件中从`@Configuration`文件中控制日志。**在此之前**改变日志系统或完全禁用它的唯一方法是通过系统属性。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 根据你的日志记录系统,将加载以下文件: | Logging System |定制| |-----------------------|---------------------------------------------------------------------------------| -| Logback |`logback-spring.xml`,`logback-spring.groovy`,`logback-spring.groovy`,或`logback.groovy`| +| Logback |`logback-spring.xml`,`logback-spring.groovy`,`logback.xml`,或`logback.groovy`| | Log4j2 |`log4j2-spring.xml`或`log4j2.xml`| |JDK (Java Util Logging)|`logging.properties`| | |如果可能,我们建议你在日志配置中使用`-spring`变量(例如,`logback-spring.xml`而不是`logback.xml`)。
如果使用标准配置位置, Spring 不能完全控制日志初始化。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在从“可执行文件 jar”运行时,Java util 日志记录中存在已知的类加载问题,这些问题会导致问题。
如果可能的话,我们建议你在从“可执行文件 jar”运行时避免这种情况。| +| |在从“可执行文件 jar”运行时,Java util 日志记录中存在已知的类加载问题,这些问题会导致问题。
如果可能的话,我们建议你在从“可执行文件 jar”运行时避免此类问题。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 为了帮助进行定制,将一些其他属性从 Spring `Environment`转移到系统属性,如下表所述: @@ -2384,17 +2384,17 @@ logging: * [Java util 日志记录](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties) -| |如果希望在日志属性中使用占位符,则应该使用[Spring Boot’s syntax](#features.external-config.files.property-placeholders),而不是底层框架的语法。
特别是,如果使用 logback,则应该使用`:`作为属性名与其默认值之间的分隔符,而不是使用`:-`。| +| |如果你想在日志属性中使用占位符,那么你应该使用[Spring Boot’s syntax](#features.external-config.files.property-placeholders),而不是底层框架的语法。
值得注意的是,如果你使用 logback,你应该使用`:`作为属性名与其默认值之间的分隔符,而不是使用`:-`。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |你可以通过只重写`LOG_LEVEL_PATTERN`(或`logging.pattern.level`带回日志)将 MDC 和其他临时内容添加到日志行中,
例如,如果你使用`logging.pattern.level=user:%X{user} %5p`,那么默认的日志格式包含一个“user”的 MDC 条目,如果它存在的话,如下例所示。

``
2019-08-3012:30:04.031 用户:someone info22174---[蔚来-8080-exec-0]demo.controller
处理经过验证的请求
```| +| |你可以通过只重写`LOG_LEVEL_PATTERN`(或`logging.pattern.level`带回日志),将 MDC 和其他临时内容添加到日志行中,
例如,如果你使用`logging.pattern.level=user:%X{user} %5p`,那么默认的日志格式包含一个“user”的 MDC 条目,如果它存在的话,如下面的示例所示。

```
2019-08-30 12:30:04.031 user:someone INFO 22174 --- [ nio-8080-exec-0] demo.Controller
Handling authenticated request
```| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 4.9.回录扩展 Spring 启动包括许多对注销的扩展,这些扩展可以帮助进行高级配置。你可以在`logback-spring.xml`配置文件中使用这些扩展名。 -| |因为标准的`logback.xml`配置文件加载得太早,所以不能在其中使用扩展名。
你需要使用`logback-spring.xml`或者定义`logging.config`属性。| +| |因为标准的`logback.xml`配置文件加载得太早,所以不能在其中使用扩展名。
你需要使用`logback-spring.xml`或定义`logging.config`属性。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |这些扩展名不能与 Logback 的[配置扫描](https://logback.qos.ch/manual/configuration.html#autoScan)一起使用。
如果你试图这样做,对配置文件进行更改将导致类似于记录以下错误之一的错误:| @@ -2407,7 +2407,7 @@ ERROR in ch.qos.logback.core.joran.spi.Interpret[email protected]:71 - no appli #### 4.9.1.特定于配置文件的配置 -``标记允许你根据活动 Spring 配置文件可选地包括或排除配置的部分。在``元素中的任何地方都支持配置文件部分。使用`name`属性指定哪个配置文件接受配置。``标记可以包含配置文件名(例如`staging`)或配置文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑,例如`production & (eu-central | eu-west)`。有关更多详细信息,请查看[reference guide](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/core.html#beans-definition-profiles-java)。下面的清单显示了三个示例配置文件: +``标记允许你基于活动 Spring 配置文件可选地包括或排除配置的部分。在``元素中的任何地方都支持配置文件部分。使用`name`属性指定哪个配置文件接受配置。``标记可以包含配置文件名(例如`staging`)或配置文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑,例如`production & (eu-central | eu-west)`。查看[参考指南](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/core.html#beans-definition-profiles-java)以获取更多详细信息。下面的清单显示了三个示例配置文件: ``` @@ -2443,10 +2443,10 @@ ERROR in ch.qos.logback.core.joran.spi.Interpret[email protected]:71 - no appli Spring 启动支持本地化消息,以便你的应用程序能够迎合具有不同语言偏好的用户。默认情况下, Spring 引导在 Classpath 的根位置查找`messages`资源包的存在。 -| |当配置的资源包的默认属性文件可用时,将应用自动配置。
如果你的资源包只包含特定于语言的属性文件,则需要添加默认的属性文件。`MessageSource`如果没有找到匹配任何配置的基名的属性文件,不会自动配置`MessageSource`。| +| |当配置的资源包的默认属性文件可用时(默认情况下`messages.properties`),自动配置将应用,
如果你的资源包只包含语言特定的属性文件,则需要添加默认的属性文件。
如果没有找到匹配任何配置的基名的属性文件,不会自动配置`messages`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -可以使用`spring.messages`命名空间来配置资源包的 basename 以及其他几个属性,如下例所示: +可以使用`messages`命名空间来配置资源包的 basename 以及其他几个属性,如下例所示: Properties @@ -2467,7 +2467,7 @@ spring: | |`spring.messages.basename`支持以逗号分隔的位置列表,可以是包限定符,也可以是从 Classpath 根目录解析的资源。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------| -有关更多支持的选项,请参见`MessageSource`。 +参见[`MessageSourceProperties`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/context/mentt/messagesourceproperties.java)以获得更多支持的选项。 ## 6. JSON @@ -2483,7 +2483,7 @@ Jackson 是首选的默认库。 ### 6.1.Jackson -提供了用于 Jackson 的自动配置,并且 Jackson 是`spring-boot-starter-json`的一部分。当 Jackson 在 Classpath 上时,`ObjectMapper` Bean 被自动配置。为[customizing the configuration of the `ObjectMapper`](howto.html#howto.spring-mvc.customize-jackson-objectmapper)提供了几个配置属性。 +提供了用于 Jackson 的自动配置,并且 Jackson 是`messages`的一部分。当 Jackson 在 Classpath 上时,`ObjectMapper` Bean 被自动配置。为[自定义`ObjectMapper`](howto.html#howto. Spring-mvc.customize-Jackson-objectmapper)的配置提供了几个配置属性。 ### 6.2.格森 @@ -2495,12 +2495,12 @@ Jackson 是首选的默认库。 ## 7. 任务执行和调度 -在上下文中没有`Executor` Bean 的情况下, Spring 引导自动配置带有合理默认值的`ThreadPoolTaskExecutor`,该默认值可以自动关联到异步任务执行和 Spring MVC 异步请求处理。 +在上下文中没有`Executor` Bean 的情况下, Spring 引导自动配置具有合理默认值的`ThreadPoolTaskExecutor`,该默认值可以自动关联到异步任务执行(`@EnableAsync`)和 Spring MVC 异步请求处理。 -| |如果你在上下文中定义了自定义的`Executor`,则常规的任务执行(即`@EnableAsync`)将透明地使用它,但是 Spring MVC 支持将不会被配置,因为它需要`applicationTaskExecutor`实现(名为`applicationTaskExecutor`)。
取决于你的目标安排,你可以将你的`Executor`更改为`ThreadPoolTaskExecutor`,或者同时定义`ThreadPoolTaskExecutor`和`AsyncConfigurer`来包装你的自定义`Executor`。
自动配置的
允许你轻松地创建实例,这些实例可以复制默认情况下自动配置的功能。| +| |如果你在上下文中定义了自定义的`@EnableAsync`,则常规的任务执行(即`@EnableAsync`)将透明地使用它,但是 Spring MVC 支持将不会被配置,因为它需要`AsyncTaskExecutor`实现(名为`applicationTaskExecutor`)。
取决于你的目标安排,你可以将你的`Executor`更改为`ThreadPoolTaskExecutor`,或者同时定义`ThreadPoolTaskExecutor`和`AsyncConfigurer`包装你的自定义`Executor`。
自动配置的`TaskExecutorBuilder`允许你轻松地创建实例,这些实例复制默认情况下自动配置的功能。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -线程池使用 8 个核心线程,这些线程可以根据负载的大小进行增长和收缩。可以使用`spring.task.execution`名称空间对这些默认设置进行微调,如下例所示: +线程池使用 8 个核心线程,这些线程可以根据负载的大小进行增长和收缩。可以使用`Executor`名称空间对这些默认设置进行微调,如下例所示: Properties @@ -2524,7 +2524,7 @@ spring: 这将线程池更改为使用有界队列,以便当队列已满(100 个任务)时,线程池最多增加到 16 个线程。当线程空闲 10 秒(而不是默认的 60 秒)时,会回收线程,因此池的收缩会更剧烈。 -如果需要与计划的任务执行相关联,`ThreadPoolTaskScheduler`也可以自动配置(例如使用`ThreadPoolTaskExecutor`)。线程池默认使用一个线程,其设置可以使用`spring.task.scheduling`名称空间进行微调,如下例所示: +如果需要与计划的任务执行相关联,`ThreadPoolTaskScheduler`也可以自动配置(例如使用`@EnableScheduling`)。线程池默认使用一个线程,其设置可以使用`spring.task.scheduling`名称空间进行微调,如下例所示: Properties @@ -2552,10 +2552,10 @@ Spring 引导提供了许多实用工具和注释,以在测试应用程序时 大多数开发人员使用`spring-boot-starter-test`“starter”,它既导入 Spring 引导测试模块,也导入 JUnit Jupiter、AssertJ、Hamcrest 和许多其他有用的库。 -| |如果你有使用 JUnit4 的测试,可以使用 JUnit5 的 Vintage 引擎来运行它们,
要使用 Vintage 引擎,请添加对`junit-vintage-engine`的依赖项,如下例所示:

```TaskExecutorBuilder`


Junit-vintage-engine<1239"/>test=“1241”/>><1240">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>| +| |如果你有使用 JUnit4 的测试,可以使用 JUnit5 的 Vintage 引擎来运行它们。`@EnableScheduling`要使用 Vintage 引擎,请在`junit-vintage-engine`上添加一个依赖项,如以下示例所示:

| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -`hamcrest-core`被排除在外,而`org.hamcrest:hamcrest`是`spring-boot-starter-test`的一部分。 +`spring-boot-starter-test`被排除在外,而`org.hamcrest:hamcrest`是`spring-boot-starter-test`的一部分。 ### 8.1.测试范围依赖项 @@ -2567,7 +2567,7 @@ Spring 引导提供了许多实用工具和注释,以在测试应用程序时 * [AssertJ](https://assertj.github.io/doc/):一个流畅的断言程序库。 -* [Hamcrest](https://github.com/hamcrest/JavaHamcrest):匹配器对象(也称为约束或谓词)的库。 +* [Hamcrest](https://github.com/hamcrest/JavaHamcrest):Matcher 对象(也称为约束或谓词)的库。 * [Mockito](https://site.mockito.org/):一个 Java 模拟框架。 @@ -2575,11 +2575,11 @@ Spring 引导提供了许多实用工具和注释,以在测试应用程序时 * [JsonPath](https://github.com/jayway/JsonPath):XPath for JSON。 -在编写测试时,我们通常会发现这些公共库非常有用。如果这些库不适合你的需求,那么你可以添加自己的额外测试依赖项。 +在编写测试时,我们通常会发现这些公共库非常有用。如果这些库不适合你的需要,那么你可以添加自己的额外测试依赖项。 ### 8.2.测试 Spring 应用程序 -依赖注入的主要优点之一是它应该使代码更容易进行单元测试。你可以使用`new`运算符实例化对象,甚至不需要涉及 Spring。你也可以使用*模拟对象*来代替真正的依赖关系。 +依赖注入的一个主要优点是,它应该使代码更容易进行单元测试。你可以使用`new`运算符实例化对象,甚至不需要涉及 Spring。你也可以使用[Java util 日志记录](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties)来代替真正的依赖关系。 通常,你需要超越单元测试,开始集成测试(使用 Spring `ApplicationContext`)。能够在不需要部署应用程序或不需要连接到其他基础设施的情况下执行集成测试是非常有用的。 @@ -2589,30 +2589,30 @@ Spring 框架包括用于这种集成测试的专用测试模块。你可以直 ### 8.3.测试 Spring 引导应用程序 -Spring 引导应用程序是一个 Spring `ApplicationContext`,因此,除了正常情况下使用 vanilla Spring 上下文所做的工作外,不需要做任何非常特殊的事情来测试它。 +Spring 引导应用程序是 Spring `ApplicationContext`,因此,除了通常使用普通上下文 Spring 所做的事情外,无需做任何非常特殊的事情来测试它。 -| |只有在使用`SpringApplication`创建它的情况下, Spring 启动的外部属性、日志记录和其他功能才默认安装在上下文中。| +| |只有在使用`SpringApplication`创建它的情况下, Spring 引导的外部属性、日志记录和其他功能才默认安装在上下文中。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring Boot 提供了一个`@SpringBootTest`注释,其可以作为标准`spring-test``@ContextConfiguration`注释的替代项,当需要 Spring 启动功能时。注释的工作原理是[creating the `ApplicationContext` used in your tests through `SpringApplication`](#features.testing.spring-boot-applications.detecting-configuration)。除了`@SpringBootTest`之外,还为[creating the `ApplicationContext` used in your tests through `SpringApplication`](#features.testing.spring-boot-applications.detecting-configuration)的应用程序提供了许多其他注释。 +Spring Boot 提供了一个`@SpringBootTest`注释,其可以作为标准`spring-test``@ContextConfiguration`注释的替代项,当需要 Spring 启动功能时。该注释的工作原理是[通过`SpringApplication`创建测试中使用的`ApplicationContext`](#features.testing. Spring-boot-applications.detecting-configuration)。除了`@SpringBootTest`之外,还为[测试更具体的切片](#features.testing.spring-boot-applications.autoconfigured-tests)的应用程序提供了许多其他注释。 | |如果你正在使用 JUnit4,请不要忘记在你的测试中也添加`@RunWith(SpringRunner.class)`,否则注释将被忽略。
如果你正在使用 JUnit5,没有必要将等价的`@ExtendWith(SpringExtension.class)`添加为`@SpringBootTest`,并且其他`@…​Test`注释已经用它注释了。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -默认情况下,`@SpringBootTest`不会启动服务器。可以使用`@SpringBootTest`的`webEnvironment`属性来进一步改进测试的运行方式: +默认情况下,`@SpringBootTest`不会启动服务器。可以使用`@SpringBootTest`的`webEnvironment`属性来进一步细化测试的运行方式: -* `MOCK`(默认):加载 Web`ApplicationContext`并提供模拟 Web 环境。使用此注释时,嵌入式服务器不会启动。如果你的 Classpath 上没有可用的 Web 环境,则该模式将透明地返回到创建常规的非 Web`ApplicationContext`。它可以与[`@AutoConfigureMockMvc` or `@AutoConfigureWebTestClient`](#features.testing.spring-boot-applications.with-mock-environment)一起用于对 Web 应用程序进行基于模拟的测试。 +* `MOCK`(默认):加载 Web`ApplicationContext`并提供模拟 Web 环境。使用此注释时,嵌入式服务器不会启动。如果你的 Classpath 上没有可用的 Web 环境,则该模式可透明地返回到创建常规的非 Web`ApplicationContext`。它可以与[`@AutoConfigureMockMvc`或`@AutoConfigureWebTestClient`](#features.testing. Spring-boot-applications.with-mock-environment)结合使用,用于对 Web 应用程序进行基于模拟的测试。 * `RANDOM_PORT`:加载`WebServerApplicationContext`并提供一个真实的 Web 环境。嵌入式服务器在一个随机端口上启动和监听。 -* `DEFINED_PORT`:加载`WebServerApplicationContext`并提供一个真实的 Web 环境。嵌入式服务器在定义的端口(从`application.properties`)或默认端口`8080`上启动和侦听。 +* `DEFINED_PORT`:加载`WebServerApplicationContext`,并提供一个真正的 Web 环境。嵌入式服务器在定义的端口(从`application.properties`)或默认端口`8080`上启动和侦听。 * `NONE`:通过使用`SpringApplication`加载`ApplicationContext`,但不提供*任何*Web 环境(模拟或其他方式)。 -| |如果你的测试是`@Transactional`,那么默认情况下,它会在每个测试方法的末尾回滚事务。
但是,由于使用这种安排,`RANDOM_PORT`或`DEFINED_PORT`隐式地提供了一个真正的 Servlet 环境,HTTP 客户机和服务器在单独的线程中运行,因此,在单独的事务中.
在服务器上发起的任何事务在这种情况下都不回滚。| +| |如果你的测试是`@Transactional`,那么默认情况下,它会在每个测试方法的末尾回滚事务。
但是,由于使用这种安排,`RANDOM_PORT`或`RANDOM_PORT`隐式地提供了一个真正的 Servlet 环境,HTTP 客户机和服务器在单独的线程中运行,因此,在单独的事务中。
在这种情况下,在服务器上发起的任何事务都不回滚。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |如果应用程序为管理服务器使用不同的端口,`@SpringBootTest`with`webEnvironment = WebEnvironment.RANDOM_PORT`也将在单独的随机端口上启动管理服务器。| +| |如果应用程序为管理服务器使用不同的端口,则`@SpringBootTest`with`webEnvironment = WebEnvironment.RANDOM_PORT`也将在单独的随机端口上启动管理服务器。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 8.3.1.检测 Web 应用程序类型 @@ -2639,12 +2639,12 @@ class MyWebFluxTests { 在测试 Spring 引导应用程序时,这通常不是必需的。 Spring 只要不显式地定义一个配置,Boot 的`@*Test`注释就会自动搜索你的主要配置。 -搜索算法从包含测试的包开始工作,直到找到一个用`@SpringBootApplication`或`@SpringBootConfiguration`注释的类。只要以合理的方式[结构化你的代码](using.html#using.structuring-your-code),通常就可以找到你的主配置。 +搜索算法从包含测试的包开始工作,直到找到一个用`@SpringBootApplication`或`@SpringBootConfiguration`注释的类。只要以一种合理的方式
,通常就可以找到你的主配置。 -| |如果使用[测试注释以测试应用程序的一个更具体的部分](#features.testing.spring-boot-applications.autoconfigured-tests),你应该避免在[主方法的应用程序类](#features.testing.spring-boot-applications.user-configuration-and-slicing)上添加特定于特定区域的配置设置。


的底层组件扫描配置定义了排除过滤器如果你在你的`@SpringBootApplication`-注释类上使用显式的`@ComponentScan`指令,请注意这些过滤器将被禁用。
如果你正在使用切片,则应再次定义它们。| +| |如果使用[测试注释以测试应用程序的一个更具体的部分](#features.testing.spring-boot-applications.autoconfigured-tests),你应该避免在[主方法的应用程序类](#features.testing.spring-boot-applications.user-configuration-and-slicing)上添加特定于特定区域的配置设置。

`@SpringBootApplication`的底层组件扫描配置定义了排除过滤器如果你在你的`@SpringBootApplication`-注释类上使用显式的`@ComponentScan`指令,请注意这些过滤器将被禁用。
如果你正在使用切片,则应再次定义它们。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果你想定制主配置,可以使用嵌套的`@TestConfiguration`类。不同于嵌套的`@Configuration`类,嵌套的`@TestConfiguration`类将被用来代替应用程序的主配置,除了应用程序的主配置之外,还使用嵌套的`@TestConfiguration`类。 +如果你想定制主配置,可以使用嵌套的`@TestConfiguration`类。不同于嵌套的`@Configuration`类,嵌套的`@TestConfiguration`类将被用来代替应用程序的主配置,在应用程序的主配置之外还使用了嵌套的`@TestConfiguration`类。 | |Spring 的测试框架在测试之间缓存应用程序上下文。
因此,只要你的测试共享相同的配置(无论如何发现),加载上下文的可能耗时的过程只会发生一次。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -2653,7 +2653,7 @@ class MyWebFluxTests { 如果你的应用程序使用组件扫描(例如,如果你使用`@SpringBootApplication`或`@ComponentScan`),你可能会发现只为特定测试创建的顶级配置类在任何地方都会意外地被选中。 -正如我们[早些时候见过](#features.testing.spring-boot-applications.detecting-configuration),`@TestConfiguration`可以用于对内部类的测试进行自定义的主要配置。当放置在顶级类上时,`@TestConfiguration`表示不应通过扫描来读取`src/test/java`中的类。然后,你可以在需要的地方显式地导入该类,如下面的示例所示: +正如我们[看过更早的](#features.testing.spring-boot-applications.detecting-configuration),`@TestConfiguration`可以用于对内部类的测试进行自定义的主要配置。当放置在顶级类上时,`@TestConfiguration`表示不应通过扫描来读取`src/test/java`中的类。然后,你可以在需要的地方显式地导入该类,如下面的示例所示: ``` import org.junit.jupiter.api.Test; @@ -2674,12 +2674,12 @@ class MyTests { ``` -| |如果直接使用`@ComponentScan`(即不通过`@SpringBootApplication`),则需要用它注册`TypeExcludeFilter`。
详见[the Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/context/TypeExcludeFilter.html)。| +| |如果直接使用`@ComponentScan`(即不通过`@SpringBootApplication`),则需要用它注册`TypeExcludeFilter`。
详见[Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/context/TypeExcludeFilter.html)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 8.3.4.使用应用程序参数 -如果应用程序期望[arguments](#features.spring-application.application-arguments),则可以使用`@SpringBootTest`属性注入它们。 +如果应用程序期望`@SpringBootTest`,则可以使用`args`属性注入它们。 ``` import org.junit.jupiter.api.Test; @@ -2707,7 +2707,7 @@ class MyApplicationArgumentTests { 默认情况下,`@SpringBootTest`不会启动服务器,而是设置一个模拟环境来测试 Web 端点。 -使用 Spring MVC,我们可以使用[`MockMvc`](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#spring-mvc-test-framework)或`WebTestClient`查询我们的 Web 端点,如以下示例所示: +使用 Spring MVC,我们可以使用[`MockMvc`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/testing.html# Spring-mvc-test-framework)或`WebTestClient`查询我们的 Web 端点,如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -2745,10 +2745,10 @@ class MyMockMvcTests { ``` -| |如果你想只关注 Web 层,而不是启动一个完整的`ApplicationContext`,请考虑[using `@WebMvcTest` instead](#features.testing.spring-boot-applications.spring-mvc-tests)。| +| |如果你希望只关注 Web 层,而不是启动一个完整的`ApplicationContext`,请考虑[使用`@WebMvcTest`代替](#features.testing. Spring-boot-applications. Spring-mvc-tests)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -对于 Spring WebFlux 端点,你可以使用[`WebTestClient`](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#webtestclient-tests),如以下示例所示: +使用 Spring WebFlux 端点,可以使用[`WebTestClient`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/testing.html#WebTestClient-tests),如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -2782,7 +2782,7 @@ class MyMockWebTestClientTests { 如果你需要启动一个完整的正在运行的服务器,我们建议你使用随机端口。如果使用`@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)`,则每次测试运行时都会随机选择一个可用的端口。 -`@LocalServerPort`注释可用于[注入实际使用的端口](howto.html#howto.webserver.discover-port)到你的测试中。为了方便起见,需要对启动的服务器进行 REST 调用的测试还可以使用`@Autowire`a[`WebTestClient`](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#webtestclient-tests),它解析到运行中的服务器的相对链接,并附带用于验证响应的专用 API,如以下示例所示: +`@LocalServerPort`注释可以用于[注入实际使用的端口](howto.html#howto.webserver.discover-port)到你的测试中。为了方便起见,需要对启动的服务器进行 REST 调用的测试还可以另外`@Autowire`a[`WebTestClient`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/testing.html#webtestclient-tests),它解析与运行中的服务器的相关链接,并附带用于验证响应的专用 API,如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -2808,7 +2808,7 @@ class MyRandomPortWebTestClientTests { ``` -| |`WebTestClient`可同时用于实时服务器和[模拟环境](#features.testing.spring-boot-applications.with-mock-environment)。| +| |`WebTestClient`可以同时用于实时服务器和[模拟环境](#features.testing.spring-boot-applications.with-mock-environment)。| |---|------------------------------------------------------------------------------------------------------------------------------------------------| 此设置需要在 Classpath 上执行`spring-webflux`。如果不能或不会添加 WebFlux, Spring Boot 还提供了`TestRestTemplate`功能: @@ -2838,7 +2838,7 @@ class MyRandomPortTestRestTemplateTests { #### 8.3.7.自定义 WebTestClient -要定制`WebTestClient` Bean,请配置`WebTestClientBuilderCustomizer` Bean。使用用于创建`WebTestClient`的`WebTestClient.Builder`调用任何这样的 bean。 +要定制`WebTestClient` Bean,请配置`WebTestClientBuilderCustomizer` Bean。使用`WebTestClient.Builder`调用任何这样的 bean,该 bean 用于创建`WebTestClient`。 #### 8.3.8.使用 JMX @@ -2878,7 +2878,7 @@ class MyJmxTests { #### 8.3.9.使用度量 -无论你的 Classpath 是什么,在使用`@SpringBootTest`时,除了内存中备份的仪表注册中心外,仪表注册中心不会自动配置。 +无论你的 Classpath 是什么,除了内存备份之外,仪表注册中心在使用`@SpringBootTest`时不会自动配置。 如果作为集成测试的一部分,需要将指标导出到不同的后端,请用`@AutoConfigureMetrics`对其进行注释。 @@ -2888,7 +2888,7 @@ class MyJmxTests { Spring 引导包括一个`@MockBean`注释,该注释可用于在你的`ApplicationContext`中为 Bean 定义一个 mockito 模拟。你可以使用该注释来添加新的 bean 或替换单个现有的 Bean 定义。注释可以直接用于测试类、测试中的字段或`@Configuration`类和字段。当在字段上使用时,创建的模拟实例也会被注入。在每种测试方法之后,mock bean 都会自动重置。 -| |如果你的测试使用 Spring boot 的测试注释之一(例如`@SpringBootTest`),则自动启用此功能,
若要以不同的方式使用此功能,必须显式地添加监听器,如下例所示:

``
导入 org.springframework.boot.test.mock.mockito.mockitostexecutionListener;
import org.springframework.moxecto.restexecutionlistener;importorg.contexframework.contextframework.contest.contexr=“;<95"/>contextcontextionr=1394;"myclass=| +| |如果你的测试使用 Spring boot 的测试注释之一(例如`@SpringBootTest`),则自动启用此功能。
要以不同的方式使用此功能,必须显式地添加监听器,如以下示例所示:

```
import org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener;
import org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;

@ContextConfiguration(classes = MyConfig.class)
@TestExecutionListeners({ MockitoTestExecutionListener.class, ResetMocksTestExecutionListener.class })
class MyTests {

// ...

}

```| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 下面的示例用模拟实现替换现有的`RemoteService` Bean: @@ -2928,13 +2928,13 @@ class MyTests { 此外,你可以使用`@SpyBean`用 mockito`spy`包装任何现有的 Bean。有关详细信息,请参见[Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/test/mock/mockito/SpyBean.html)。 -| |CGLIB 代理,例如为作用域 bean 创建的代理,将代理方法声明为`final`。
这将阻止 Mockito 正常运行,因为它无法在其默认配置中模拟或监视`final`方法。,
如果你想模拟或监视这样的 Bean 方法,通过将`org.mockito:mockito-inline`添加到应用程序的测试依赖项,将 Mockito 配置为使用其内联 mock maker。
这允许 Mockito 模拟和监视`final`方法。| +| |CGLIB 代理,例如为作用域 bean 创建的代理,将 proxied 方法声明为`final`。
这将阻止 Mockito 正常运行,因为它无法在其默认配置中模拟或监视`final`方法。,
如果你想模拟或监视这样的 Bean,通过将`org.mockito:mockito-inline`添加到应用程序的测试依赖项,将 Mockito 配置为使用其内联 mock maker。
这允许 Mockito 模拟和监视`final`方法。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |Spring 的测试框架在测试之间缓存应用程序上下文,并为共享相同配置的测试重用上下文,而`@MockBean`或`@SpyBean`的使用会影响缓存键,这很可能会增加上下文的数量。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |如果你正在使用`@SpyBean`监视带有`@Cacheable`方法的 Bean,该方法通过名称引用参数,则你的应用程序必须使用`-parameters`编译。
这将确保在监视了 Bean 之后,参数名称对缓存基础结构是可用的。| +| |如果你使用`@SpyBean`监视带有`@Cacheable`方法的 Bean,该方法通过名称引用参数,则你的应用程序必须使用`-parameters`进行编译。
这将确保在监视了 Bean 之后,参数名称对缓存基础设施是可用的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |当你使用`@SpyBean`监视由 Spring 代理的 Bean 时,在某些情况下可能需要删除 Spring 的代理,例如在使用`given`或`when`设置期望时。
使用`AopTestUtils.getTargetObject(yourProxiedSpy)`来这样做。| @@ -2957,7 +2957,7 @@ Spring Boot 的自动配置系统在应用程序中运行良好,但有时在 #### 8.3.12.自动配置的 JSON 测试 -要测试对象 JSON 序列化和反序列化是否如预期的那样工作,你可以使用`@JsonTest`注释。@jsontest` 自动配置可用的受支持的 JSON 映射器,它可以是以下库之一: +要测试对象 JSON 序列化和反序列化是否如预期的那样工作,你可以使用`@JsonTest`注释。`@JsonTest`自动配置可用的受支持的 JSON 映射器,它可以是以下库之一: * Jackson`ObjectMapper`,任何`@JsonComponent`bean 和任何 Jackson`Module`s @@ -3008,10 +3008,10 @@ class MyJsonTests { ``` -| |JSON helper 类也可以在标准单元测试中直接使用。
要做到这一点,如果不使用`@Before`方法,请在你的`@JsonTest`方法中调用该 helper 的`initFields`方法。| +| |JSON helper 类也可以在标准单元测试中直接使用。
要这样做,如果不使用`@JsonTest`方法,请在你的`initFields`方法中调用该 helper 的`initFields`方法。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果使用 Spring boot 的基于 AssertJ 的助手在给定的 JSON 路径上断言一个数字值,则可能无法根据类型使用`isEqualTo`。相反,你可以使用 AssertJ 的`satisfies`来断言该值与给定条件匹配。例如,下面的示例断言,在`0.01`的偏移量内,实际数字是一个接近`0.15`的浮点值。 +如果使用 Spring boot 的基于 AssertJ 的助手在给定的 JSON 路径上断言一个数字值,则可能无法根据类型使用`isEqualTo`。相反,你可以使用 AssertJ 的`satisfies`来断言该值匹配给定的条件。例如,下面的示例断言,在`0.01`的偏移量内,实际数字是一个接近`0.15`的浮点值。 ``` @Test @@ -3025,7 +3025,7 @@ void someTest() throws Exception { #### 8.3.13.自动配置的 Spring MVC 测试 -要测试 Spring MVC 控制器是否如预期的那样工作,请使用`@WebMvcTest`注释。@Webmvctest` 自动配置 Spring MVC 基础架构,并将扫描的 bean 限制为`@Controller`,`@ControllerAdvice`,`@JsonComponent`,`GenericConverter`,`Filter`,`HandlerInterceptor`,,`WebMvcConfigurer`,,`WebMvcConfigurer`。当使用`@WebMvcTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +要测试 Spring MVC 控制器是否如预期的那样工作,请使用`@WebMvcTest`注释。`@WebMvcTest`自动配置 Spring MVC 基础架构,并将扫描的 bean 限制为`@Controller`,`@ControllerAdvice`,`Converter`,`GenericConverter`,`Filter`,`HandlerInterceptor`,<1440"/>,,和”1442">。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@WebMvcTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 | |`@WebMvcTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3037,7 +3037,7 @@ void someTest() throws Exception { `@WebMvcTest`还自动配置`MockMvc`。Mock MVC 提供了一种强大的方法,可以快速测试 MVC 控制器,而无需启动完整的 HTTP 服务器。 -| |你还可以通过使用`@AutoConfigureMockMvc`对
进行注释,在非 @@webmvctest`(例如`@SpringBootTest`)中自动配置`MockMvc`。
下面的示例使用`MockMvc`:| +| |你还可以在非-`@WebMvcTest`(例如`@SpringBootTest`)中自动配置`MockMvc`(例如`@SpringBootTest`),方法是用`@AutoConfigureMockMvc`对其进行注释。
下面的示例使用`MockMvc`:| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ``` @@ -3079,7 +3079,7 @@ class MyControllerTests { | |如果需要配置自动配置的元素(例如,当应用 Servlet 过滤器时),可以在`@AutoConfigureMockMvc`注释中使用属性。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果使用 htmlUnit 和 Selenium,Auto-Configuration 还提供了一个 htmlUnit Bean 和/或一个 Selenium Bean。以下示例使用了 htmlUnit: +如果使用 htmlUnit 和 Selenium,Auto-Configuration 还提供了一个 htmlUnit Bean 和/或一个 Selenium Bean。以下示例使用了 htmlUnit: ``` import com.gargoylesoftware.htmlunit.WebClient; @@ -3116,17 +3116,17 @@ class MyHtmlUnitTests { | |默认情况下, Spring boot 将`WebDriver`bean 放在一个特殊的“范围”中,以确保每次测试后驱动程序退出,并且注入了一个新的实例。
如果你不想要这种行为,可以将`@Scope("singleton")`添加到你的`WebDriver`定义中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |由 Spring 引导创建的`webDriver`作用域将替换任何用户定义的同名作用域。
如果你定义自己的`webDriver`作用域,则在使用`@WebMvcTest`时,你可能会发现它停止工作。| +| |由 Spring 引导创建的`webDriver`作用域将替换任何用户定义的同名作用域。
如果你定义自己的`webDriver`作用域,则当你使用`@WebMvcTest`时,你可能会发现它停止工作。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果在 Classpath 上具有 Spring 安全性,`@WebMvcTest`也将扫描`WebSecurityConfigurer`bean。你可以使用 Spring Security 的测试支持,而不是完全禁用此类测试的安全性。有关如何使用 Spring Security 的`MockMvc`支持的更多详细信息,请参见*[howto.html](howto.html#howto.testing.with-spring-security)*how-to 一节。 +如果在 Classpath 上具有 Spring 安全性,则`@WebMvcTest`也将扫描`WebSecurityConfigurer`bean。你可以使用 Spring Security 的测试支持,而不是完全禁用此类测试的安全性。关于如何使用 Spring Security 的`MockMvc`支持的更多详细信息,可以在这个 *[howto.html](howto.html#howto.testing.with-spring-security)*how-to 部分中找到。 | |有时编写 Spring MVC 测试是不够的; Spring 引导可以帮助你运行[使用实际服务器进行完整的端到端测试](#features.testing.spring-boot-applications.with-running-server)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 8.3.14.自动配置的 Spring WebFlux 测试 -要测试[Spring WebFlux](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html)控制器是否按预期工作,可以使用`@WebFluxTest`注释。@WebFluxTest` 自动配置 Spring WebFlux 基础设施,并将扫描的 bean 限制为`@Controller`,`@ControllerAdvice`,`Converter`,`GenericConverter`,`WebFilter`,和`WebFluxConfigurer`。当使用`@WebFluxTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +要测试[Spring WebFlux](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html)控制器是否按预期工作,可以使用`@WebFluxTest`注释。`@WebFluxTest`自动配置 Spring WebFlux 基础设施,并将扫描的 bean 限制为`@Controller`,`@ControllerAdvice`,`Converter`,`GenericConverter`,`WebFilter`,以及`WebFluxConfigurer`。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@WebFluxTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 | |由`@WebFluxTest`启用的自动配置的列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3136,9 +3136,9 @@ class MyHtmlUnitTests { 通常,`@WebFluxTest`仅限于单个控制器,并与`@MockBean`注释结合使用,以为所需的协作者提供模拟实现。 -`@WebFluxTest`还自动配置[`WebTestClient`](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#webtestclient),这提供了一种强大的方法,可以快速测试 WebFlux 控制器,而无需启动完整的 HTTP 服务器。 +`@WebFluxTest`还自动配置[`WebTestClient`](https://DOCS. Spring.io/ Spring-Framework/DOCS/5.3.16/Reference/html/testing.html#WebTestClient),它提供了一种强大的方式,可以快速测试 WebFlux 控制器,而无需启动完整的 HTTP 服务器。 -| |你还可以通过使用`@AutoConfigureWebTestClient`对
进行注释来自动配置`WebTestClient`在非 @@webfluxtest`(例如`@SpringBootTest`)中的`WebTestClient`。下面的示例显示了一个同时使用`@WebFluxTest`和`WebTestClient`的类:| +| |你还可以在非-`@WebFluxTest`(例如`@SpringBootTest`)中通过使用`@AutoConfigureWebTestClient`对其进行注释来自动配置`WebTestClient`。
下面的示例显示了一个同时使用`@WebFluxTest`和`WebTestClient`的类:| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ``` @@ -3177,7 +3177,7 @@ class MyControllerTests { | |此设置仅由 WebFlux 应用程序支持,因为在模拟 Web 应用程序中使用`WebTestClient`目前仅与 WebFlux 一起工作。| |---|------------------------------------------------------------------------------------------------------------------------------------------------| -| |`@WebFluxTest`无法检测通过 Functional Web Framework 注册的路由。
对于在上下文中测试`RouterFunction`bean,请考虑通过使用`@Import`或通过使用`@SpringBootTest`导入你自己的`RouterFunction`。| +| |`@WebFluxTest`无法检测通过 Functional Web Framework 注册的路由。
对于在上下文中测试`RouterFunction`bean,请考虑通过使用`@Import`或通过使用`@SpringBootTest`来导入你的`RouterFunction`自己。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |`@WebFluxTest`无法检测到注册为`@Bean`类型的`SecurityWebFilterChain`的自定义安全配置。
要在测试中包含该配置,你将需要通过使用`@Import`或通过使用`@SpringBootTest`导入注册 Bean 的配置。| @@ -3188,12 +3188,12 @@ class MyControllerTests { #### 8.3.15.自动配置的数据 Cassandra 测试 -你可以使用`@DataCassandraTest`来测试 Cassandra 应用程序。默认情况下,它配置`CassandraTemplate`,扫描`@Table`类,并配置 Spring 数据 Cassandra 存储库。当使用`@DataCassandraTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包含`@ConfigurationProperties`bean。(关于使用 Cassandra 与 Spring boot 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.cassandra)”。 +你可以使用`@DataCassandraTest`来测试 Cassandra 应用程序。默认情况下,它配置`CassandraTemplate`,扫描`@Table`类,并配置 Spring 数据 Cassandra 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataCassandraTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。(关于使用 Spring boot 的 Cassandra 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.cassandra)”。 | |`@DataCassandraTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -下面的示例展示了在 Spring boot 中使用 Cassandra 测试的典型设置: +下面的示例展示了在 Spring Boot 中使用 Cassandra 测试的典型设置: ``` import org.springframework.beans.factory.annotation.Autowired; @@ -3213,7 +3213,7 @@ class MyDataCassandraTests { 你可以使用`@DataJpaTest`注释来测试 JPA 应用程序。默认情况下,它扫描`@Entity`类并配置 Spring 数据 JPA 存储库。如果嵌入式数据库在 Classpath 上可用,那么它也会配置一个。默认情况下,通过将`spring.jpa.show-sql`属性设置为`true`来记录 SQL 查询。可以使用注释的`showSql()`属性禁用此功能。 -当使用`@DataJpaTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataJpaTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 | |`@DataJpaTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3235,7 +3235,7 @@ class MyNonTransactionalTests { ``` -JPA 测试数据还可以注入 Bean,这为 JPA 标准提供了一种替代方法,即专门为测试而设计。 +数据 JPA 测试还可能注入一个[`TestEntityManager`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-test-autofigure/SRC/main/java/org/springframework/boot/test/autoform/ JPA/testentitymanager.java) Bean,它为专门为测试设计的标准 JPA 提供了一种替代方案。 | |`TestEntityManager`还可以通过添加`@AutoConfigureTestEntityManager`自动配置到你的任何基于 Spring 的测试类。
这样做时,请确保你的测试是在事务中运行的,例如,在你的测试类或方法上添加`@Transactional`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3291,9 +3291,9 @@ class MyRepositoryTests { #### 8.3.17.自动配置的 JDBC 测试 -`@JdbcTest`类似于`@DataJpaTest`,但用于仅需要`DataSource`且不使用 Spring 数据 JDBC 的测试。默认情况下,它配置一个内存嵌入数据库和一个`JdbcTemplate`。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@JdbcTest`注释时不进行扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +`@JdbcTest`类似于`@DataJpaTest`,但用于仅需要`DataSource`且不使用 Spring 数据 JDBC 的测试。默认情况下,它配置内存中的嵌入式数据库和`JdbcTemplate`。当使用`@JdbcTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 -| |由`@JdbcTest`启用的自动配置的列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| +| |`@JdbcTest`启用的自动配置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------| 默认情况下,JDBC 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring 框架参考文档中的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#testcontext-tx-enabling-transactions)。如果这不是你想要的,那么你可以禁用测试或整个类的事务管理,如下所示: @@ -3315,18 +3315,18 @@ class MyTransactionalTests { #### 8.3.18.自动配置的数据 JDBC 测试 -`@DataJdbcTest`类似于`@JdbcTest`,但用于使用 Spring 数据 JDBC 存储库的测试。默认情况下,它配置内存中的嵌入式数据库、`JdbcTemplate`和 Spring 数据 JDBC 存储库。当使用`@DataJdbcTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +`@DataJdbcTest`类似于`@JdbcTest`,但用于使用 Spring 数据 JDBC 存储库的测试。默认情况下,它配置内存中的嵌入式数据库、`JdbcTemplate`和 Spring 数据 JDBC 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataJdbcTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 -| |`@DataJdbcTest`启用的自动配置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| +| |由`@DataJdbcTest`启用的自动配置的列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| -默认情况下,数据 JDBC 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring 框架参考文档中的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#testcontext-tx-enabling-transactions)。如果这不是你想要的,那么你可以禁用一个测试或整个测试类的事务管理,如[在 JDBC 示例中显示](#features.testing.spring-boot-applications.autoconfigured-jdbc)。 +默认情况下,数据 JDBC 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring 框架参考文档中的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/testing.html#testcontext-tx-enabling-transactions)。如果这不是你想要的,那么你可以禁用测试或整个测试类的事务管理,如[在 JDBC 示例中显示](#features.testing.spring-boot-applications.autoconfigured-jdbc)。 如果你希望你的测试在真实的数据库中运行,那么你可以使用`@AutoConfigureTestDatabase`注释,就像使用`DataJpaTest`注释一样。(见“[Auto-configured Data JPA Tests](#features.testing.spring-boot-applications.autoconfigured-spring-data-jpa)”。 #### 8.3.19.自动配置的 Jooq 测试 -你可以以与`@JdbcTest`类似的方式使用`@JooqTest`,但用于与 Jooq 相关的测试。由于 Jooq 在很大程度上依赖于与数据库模式相对应的基于 Java 的模式,因此使用了现有的`DataSource`。如果要用内存数据库替换它,可以使用`@AutoConfigureTestDatabase`来覆盖这些设置。(关于使用 Jooq 和 Spring boot 的更多信息,请参见本章前面的“[data.html](data.html#data.sql.jooq)”。)常规的`@Component`和`@ConfigurationProperties`bean 在使用`@JooqTest`注释时不会被扫描。@enableConfigrationProperties` 可以用来包括`@ConfigurationProperties`bean。 +你可以以与`@JdbcTest`类似的方式使用`@JooqTest`,但用于与 Jooq 相关的测试。由于 Jooq 在很大程度上依赖于与数据库模式相对应的基于 Java 的模式,因此使用了现有的`DataSource`。如果要用内存数据库替换它,可以使用`@AutoConfigureTestDatabase`来覆盖这些设置。(有关使用 Spring boot 使用 Jooq 的更多信息,请参见本章前面的“[data.html](data.html#data.sql.jooq)”。)常规`@Component`和`@ConfigurationProperties`bean 在使用`@JooqTest`注释时不会被扫描。`@EnableConfigurationProperties`bean 可用于包括`@ConfigurationProperties`bean。 | |由`@JooqTest`启用的自动配置的列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3351,11 +3351,11 @@ class MyJooqTests { ``` -在默认情况下,Jooq 测试是事务性的,并在每个测试结束时回滚。如果这不是你想要的,那么你可以禁用一个测试或整个测试类的事务管理,如[在 JDBC 示例中显示](#features.testing.spring-boot-applications.autoconfigured-jdbc)。 +在默认情况下,Jooq 测试是事务性的,并在每个测试结束时回滚。如果这不是你想要的,那么你可以禁用测试或整个测试类的事务管理,如[在 JDBC 示例中显示](#features.testing.spring-boot-applications.autoconfigured-jdbc)。 #### 8.3.20.自动配置的数据 MongoDB 测试 -你可以使用`@DataMongoTest`来测试 MongoDB 应用程序。默认情况下,它配置内存中的嵌入式 MongoDB(如果可用),配置`MongoTemplate`,扫描`@Document`类,并配置 Spring 数据 MongoDB 存储库。当使用`@DataMongoTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。(关于使用 Spring Boot 的 MongoDB 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.mongodb)”。 +你可以使用`@DataMongoTest`来测试 MongoDB 应用程序。默认情况下,它配置内存中的嵌入式 MongoDB(如果可用),配置`MongoTemplate`,扫描`@Document`类,并配置 Spring 数据 MongoDB 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataMongoTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。(有关使用 Spring Boot 的 MongoDB 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.mongodb)”。 | |`@DataMongoTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3396,7 +3396,7 @@ class MyDataMongoDbTests { #### 8.3.21.自动配置的数据 NEO4J 测试 -你可以使用`@DataNeo4jTest`来测试 NEO4J 应用程序。默认情况下,它扫描`@Node`类,并配置 Spring 数据 NEO4j 存储库。当使用`@DataNeo4jTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。(有关在 Spring boot 中使用 NEO4j 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.neo4j)”。 +你可以使用`@DataNeo4jTest`来测试 NEO4J 应用程序。默认情况下,它扫描`@Node`类,并配置 Spring 数据 NEO4j 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataNeo4jTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。(有关在 Spring 引导下使用 NEO4j 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.neo4j)”。 | |`@DataNeo4jTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3439,7 +3439,7 @@ class MyDataNeo4jTests { #### 8.3.22.自动配置的数据 Redis 测试 -你可以使用`@DataRedisTest`来测试 Redis 应用程序。默认情况下,它扫描`@RedisHash`类并配置 Spring 数据 Redis 存储库。当使用`@DataRedisTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。(有关在 Spring 引导下使用 Redis 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.redis)”。 +你可以使用`@DataRedisTest`来测试 Redis 应用程序。默认情况下,它扫描`@RedisHash`类并配置 Spring 数据 Redis 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataRedisTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。(有关在 Spring 引导下使用 Redis 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.redis)”。 | |`@DataRedisTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3464,7 +3464,7 @@ class MyDataRedisTests { #### 8.3.23.自动配置的数据 LDAP 测试 -你可以使用`@DataLdapTest`来测试 LDAP 应用程序。默认情况下,它会配置内存中的嵌入式 LDAP(如果可用),配置`LdapTemplate`,扫描`@Entry`类,并配置 Spring 数据 LDAP 存储库。当使用`@DataLdapTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包含`@ConfigurationProperties`bean。(有关在 Spring boot 中使用 LDAP 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.ldap)”。 +你可以使用`@DataLdapTest`来测试 LDAP 应用程序。默认情况下,它配置内存中的嵌入式 LDAP(如果可用),配置`LdapTemplate`,扫描`@Entry`类,并配置 Spring 数据 LDAP 存储库。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@DataLdapTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。(有关在 Spring boot 中使用 LDAP 的更多信息,请参见本章前面的“[data.html](data.html#data.nosql.ldap)”。 | |`@DataLdapTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3488,7 +3488,7 @@ class MyDataLdapTests { ``` -嵌入式 LDAP 通常在测试中运行良好,因为它速度快,不需要任何开发人员安装。但是,如果你更喜欢在真实的 LDAP 服务器上运行测试,则应该排除嵌入的 LDAP 自动配置,如下例所示: +内嵌入内存的 LDAP 通常在测试中运行良好,因为它速度快且不需要任何开发人员安装。但是,如果你更喜欢在真实的 LDAP 服务器上运行测试,则应该排除嵌入的 LDAP 自动配置,如下例所示: ``` import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration; @@ -3505,12 +3505,12 @@ class MyDataLdapTests { #### 8.3.24.自动配置的 REST 客户机 -你可以使用`@RestClientTest`注释来测试 REST 客户机。默认情况下,它会自动配置 Jackson、GSON 和 JSONB 支持,配置`RestTemplateBuilder`,并添加对`MockRestServiceServer`的支持。当使用`@RestClientTest`注释时,常规的`@Component`和`@ConfigurationProperties`bean 不会被扫描。@enableConfigurationProperties` 可用于包括`@ConfigurationProperties`bean。 +你可以使用`@RestClientTest`注释来测试 REST 客户机。默认情况下,它会自动配置 Jackson、GSON 和 JSONB 支持,配置`RestTemplateBuilder`,并添加对`MockRestServiceServer`的支持。常规的`@Component`和`@ConfigurationProperties`bean 在使用`@RestClientTest`注释时不进行扫描。`@EnableConfigurationProperties`可以用于包括`@ConfigurationProperties`bean。 | |`@RestClientTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -要测试的特定 bean 应该通过使用`value`或`components`的`components`属性来指定,如以下示例所示: +要测试的特定 bean 应该使用`value`或`components`的`components`属性来指定,如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -3546,13 +3546,13 @@ class MyRestClientTests { #### 8.3.25.自动配置的 Spring REST DOCS 测试 -你可以使用`@AutoConfigureRestDocs`注释在模拟 MVC、Rest Assured 或 WebTestClient 的测试中使用[Spring REST Docs](https://spring.io/projects/spring-restdocs)。它消除了对 Spring REST DOCS 中的 JUnit 扩展的需要。 +在使用模拟 MVC、Rest Assured 或 WebTestClient 的测试中,可以使用`@AutoConfigureRestDocs`注释来使用[Spring REST Docs](https://spring.io/projects/spring-restdocs)。它消除了对 Spring REST DOCS 中的 JUnit 扩展的需要。 -`@AutoConfigureRestDocs`可以用来覆盖默认的输出目录(如果你正在使用 Maven,则使用 `target/generated-snippets’;如果你正在使用 Gradle,则使用`build/generated-snippets`)。它还可以用于配置出现在任何有文档的 URI 中的主机、方案和端口。 +`@AutoConfigureRestDocs`可以用来覆盖默认的输出目录(`target/generated-snippets`如果你正在使用 Maven 或`build/generated-snippets`如果你正在使用 Gradle)。它还可以用于配置出现在任何有文档的 URI 中的主机、方案和端口。 ##### Spring 使用模拟 MVC 的 REST DOCS 测试的自动配置 -`@AutoConfigureRestDocs`在测试基于 Servlet 的 Web 应用程序时,定制`MockMvc` Bean 以使用 Spring REST DOCS。你可以通过使用`@Autowired`注入它,并在测试中使用它,就像在使用模拟 MVC 和 Spring REST DOCS 时通常使用的那样,如以下示例所示: +`@AutoConfigureRestDocs`在测试基于 Servlet 的 Web 应用程序时定制`MockMvc` Bean 以使用 Spring REST DOCS。你可以通过使用`@Autowired`注入它,并在测试中使用它,就像在使用模拟 MVC 和 Spring REST DOCS 时通常使用的那样,如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -3585,7 +3585,7 @@ class MyUserDocumentationTests { ``` -如果需要对 Spring REST DOCS 配置的控制超过`@AutoConfigureRestDocs`的属性所提供的控制,则可以使用`RestDocsMockMvcConfigurationCustomizer` Bean,如以下示例所示: +如果需要对 Spring REST DOCS 配置的控制比`@AutoConfigureRestDocs`的属性提供的更多,则可以使用`RestDocsMockMvcConfigurationCustomizer` Bean,如以下示例所示: ``` import org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer; @@ -3627,7 +3627,7 @@ public class MyResultHandlerConfiguration { ##### 使用 WebTestClient 自动配置的 Spring REST DOCS 测试 -`@AutoConfigureRestDocs`在测试反应性 Web 应用程序时也可以与`WebTestClient`一起使用。你可以通过使用`@Autowired`注入它,并在测试中使用它,就像你通常使用`@WebFluxTest`和 Spring REST DOCS 时一样,如以下示例所示: +`@AutoConfigureRestDocs`在测试反应性 Web 应用程序时也可以与`WebTestClient`一起使用。你可以通过使用`@Autowired`注入它,并在测试中使用它,就像在使用`@WebFluxTest`和 Spring REST DOCS 时通常使用它一样,如以下示例所示: ``` import org.junit.jupiter.api.Test; @@ -3703,7 +3703,7 @@ public class MyWebTestClientBuilderCustomizerConfiguration { ##### Spring 具有 REST 保证的 REST DOCS 测试的自动配置 -`@AutoConfigureRestDocs`生成一个`RequestSpecification` Bean,预先配置为使用 Spring REST DOCS,可用于你的测试。你可以通过使用`@Autowired`注入它,并在你的测试中使用它,就像在使用 REST ASSURED 和 Spring REST DOCS 时通常使用它一样,如以下示例所示: +`@AutoConfigureRestDocs`生成一个`RequestSpecification` Bean,预先配置为使用 Spring REST DOCS,可用于你的测试。你可以通过使用`@Autowired`注入它,并在测试中使用它,就像在使用 REST ASSURED 和 Spring REST DOCS 时通常使用它一样,如以下示例所示: ``` import io.restassured.specification.RequestSpecification; @@ -3738,7 +3738,7 @@ class MyUserDocumentationTests { ``` -如果需要对 Spring REST DOCS 配置的控制比由`@AutoConfigureRestDocs`的属性提供的更多,则可以使用`RestDocsRestAssuredConfigurationCustomizer` Bean,如以下示例所示: +如果需要对 Spring REST DOCS 配置的控制超过由`@AutoConfigureRestDocs`的属性提供的控制,则可以使用`RestDocsRestAssuredConfigurationCustomizer` Bean,如以下示例所示: ``` import org.springframework.boot.test.autoconfigure.restdocs.RestDocsRestAssuredConfigurationCustomizer; @@ -3762,7 +3762,7 @@ public class MyRestDocsConfiguration implements RestDocsRestAssuredConfiguration ##### 自动配置的 Spring Web 服务客户端测试 -你可以使用`@WebServiceClientTest`来测试使用 Spring Web 服务项目调用 Web 服务的应用程序。默认情况下,它配置一个模拟`WebServiceServer` Bean 并自动定制你的`WebServiceTemplateBuilder`。(有关使用 Spring 引导的 Web 服务的更多信息,请参见本章前面的“[io.html](io.html#io.webservices)”。 +你可以使用`@WebServiceClientTest`来测试使用 Spring Web 服务项目调用 Web 服务的应用程序。默认情况下,它配置一个模拟`WebServiceServer` Bean 并自动定制你的`WebServiceTemplateBuilder`。(有关使用 Spring boot 的 Web 服务的更多信息,请参见本章前面的“[io.html](io.html#io.webservices)”。 | |`@WebServiceClientTest`启用的自动配置设置列表可以是[在附录中找到](test-auto-configuration.html#appendix.test-auto-configuration)。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -3842,7 +3842,7 @@ class MyWebServiceServerTests { #### 8.3.27.附加的自动配置和切片 -每个切片提供一个或多个`@AutoConfigure…​`注释,即定义了作为切片的一部分应该包含的自动配置。可以通过创建自定义`@AutoConfigure…​`注释或在测试中添加`@ImportAutoConfiguration`,在逐个测试的基础上添加额外的自动配置,如下例所示: +每个切片提供一个或多个`@AutoConfigure…​`注释,即定义了作为切片的一部分应该包含的自动配置。通过创建自定义`@AutoConfigure…​`注释或在测试中添加`@ImportAutoConfiguration`,可以在逐个测试的基础上添加额外的自动配置,如下例所示: ``` import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -3857,7 +3857,7 @@ class MyJdbcTests { ``` -| |确保不使用常规的`@Import`注释来导入自动配置,因为它们是由 Spring 引导以特定方式处理的。| +| |确保不要使用常规的`@Import`注释来导入自动配置,因为它们是由 Spring 引导以特定方式处理的。| |---|-----------------------------------------------------------------------------------------------------------------------------------------| 或者,可以通过在`META-INF/spring.factories`中注册它们,为任何使用切片注释的情况添加额外的自动配置,如以下示例所示: @@ -3866,12 +3866,12 @@ class MyJdbcTests { org.springframework.boot.test.autoconfigure.jdbc.JdbcTest=com.example.IntegrationAutoConfiguration ``` -| |切片或`@AutoConfigure…​`注释可以通过这种方式进行自定义,只要它是用`@ImportAutoConfiguration`进行元注释的。| +| |切片或`@AutoConfigure…​`注释可以通过这种方式进行定制,只要它是用`@ImportAutoConfiguration`进行元注释的。| |---|------------------------------------------------------------------------------------------------------------------------------------| #### 8.3.28.用户配置和切片 -如果以一种合理的方式[构造你的代码](using.html#using.structuring-your-code),你的`@SpringBootApplication`类是[used by default](#features.testing.spring-boot-applications.detecting-configuration)作为测试的配置。 +如果以一种合理的方式[构造你的代码](using.html#using.structuring-your-code),你的`@SpringBootApplication`类是[默认使用](#features.testing.spring-boot-applications.detecting-configuration)作为测试的配置。 因此,重要的是,不要在应用程序的主类中浪费特定于其特定功能领域的配置设置。 @@ -3891,7 +3891,7 @@ public class MyApplication { ``` -因为这个类是测试的源配置,所以任何切片测试实际上都会尝试启动 Spring 批处理,这绝对不是你想要做的。推荐的方法是将该区域特定的配置移动到与应用程序处于同一级别的单独的`@Configuration`类,如下例所示: +因为这个类是测试的源配置,所以任何切片测试实际上都会尝试启动 Spring 批处理,而这绝对不是你想要做的。推荐的方法是将该区域特定的配置移动到与应用程序处于同一级别的单独的`@Configuration`类,如下例所示: ``` import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; @@ -3967,9 +3967,9 @@ public class MyApplication { | |如果这不是你的一个选项,那么你可以在测试的层次结构中的某个地方创建一个`@SpringBootConfiguration`,以便使用它。
或者,你可以为你的测试指定一个源,这将禁用查找缺省源的行为。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### 8.3.29.使用 Spock 测试 Spring 引导应用程序 +#### 8.3.29.使用 Spock 测试 Spring 启动应用程序 -Spock2.x 可用于测试 Spring 引导应用程序。为此,在应用程序的构建中添加对 Spock 的`spock-spring`模块的依赖关系。有关更多详细信息,请参见[the documentation for Spock’s Spring module](https://spockframework.org/spock/docs/2.0/modules.html#_spring_module)。 +Spock2.x 可用于测试 Spring 引导应用程序。为此,在应用程序的构建中添加对 Spock 的`spock-spring`模块的依赖关系。`spock-spring`将 Spring 的测试框架集成到 Spock 中。有关更多详细信息,请参见[the documentation for Spock’s Spring module](https://spockframework.org/spock/docs/2.0/modules.html#_spring_module)。 ### 8.4.测试实用程序 @@ -3977,7 +3977,7 @@ Spock2.x 可用于测试 Spring 引导应用程序。为此,在应用程序的 #### 8.4.1.ConfigDataApplicationContextInitializer -`ConfigDataApplicationContextInitializer`是一个`ApplicationContextInitializer`,你可以将其应用到你的测试中来加载 Spring boot`application.properties`文件。当你不需要`@SpringBootTest`提供的全套功能时,可以使用它,如下例所示: +`ConfigDataApplicationContextInitializer`是一个`ApplicationContextInitializer`,你可以将其应用到测试中以加载 Spring boot`application.properties`文件。当你不需要`@SpringBootTest`提供的全套功能时,可以使用它,如下例所示: ``` import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer; @@ -3992,7 +3992,7 @@ class MyConfigFileTests { ``` -| |单独使用`ConfigDataApplicationContextInitializer`并不提供对`@Value("${…​}")`注入的支持。
其唯一的工作是确保`application.properties`文件被加载到 Spring 的`Environment`中。
对于`@Value`的支持,你需要另外配置一个`PropertySourcesPlaceholderConfigurer`,或者使用`@SpringBootTest`,它为你自动配置了一个。| +| |单独使用`ConfigDataApplicationContextInitializer`并不提供对`@Value("${…​}")`注入的支持。
其唯一的工作是确保`application.properties`文件被加载到 Spring 的`Environment`中,
对于`@Value`的支持,你需要另外配置一个`PropertySourcesPlaceholderConfigurer`,或者使用`@SpringBootTest`,它为你自动配置了一个。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 8.4.2.测试 PropertyValues @@ -4053,11 +4053,11 @@ class MyOutputCaptureTests { | |Spring Framework5.0 提供了一个新的`WebTestClient`,它对[WebFlux 集成测试](#features.testing.spring-boot-applications.spring-webflux-tests)和[WebFlux 和 MVC 端到端测试](#features.testing.spring-boot-applications.with-running-server)都有效。
它为断言提供了一个流畅的 API,而不像`TestRestTemplate`。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -建议使用 Apache HTTP 客户机(版本 4.3.2 或更好),但不是强制的。如果你的 Classpath 上有这样的配置,则`TestRestTemplate`通过适当地配置客户机来响应。如果你确实使用了 Apache 的 HTTP 客户机,则启用了一些额外的测试友好特性: +建议使用 Apache HTTP 客户机(版本 4.3.2 或更好),但不是强制的。如果你的 Classpath 上有这样的配置,则`TestRestTemplate`通过适当地配置客户机来进行响应。如果你确实使用了 Apache 的 HTTP 客户机,则启用了一些额外的测试友好特性: * 重定向不会被跟踪(因此你可以断言响应位置)。 -* cookie 被忽略(因此模板是无状态的)。 +* cookies 被忽略(因此模板是无状态的)。 `TestRestTemplate`可以在集成测试中直接实例化,如以下示例所示: @@ -4130,18 +4130,18 @@ class MySpringBootTests { ## 9. 创建自己的自动配置 -如果你在一家开发共享库的公司工作,或者在一家开放源代码或商业库工作,那么你可能希望开发自己的自动配置。自动配置类可以捆绑在外部 JAR 中,并且仍然可以在 Spring 启动时进行拾取。 +如果你在一家开发共享库的公司工作,或者在一家开放源代码或商业库工作,那么你可能希望开发自己的自动配置。自动配置类可以捆绑在外部 JAR 中,并且仍然可以在 Spring 启动时被拾取。 -自动配置可以与一个“启动器”相关联,该启动器提供自动配置代码以及你将与之一起使用的典型库。我们首先介绍构建自己的自动配置所需了解的内容,然后继续讨论[创建自定义启动器所需的典型步骤](#features.developing-auto-configuration.custom-starter)。 +自动配置可以与一个“启动器”相关联,该启动器提供自动配置代码以及你将与之一起使用的典型库。我们首先介绍构建自己的自动配置所需的知识,然后继续讨论[创建自定义启动器所需的典型步骤](#features.developing-auto-configuration.custom-starter)。 -| |可以使用[demo project](https://github.com/snicoll-demos/spring-boot-master-auto-configuration)来展示如何一步一步地创建一个启动程序。| +| |可以使用[演示项目](https://github.com/snicoll-demos/spring-boot-master-auto-configuration)来展示如何一步一步地创建一个启动程序。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 9.1.理解自动配置的 bean 在引擎盖下,自动配置是通过标准的`@Configuration`类实现的。附加的`@Conditional`注释用于在应用自动配置时进行约束。通常,自动配置类使用`@ConditionalOnClass`和`@ConditionalOnMissingBean`注释。这确保了自动配置仅在找到相关类以及尚未声明自己的`@Configuration`时才适用。 -你可以浏览[`spring-boot-autoconfigure`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure)的源代码,查看 Spring 提供的`@Configuration`类(参见[`META-INF/spring.factories`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories)文件)。 +你可以浏览[`spring-boot-autoconfigure`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/org/springframework/boot/autofigure/autofigure)的源代码,查看 Spring 提供的`@Configuration`类(参见[`META-INF/spring.factories`](https://github.com/ Spring-projects/[[[[tree]-tree/6.6]- ### 9.2.定位自动配置候选项 @@ -4153,12 +4153,12 @@ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration ``` -| |自动配置必须以*只是*的方式加载。
确保它们是在特定的包空间中定义的,并且它们永远不是组件扫描的目标。
此外,自动配置类不应使组件扫描能够找到其他组件。应该使用
特定的`@Import`s。| +| |自动配置必须以*只有*的方式加载。
确保它们是在特定的包空间中定义的,并且它们永远不是组件扫描的目标。
此外,自动配置类不应使组件扫描能够找到其他组件。应该使用
特定的`@Import`s。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果需要按特定顺序应用配置,则可以使用[`@autofigureafter`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigureAfter.java)或[@autofigurebefore](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigureBefore.java)注释。例如,如果你提供了特定于 Web 的配置,那么你的类可能需要在`WebMvcAutoConfiguration`之后应用。 +你可以使用[`@AutoConfigureAfter`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autconfigure/SRC/main/java/org/SpringFramework/boot/autoConfigure/autoConfigure/autoafter.java.java)或[`@AutoConfigureBefore`](https:///github.com/ Spring-projects/[[ Spring-boot/tree/tree/v2.6.4/例如,如果你提供了特定于 Web 的配置,那么你的类可能需要在`WebMvcAutoConfiguration`之后应用。 -如果你希望订购某些不应该相互有任何直接了解的自动配置,也可以使用`@AutoConfigureOrder`。该注释与常规的`@Order`注释具有相同的语义,但为自动配置类提供了专用的顺序。 +如果你希望订购某些不应相互有任何直接了解的自动配置,也可以使用`@AutoConfigureOrder`。该注释与常规的`@Order`注释具有相同的语义,但为自动配置类提供了专用的顺序。 与标准的`@Configuration`类一样,应用自动配置类的顺序只会影响其 bean 的定义顺序。随后创建这些 bean 的顺序不受影响,并且由每个 Bean 的依赖关系和任何`@DependsOn`关系决定。 @@ -4182,9 +4182,9 @@ Spring 引导包括许多`@Conditional`注释,你可以通过注释`@Configura #### 9.3.1.类条件 -`@ConditionalOnClass`和`@ConditionalOnMissingClass`注释让`@Configuration`类基于特定类的存在或不存在而被包括。由于批注元数据是通过使用[ASM](https://asm.ow2.io/)来解析的,因此可以使用`value`属性来引用真正的类,即使该类实际上可能不会出现在正在运行的应用程序上 Classpath。如果你希望通过使用`String`值来指定类名,那么也可以使用`name`属性。 +`@ConditionalOnClass`和`@ConditionalOnMissingClass`注释让`@Configuration`类基于特定类的存在或不存在而被包括。由于批注元数据是通过使用[ASM](https://asm.ow2.io/)进行解析的,因此你可以使用`value`属性来引用真正的类,即使该类实际上可能不会出现在正在运行的应用程序上 Classpath。如果你希望通过使用`String`值来指定类名,也可以使用`name`属性。 -这种机制不以同样的方式应用于`@Bean`方法,在这种方法中,返回类型通常是条件的目标:在方法的条件应用之前,JVM 将装载类和可能处理的方法引用,如果类不存在,这些引用将失败。 +此机制不以同样的方式应用于`@Bean`方法,其中返回类型通常是条件的目标:在方法的条件应用之前,JVM 将装载类和可能处理的方法引用,如果类不存在,这些引用将失败。 要处理此场景,可以使用一个单独的`@Configuration`类来隔离该条件,如以下示例所示: @@ -4243,12 +4243,12 @@ public class MyAutoConfiguration { ``` -在前面的示例中,如果`SomeService`类型的 Bean 中的`someService`已经包含在`ApplicationContext`中,则将创建`someService` Bean。 +在前面的示例中,如果`SomeService`类型的 Bean 已经包含在`ApplicationContext`中,则将创建`someService` Bean。 -| |你需要非常小心添加 Bean 定义的顺序,因为这些条件是基于到目前为止已处理的内容进行评估的。,由于这个原因,在类级别上使用这些条件与用注释标记每个包含`@Bean`方法之间的唯一区别是如果条件不匹配,则前者阻止将`@Configuration`类注册为 Bean。| +| |`@ConditionalOnBean`和`@ConditionalOnMissingBean`并不阻止创建`@Configuration`类。
在类级别上使用这些条件与用注释标记每个包含的`@Bean`方法之间的唯一区别是如果条件不匹配,则前者阻止将`@Configuration`类注册为 Bean。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |在声明`@Bean`方法时,在方法的返回类型中提供尽可能多的类型信息,例如,
,如果 Bean 的 Concrete 类实现了一个接口,那么 Bean 方法的返回类型应该是 Concrete 类而不是接口。在方法中提供尽可能多的类型信息在使用 Bean 条件时尤其重要,因为它们的评估只能依赖于在方法签名中可用的类型信息。| @@ -4270,14 +4270,14 @@ public class MyAutoConfiguration { #### 9.3.6.SPEL 表达条件 -`@ConditionalOnExpression`注释允许基于[SpEL expression](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/core.html#expressions)的结果包含配置。 +`@ConditionalOnExpression`注释允许基于[Spel 表达式](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/core.html#expressions)的结果包含配置。 | |在表达式中引用 Bean 将导致 Bean 在上下文刷新处理中很早就被初始化。
因此, Bean 将不符合后处理的条件(例如配置属性绑定),并且其状态可能不完整。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 9.4.测试你的自动配置 -自动配置可能受到许多因素的影响:用户配置(`@ Bean ` 定义和`Environment`自定义)、条件评估(存在特定库),以及其他因素。具体地说,每个测试都应该创建一个定义良好的`ApplicationContext`,它代表了这些定制的组合。 +自动配置可能受到许多因素的影响:用户配置(`@Bean`定义和`Environment`定制)、条件评估(存在特定库),以及其他因素。具体地说,每个测试都应该创建一个定义良好的`ApplicationContext`,它代表了这些定制的组合。`ApplicationContextRunner`提供了一种很好的实现方法。 `ApplicationContextRunner`通常被定义为用于收集基础、公共配置的测试类的字段。下面的示例确保始终调用`MyServiceAutoConfiguration`: @@ -4290,7 +4290,7 @@ private final ApplicationContextRunner contextRunner = new ApplicationContextRun | |如果必须定义多个自动配置,则不需要对它们的声明进行排序,因为它们的调用顺序与运行应用程序时的顺序完全相同。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -每个测试都可以使用 Runner 来表示特定的用例。例如,下面的示例调用一个用户配置(“userconfiguration”),并检查自动配置是否正确备份。调用`run`提供了一个可以与`AssertJ`一起使用的回调上下文。 +每个测试都可以使用 Runner 来表示特定的用例。例如,下面的示例调用一个用户配置(`UserConfiguration`),并检查自动配置是否正确备份。调用`run`提供了一个可以与`AssertJ`一起使用的回调上下文。 ``` @Test @@ -4356,7 +4356,7 @@ class MyConditionEvaluationReportingTests { #### 9.4.2.超越 Classpath -还可以测试在运行时不存在特定类和/或包时会发生什么。 Spring 具有`FilteredClassLoader`的引导船,该引导船可以很容易地被跑步者使用。在下面的示例中,我们断言,如果`MyService`不存在,则自动配置将被正确禁用: +也可以测试在运行时不存在特定类和/或包时会发生什么。 Spring 具有`FilteredClassLoader`的引导船,该引导船可以很容易地被跑步者使用。在下面的示例中,我们断言,如果`MyService`不存在,则自动配置将被正确禁用: ``` @Test @@ -4369,7 +4369,7 @@ void serviceIsIgnoredIfLibraryIsNotPresent() { ### 9.5.创建自己的启动器 -典型的 Spring 引导启动器包含用于自动配置和自定义给定技术的基础架构的代码,我们将其称为“Acme”。为了使其易于扩展,可以将专用名称空间中的许多配置键公开到环境中。最后,提供了一个单一的“启动”依赖项,以帮助用户尽可能轻松地启动。 +典型的引导启动器包含自动配置和自定义给定技术基础设施的代码,我们将其称为“Acme”。为了使其易于扩展,可以将专用名称空间中的许多配置键公开到环境中。最后,提供了一个单一的“启动”依赖项,以帮助用户尽可能轻松地启动。 具体地说,自定义启动器可以包含以下内容: @@ -4383,9 +4383,9 @@ void serviceIsIgnoredIfLibraryIsNotPresent() { #### 9.5.1.命名 -你应该确保为你的启动器提供一个正确的名称空间。即使使用不同的 Maven `groupId`,也不要以`spring-boot`开始模块名称。我们可能会在将来为你自动配置的东西提供官方支持。 +你应该确保为你的启动器提供一个正确的名称空间。即使使用不同的 Maven `groupId`,也不要以`spring-boot`开始模块名称。我们可能会在将来为你的自动配置提供官方支持。 -根据经验,你应该以 starter 的名称命名一个组合模块。例如,假设你正在为“acme”创建一个启动器,并且将自动配置模块命名为`acme-spring-boot`,并将启动器命名为`acme-spring-boot-starter`。如果只有一个模块合并了这两个模块,请将其命名为`acme-spring-boot-starter`。 +根据经验,你应该以 starter 命名一个组合模块。例如,假设你正在为“acme”创建一个启动器,并且将自动配置模块命名为`acme-spring-boot`,并将启动器命名为`acme-spring-boot-starter`。如果只有一个模块合并了这两个模块,请将其命名为`acme-spring-boot-starter`。 #### 9.5.2.配置键 @@ -4433,7 +4433,7 @@ public class AcmeProperties { ``` -| |你应该只在`@ConfigurationProperties`字段 Javadoc 中使用纯文本,因为在将它们添加到 JSON 之前,不会对它们进行处理。| +| |你应该只在`@ConfigurationProperties`字段 Javadoc 中使用纯文本,因为它们在被添加到 JSON 之前不会被处理。| |---|------------------------------------------------------------------------------------------------------------------------------------------| 以下是我们内部遵循的一些规则,以确保描述一致: @@ -4446,9 +4446,9 @@ public class AcmeProperties { * 使用`java.time.Duration`而不是`long`,并描述缺省单位,如果它与毫秒不同,例如“如果没有指定持续时间后缀,将使用秒”。 -* 不要在描述中提供默认值,除非必须在运行时确定默认值。 +* 不要在描述中提供默认值,除非它必须在运行时确定。 -请确保[触发元数据生成](configuration-metadata.html#appendix.configuration-metadata.annotation-processor),以便你的密钥也可以使用 IDE 辅助。你可能需要查看生成的元数据(`meta-inf/ Spring-configuration-metadata.json`),以确保你的键被正确地记录下来。在兼容的 IDE 中使用自己的启动器也是验证元数据质量的一个好主意。 +请确保[触发元数据生成](configuration-metadata.html#appendix.configuration-metadata.annotation-processor),以便你的密钥也可以使用 IDE 辅助。你可能想要查看生成的元数据(`META-INF/spring-configuration-metadata.json`),以确保你的密钥被正确地记录。在兼容的 IDE 中使用自己的启动器也是验证元数据质量的一个好主意。 #### 9.5.3.“自动配置”模块 @@ -4457,7 +4457,7 @@ public class AcmeProperties { | |你应该将库的依赖关系标记为可选的,这样你就可以更容易地在项目中包含`autoconfigure`模块。
如果你这样做,那么库就不会被提供,并且在默认情况下, Spring back off。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring Boot 使用注释处理器在元数据文件(`meta-inf/ Spring-autofigure-metadata.properties`)中收集关于自动配置的条件。如果该文件存在,它将被用来急切地过滤不匹配的自动配置,这将提高启动时间。建议在包含自动配置的模块中添加以下依赖项: +Spring 引导使用注释处理器来收集元数据文件(`META-INF/spring-autoconfigure-metadata.properties`)中关于自动配置的条件。如果该文件存在,它将被用来急切地过滤不匹配的自动配置,这将提高启动时间。建议在包含自动配置的模块中添加以下依赖项: ``` @@ -4510,9 +4510,9 @@ dependencies { 起动器实际上是一个空的 jar。它的唯一目的是提供使用该库所需的依赖项。你可以把它看作是对开始工作需要什么的一种固执己见的看法。 -不要对添加了启动器的项目进行假设。如果你正在自动配置的库通常需要其他启动器,那么也应该提及它们。如果可选依赖项的数量很高,那么提供一组适当的*默认值*依赖项可能会很困难,因为你应该避免包含对于库的典型使用来说不必要的依赖项。换句话说,你不应该包括可选的依赖关系。 +不要对添加了启动器的项目进行假设。如果你正在自动配置的库通常需要其他启动器,那么也应该提及它们。如果可选依赖关系的数量很高,那么提供一组适当的*默认值*依赖关系可能会很困难,因为你应该避免包含对于库的典型使用来说不必要的依赖关系。换句话说,你不应该包括可选的依赖关系。 -| |无论哪种方式,你的启动程序都必须直接或间接地引用核心 Spring 启动程序(` Spring-boot-starter`)(如果你的启动程序依赖于另一个启动程序,则无需添加它),
如果一个项目是仅用你的自定义启动程序创建的, Spring Boot 的核心功能将因核心启动器的出现而受到尊重。| +| |无论哪种方式,你的启动程序都必须直接或间接地引用核心 Spring 启动程序(`spring-boot-starter`)(如果你的启动程序依赖于另一个启动程序,则无需添加它),如果仅使用你的自定义启动程序创建项目,则
, Spring Boot 的核心功能将因核心启动器的出现而受到尊重。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 10. Kotlin 支持 @@ -4521,35 +4521,35 @@ dependencies { Spring Boot 通过利用其他 Spring 项目中的支持来提供 Kotlin 支持,例如 Spring 框架、 Spring 数据和反应堆。有关更多信息,请参见[Spring Framework Kotlin support documentation](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/languages.html#kotlin)。 -启动 Spring boot 和 Kotlin 的最简单方法是遵循[这个全面的教程](https://spring.io/guides/tutorials/spring-boot-kotlin/)。你可以使用[start.spring.io](https://start.spring.io/#!language=kotlin)创建新的 Kotlin 项目。如果你需要支持,可以随时加入[Kotlin Slack](https://slack.kotlinlang.org/)的 # Spring 频道,或者使用`spring`和`kotlin`标签在[Stack Overflow](https://stackoverflow.com/questions/tagged/spring+kotlin)上提问。 +启动 Spring boot 和 Kotlin 的最简单方法是遵循[这个全面的教程](https://spring.io/guides/tutorials/spring-boot-kotlin/)。你可以使用[start.spring.io](https://start.spring.io/#!language=kotlin)创建新的 Kotlin 项目。如果你需要支持,可以随时加入[Kotlin Slack](https://slack.kotlinlang.org/)的 # Spring 频道,或者使用`spring`和`kotlin`标签在[堆栈溢出](https://stackoverflow.com/questions/tagged/spring+kotlin)上提问。 ### 10.1.所需经费 -Spring 启动需要至少 Kotlin 1.3.x 并且通过依赖管理管理管理管理合适的 Kotlin 版本。要使用 Kotlin,`org.jetbrains.kotlin:kotlin-stdlib`和`org.jetbrains.kotlin:kotlin-reflect`必须存在于 Classpath 上。也可以使用`kotlin-stdlib`的变体`kotlin-stdlib-jdk7`和`kotlin-stdlib-jdk8`。 +Spring 启动需要至少 Kotlin 1.3.x 并且通过依赖管理管理管理管理合适的 Kotlin 版本。要使用 Kotlin,`org.jetbrains.kotlin:kotlin-stdlib`和`org.jetbrains.kotlin:kotlin-reflect`必须存在于 Classpath 上。也可以使用`kotlin-stdlib`变种`kotlin-stdlib-jdk7`和`kotlin-stdlib-jdk8`。 由于[Kotlin classes are final by default](https://discuss.kotlinlang.org/t/classes-final-by-default/166),你可能想要配置[kotlin-spring](https://kotlinlang.org/docs/reference/compiler-plugins.html#spring-support)插件,以便自动打开 Spring-注释的类,以便可以代理它们。 -在 Kotlin 中序列化/反序列化 JSON 数据需要[Jackson’s Kotlin module](https://github.com/FasterXML/jackson-module-kotlin)。当在 Classpath 上找到它时,它会自动注册。如果 Jackson 和 Kotlin 存在但 Jackson 模块 Kotlin 不存在,则记录警告消息。 +在 Kotlin 中,序列化/反序列化 JSON 数据需要[Jackson’s Kotlin module](https://github.com/FasterXML/jackson-module-kotlin)。当在 Classpath 上找到它时,它会自动注册。如果 Jackson 和 Kotlin 存在但 Jackson Kotlin 模块不存在,则记录警告消息。 | |默认情况下,如果在[start.spring.io](https://start.spring.io/#!language=kotlin)上引导一个 Kotlin 项目,就会提供这些依赖项和插件。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------| ### 10.2.零安全 -Kotlin 的关键特征之一是[null-safety](https://kotlinlang.org/docs/reference/null-safety.html)。它在编译时处理`null`值,而不是将问题推迟到运行时并遇到`NullPointerException`。这有助于消除常见的错误源,而无需支付`Optional`之类包装器的费用。 Kotlin 还允许使用如[comprehensive guide to null-safety in Kotlin](https://www.baeldung.com/kotlin-null-safety)中所描述的具有可空的值的函数结构。 +Kotlin 的关键特征之一是[零安全](https://kotlinlang.org/docs/reference/null-safety.html)。它在编译时处理`null`值,而不是将问题推迟到运行时并遇到`NullPointerException`。这有助于消除常见的错误源,而无需支付`Optional`之类包装器的费用。 Kotlin 还允许使用如在此[comprehensive guide to null-safety in Kotlin](https://www.baeldung.com/kotlin-null-safety)中所描述的具有可空的值的函数构造。 -虽然 Java 不允许在其类型系统中表示空安全,但 Spring Framework、 Spring Data 和 Reactor 现在通过对工具友好的注释为其 API 提供了空安全。默认情况下,来自 Kotlin 中使用的 Java API 的类型被识别为[platform types](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types),对其放松了空检查。[Kotlin’s support for JSR 305 annotations](https://kotlinlang.org/docs/reference/java-interop.html#jsr-305-support)与空性注释相结合,为 Kotlin 中相关的 Spring API 提供了空安全性。 +虽然 Java 不允许在其类型系统中表示空安全,但 Spring Framework、 Spring Data 和 Reactor 现在通过对工具友好的注释为其 API 提供了空安全。默认情况下,来自 Kotlin 中使用的 Java API 的类型被识别为[平台类型](https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types),对其放松了空检查。[Kotlin’s support for JSR 305 annotations](https://kotlinlang.org/docs/reference/java-interop.html#jsr-305-support)与空性注释相结合,为 Kotlin 中相关的 Spring API 提供了空安全性。 -可以通过添加带有以下选项的`-Xjsr305`编译器标志来配置 JSR305 检查:`-Xjsr305={strict|warn|ignore}`。默认行为与`-Xjsr305=warn`相同。在从 Spring API 推断出的 Kotlin 类型中,`strict`值需要考虑到空安全性,但是在使用时应该知道 Spring API 的无效性声明即使在较小的版本之间也可以发展,并且将来可能会添加更多的检查)。 +可以通过添加带有以下选项的`-Xjsr305`编译器标志来配置 JSR305 检查:`-Xjsr305={strict|warn|ignore}`。默认行为与`-Xjsr305=warn`相同。在从 Spring API 推断出的 Kotlin 类型中,`strict`值必须考虑到空安全性,但在使用时应了解 Spring API 的无效性声明即使在较小的版本之间也可以发展,并且将来可能会添加更多的检查)。 -| |目前还不支持泛型类型参数、varargs 和数组元素的可空性。
有关最新信息,请参见[SPR-15942](https://jira.spring.io/browse/SPR-15942)。
还请注意, Spring Boot 自己的 API 是[尚未注释](https://github.com/spring-projects/spring-boot/issues/10712)。| +| |还不支持泛型类型参数、varargs 和数组元素的可空性。
有关最新信息,请参见[SPR-15942](https://jira.spring.io/browse/SPR-15942)。
还请注意 Spring Boot 自己的 API 是[尚未注释](https://github.com/spring-projects/spring-boot/issues/10712)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 10.3. Kotlin 空气污染指数 #### 10.3.1.运行应用程序 -Spring 引导提供了一种惯用的方式来运行带有`runApplication(*args)`的应用程序,如以下示例所示: +Spring Boot 提供了一种惯用的方式来运行带有`runApplication(*args)`的应用程序,如以下示例所示: ``` import org.springframework.boot.autoconfigure.SpringBootApplication @@ -4577,7 +4577,7 @@ runApplication(*args) { Kotlin [extensions](https://kotlinlang.org/docs/reference/extensions.html)提供了扩展具有附加功能的现有类的能力。 Spring 引导 Kotlin API 利用这些扩展为现有的 API 添加新的 Kotlin 特定的便利。 -`TestRestTemplate`扩展,类似于 Spring 框架中为`RestOperations`提供的扩展,在 Spring 框架中。在其他事情中,扩展使得有可能利用 Kotlin 具体化的类型参数。 +`TestRestTemplate`扩展,类似于 Spring 框架中为`RestOperations`提供的扩展,在 Spring 框架中。在其他事情中,这些扩展使得有可能利用 Kotlin 具体化的类型参数。 ### 10.4.依赖管理 @@ -4585,14 +4585,14 @@ Kotlin [extensions](https://kotlinlang.org/docs/reference/extensions.html)提供 有了 Maven, Kotlin 版本可以通过设置`kotlin.version`属性来定制,并且为`kotlin-maven-plugin`提供插件管理。在 Gradle 中, Spring 引导插件自动将`kotlin.version`与 Kotlin 插件的版本对齐。 -Spring Boot 还通过导入 Kotlin 协程 BOM 来管理协程依赖的版本。可以通过设置`kotlin-coroutines.version`属性来定制该版本。 +Spring Boot 还通过导入 Kotlin 协程 BOM 来管理协程依赖的版本。可以通过设置`kotlin-coroutines.version`属性来定制版本。 | |如果一个 Kotlin 项目至少对[start.spring.io](https://start.spring.io/#!language=kotlin)具有一个反应性依赖项,则默认情况下提供`org.jetbrains.kotlinx:kotlinx-coroutines-reactor`依赖项。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 10.5.@configrationProperties -`@ConfigurationProperties`与[@constructorbinding](#features.external-config.typesafe-configuration-properties.constructor-binding)组合使用时,支持具有不可变`val`属性的类,如以下示例所示: +`@ConfigurationProperties`与[`@ConstructorBinding`](#features.external-config.typesafe-configuration-properties.constructor-binding)结合使用时,支持具有不可变`val`属性的类,如以下示例所示: ``` @ConstructorBinding @@ -4610,14 +4610,14 @@ data class KotlinExampleProperties( ``` -| |要使用注释处理器生成[你自己的元数据](configuration-metadata.html#appendix.configuration-metadata.annotation-processor),[“kapt”应该配置](https://kotlinlang.org/docs/reference/kapt.html)带有`spring-boot-configuration-processor`依赖关系的
注意,由于 Kapt 提供的模型中的限制,一些功能(例如检测默认值或不推荐的项)无法工作。| +| |要使用注释处理器生成[你自己的元数据](configuration-metadata.html#appendix.configuration-metadata.annotation-processor),[`kapt`应该配置](https://kotlinlang.org/DOCS/reference/kapt.html)与`spring-boot-configuration-processor`依赖关系。
注意,由于 Kapt 提供的模型中的限制,一些功能(例如检测默认值或不推荐项)不起作用。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 10.6.测试 虽然可以使用 JUnit4 来测试 Kotlin 代码,但 JUnit5 是默认提供的,并且是推荐的。JUnit5 允许一个测试类被实例化一次,并在类的所有测试中重用。这使得在非静态方法上使用`@BeforeAll`和`@AfterAll`注释成为可能,这非常适合 Kotlin。 -要模拟 Kotlin 类,建议使用[MockK](https://mockk.io/)。如果你需要`Mockk`mockito specific[`@MockBean` and `@SpyBean` annotations](#features.testing.spring-boot-applications.mocking-beans)的等价物,则可以使用[SpringMockK](https://github.com/Ninja-Squad/springmockk),这提供了类似的`@MockkBean`和`@SpykBean`注释。 +要模拟 Kotlin 类,建议使用[MockK](https://mockk.io/)。如果你需要`Mockk`特定于 mockito 的[`@MockBean`和`@SpyBean`注释](#features.testing. Spring-boot-applications.mocking-beans)的等价物,则可以使用[斯普林莫克](https://github.com/Ninja-Squad/springmockk),它提供类似的`@MockkBean`和`@SpykBean`注释。 ### 10.7.资源 @@ -4627,7 +4627,7 @@ data class KotlinExampleProperties( * [Kotlin Slack](https://kotlinlang.slack.com/)(带专用 # Spring 频道) -* [Stackoverflow with `spring` and `kotlin` tags](https://stackoverflow.com/questions/tagged/spring+kotlin) +* [Stackoverflow with`spring`and`kotlin`tags](https://stackoverflow.com/questions/tagged/ Spring + Kotlin) * [Try Kotlin in your browser](https://try.kotlinlang.org/) @@ -4653,15 +4653,15 @@ data class KotlinExampleProperties( * [spring-kotlin-fullstack](https://github.com/sdeleuze/spring-kotlin-fullstack):使用 Kotlin2js 代替 JavaScript 或 TypeScript 作为前端的 webflux Kotlin fullstack 示例 -* [spring-petclinic-kotlin](https://github.com/spring-petclinic/spring-petclinic-kotlin): Spring PetClinic 样本申请的 Kotlin 版本 +* [spring-petclinic-kotlin](https://github.com/spring-petclinic/spring-petclinic-kotlin): Spring PetClinic 样本应用程序的 Kotlin 版本 * [spring-kotlin-deepdive](https://github.com/sdeleuze/spring-kotlin-deepdive):将 Boot1.0+Java 逐步迁移到 Boot2.0+ Kotlin * [spring-boot-coroutines-demo](https://github.com/sdeleuze/spring-boot-coroutines-demo):协程样本项目 -## 11. 接下来读什么? +## 11. 接下来要读什么? -如果你想更多地了解本节中讨论的任何类,请参见[Spring Boot API documentation](https://docs.spring.io/spring-boot/docs/2.6.4/api/),或者你也可以浏览[源代码直接](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。如果你有具体的问题,请参阅[how-to](howto.html#howto)部分。 +如果你想了解更多关于本节中讨论的任何类的信息,请参见[Spring Boot API documentation](https://docs.spring.io/spring-boot/docs/2.6.4/api/),或者你也可以浏览[源代码直接](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。如果你有具体的问题,请参阅[how-to](howto.html#howto)部分。 如果你对 Spring Boot 的核心功能感到满意,那么你可以继续阅读[可投入生产的功能](actuator.html#actuator)。 diff --git a/docs/spring-boot/getting-help.md b/docs/spring-boot/getting-help.md index c1d86f832fa16d39e85d2970b19f6d7dbc60ea65..a623fb0acdcf0c516800f6985595ab12886c6443 100644 --- a/docs/spring-boot/getting-help.md +++ b/docs/spring-boot/getting-help.md @@ -6,10 +6,10 @@ * 学习基础知识。 Spring Boot 建立在许多其他 Spring 项目之上。查看[spring.io](https://spring.io)网站以获取大量的参考文档。如果你从 Spring 开始,请尝试[guides](https://spring.io/guides)中的一个。 -* 问一个问题。我们监视[stackoverflow.com](https://stackoverflow.com)中带有[`spring-boot`](https://stackoverflow.com/tags/spring-boot)标记的问题。 +* 问一个问题。我们监视[stackoverflow.com](https://stackoverflow.com)中带有[`spring-boot`]标记的问题(https://stackoverflow.com/tags/ Spring-boot)。 * 使用 Spring boot 在[github.com/spring-projects/spring-boot/issues](https://github.com/spring-projects/spring-boot/issues)上报告错误。 注: -所有的启动都是开源的,包括文档。如果你发现 DOCS 存在问题或希望改进它们,请[get involved](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。 \ No newline at end of file +所有的启动都是开源的,包括文档。如果你发现 DOCS 存在问题或希望改进它们,请[参与进来](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。 \ No newline at end of file diff --git a/docs/spring-boot/getting-started.md b/docs/spring-boot/getting-started.md index 948100e9f2f216c19e2c057d1df8a47cc59a2b7d..281b997d0b49d0845a2dca99a8f384dfb23ef457 100644 --- a/docs/spring-boot/getting-started.md +++ b/docs/spring-boot/getting-started.md @@ -14,7 +14,7 @@ Spring 引导帮助你创建可以运行的独立的、基于生产级别 Spring * 在需求开始偏离默认值时,不要拘泥于常规,但要尽快摆脱。 -* 提供一系列非功能特性,这些特性是大型项目(如嵌入式服务器、安全性、度量、健康检查和外部化配置)所共有的。 +* 提供一系列非功能特性,这些特性是大型项目类所共有的(例如嵌入式服务器、安全性、度量、健康检查和外部化配置)。 * 绝对不需要代码生成,也不需要 XML 配置。 @@ -97,11 +97,11 @@ Spring 引导 CLI(命令行界面)是一种命令行工具,你可以使用 尖端[快照分布](https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/)也是可用的。 -一旦下载,请按照解压缩归档文件中的[INSTALL.txt](https://raw.githubusercontent.com/spring-projects/spring-boot/v2.6.4/spring-boot-project/spring-boot-cli/src/main/content/INSTALL.txt)说明进行操作。总之,在`.zip`文件中的`bin/`目录中有一个`spring`脚本(用于 Windows 的 ` Spring.bat`)。或者,你可以在`java -jar`文件中使用`.jar`(该脚本可以帮助你确保 Classpath 设置正确)。 +一旦下载,请按照解压缩归档文件中的[安装.TXT](https://raw.githubusercontent.com/spring-projects/spring-boot/v2.6.4/spring-boot-project/spring-boot-cli/src/main/content/INSTALL.txt)说明进行操作。总之,在`.zip`文件中的`bin/`目录中有一个`spring`脚本(`spring.bat`用于 Windows)。或者,你可以在`.jar`文件中使用`java -jar`(该脚本可以帮助你确保 Classpath 设置正确)。 #### 3.2.2.用 SDKMAN 安装! -SDKMAN!(软件开发工具包管理器)可以用于管理各种二进制 SDK 的多个版本,包括 Groovy 和 Spring 引导 CLI。得到 SDKMAN!从[sdkman.io](https://sdkman.io)开始,使用以下命令安装 Spring boot: +SDKMAN!(软件开发工具包管理器)可以用于管理各种二进制 SDK 的多个版本,包括 Groovy 和 Spring Boot CLI。得到 SDKMAN!从[sdkman.io](https://sdkman.io)开始,使用以下命令安装 Spring boot: ``` $ sdk install springboot @@ -149,7 +149,7 @@ $ brew install spring-boot Homebrew 将`spring`安装到`/usr/local/bin`。 -| |如果你没有看到公式,那么你安装的 BREW 可能已经过时。
在这种情况下,运行`brew update`,然后再试一次。| +| |如果你没有看到公式,那么你安装的 BREW 可能已经过期。
在这种情况下,运行`brew update`,然后再试一次。| |---|---------------------------------------------------------------------------------------------------------------------------------| #### 3.2.4. MacPorts 安装 @@ -170,7 +170,7 @@ $ spring grab help jar run test version ``` -| |如果你使用 Homebrew 或 MacPorts 安装 Spring 引导 CLI,那么命令行完成脚本将自动注册到你的 shell 中。| +| |如果你使用 Homebrew 或 MacPorts 安装 Spring 启动 CLI,那么命令行完成脚本将自动注册到你的 shell 中。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------| #### 3.2.6.Windows Scoop 安装 @@ -184,7 +184,7 @@ $ spring Scoop 将`spring`安装到`~/scoop/apps/springboot/current/bin`。 -| |如果你没有看到应用程序清单,那么你安装的 Scoop 可能已经过期。
在这种情况下,运行`scoop update`,然后再试一次。| +| |如果你没有看到应用程序清单,那么你的 Scoop 安装可能已经过期。
在这种情况下,运行`scoop update`,然后再试一次。| |---|----------------------------------------------------------------------------------------------------------------------------------------| #### 3.2.7.快速启动 Spring CLI 示例 @@ -223,7 +223,7 @@ Hello World! 这一部分描述了如何开发一个小型的“Hello World!”Web 应用程序,该应用程序突出了 Spring Boot 的一些关键功能。我们使用 Maven 来构建这个项目,因为大多数 IDE 都支持它。 -| |[spring.io](https://spring.io)网站包含许多使用 Spring 引导的“入门”[guides](https://spring.io/guides),
如果需要解决特定问题,首先检查那里。

你可以通过转到[start.spring.io](https://start.spring.io)并从依赖项搜索器中选择“web”启动器来缩短以下步骤。
这样做会生成一个新的项目结构,以便你可以[立即开始编码](#getting-started.first-application.code)。
检查[start.spring.io user guide](https://github.com/spring-io/start.spring.io/blob/main/USING.adoc)以获取更多详细信息。| +| |[spring.io](https://spring.io)网站包含许多使用 Spring 引导的“入门”[guides](https://spring.io/guides),
如果你需要解决特定的问题,首先检查那里。

你可以通过转到[start.spring.io](https://start.spring.io)并从依赖项搜索器中选择“web”启动器来快捷下面的步骤。
这样做会生成一个新的项目结构,这样你就可以[立即开始编码](#getting-started.first-application.code)。
检查[start.spring.io user guide](https://github.com/spring-io/start.spring.io/blob/main/USING.adoc)以获取更多详细信息。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 在开始之前,打开一个终端并运行以下命令,以确保安装了有效的 Java 和 Maven 版本: @@ -272,12 +272,12 @@ Java version: 1.8.0_102, vendor: Oracle Corporation 前面的列表应该为你提供一个可工作的构建。你可以通过运行`mvn package`来测试它(目前,你可以忽略“ jar 将为空-没有内容被标记为包含!”警告)。 -| |此时,你可以将项目导入到 IDE 中(大多数现代 Java IDE 都包含对 Maven 的内置支持)。
为了简单起见,我们将继续在此示例中使用纯文本编辑器。| +| |此时,你可以将项目导入到 IDE 中(大多数现代 Java IDE 都包含对 Maven 的内置支持)。
为了简单起见,我们在这个示例中继续使用纯文本编辑器。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 4.2.添加 Classpath 依赖项 -Spring Boot 提供了许多“启动器”,允许你将罐子添加到你的 Classpath。我们的烟雾测试应用程序使用 POM 中`parent`部分中的`spring-boot-starter-parent`。`spring-boot-starter-parent`是一种特殊的启动器,它提供了有用的 Maven 默认值。它还提供了[“扶养-管理”](using.html#using.build-systems.dependency-management)节,以便你可以省略“有福的”依赖项的`version`标记。 +Spring Boot 提供了许多“启动器”,允许你将罐子添加到你的 Classpath。我们的烟雾测试应用程序使用 POM 中`parent`部分中的`spring-boot-starter-parent`。`spring-boot-starter-parent`是一种特殊的启动器,它提供了有用的 Maven 默认值。它还提供了一个[`dependency-management`](使用.html#using.build-systems.dependency-management)部分,这样你就可以省略`version`标记来表示“有福的”依赖关系。 其他“启动器”提供了在开发特定类型的应用程序时可能需要的依赖关系。因为我们正在开发一个 Web 应用程序,所以我们添加了一个`spring-boot-starter-web`依赖项。在此之前,我们可以通过运行以下命令查看当前的内容: @@ -287,7 +287,7 @@ $ mvn dependency:tree [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT ``` -`mvn dependency:tree`命令打印项目依赖关系的树表示。你可以看到`spring-boot-starter-parent`本身不提供依赖关系。要添加必要的依赖关系,请编辑`pom.xml`,并在`parent`部分下面添加`spring-boot-starter-web`依赖关系: +`mvn dependency:tree`命令打印项目依赖关系的树表示。你可以看到`spring-boot-starter-parent`本身不提供依赖关系。要添加必要的依赖项,请编辑`pom.xml`,并在`parent`部分下面添加`spring-boot-starter-web`依赖项: ``` @@ -333,9 +333,9 @@ public class MyApplication { 我们的`MyApplication`类的第一个注释是`@RestController`。这被称为*刻板印象*注释。它为阅读代码的人提供了提示,并为 Spring 提供了类扮演特定角色的提示。在这种情况下,我们的类是一个 Web`@Controller`,因此 Spring 在处理传入的 Web 请求时考虑它。 -`@RequestMapping`注释提供了“路由”信息。它告诉 Spring 任何带有`/`路径的 HTTP 请求都应该映射到`home`方法。`@RestController`注释告诉 Spring 将生成的字符串直接呈现给调用方。 +`@RequestMapping`注释提供了“路由”信息。它告诉 Spring,任何带有`/`路径的 HTTP 请求都应该映射到`home`方法。`@RestController`注释告诉 Spring 将生成的字符串直接呈现给调用方。 -| |`@RestController`和`@RequestMapping`注释是 Spring MVC 注释(它们不特定于 Spring 引导)。
有关更多详细信息,请参见 Spring 参考文档中的[MVC section](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc)。| +| |`@RestController`和`@RequestMapping`注释是 Spring MVC 注释(它们不特定于 Spring 引导)。
有关更多详细信息,请参见 Spring 参考文档中的[MVC 部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 4.3.2.@enableAutoConfiguration 注释 ### @@ -348,7 +348,7 @@ public class MyApplication { #### 4.3.3.“主”法 -我们应用程序的最后一部分是`main`方法。对于应用程序入口点,这是一种遵循 Java 约定的标准方法。通过调用`run`,我们的主方法委托给 Spring boot 的`SpringApplication`类。`SpringApplication` 引导我们的应用程序,启动 Spring,然后启动自动配置的 Tomcat Web 服务器。我们需要将`MyApplication.class`作为参数传递给`run`方法,以告诉`SpringApplication`哪个是主要的 Spring 组件。还会传递`args`数组,以公开任何命令行参数。 +我们应用程序的最后一部分是`main`方法。对于应用程序入口点,这是一种遵循 Java 约定的标准方法。我们的主方法通过调用`run`来委托 Spring boot 的`SpringApplication`类。`SpringApplication`引导我们的应用程序,启动 Spring,然后启动自动配置的 Tomcat Web 服务器。我们需要将`MyApplication.class`作为参数传递给`run`方法,以告诉`SpringApplication`哪个是主要的 Spring 组件。还通过`args`数组公开任何命令行参数。 ### 4.4.运行示例 @@ -403,10 +403,10 @@ Spring boot 需要[不同的方法](executable-jar.html#appendix.executable-jar) ``` -| |`spring-boot-starter-parent` POM 包括``配置以绑定`repackage`目标。
如果不使用父 POM,则需要自己声明此配置。
详情请参见[插件文档](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started)。| +| |`spring-boot-starter-parent` POM 包括``配置,以绑定`repackage`目标。
如果不使用父 POM,则需要自己声明此配置。
有关详细信息,请参见[插件文档](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -保存`pom.xml`并从命令行中运行`mvn package`,如下所示: +保存`pom.xml`并从命令行运行`mvn package`,如下所示: ``` $ mvn package @@ -454,8 +454,8 @@ $ java -jar target/myproject-0.0.1-SNAPSHOT.jar 和前面一样,要退出应用程序,请按`ctrl-c`。 -## 5. 接下来读什么? +## 5. 接下来要读什么? -希望这一部分提供了一些 Spring 引导基础知识,并帮助你编写自己的应用程序。如果你是一位面向任务类型的开发人员,那么你可能希望跳到[spring.io](https://spring.io),并遵循一些[getting started](https://spring.io/guides/)指南,这些指南解决了特定的“我如何使用 Spring?”问题。我们还有 Spring 特定于引导的“[How-to](howto.html#howto)”参考文档。 +希望这一部分提供了一些 Spring 引导基础知识,并帮助你编写自己的应用程序。如果你是一位面向任务类型的开发人员,你可能希望跳到[spring.io](https://spring.io),并遵循一些[开始](https://spring.io/guides/)指南,这些指南解决了特定的“如何使用 Spring?”问题。我们还有 Spring 特定于引导的“[How-to](howto.html#howto)”参考文档。 -否则,下一个逻辑步骤是读取*[using.html](using.html#using)*。如果你真的不耐烦了,你也可以跳到前面去读*[Spring Boot features](features.html#features)*。 +否则,下一个逻辑步骤是读取 *[using.html](using.html#using)*。如果你真的不耐烦了,你也可以跳到前面去读关于 *[Spring Boot features](features.html#features)* 的文章。 diff --git a/docs/spring-boot/howto.md b/docs/spring-boot/howto.md index 4a0b0f7e4ff40969f98f9d186874d4643e3521bd..ef7ff2c2977137972964a9249c1ee85b8161c496 100644 --- a/docs/spring-boot/howto.md +++ b/docs/spring-boot/howto.md @@ -1,10 +1,10 @@ # “操作指南” -这一部分提供了一些常见的“我如何做到这一点…”问题的答案,这些问题在使用 Spring Boot 时经常会出现。它的覆盖范围并不全面,但确实涵盖了相当多的内容。 +这一部分提供了一些常见的“我如何做到这一点……”问题的答案,这些问题在使用 Spring Boot 时经常会出现。它的覆盖范围并不全面,但确实涵盖了相当多的内容。 如果你有一个我们在此未讨论的特定问题,你可能想要检查[stackoverflow.com](https://stackoverflow.com/tags/spring-boot),以查看是否有人已经提供了答案。这也是一个提出新问题的好地方(请使用`spring-boot`标签)。 -我们也非常乐意扩展这一部分。如果你想添加“how-to”,请给我们发送[pull request](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。 +我们也非常乐意扩展这一部分。如果你想添加“how-to”,请给我们发送[拉请求](https://github.com/spring-projects/spring-boot/tree/v2.6.4)。 ## 1. Spring 引导应用程序 @@ -12,7 +12,7 @@ ### 1.1.创建自己的故障分析器 -[“故障分析仪”](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/diagnostics/FailureAnalyzer.html)是一种很好的方法,可以在启动时拦截异常,并将其转换为人类可读的消息,包装在[“失效分析”](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/diagnostics/FailureAnalysis.html)中。 Spring Boot 为与应用程序上下文相关的异常、JSR-303 验证等提供了这样的分析器。你也可以创建自己的。 +[`FailureAnalyzer`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/diagnostics/failureanalyzer.html)是一种很好的方法,可以在启动时拦截异常,并将其转换为人类可读的消息,包装在[`FailureAnalysis`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/springfailureframework/api/api/org/diagnostics.html/failureanalys Spring Boot 为应用程序上下文相关的异常、JSR-303 验证等提供了这样的分析器。你也可以创建自己的。 `AbstractFailureAnalyzer`是`FailureAnalyzer`的一个方便的扩展,用于检查要处理的异常中是否存在指定的异常类型。你可以从中进行扩展,以便你的实现只有在异常实际存在时才有机会处理该异常。如果由于任何原因无法处理异常,则返回`null`,以便给另一个实现一个处理异常的机会。 @@ -28,15 +28,15 @@ com.example.ProjectConstraintViolationFailureAnalyzer ### 1.2.故障排除自动配置 -引导自动配置尽力“做正确的事情”,但有时事情会失败,而且很难讲出原因。 +Spring 引导自动配置尽力“做正确的事情”,但有时事情会失败,而且很难讲出原因。 -有一个真正有用的`ConditionEvaluationReport`可用于任何 Spring 引导`ApplicationContext`。如果启用`DEBUG`日志输出,就可以看到它。如果使用`spring-boot-actuator`(参见[《执行器》一章](actuator.html#actuator)),还会有一个`conditions`端点在 JSON 中呈现该报告。使用该端点调试应用程序,并查看在运行时启动 Spring 时添加了哪些特性(哪些特性没有添加)。 +有一个真正有用的`ConditionEvaluationReport`可用于任何 Spring 引导`ApplicationContext`。如果启用`DEBUG`日志输出,就可以看到它。如果使用`spring-boot-actuator`(参见[《执行器》一章](actuator.html#actuator)),还会有一个`conditions`端点在 JSON 中呈现该报告。使用该端点调试应用程序,并查看在运行时 Spring 启动时添加了哪些特性(哪些特性尚未添加)。 通过查看源代码和 Javadoc,可以回答更多的问题。在阅读代码时,请记住以下经验法则: -* 查找名为`*AutoConfiguration`的类,并阅读它们的源代码。请特别注意`@Conditional*`注释,以找出它们启用的功能以及它们启用的时间。将`--debug`添加到命令行或系统属性`-Ddebug`,可以在控制台上获得在应用程序中做出的所有自动配置决策的日志。在启用了执行器的正在运行的应用程序中,查看`conditions`端点(`/执行器/条件’或等效的 JMX)以获得相同的信息。 +* 查找名为`*AutoConfiguration`的类,并阅读它们的源代码。请特别注意`@Conditional*`注释,以了解它们启用了哪些功能以及何时启用。将`--debug`添加到命令行或系统属性`-Ddebug`,可以在控制台上获得在应用程序中做出的所有自动配置决策的日志。在启用了执行器的正在运行的应用程序中,查看`conditions`端点(`/actuator/conditions`或等效的 JMX)以获得相同的信息。 -* 查找`@Configuration属性`的类(例如[“serverproperties”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/Server属性.java)),并从那里读取可用的外部配置选项。`@Configuration属性`注释具有`name`属性,该属性充当外部属性的前缀。因此,`Server属性`具有`prefix="server"`并且其配置属性是`server.port`,`server.address`,以及其他。在启用了执行器的正在运行的应用程序中,查看`configprops`端点。 +* 查找`@Configuration属性`的类(例如[`Server属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/autofork/autofigure/web/serverproperties.java)),并从那里读取可用的外部配置选项。`@Configuration属性`注释具有`name`属性,该属性充当外部属性的前缀。因此,`Server属性`具有`prefix="server"`,并且其配置属性是`server.port`、`server.address`和其他属性。在启用了执行器的正在运行的应用程序中,查看`configprops`端点。 * 在`Binder`上查找`bind`方法的使用情况,以轻松的方式显式地从`Environment`中提取配置值。它常与前缀一起使用。 @@ -48,11 +48,11 @@ com.example.ProjectConstraintViolationFailureAnalyzer a`SpringApplication`具有`ApplicationListeners`和`ApplicationContextInitializers`,它们用于对上下文或环境应用自定义。 Spring 引导从`META-INF/spring.factories`加载许多这样的自定义以供内部使用。注册额外定制的方法不止一种: -* 从编程的角度来看,通过在`SpringApplication`上调用`addListeners`和`addInitializers`方法,每个应用程序都可以运行它。 +* 从编程的角度来看,通过在运行`SpringApplication`之前调用`addListeners`和`addInitializers`方法,每个应用程序都可以这样做。 * 声明性地,通过设置`context.initializer.classes`或`context.listener.classes`属性,为每个应用程序设置。 -* 声明性地,对于所有应用程序,通过添加`META-INF/spring.factories`并打包一个 jar 文件,所有应用程序都将其用作一个库。 +* 声明地,对于所有应用程序,通过添加`META-INF/spring.factories`并打包一个 jar 文件,应用程序都将其用作库。 `SpringApplication`将一些特殊的`ApplicationEvents`发送给侦听器(有些甚至在创建上下文之前),然后为`ApplicationContext`发布的事件注册侦听器。有关完整列表,请参见“ Spring 引导功能”部分中的“[应用程序事件和监听器](features.html#features.spring-application.application-events-and-listeners)”。 @@ -62,7 +62,7 @@ a`SpringApplication`具有`ApplicationListeners`和`ApplicationContextInitialize org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor ``` -该实现可以加载任意文件并将其添加到`Environment`中。例如,下面的示例从 Classpath 加载 YAML 配置文件: +该实现可以加载任意文件并将其添加到`Environment`中。例如,以下示例从 Classpath 加载 YAML 配置文件: ``` import java.io.IOException; @@ -101,10 +101,10 @@ public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { ``` -| |`Environment`已经准备好了所有常用的属性源。因此,可以从环境中获取文件的位置。
前面的示例在列表的末尾添加了`custom-resource`属性源。在任何通常的其他位置中定义的键都具有优先权。
一个自定义实现可以定义另一个顺序。| +| |`Environment`已经与所有常用的属性源一起准备好了 Spring 默认情况下引导加载。
因此可以从环境中获取文件的位置。
前面的示例在列表的末尾添加了`custom-resource`属性源,所以在任何通常的其他位置中定义的键都具有优先权。
一个自定义实现可以定义另一个顺序。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |虽然在`@SpringBootApplication`上使用`@PropertySource`似乎是在`Environment`中加载自定义资源的一种方便方法,我们不建议这样做。
这样的属性源在应用程序上下文被刷新之前不会被添加到`Environment`。
这对于配置某些属性(如`logging.*`和`spring.main.*`)已经太晚了,因为这些属性是在开始刷新之前读取的。| +| |虽然在`@SpringBootApplication`上使用`@PropertySource`似乎是在`Environment`中加载自定义资源的一种方便方法,我们不推荐这样做。
这样的属性源在应用程序上下文被刷新之前不会被添加到`Environment`。
这对于配置某些属性(如`logging.*`和`spring.main.*`)来说太晚了,因为这些属性在开始刷新之前就已读取。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 1.4.构建应用程序上下文层次结构(添加父上下文或根上下文)### @@ -113,11 +113,11 @@ public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { ### 1.5.创建一个非 Web 应用程序 -Spring 并非所有的应用程序都必须是 Web 应用程序(或 Web 服务)。如果你希望在`main`方法中执行一些代码,并且还需要引导一个应用程序来设置要使用的基础设施,那么你可以使用 Spring 引导的`SpringApplication`功能。一个`SpringApplication`会改变它的`ApplicationContext`类,这取决于它是否认为需要一个 Web 应用程序。你可以做的第一件事是将与服务器相关的依赖关系(例如 Servlet API)从 Classpath 中去除。如果你不能这样做(例如,你从相同的代码库运行两个应用程序),那么你可以在`SpringApplication`实例上显式调用`setWebApplicationType(WebApplicationType.NONE)`或设置`applicationContextClass`属性(通过 Java API 或使用外部属性)。希望作为业务逻辑运行的应用程序代码可以实现为`CommandLineRunner`,并作为`@Bean`定义放入上下文。 +Spring 并非所有的应用程序都必须是 Web 应用程序(或 Web 服务)。如果你希望在`main`方法中执行一些代码,而且还需要引导一个应用程序来设置要使用的基础设施,那么你可以使用`SpringApplication` Spring 引导的功能。一个`SpringApplication`会改变它的`ApplicationContext`类,这取决于它是否认为需要一个 Web 应用程序。你可以做的第一件事是将与服务器相关的依赖关系(例如 Servlet API)从 Classpath 中去除。如果你不能这样做(例如,你从相同的代码库运行两个应用程序),那么你可以在`SpringApplication`实例上显式调用`setWebApplicationType(WebApplicationType.NONE)`或设置`applicationContextClass`属性(通过 Java API 或使用外部属性)。希望作为业务逻辑运行的应用程序代码可以实现为`CommandLineRunner`,并作为`@Bean`定义放入上下文。 ## 2. 属性和配置 -本节包括有关设置和读取属性、配置设置及其与 Spring 启动应用程序的交互的主题。 +本节包括有关设置和读取属性、配置设置及其与 Spring 引导应用程序的交互的主题。 ### 2.1.在构建时自动展开属性 @@ -146,10 +146,10 @@ app: | |只有生产配置是以这种方式进行筛选的(换句话说,在`src/test/resources`上不应用筛选)。| |---|---------------------------------------------------------------------------------------------------------------------| -| |如果启用`addResources`标志,`spring-boot:run`目标可以直接将`src/main/resources`添加到 Classpath 中(用于热重载目的)。
这样做绕过了资源过滤和此功能。,相反,
,你可以使用`exec:java`目标或自定义插件的配置。
有关更多详细信息,请参见[插件使用页面](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started)。| +| |如果启用`addResources`标志,`spring-boot:run`目标可以直接将`src/main/resources`添加到 Classpath 中(用于热重载目的)。
这样做会绕过资源过滤和此功能。,相反,
,你可以使用`exec:java`目标或自定义插件的配置。
有关更多详细信息,请参见[插件使用页面](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果不使用启动父级,则需要在`pom.xml`的``元素中包含以下元素: +如果不使用启动器父元素,则需要在你的`pom.xml`的``元素中包含以下元素: ``` @@ -160,7 +160,7 @@ app: ``` -还需要在``中包含以下元素: +你还需要在``中包含以下元素: ``` @@ -288,7 +288,7 @@ spring: banner-mode: "console" ``` -实际的应用程序将显示横幅(被配置重写),并为`ApplicationContext`使用三个源。应用程序来源如下: +实际的应用程序将显示横幅(被配置覆盖),并为`ApplicationContext`使用三个源。应用程序来源如下: 1. `MyApplication`(来自代码) @@ -298,19 +298,19 @@ spring: ### 2.3.更改应用程序外部属性的位置 ### -默认情况下,来自不同来源的属性以定义的顺序添加到 Spring `Environment`中(确切的顺序请参见“ Spring 引导功能”部分中的“[features.html](features.html#features.external-config)”)。 +默认情况下,来自不同来源的属性以定义的顺序添加到 Spring `Environment`中(具体顺序请参见“ Spring 引导功能”部分中的“[features.html](features.html#features.external-config)”)。 你还可以提供以下系统属性(或环境变量)来更改行为: -* `spring.config.name`:默认为`application`作为文件名的根。 +* `spring.config.name`(`SPRING_CONFIG_NAME`):默认为`application`作为文件名的根。 -* `spring.config.location`:要加载的文件(例如 Classpath 资源或 URL)。为该文档设置了一个单独的`Environment`属性源,它可以被系统属性、环境变量或命令行覆盖。 +* `spring.config.location`(`SPRING_CONFIG_LOCATION`):要加载的文件(例如 Classpath 资源或 URL)。为该文档设置了一个单独的`Environment`属性源,它可以被系统属性、环境变量或命令行覆盖。 无论你在环境中设置了什么, Spring 引导总是加载`application.properties`,如上文所述。默认情况下,如果使用 YAML,那么扩展名为“.yml”的文件也会添加到列表中。 Spring 引导日志记录在`DEBUG`级别加载的配置文件和在`TRACE`级别未找到的候选文件。 -有关更多详细信息,请参见[“配置文件应用程序监听器”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java)。 +参见[`ConfigFileApplicationListener`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/boot/context/config/configfileapplicationlistener.java)了解更多细节。 ### 2.4.使用“short”命令行参数 @@ -329,10 +329,10 @@ server: port: "${port:8080}" ``` -| |如果从`spring-boot-starter-parent` POM 继承,则`maven-resources-plugins`的默认筛选标记已从`${*}`更改为`@`(即,`@[[email protected]](/cdn-cgi/l/email-protection)`而不是`${maven.token}`),以防止与 Spring 样式的占位符发生冲突。
如果你已经直接为`application.properties`启用了 Maven 筛选,那么你可能还希望将默认的筛选标记更改为使用[其他分隔符](https://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#delimiters)。| +| |如果继承自`spring-boot-starter-parent` POM,则`maven-resources-plugins`的默认筛选器标记已从`${*}`更改为`@`(即,`@[[email protected]](/cdn-cgi/l/email-protection)`而不是`${maven.token}`),以防止与 Spring 样式的占位符发生冲突。
如果你已经直接为`application.properties`启用了 Maven 筛选,那么你可能还希望将默认的筛选标记更改为使用[其他分隔符](https://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#delimiters)。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在这种特殊情况下,端口绑定工作在 PaaS 环境中,例如 Heroku 或 Cloud Foundry。
在这两个平台中,`PORT`环境变量被自动设置,并且 Spring 可以绑定到`Environment`属性的大写同义词。| +| |在这种特定的情况下,端口绑定工作在 PaaS 环境中,例如 Heroku 或 Cloud Foundry。
在这两个平台中,`PORT`环境变量被自动设置,并且 Spring 可以绑定到`Environment`属性的大写同义词。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 2.5.对外部属性使用 YAML @@ -350,7 +350,7 @@ server: port: 9000 ``` -创建一个名为`application.yml`的文件,并将其放在 Classpath 的根目录中。然后将`snakeyaml`添加到你的依赖项( Maven 坐标`org.yaml:snakeyaml`,如果你使用`spring-boot-starter`)。将 YAML 文件解析为一个 Java`Map`(类似于 JSON 对象),并且 Spring 引导使映射变平,使其具有一级深度并具有周期分隔的键,就像许多人习惯于使用 Java 中的`属性`文件一样。 +创建一个名为`application.yml`的文件,并将其放在 Classpath 的根目录中。然后将`snakeyaml`添加到你的依赖项( Maven 坐标`org.yaml:snakeyaml`,如果你使用`spring-boot-starter`)。将 YAML 文件解析为 Java`Map`(类似于 JSON 对象),并且 Spring 引导将映射变平,使其具有一层深度并具有周期分隔的键,就像许多人习惯于使用 Java 中的`属性`文件一样。 前面的示例 YAML 对应于下面的`application.properties`文件: @@ -361,11 +361,11 @@ spring.datasource.url=jdbc:mysql://localhost/test server.port=9000 ``` -有关 YAML 的更多信息,请参见“ Spring Boot Features”部分中的“[features.html](features.html#features.external-config.yaml)”。 +有关 YAML 的更多信息,请参见“ Spring 引导功能”部分中的“[features.html](features.html#features.external-config.yaml)”。 ### 2.6.设置活动的 Spring 配置文件 -Spring `Environment`对此有一个 API,但通常需要设置一个系统属性(` Spring.profiles.active`)或一个 OS 环境变量(`spring_profiles_active`)。此外,你还可以使用`-D`参数启动应用程序(请记住将其放在主类或 jar 归档文件之前),如下所示: +Spring `Environment`对此有一个 API,但通常需要设置一个系统属性(`spring.profiles.active`)或一个 OS 环境变量(`SPRING_PROFILES_ACTIVE`)。此外,你还可以使用`-D`参数启动应用程序(请记住将其放在主类或 jar 归档文件之前),如下所示: ``` $ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar @@ -393,9 +393,9 @@ spring: ### 2.7.设置默认配置文件名 -默认配置文件是一个配置文件,如果没有配置文件处于活动状态,则启用该配置文件。默认情况下,默认配置文件的名称是`default`,但可以使用系统属性(` Spring.profiles.default`)或 OS 环境变量(`spring_profiles_default`)更改它。 +默认配置文件是一个配置文件,如果没有配置文件处于活动状态,则启用该配置文件。默认情况下,默认配置文件的名称是`default`,但可以使用系统属性(`spring.profiles.default`)或 OS 环境变量(`SPRING_PROFILES_DEFAULT`)更改它。 -在 Spring boot 中,还可以在`application.properties`中设置默认的配置文件名,如下例示例所示: +在 Spring 引导中,还可以在`application.properties`中设置默认配置文件名,如下例所示: 属性 @@ -415,9 +415,9 @@ spring: ### 2.8.根据环境 ### 更改配置 -Spring 启动支持多文档 YAML 和属性文件(详见[features.html](features.html#features.external-config.files.multi-document)),这些文件可以根据活动的配置文件有条件地被激活。 +Spring 启动支持多文档 YAML 和属性文件(详见[features.html](features.html#features.external-config.files.multi-document)),这些文件可以基于活动配置文件有条件地被激活。 -如果文档包含`spring.config.activate.on-profile`键,那么配置文件值(用逗号分隔的配置文件列表或配置文件表达式)将被馈入 Spring `Environment.acceptsProfiles()`方法。如果配置文件表达式匹配,那么该文档将包含在最终的合并中(否则不包括),如以下示例所示: +如果文档包含`spring.config.activate.on-profile`键,那么配置文件值(用逗号分隔的配置文件列表或配置文件表达式)将被输入 Spring `Environment.acceptsProfiles()`方法。如果配置文件表达式匹配,那么该文档将包含在最终的合并中(否则不包括),如以下示例所示: 属性 @@ -452,7 +452,7 @@ server: port: 0 ``` -在前面的示例中,缺省端口是 9000。但是,如果称为“开发”的 Spring 配置文件是活动的,那么端口是 9001。如果“production”是活动的,那么端口是 0。 +在前面的示例中,缺省端口是 9000。然而,如果称为“开发”的 Spring 配置文件是活动的,那么端口是 9001。如果“production”是活动的,那么端口是 0。 | |文档按照遇到它们的顺序合并。
后面的值覆盖前面的值。| |---|--------------------------------------------------------------------------------------------------------------| @@ -463,13 +463,13 @@ Spring 引导在运行时将`application.properties`(或`.yml`文件和其他 具有执行器功能的正在运行的应用程序具有`configprops`端点,该端点通过`@Configuration属性`显示所有可用的绑定和绑定属性。 -附录包括一个[` 申请.财产’](application-properties.html#appendix.application-properties)示例,其中列出了 Spring boot 支持的最常见的属性。最终的列表来自搜索`@Configuration属性`和`@Value`注释的源代码,以及偶尔使用`Binder`。有关加载属性的确切顺序的更多信息,请参见“[features.html](features.html#features.external-config)”。 +附录包括一个[`application.properties`](application-properties.html#application.application-properties)示例,其中列出了 Spring boot 支持的最常见的属性。最终的列表来自搜索`@Configuration属性`和`@Value`注释的源代码,以及偶尔使用`Binder`。有关加载属性的确切顺序的更多信息,请参见“[features.html](features.html#features.external-config)”。 ## 3. 嵌入式 Web 服务器 Spring 每个引导 Web 应用程序包括嵌入式 Web 服务器。这个特性导致了许多操作问题,包括如何更改嵌入式服务器以及如何配置嵌入式服务器。这一节回答了这些问题。 -### 3.1.使用另一个 Web 服务器 +### 3.1.使用另一台 Web 服务器 Spring 许多启动程序都包含默认的嵌入式容器。 @@ -547,7 +547,7 @@ spring: 要完全关闭 HTTP 端点,但仍然创建`WebApplicationContext`,请使用`server.port=-1`(这样做有时对测试很有用)。 -有关更多详细信息,请参见“ Spring 引导功能”部分中的“[web.html](web.html#web.servlet.embedded-container.customizing)”,或[“serverproperties”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/Server属性.java)源代码。 +有关更多详细信息,请参见“ Spring 启动特性”部分中的“[web.html](web.html#web.servlet.embedded-container.customizing)”,或[`Server属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/org/springframework/autoframework/autofconfigure/web/serverproperties.java)源代码 ### 3.4.使用随机未分配的 HTTP 端口 @@ -555,7 +555,7 @@ spring: ### 3.5.在运行时发现 HTTP 端口 -你可以从日志输出或从`WebServerApplicationContext`通过其`WebServer`访问服务器运行的端口。要获得这个结果并确保它已被初始化,最好的方法是添加`@Bean`类型的`ApplicationListener`,并在事件发布时将容器从事件中拉出。 +你可以从日志输出或从`WebServerApplicationContext`通过其`WebServer`访问服务器运行的端口。获得该结果并确保其已被初始化的最佳方法是添加`@Bean`类型的`ApplicationListener`,并在事件发布时将容器从事件中拉出。 使用`@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)`的测试也可以通过使用`@LocalServerPort`注释将实际端口注入字段,如以下示例所示: @@ -643,7 +643,7 @@ server: key-password: "another-secret" ``` -有关所有支持的属性的详细信息,请参见[`Ssl`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/Ssl.java)。 +有关所有支持的属性的详细信息,请参见[`Ssl`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/boot/web/server/ssl.java)。 使用像前面示例那样的配置意味着应用程序不再支持端口 8080 的普通 HTTP 连接器。 Spring 引导不支持通过`application.properties`同时配置 HTTP 连接器和 HTTPS 连接器。如果你想同时拥有这两种功能,那么你需要以编程方式配置其中的一种。我们建议使用`application.properties`来配置 HTTPS,因为 HTTP 连接器是两个中更容易通过编程进行配置的。 @@ -653,7 +653,7 @@ server: #### 3.8.1.HTTP/2with Tomcat -Spring 在使用 JDK9 或更高版本时,默认情况下,Boot 附带 Tomcat 9.0.x,它支持`h2c`开箱即用和`h2`开箱即用。或者,如果`libtcnative`库及其依赖项安装在主机操作系统上,则`h2`可以在 JDK8 上使用。 +Spring 默认情况下,在使用 JDK9 或更高版本时,Boot 附带 Tomcat 9.0.x 支持`h2c`开箱即用和`h2`开箱即用。或者,如果`libtcnative`库及其依赖项安装在主机操作系统上,则`h2`可以在 JDK8 上使用。 必须使库目录对 JVM 库路径可用(如果不是已经可用的话)。你可以使用 JVM 参数(如`-Djava.library.path=/usr/local/opt/tomcat-native/lib`)来实现此目的。在[official Tomcat documentation](https://tomcat.apache.org/tomcat-9.0-doc/apr.html)中有更多关于此的内容。 @@ -669,7 +669,7 @@ ERROR 8787 --- [ main] o.a.coyote.http11.Http11NioProtocol : The 对于 HTTP/2 支持, Jetty 需要额外的`org.eclipse.jetty.http2:http2-server`依赖关系。要使用`h2c`,不需要其他依赖项。要使用`h2`,还需要根据你的部署选择以下依赖项之一: -* `org.eclipse.jetty:jetty-alpn-java-server`用于运行在 JDK9+ 上的应用程序 +* `org.eclipse.jetty:jetty-alpn-java-server`用于在 JDK9+ 上运行的应用程序 * `org.eclipse.jetty:jetty-alpn-openjdk8-server`用于在 JDK8U252+ 上运行的应用程序 @@ -679,17 +679,17 @@ ERROR 8787 --- [ main] o.a.coyote.http11.Http11NioProtocol : The `spring-boot-webflux-starter`默认情况下使用 reactor netty 作为服务器。使用 JDK8 或更高版本,Reactor Netty 支持`h2c`,没有额外的依赖关系。使用 JDK9 或更高版本的 JDK 支持,Reactor Netty 支持`h2`。对于 JDK8 环境或最佳运行时性能,此服务器还支持带有本机库的`h2`。要实现这一点,你的应用程序需要有一个额外的依赖关系。 -Spring 引导管理`io.netty:netty-tcnative-boringssl-static`“UBER jar”的版本,其中包含所有平台的本机库。开发人员可以选择只使用分类器导入所需的依赖项(参见[Netty 官方文档](https://netty.io/wiki/forked-tomcat-native.html))。 +Spring 引导管理用于`io.netty:netty-tcnative-boringssl-static`“UBER jar”的版本,其中包含用于所有平台的本机库。开发人员可以选择只使用分类器导入所需的依赖项(参见[Netty 官方文档](https://netty.io/wiki/forked-tomcat-native.html))。 #### 3.8.4.HTTP/2with Undertow -截至 Undertow 1.4.0+,`h2`和`h2c`在 JDK8 上都是支持的,没有任何额外的依赖关系。 +截至 Undertow 1.4.0+,`h2`和`h2c`在 JDK8 上都得到了支持,没有任何额外的依赖关系。 ### 3.9.配置 Web 服务器 通常,你应该首先考虑使用许多可用配置键中的一个,并通过在`application.properties`或`application.yml`文件中添加新条目来定制 Web 服务器。见“[发现外部属性的内置选项](#howto.properties-and-configuration.discover-build-in-options-for-external-properties)”)。在这里,`server.*`命名空间非常有用,对于服务器特定的特性,它包括`server.tomcat.*`、`server.jetty.*`等命名空间。参见[应用程序-properties.html](application-properties.html#appendix.application-properties)列表。 -前面的部分已经涵盖了许多常见的用例,例如压缩、SSL 或 HTTP/2。但是,如果你的用例不存在配置键,那么你应该查看[“WebServerFactoryCustomizer”](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/web/server/WebServerFactoryCustomizer.html)。你可以声明这样的组件并获得对与你的选择相关的服务器工厂的访问:你应该为所选择的服务器( Tomcat、 Jetty、反应器网络、 Undertow)和所选择的 Web 堆栈( Servlet 或反应式)选择该变体。 +前面的部分已经涵盖了许多常见的用例,例如压缩、SSL 或 HTTP/2。但是,如果你的用例不存在配置键,那么你应该查看[`WebServerFactoryCustomizer`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/web/server/webserverfactorycustomizer.html)。你可以声明这样的组件并获得对与你的选择相关的服务器工厂的访问:你应该为所选择的服务器( Tomcat、 Jetty、反应器网络、 Undertow)和所选择的 Web 堆栈( Servlet 或反应式)选择变体。 下面的示例用于使用`spring-boot-starter-web`( Servlet 堆栈)的 Tomcat: @@ -724,11 +724,11 @@ public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer这与 Servlet 规范的默认 Dispatcher 类型一致。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------| -像任何其他 Spring Bean 一样,你可以定义 Servlet 过滤器 bean 的顺序;请确保检查“[web.html](web.html#web.servlet.embedded-container.servlets-filters-listeners.beans)”部分。 +与任何其他 Spring Bean 一样,你可以定义 Servlet 过滤器 bean 的顺序;请确保检查“[web.html](web.html#web.servlet.embedded-container.servlets-filters-listeners.beans)”部分。 ##### 禁用 Servlet 或过滤器的注册 ##### @@ -768,15 +768,15 @@ public class MyFilterConfiguration { ``` -#### 3.10.2.使用 Classpath 扫描 #### 添加 servlet、过滤器和侦听器 # +#### 3.10.2.使用 Classpath 扫描 ##### 添加 servlet、过滤器和侦听器 # -`@WebServlet`,`@WebFilter`,和`@WebListener`注解的类可以通过注解一个`@Configuration`类和`@ServletComponentScan`类,并指定包含你想要注册的组件的包,自动地在嵌入式 Servlet 容器中注册。默认情况下,`@ServletComponentScan`从带注释的类的包中扫描。 +`@WebServlet`,`@WebFilter`,和`@WebListener`注释类可以通过注解一个`@Configuration`类和`@ServletComponentScan`类,并指定包含你想要注册的组件的包,自动地在嵌入式 Servlet 容器中注册。默认情况下,`@ServletComponentScan`从带注释的类的包中扫描。 ### 3.11.配置访问日志 访问日志可以通过 Tomcat、 Undertow 和 Jetty 各自的名称空间进行配置。 -例如,下面的设置使用[custom pattern](https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_伐木)对 Tomcat 进行日志访问。 +例如,下面的设置使用[自定义模式](https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_伐木)日志访问 Tomcat。 属性 @@ -846,7 +846,7 @@ server: 如果你的应用程序运行在代理、负载均衡器或云中,那么请求信息(如主机、端口、方案……)可能会在此过程中发生变化。你的应用程序可能运行在`10.10.10.10:8080`上,但是 HTTP 客户端应该只看到`example.org`。 -[RFC7239“转发头”](https://tools.ietf.org/html/rfc7239)定义了`Forwarded`HTTP 报头;代理可以使用这个报头来提供关于原始请求的信息。你可以将你的应用程序配置为读取这些标头,并在创建链接并将其发送到 HTTP302 响应、JSON 文档或 HTML 页面中的客户端时自动使用这些信息。也有非标准的标题,如`X-Forwarded-Host`,`X-Forwarded-Port`,`X-Forwarded-Proto`,`X-Forwarded-Ssl`,和`X-Forwarded-Prefix`。 +[RFC7239“转发头”](https://tools.ietf.org/html/rfc7239)定义了`Forwarded`HTTP 报头;代理可以使用这个报头来提供关于原始请求的信息。你可以将你的应用程序配置为读取这些标题,并在创建链接并将其发送到 HTTP302 响应、JSON 文档或 HTML 页面中的客户端时自动使用这些信息。也有非标准的标题,如`X-Forwarded-Host`,`X-Forwarded-Port`,`X-Forwarded-Proto`,`X-Forwarded-Ssl`,和`X-Forwarded-Prefix`。 如果代理添加了常用的`X-Forwarded-For`和`X-Forwarded-Proto`头,则将`server.forward-headers-strategy`设置为`NATIVE`就足以支持这些。有了这个选项,Web 服务器本身就支持这个特性;你可以查看它们的特定文档来了解特定的行为。 @@ -896,10 +896,10 @@ server: internal-proxies: "192\\.168\\.\\d{1,3}\\.\\d{1,3}" ``` -| |你可以通过将`internal-proxies`设置为空来信任所有代理(但在生产中不要这样做)。| +| |可以通过将`internal-proxies`设置为空来信任所有代理(但在生产过程中不要这样做)。| |---|------------------------------------------------------------------------------------------------------| -通过关闭自动关闭(为此,请设置`server.forward-headers-strategy=NONE`)并使用`WebServerFactoryCustomizer` Bean 添加一个新的阀门实例,可以完全控制 Tomcat 的`RemoteIpValve`的配置。 +通过关闭自动关闭(为此,请设置`server.forward-headers-strategy=NONE`)并使用`WebServerFactoryCustomizer` Bean 添加一个新的阀实例,可以完全控制 Tomcat 的`RemoteIpValve`的配置。 ### 3.13. Tomcat 启用多个连接器 @@ -985,7 +985,7 @@ public class MyLegacyCookieProcessorConfiguration { ### 3.15.启用 Tomcat 的 MBean 注册中心 -默认情况下,嵌入式 Tomcat 的 MBean 注册中心被禁用。这最大限度地减少了 Tomcat 的内存占用。如果你希望使用 Tomcat 的 MBean,以便 Micrometer 可以使用它们来公开度量,那么你必须使用`server.tomcat.mbeanregistry.enabled`属性来这样做,如以下示例所示: +默认情况下,嵌入式 Tomcat 的 MBean 注册中心被禁用。这最大限度地减少了 Tomcat 的内存占用。例如,如果你想使用 Tomcat 的 MBean,以便 Micrometer 可以使用它们来公开度量,那么你必须使用`server.tomcat.mbeanregistry.enabled`属性来这样做,如以下示例所示: 属性 @@ -1004,7 +1004,7 @@ server: ### 3.16.使用 Undertow 启用多个侦听器 -向`UndertowServletWebServerFactory`添加`UndertowBuilderCustomizer`,并向`Builder`添加侦听器,如以下示例所示: +将`UndertowBuilderCustomizer`添加到`UndertowServletWebServerFactory`,并将侦听器添加到`Builder`,如以下示例所示: ``` import io.undertow.Undertow.Builder; @@ -1055,7 +1055,7 @@ Bean 在前面的示例中所示的任何`@ServerEndpoint`注释的 bean 与底 ## 4. Spring MVC -Spring 启动具有包括 Spring MVC 的许多启动器。请注意,一些启动器包括对 Spring MVC 的依赖,而不是直接包括它。这一部分回答了关于 Spring MVC 和 Spring Boot 的常见问题。 +Spring 启动具有包括 Spring MVC 的许多启动器。请注意,一些启动器包含对 Spring MVC 的依赖,而不是直接包含它。这一部分回答了关于 Spring MVC 和 Spring Boot 的常见问题。 ### 4.1.编写 JSON REST 服务 @@ -1081,7 +1081,7 @@ public class MyController { ### 4.2.编写 XML REST 服务 -如果在 Classpath 上有 Jackson 的 XML 扩展(`Jackson-DataFormat-XML`),则可以使用它来呈现 XML 响应。我们为 JSON 使用的前一个示例将起作用。要使用 Jackson 的 XML 渲染器,请向项目添加以下依赖项: +如果在 Classpath 上有 Jackson 的 XML 扩展(`jackson-dataformat-xml`),则可以使用它来呈现 XML 响应。我们为 JSON 使用的前一个示例将起作用。要使用 Jackson 的 XML 渲染器,请向项目添加以下依赖项: ``` @@ -1123,12 +1123,12 @@ JAXB 只能在 Java8 的开箱即用中使用。如果你使用的是新一代 ``` -| |要让服务器呈现 XML 而不是 JSON,你可能必须发送`Accept: text/xml`报头(或使用浏览器)。| +| |要让服务器呈现 XML 而不是 JSON,你可能必须发送`Accept: text/xml`头(或使用浏览器)。| |---|------------------------------------------------------------------------------------------------------------------------| ### 4.3.自定义 JacksonObjectMapper -Spring MVC(客户端和服务器端)使用`HttpMessageConverters`在 HTTP 交换中协商内容转换。如果 Jackson 位于 Classpath 上,则你已经获得了由`Jackson2ObjectMapperBuilder`提供的默认转换器,其实例是为你自动配置的。 +Spring MVC(客户端和服务器端)使用`HttpMessageConverters`在 HTTP 交换中协商内容转换。如果 Jackson 在 Classpath 上,则你已经获得了由`Jackson2ObjectMapperBuilder`提供的默认转换器,其实例是为你自动配置的。 `ObjectMapper`(或`XmlMapper`用于 JacksonXML 转换器)实例(默认情况下创建)具有以下定制属性: @@ -1151,9 +1151,9 @@ Spring 引导还具有一些功能,以使其更容易自定义这种行为。 | `com.fasterxml.jackson.databind.SerializationFeature` | `spring.jackson.serialization.` |`true`, `false`| |`com.fasterxml.jackson.annotation.JsonInclude.Include` | `spring.jackson.default-property-inclusion` |`always`, `non_null`, `non_absent`, `non_default`, `non_empty`| -例如,要启用 pretty print,请设置`spring.jackson.serialization.indent_output=true`。注意,由于使用了[relaxed binding](features.html#features.external-config.typesafe-configuration-properties.relaxed-binding),`indent_output`的情况不必匹配对应的枚举常数的情况,即`INDENT_OUTPUT`。 +例如,要启用 pretty print,请设置`spring.jackson.serialization.indent_output=true`。注意,由于使用了[松弛结合](features.html#features.external-config.typesafe-configuration-properties.relaxed-binding),`indent_output`的情况不必匹配对应的枚举常数的情况,即`INDENT_OUTPUT`。 -这种基于环境的配置应用于自动配置的`Jackson2ObjectMapperBuilder` Bean 并应用于通过使用构建器创建的任何映射器,包括自动配置的`ObjectMapper` Bean。 +这种基于环境的配置应用于自动配置的`Jackson2ObjectMapperBuilder` Bean,并应用于通过使用构建器创建的任何映射器,包括自动配置的`ObjectMapper` Bean。 上下文的`Jackson2ObjectMapperBuilder`可以由一个或多个`Jackson2ObjectMapperBuilderCustomizer`bean 自定义。可以订购这样的定制程序 bean(Boot 自己的定制程序的订单为 0),从而在 Boot 的定制之前和之后都可以应用额外的定制程序。 @@ -1163,30 +1163,30 @@ Spring 引导还具有一些功能,以使其更容易自定义这种行为。 如果你提供任何`@Beans`类型的`MappingJackson2HttpMessageConverter`,它们将替换 MVC 配置中的默认值。此外,还提供了`HttpMessageConverters`类型的方便 Bean(如果使用默认的 MVC 配置,则始终可用)。它有一些有用的方法来访问默认的和用户增强的消息转换器。 -有关更多详细信息,请参见“[自定义 @responsebody 呈现](#howto.spring-mvc.customize-responsebody-rendering)”部分和[“WebMVCAutoConfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java)源代码。 +参见“[自定义 @responsebody 呈现](#howto.spring-mvc.customize-responsebody-rendering)”部分和[`WebMvcAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/autofconfigure/web/[ Servlet/ Servlet/webmvcautofconfiguration.java])源 ### 4.4.自定义 @responsebody 呈现 -Spring 使用`HttpMessageConverters`来呈现`@ResponseBody`(或来自`@RestController`的响应)。你可以通过在 Spring 引导上下文中添加适当类型的 bean 来贡献额外的转换器。如果你添加的 Bean 是一种无论如何默认情况下都会包含的类型(例如用于 JSON 转换的`MappingJackson2HttpMessageConverter`),那么它将替换默认值。 Bean 类型`HttpMessageConverters`的便利是提供的,并且如果你使用默认的 MVC 配置,它总是可用的。它有一些有用的方法来访问默认的和用户增强的消息转换器(例如,如果你想手动将它们注入到自定义的`RestTemplate`中,它可能是有用的)。 +Spring 使用`HttpMessageConverters`来呈现`@ResponseBody`(或来自`@RestController`的响应)。你可以通过在 Spring 引导上下文中添加适当类型的 bean 来贡献额外的转换器。如果你添加的 Bean 是一种无论如何默认情况下都会包含的类型(例如,对于 JSON 转换,`MappingJackson2HttpMessageConverter`),那么它将替换默认值。 Bean 提供了`HttpMessageConverters`类型的便利,并且如果使用默认的 MVC 配置,这种便利总是可用的。它有一些有用的方法来访问默认的和用户增强的消息转换器(例如,如果你想手动将它们注入到自定义的`RestTemplate`中,它可能会很有用)。 -正如在正常的 MVC 使用中一样,你提供的任何`WebMvcConfigurer`bean 也可以通过覆盖`configureMessageConverters`方法来贡献转换器。然而,与普通的 MVC 不同,你只能提供所需的额外转换器(因为 Spring Boot 使用相同的机制来贡献其默认值)。最后,如果你通过提供你自己的`@EnableWebMvc`配置来 OPT 出 Spring 引导默认的 MVC 配置,那么你可以通过使用`getMessageConverters`from`WebMvcConfigurationSupport`完全控制并手动执行所有操作。 +正如在正常的 MVC 使用中一样,你提供的任何`WebMvcConfigurer`bean 也可以通过覆盖`configureMessageConverters`方法来贡献转换器。然而,与普通的 MVC 不同,你只能提供所需的额外转换器(因为 Spring Boot 使用相同的机制来贡献其默认值)。最后,如果你通过提供你自己的`@EnableWebMvc`配置来 OPT 出 Spring 引导默认的 MVC 配置,那么你可以通过使用`getMessageConverters`from`WebMvcConfigurationSupport`来完全控制并手动执行所有操作。 -有关更多详细信息,请参见[“WebMVCAutoConfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java)源代码。 +参见[`WebMvcAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/web/ Servlet/webmvcautofconfiguration.javation)源代码了解更多详细信息。 ### 4.5.处理多部分文件上传 -Spring Boot 包含 Servlet 3`javax.servlet.http.Part`API 以支持上载文件。默认情况下, Spring 引导配置 Spring MVC,在单个请求中,每个文件的最大大小为 1MB,文件数据的最大大小为 10MB。你可以使用`Multipart属性`类中公开的属性重写这些值、存储中间数据的位置(例如,存储到`/tmp`目录)以及将数据刷新到磁盘的阈值。例如,如果你想指定文件是无限的,那么将`spring.servlet.multipart.max-file-size`属性设置为`-1`。 +Spring 引导包含 Servlet 3`javax.servlet.http.Part`API 以支持上载文件。默认情况下, Spring 引导配置 Spring MVC,在单个请求中,每个文件的最大大小为 1MB,文件数据的最大大小为 10MB。你可以使用`Multipart属性`类中公开的属性重写这些值、存储中间数据的位置(例如,存储到`/tmp`目录)以及将数据刷新到磁盘的阈值。例如,如果你想指定文件是无限的,那么将`spring.servlet.multipart.max-file-size`属性设置为`-1`。 当你希望在 Spring MVC 控制器处理程序方法中以`@RequestParam`类型的`MultipartFile`注释参数的形式接收多部分编码的文件数据时,多部分支持是有帮助的。 -有关更多详细信息,请参见[“多元构型”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/MultipartAutoConfiguration.java)源代码。 +参见[`MultipartAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/web/ Servlet/multipartauconfiguration.java)源代码获取更多详细信息。 | |建议对多部分上传使用容器的内置支持,而不是引入额外的依赖关系,如 Apache Commons 文件上传。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 4.6.关闭 Spring MVC DispatcherServlet -默认情况下,所有内容都是从应用程序的根目录提供的。如果你更愿意映射到另一条路径,那么可以按以下方式配置一条路径: +默认情况下,所有内容都是从应用程序的根目录(`/`)提供的。如果你更愿意映射到另一条路径,那么可以按以下方式配置一条路径: Properties @@ -1209,37 +1209,37 @@ spring: ### 4.7.关闭默认的 MVC 配置 -要完全控制 MVC 配置,最简单的方法是使用`@EnableWebMvc`注释提供自己的`@Configuration`。这样做,所有的 MVC 配置都在你的手中。 +对 MVC 配置进行完全控制的最简单的方法是使用`@EnableWebMvc`注释提供你自己的`@Configuration`。这样做会让所有的 MVC 配置都在你的手中。 ### 4.8.自定义视解析程序 -a`ViewResolver`是 Spring MVC 的核心组件,将`@Controller`中的视图名称转换为实际的`View`实现。请注意,`ViewResolvers`主要用于 UI 应用程序,而不是 REST 风格的服务(a`View`不用于呈现 a`@ResponseBody`)。有许多`ViewResolver`的实现方式可供选择,并且 Spring 本身并不确定应该使用哪些实现方式。 Spring 另一方面,引导为你安装一个或两个,这取决于它在 Classpath 和应用程序上下文中发现的内容。`DispatcherServlet`使用它在应用程序上下文中找到的所有解析器,依次尝试每个解析器,直到得到一个结果。如果你添加了你自己的,那么你必须知道你的解析器添加的顺序和位置。 +a`ViewResolver`是 Spring MVC 的核心组件,将`@Controller`中的视图名称转换为实际的`View`实现。注意,`ViewResolvers`主要用于 UI 应用程序,而不是 REST 风格的服务(a`View`不用于呈现 a`@ResponseBody`)。有许多`ViewResolver`的实现方式可供选择,并且 Spring 本身并不确定应该使用哪些实现方式。 Spring 另一方面,引导为你安装一个或两个,这取决于它在 Classpath 上和在应用程序上下文中发现的内容。`DispatcherServlet`使用它在应用程序上下文中找到的所有解析器,依次尝试每个解析器,直到得到一个结果。如果你添加了你自己的,那么你必须知道你的解析程序添加的顺序和位置。 `WebMvcAutoConfiguration`将以下`ViewResolvers`添加到上下文中: -* 名为“defaultViewResolver”的`InternalResourceViewResolver`。这一个定位可以通过使用`DefaultServlet`呈现的物理资源(如果你使用静态资源和 JSP 页面,则包括静态资源和 JSP 页面)。它将一个前缀和后缀应用到视图名,然后在 Servlet 上下文中查找具有该路径的物理资源(默认值都是空的,但是可以通过`spring.mvc.view.prefix`和`spring.mvc.view.suffix`进行外部配置)。你可以通过提供相同类型的 Bean 来覆盖它。 +* 名为“defaultViewResolver”的。这一个定位了可以通过使用`DefaultServlet`呈现的物理资源(包括静态资源和 JSP 页面,如果你使用它们的话)。它将前缀和后缀应用到视图名称,然后在 Servlet 上下文中查找具有该路径的物理资源(默认值都是空的,但是可以通过`spring.mvc.view.prefix`和`spring.mvc.view.suffix`进行外部配置)。你可以通过提供相同类型的 Bean 来覆盖它。 * 一个名为“BeannameViewResolver”的`BeanNameViewResolver`。这是视图解析器链中的一个有用的成员,并获取与正在解析的`View`同名的任何 bean。不需要重写或替换它。 -* 只有当存在**Are**类型的 bean 时,才会添加名为“viewresolver”的`ContentNegotiatingViewResolver`。这是一个复合解析器,将其委托给所有其他解析器,并试图找到与客户机发送的“Accept”HTTP 头匹配的项。有一个有用的[blog about `ContentNegotiatingViewResolver`](https://spring.io/blog/2013/06/03/content-negotiation-using-views),你可能想学习更多,你也可以查看源代码了解详细信息。你可以通过定义一个名为“ViewResolver”的 Bean 来关闭自动配置的`ContentNegotiatingViewResolver`。 +* 只有当存在**Are**类型的 bean 时,才会添加名为`ContentNegotiatingViewResolver`的 viewresolver。这是一个复合解析器,将其委托给所有其他解析器,并试图找到与客户机发送的“Accept”HTTP 头匹配的项。有一个有用的[blog about`ContentNegotiatingViewResolver`](https:// Spring.io/blog/2013/06/03/content-consultation-using-views),你可能想学习更多信息,也可能会查看源代码了解详细信息。你可以通过定义一个名为“ViewResolver”的 Bean 来关闭自动配置的`ContentNegotiatingViewResolver`。 * 如果你使用 ThymeLeaf,那么你还有一个名为“ThymeLeafViewResolver”的`ThymeleafViewResolver`。它通过使用前缀和后缀环绕视图名来查找资源。前缀是`spring.thymeleaf.prefix`,后缀是`spring.thymeleaf.suffix`。前缀和后缀的值分别默认为“ Classpath:/templates/”和“.html”。你可以通过提供同名的 Bean 来覆盖`ThymeleafViewResolver`。 -* 如果使用 Freemarker,还会有一个名为“freemarkerviewresolver”的`FreeMarkerViewResolver`。通过使用前缀和后缀围绕视图名,它在加载程序路径(外部化为`spring.freemarker.templateLoaderPath`,并具有默认值‘ Classpath:/templates/’)中查找资源。前缀外部化为`spring.freemarker.prefix`,后缀外部化为`spring.freemarker.suffix`。前缀和后缀的默认值分别为空和“.ftlh”。你可以通过提供同名的 Bean 来覆盖`FreeMarkerViewResolver`。 +* 如果使用 freemarker,还会有一个名为“freemarkerviewresolver”的`FreeMarkerViewResolver`。通过使用前缀和后缀围绕视图名,它在加载程序路径(外部化为`spring.freemarker.templateLoaderPath`,并具有默认值‘ Classpath:/templates/’)中查找资源。前缀外部化为`spring.freemarker.prefix`,后缀外部化为`spring.freemarker.suffix`。前缀和后缀的默认值分别为空和“.ftlh”。你可以通过提供同名的 Bean 来覆盖`FreeMarkerViewResolver`。 -* 如果你使用 Groovy 模板(实际上,如果`groovy-templates`在你的 Classpath 上),那么你还有一个名为“GroovyMarkupViewResolver”的`GroovyMarkupViewResolver`。它通过使用前缀和后缀(外部化为`spring.groovy.template.prefix`和`spring.groovy.template.suffix`)包围视图名,在加载程序路径中查找资源。前缀和后缀的默认值分别为“ Classpath:/templates/”和“.TPL”。可以通过提供同名的 Bean 来覆盖`GroovyMarkupViewResolver`。 +* 如果你使用 Groovy 模板(实际上,如果`groovy-templates`在你的 Classpath 上),那么你还有一个名为“GroovyMarkupViewResolver”的`GroovyMarkupViewResolver`。它通过使用前缀和后缀(外部化为`spring.groovy.template.prefix`和`spring.groovy.template.suffix`)包围视图名称,在加载程序路径中查找资源。前缀和后缀的默认值分别为“ Classpath:/templates/”和“.TPL”。你可以通过提供同名的 Bean 来覆盖`GroovyMarkupViewResolver`。 * 如果你使用 Mustache,你也有一个`MustacheViewResolver`名为“MustacheViewResolver”。它通过使用前缀和后缀环绕视图名来查找资源。前缀是`spring.mustache.prefix`,后缀是`spring.mustache.suffix`。前缀和后缀的值分别默认为“ Classpath:/templates/”和“.mustache”。你可以通过提供同名的 Bean 来覆盖`MustacheViewResolver`。 有关更多详细信息,请参见以下部分: -* [“WebMVCAutoConfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java) +* [`WebMvcAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/web/ Servlet/webmvcautofconfiguration.java) -* [胸腺叶自动构型](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java) +* [`ThymeleafAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/tofigure/thymeleautofconfiguration.java) -* [FreemarkerAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) +* [`FreeMarkerAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/org/springframework/boot/autofigure/freemmarkautofconfiguration.java) -* [GroovytemplateAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java) +* [`GroovyTemplateAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofconfigure/groovy/groovy/templateautofconfiguration.java) ## 5. 泽西岛 @@ -1302,7 +1302,7 @@ Spring Boot 提供了许多与 HTTP 客户端一起工作的启动器。本节 ### 6.2.配置由基于反应堆网络的 WebClient 使用的 TCPClient### -当反应堆网络是在 Classpath 上时,基于反应堆网络的`WebClient`是自动配置的。要定制客户机对网络连接的处理,请提供`ClientHttpConnector` Bean。下面的示例配置了 60 秒的连接超时,并添加了`ReadTimeoutHandler`: +Classpath 基于反应器网络的`WebClient`在反应器网络上时是自动配置的。要定制客户机对网络连接的处理,请提供`ClientHttpConnector` Bean。下面的示例配置了 60 秒的连接超时,并添加了`ReadTimeoutHandler`: ``` import io.netty.channel.ChannelOption; @@ -1331,12 +1331,12 @@ public class MyReactorNettyClientConfiguration { ``` -| |注意对连接提供程序和事件循环资源使用`ReactorResourceFactory`。
这确保了接收请求的服务器和发出请求的客户机有效地共享资源。| +| |注意对连接提供程序和事件循环资源使用`ReactorResourceFactory`。
这确保了接收请求的服务器和发出请求的客户端的资源的有效共享。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 7. Logging -Spring 启动没有强制的日志依赖关系,除了 Commons 日志 API,它通常由 Spring Framework 的`spring-jcl`模块提供。要使用[Logback](https://logback.qos.ch),需要在 Classpath 上包含它和`spring-jcl`。推荐的实现方法是通过启动器,所有启动器都依赖于`spring-boot-starter-logging`。对于 Web 应用程序,你只需要`spring-boot-starter-web`,因为它在传递上依赖于日志启动器。如果你使用 Maven,则以下依赖项将为你添加日志记录: +Spring 启动没有强制的日志依赖性,除了 Commons 日志 API,它通常由 Spring Framework 的`spring-jcl`模块提供。要使用[Logback](https://logback.qos.ch),需要在 Classpath 上包含它和`spring-jcl`。推荐的实现方法是通过启动器,所有启动器都依赖于`spring-boot-starter-logging`。对于 Web 应用程序,你只需要`spring-boot-starter-web`,因为它在传递上依赖于日志启动器。如果你使用 Maven,以下依赖项将为你添加日志记录: ``` @@ -1347,7 +1347,7 @@ Spring 启动没有强制的日志依赖关系,除了 Commons 日志 API,它 Spring 引导具有`LoggingSystem`的抽象,该抽象尝试基于 Classpath 的内容来配置日志记录。如果可以登录,它是第一个选择。 -如果你需要对日志记录进行的唯一更改是设置各种日志记录器的级别,那么你可以在`application.properties`中使用“logging.level”前缀进行更改,如下例所示: +如果你需要对日志记录进行的唯一更改是设置各种日志记录器的级别,那么你可以在`application.properties`中使用“logging.level”前缀进行设置,如下例所示: Properties @@ -1367,16 +1367,16 @@ logging: 还可以使用`logging.file.name`设置要将日志写入的文件的位置(除了控制台)。 -要配置日志系统的更细粒度的设置,你需要使用所讨论的`LoggingSystem`所支持的本机配置格式。默认情况下, Spring boot 会从系统的默认位置(例如`classpath:logback.xml`用于回传)获取本机配置,但是你可以通过使用`logging.config`属性设置配置文件的位置。 +要配置日志系统的更细粒度的设置,你需要使用所讨论的`LoggingSystem`所支持的本机配置格式。默认情况下, Spring boot 从其系统的默认位置(例如`classpath:logback.xml`用于回传)获取本机配置,但是你可以通过使用`logging.config`属性设置配置文件的位置。 ### 7.1.配置日志记录的回录 -如果你需要在`application.properties`所能实现的范围之外,对回录应用自定义,那么你将需要添加一个标准的回录配置文件。你可以将`logback.xml`文件添加到你的 Classpath 根目录中,以便进行回登查找。如果你想使用[Spring Boot Logback extensions](features.html#features.logging.logback-extensions),也可以使用`logback-spring.xml`。 +如果你需要在`application.properties`所能实现的范围之外,对回录应用自定义,那么你将需要添加一个标准的回录配置文件。你可以将`logback.xml`文件添加到你的 Classpath 的根目录中,以便进行检索。如果你想使用[Spring Boot Logback extensions](features.html#features.logging.logback-extensions),也可以使用`logback-spring.xml`。 -| |在一些细节上,注销文档有一个[包含配置的专用部分](https://logback.qos.ch/manual/configuration.html)。| +| |在一些细节上,回登文档有一个[包含配置的专用部分](https://logback.qos.ch/manual/configuration.html)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------| -Spring Boot 提供了许多从你自己的配置中执行`included`的回登配置。这些包括被设计为允许某些公共 Spring 引导约定被重新应用。 +Spring Boot 提供了许多从你自己的配置中执行`included`的回录配置。这些包括被设计为允许某些共同的引导约定被重新应用。 以下文件在`org/springframework/boot/logging/logback/`下提供: @@ -1386,7 +1386,7 @@ Spring Boot 提供了许多从你自己的配置中执行`included`的回登配 * `file-appender.xml`-在适当的设置下使用`FILE_LOG_PATTERN`和`ROLLING_FILE_NAME_PATTERN`添加`RollingFileAppender`。 -此外,还提供了一个遗留的`base.xml`文件,以便与 Spring boot 的早期版本兼容。 +此外,还提供了一个遗留的`base.xml`文件,用于与 Spring 引导的早期版本兼容。 一个典型的自定义`logback.xml`文件看起来是这样的: @@ -1408,13 +1408,13 @@ Spring Boot 提供了许多从你自己的配置中执行`included`的回登配 * `${LOG_FILE}`:在 Boot 的外部配置中是否设置了`logging.file.name`。 -* `${LOG_PATH}`:是否在 Boot 的外部配置中设置了`logging.file.path`(代表用于保存日志文件的目录)。 +* `${LOG_PATH}`:在 Boot 的外部配置中是否设置了`logging.file.path`(代表用于保存日志文件的目录)。 * `${LOG_EXCEPTION_CONVERSION_WORD}`:在 Boot 的外部配置中是否设置了`logging.exception-conversion-word`。 * `${ROLLING_FILE_NAME_PATTERN}`:在 Boot 的外部配置中是否设置了`logging.pattern.rolling-file-name`。 -Spring 启动还通过使用定制的回录转换器在控制台上(但不是在日志文件中)提供一些漂亮的 ANSI 彩色终端输出。有关示例,请参见`defaults.xml`配置中的`CONSOLE_LOG_PATTERN`。 +Spring 启动还通过使用定制的回录转换器在控制台上(但不是在日志文件中)提供一些不错的 ANSI 彩色终端输出。有关示例,请参见`defaults.xml`配置中的`CONSOLE_LOG_PATTERN`。 如果 Groovy 位于 Classpath 上,那么你也应该能够使用`logback.groovy`配置回发。如果存在,此设置将被优先考虑。 @@ -1423,7 +1423,7 @@ Spring 启动还通过使用定制的回录转换器在控制台上(但不是 #### 7.1.1.为仅文件输出配置回录 -如果要禁用控制台日志记录并只将输出写到文件,则需要一个自定义的`logback-spring.xml`,它导入`file-appender.xml`,但不导入`console-appender.xml`,如下例所示: +如果要禁用控制台日志记录并只将输出写到文件,则需要一个自定义的`logback-spring.xml`,它导入`file-appender.xml`,但不导入`console-appender.xml`,如以下示例所示: ``` @@ -1493,7 +1493,7 @@ dependencies { } ``` -| |log4j 启动器将常见日志需求的依赖关系收集在一起(例如 Tomcat 使用`java.util.logging`但使用 log4j2 配置输出)。| +| |log4j 启动器将常见日志需求的依赖关系收集在一起(例如, Tomcat 使用`java.util.logging`,但使用 log4j2 配置输出)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |要确保使用`java.util.logging`执行的调试日志被路由到 log4j2 中,可以通过将`java.util.logging.manager`系统属性设置为`org.apache.logging.log4j.jul.LogManager`来配置其[JDK 日志适配器](https://logging.apache.org/log4j/2.x/log4j-jul/index.html)。| @@ -1611,7 +1611,7 @@ app: pool-size: 30 ``` -然而,有一个问题。由于连接池的实际类型未公开,因此在你的自定义`DataSource`的元数据中不会生成任何键,并且 IDE 中也没有可用的补全功能(因为`DataSource`接口不公开任何属性)。另外,如果你碰巧在 Classpath 上有 hikari,则此基本设置将不工作,因为 hikari 没有`url`属性(但是有`jdbcUrl`属性)。在这种情况下,你必须按以下方式重写配置: +然而,有一个问题。由于连接池的实际类型未公开,因此在你的自定义`DataSource`的元数据中不会生成任何键,并且 IDE 中也不会提供任何补全功能(因为`DataSource`接口不公开任何属性)。另外,如果你碰巧在 Classpath 上有 hikari,则此基本设置将不工作,因为 hikari 没有`url`属性(但是有`jdbcUrl`属性)。在这种情况下,你必须按以下方式重写配置: Properties @@ -1633,7 +1633,7 @@ app: pool-size: 30 ``` -你可以通过强制连接池使用并返回一个专用实现(而不是`DataSource`)来解决此问题。你无法在运行时更改实现,但选项列表将是显式的。 +可以通过强制连接池使用并返回一个专用的实现(而不是`DataSource`)来解决此问题。你无法在运行时更改实现,但选项列表将是显式的。 下面的示例显示了如何使用`DataSourceBuilder`创建`HikariDataSource`: @@ -1658,7 +1658,7 @@ public class MyDataSourceConfiguration { ``` -你甚至可以通过利用`DataSourceProperties`为你做的事情来更进一步——也就是说,如果没有提供 URL,则提供一个默认的嵌入式数据库,该数据库具有合理的用户名和密码。你可以很容易地从任何`DataSourceProperties`对象的状态初始化`DataSourceBuilder`,因此你还可以插入 Spring boot 自动创建的数据源。但是,这会将你的配置拆分成两个名称空间:`url`,`username`,`password`,`type`,`driver`在`spring.datasource`上,其余的则在你的自定义名称空间上。为了避免这种情况,你可以在自定义名称空间上重新定义自定义`DataSourceProperties`,如下例所示: +你甚至可以通过利用`DataSourceProperties`为你做的事情来更进一步——也就是说,如果没有提供 URL,则提供一个默认的嵌入式数据库,该数据库具有合理的用户名和密码。你可以轻松地从任何`DataSourceProperties`对象的状态初始化`DataSourceBuilder`,因此你还可以插入 Spring boot 自动创建的数据源。但是,这将把你的配置拆分成两个名称空间:`url`,`username`,`password`,`type`,`driver`在`spring.datasource`上,其余的在你的自定义名称空间上(`app.datasource`)。为了避免这种情况,你可以在自定义名称空间上重新定义自定义`DataSourceProperties`,如下例所示: ``` import com.zaxxer.hikari.HikariDataSource; @@ -1689,7 +1689,7 @@ public class MyDataSourceConfiguration { ``` -该设置将你的*同步*与 Spring boot 在默认情况下为你提供的功能相同,只是选择了一个专用的连接池(在代码中),并且其设置在`app.datasource.configuration`子名称空间中公开。因为`DataSourceProperties`正在为你处理`url`/`jdbcurl’转换,所以你可以将其配置如下: +该设置将你的*同步*与 Spring boot 在默认情况下为你提供的功能相同,只是选择了一个专用的连接池(在代码中),并且其设置在`app.datasource.configuration`子名称空间中公开。因为`DataSourceProperties`正在为你处理`url`/`jdbcUrl`转换,所以你可以将其配置如下: Properties @@ -1718,13 +1718,13 @@ app: | |因为你的自定义配置选择使用 hikari,所以`app.datasource.type`没有任何效果。
在实践中,构建器是用你可能在那里设置的任何值初始化的,然后通过调用`.type()`来重写。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -有关更多详细信息,请参见“ Spring 引导特性”部分中的“[data.html](data.html#data.sql.datasource)”和[“数据源自动配置”](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/DataSourceAutoConfiguration.java)类。 +请参阅“ Spring 引导功能”部分中的“[data.html](data.html#data.sql.datasource)”,以及[`DataSourceAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/autofork/autoform/autoforigation/jdbc/dasourceautofconfiguration.java)类 ### 8.2.配置两个数据源 -如果需要配置多个数据源,则可以应用上一节中描述的相同技巧。但是,你必须将一个`DataSource`实例标记为`@Primary`,因为未来的各种自动配置都希望能够根据类型获得一个实例。 +如果需要配置多个数据源,则可以应用上一节中描述的相同技巧。但是,你必须将`DataSource`实例之一标记为`@Primary`,因为未来的各种自动配置都希望能够根据类型获得一个实例。 -如果你创建自己的`DataSource`,那么自动配置就会后退。在下面的示例中,我们提供了*确切*与在主数据源上提供的自动配置相同的功能集: +如果你创建了自己的`DataSource`,那么自动配置就会后退。在下面的示例中,我们提供了*确切*与在主数据源上提供的自动配置相同的功能集: ``` import com.zaxxer.hikari.HikariDataSource; @@ -1857,13 +1857,13 @@ Spring 数据可以创建各种类型的`@Repository`接口的实现方式。 Sp 对于许多应用程序,你所需要的只是将正确的 Spring 数据依赖关系放在你的 Classpath 上。对于 JPA 有`spring-boot-starter-data-jpa`,对于 MongoDB 有`spring-boot-starter-data-mongodb`,对于受支持的技术还有其他各种启动器。要开始,请创建一些存储库接口来处理`@Entity`对象。 -Spring Boot 尝试猜测你的`@Repository`定义的位置,基于它找到的`@EnableAutoConfiguration`。要获得更多的控制,使用`@EnableJpaRepositories`注释(来自 Spring data JPA)。 +Spring Boot 试图根据它找到的`@EnableAutoConfiguration`来猜测你的`@Repository`定义的位置。要获得更多的控制,使用`@EnableJpaRepositories`注释(来自 Spring data JPA)。 有关 Spring 数据的更多信息,请参见[Spring Data project page](https://spring.io/projects/spring-data)。 ### 8.4.将 @Entity 定义与 Spring 配置 ### 分开 -Spring Boot 尝试猜测你的`@Entity`定义的位置,基于它找到的`@EnableAutoConfiguration`。要获得更多的控制,可以使用`@EntityScan`注释,如以下示例所示: +Spring Boot 试图根据它找到的`@EnableAutoConfiguration`来猜测你的`@Entity`定义的位置。要获得更多的控制,可以使用`@EntityScan`注释,如以下示例所示: ``` import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -1883,11 +1883,11 @@ public class MyApplication { ### 8.5.配置 JPA 属性 -Spring 数据 JPA 已经提供了一些独立于供应商的配置选项(例如用于 SQL 日志记录的那些选项),并且 Spring 启动公开了这些选项以及用于 Hibernate 的更多一些作为外部配置属性。其中一些是根据上下文自动检测的,因此你不必设置它们。 +Spring 数据 JPA 已经提供了一些独立于供应商的配置选项(例如用于 SQL 日志记录的那些选项),并且 Spring 启动公开了这些选项以及用于 Hibernate 的其他一些选项作为外部配置属性。其中一些是根据上下文自动检测的,因此你不必设置它们。 `spring.jpa.hibernate.ddl-auto`是一种特殊情况,因为根据运行时条件,它有不同的默认值。如果使用了嵌入式数据库,并且没有模式管理器(例如 Liquibase 或 Flyway)处理`DataSource`,则默认为`create-drop`。在所有其他情况下,它默认为`none`。 -JPA 提供程序检测要使用的方言。如果你喜欢自己设置方言,请设置`spring.jpa.database-platform`属性。 +JPA 提供程序检测要使用的方言。如果你希望自己设置方言,请设置`spring.jpa.database-platform`属性。 下面的示例显示了最常见的设置选项: @@ -1909,19 +1909,19 @@ spring: show-sql: true ``` -此外,当创建本地`EntityManagerFactory`时,`spring.jpa.properties.*`中的所有属性都将作为正常的 JPA 属性(去掉前缀)通过。 +此外,当创建本地`spring.jpa.properties.*`时,`spring.jpa.properties.*`中的所有属性都将作为正常的 JPA 属性(前缀被剥离)通过。 | |你需要确保在`spring.jpa.properties.*`下定义的名称与你的 JPA 提供程序所期望的名称完全匹配,
Spring boot 将不会尝试对这些条目进行任何放松的绑定。

,例如,如果要配置 Hibernate 的批处理大小,则必须使用`spring.jpa.properties.hibernate.jdbc.batch_size`。
如果使用其他形式,例如`batchSize`或`batch-size`,则 Hibernate 将不应用该设置。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |如果你需要对 Hibernate 属性应用高级定制,请考虑注册一个`HibernatePropertiesCustomizer` Bean,在创建`EntityManagerFactory`之前将调用它。
这优先于自动配置所应用的任何内容。| +| |如果你需要对 Hibernate 属性应用高级定制,请考虑注册一个`HibernatePropertiesCustomizer` Bean,它将在创建`EntityManagerFactory`之前被调用。
这优先于自动配置所应用的任何内容。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 8.6.配置 Hibernate 命名策略 Hibernate 使用[两种不同的命名策略](https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#naming)将名称从对象模型映射到相应的数据库名称。通过分别设置`spring.jpa.hibernate.naming.physical-strategy`和`spring.jpa.hibernate.naming.implicit-strategy`属性,可以配置物理实现和隐式策略实现的完全限定类名。或者,如果`ImplicitNamingStrategy`或`PhysicalNamingStrategy`bean 在应用程序上下文中可用, Hibernate 将自动配置为使用它们。 -默认情况下, Spring 引导使用`CamelCaseToUnderscoresNamingStrategy`配置物理命名策略。使用这种策略,所有的点都被替换为下划线,驼峰外壳也被替换为下划线。此外,默认情况下,所有的表名都是用小写字母生成的。例如,将`TelephoneNumber`实体映射到`telephone_number`表。如果你的模式需要混合大小写标识符,请定义一个自定义`CamelCaseToUnderscoresNamingStrategy` Bean,如下例所示: +默认情况下, Spring 引导使用`CamelCaseToUnderscoresNamingStrategy`配置物理命名策略。使用这种策略,所有的点都会被下划线所代替,而驼峰外壳也会被下划线所代替。此外,默认情况下,所有的表名都是用小写字母生成的。例如,将`TelephoneNumber`实体映射到`telephone_number`表。如果你的模式需要混合大小写标识符,请定义自定义`CamelCaseToUnderscoresNamingStrategy` Bean,如下例所示: ``` import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy; @@ -1975,7 +1975,7 @@ class MyHibernateConfiguration { ``` -有关更多详细信息,请参见[“HibernatejpaAutoConfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java)和[“jpabaseconfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java)。 +参见[`HibernateJpaAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofconfigure/SRC/more/java/org/Springframework/boot/autoframework/HibernatejaAutoConfiguration.jconfiguration)和[<`JpaBaseConfiguration`](https:///github.com/[[ Spring-projb/ Spring-projects/ Spring-tree/v2.6.4/ ### 8.7.配置 Hibernate 二级缓存 @@ -2005,9 +2005,9 @@ public class MyHibernateSecondLevelCacheConfiguration { 这个定制程序将配置 Hibernate 使用与应用程序使用的相同的`CacheManager`。也可以使用单独的`CacheManager`实例。详见[the Hibernate user guide](https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#caching-provider-jcache)。 -### 8.8.在 Hibernate 组件 ### 中使用依赖注入 +### 8.8.在 Hibernate 组件中使用依赖注入 ### -默认情况下, Spring 引导注册了`BeanContainer`实现,该实现使用`BeanFactory`,以便转换器和实体侦听器可以使用常规的依赖注入。 +默认情况下, Spring 启动注册了`BeanContainer`实现,该实现使用`BeanFactory`,以便转换器和实体侦听器可以使用常规的依赖注入。 你可以通过注册删除或更改`hibernate.resource.beans.container`属性的`HibernatePropertiesCustomizer`来禁用或调优此行为。 @@ -2061,7 +2061,7 @@ public class MyEntityManagerFactoryConfiguration { ``` -上面的示例使用名为`firstDataSource`的`EntityManagerFactory` Bean 创建`EntityManagerFactory`。它扫描位于`Order`相同包中的实体。可以使用`app.first.jpa`名称空间映射额外的 JPA 属性。 +上面的示例使用名为`firstDataSource`的`DataSource` Bean 创建`EntityManagerFactory`。它扫描位于与`Order`相同的包中的实体。可以使用`app.first.jpa`名称空间映射额外的 JPA 属性。 | |当你自己为`LocalContainerEntityManagerFactoryBean`创建 Bean 时,在创建自动配置的`LocalContainerEntityManagerFactoryBean`期间应用的任何自定义都会丢失。
例如,在 Hibernate 的情况下,在`spring.jpa.hibernate`前缀下的任何属性都不会自动应用到你的`LocalContainerEntityManagerFactoryBean`。
如果你依赖这些属性来配置诸如命名策略或 DDL 模式之类的东西,那么在创建`LocalContainerEntityManagerFactoryBean` Bean 时,你将需要显式地配置这些属性。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -2098,13 +2098,13 @@ public class CustomerConfiguration { Spring 默认情况下,引导不会搜索或使用`META-INF/persistence.xml`。如果你更喜欢使用传统的`persistence.xml`,则需要定义你自己的`@Bean`类型的`LocalEntityManagerFactoryBean`(ID 为“EntityManagerFactory”)并在此设置持久性单元名称。 -有关默认设置,请参见[“jpabaseconfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java)。 +参见[`JpaBaseConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/orm/ JPA/jpabaseconfighimation.java)的默认设置。 ### 8.12.使用 Spring 数据 JPA 和 Mongo 存储库 ### Spring Data JPA 和 Spring Data Mongo 都可以自动为你创建`Repository`实现。如果它们都存在于 Classpath 上,那么你可能需要做一些额外的配置来告诉 Spring 引导要创建哪些存储库。最明确的方法是使用标准 Spring 数据`@EnableJpaRepositories`和`@EnableMongoRepositories`注释并提供你的`Repository`接口的位置。 -还有一些标志(` Spring.data.*.repositories.enabled` 和`spring.data.*.repositories.type`),你可以使用它们在外部配置中打开和关闭自动配置的存储库。这样做是有用的,例如,如果你想关闭 Mongo 存储库,并且仍然使用自动配置的`MongoTemplate`。 +还有一些标志(`spring.data.*.repositories.enabled`和`spring.data.*.repositories.type`),你可以使用它们在外部配置中打开和关闭自动配置的存储库。这样做是有用的,例如,如果你想关闭 Mongo 存储库,并且仍然使用自动配置的`MongoTemplate`。 Spring 对于其他自动配置的数据存储库类型(ElasticSearch、SOLR 和其他),存在相同的障碍和相同的特征。要使用它们,相应地更改注释和标志的名称。 @@ -2116,9 +2116,9 @@ Spring 数据提供了 Web 支持,该支持简化了 Spring 数据存储库在 Spring 数据 REST 可以公开实现作为你的 REST 端点,前提是 Spring 已经为应用程序启用了 MVC。 -Spring 引导公开一组有用的属性(来自`spring.data.rest`命名空间),这些属性定制[“存储库和 restconfiguration”](https://docs.spring.io/spring-data/rest/docs/3.6.2/api/org/springframework/data/rest/core/config/RepositoryRestConfiguration.html)。如果需要提供额外的定制,则应该使用[“RepositoryRestConfigurer”](https://docs.spring.io/spring-data/rest/docs/3.6.2/api/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.html) Bean。 +Spring 引导公开了一组有用的属性(来自`spring.data.rest`命名空间),这些属性定制了[`RepositoryRestConfiguration`](https://DOCS. Spring.io/ Spring-data/rest/DOCS/3.6.2/api/org/springframework/data/rest/core/core/config/restoryrestconfiguration.html)。如果需要提供额外的定制,则应该使用[`RepositoryRestConfigurer`](https://DOCS. Spring.io/ Spring-data/rest/DOCS/3.6.2/api/org/springframework/data/rest/webmvc/config/repositoryrestconfigrer.html) Bean。 -| |如果你没有在你的自定义`RepositoryRestConfigurer`上指定任何顺序,则它将在 Spring 引导内部使用的命令之后运行。
如果你需要指定一个顺序,请确保它高于 0。| +| |如果你没有在你的自定义`RepositoryRestConfigurer`上指定任何订单,则它将在 Spring 引导内部使用的命令之后运行。
如果你需要指定订单,请确保其高于 0。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 8.15.配置 JPA ### 使用的组件 @@ -2151,9 +2151,9 @@ public class ElasticsearchEntityManagerFactoryDependsOnPostProcessor ### 8.16.用两个数据源配置 Jooq -如果你需要对多个数据源使用 Jooq,那么你应该为每个数据源创建自己的`DSLContext`。有关更多详细信息,请参见[JooqAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java)。 +如果需要对多个数据源使用 Jooq,那么应该为每个数据源创建自己的`DSLContext`。有关更多详细信息,请参见[JooqAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java)。 -| |特别地,`JooqExceptionTranslator`和`SpringTransactionProvider`可以被重用,以提供类似于自动配置对单个`DataSource`所做的功能。| +| |特别是,`JooqExceptionTranslator`和`SpringTransactionProvider`可以重用,以提供与自动配置使用单个`DataSource`所做的类似的功能。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 9. 数据库初始化 @@ -2170,24 +2170,24 @@ JPA 具有用于生成 DDL 的功能,并且这些功能可以设置为在启 ### 9.2.使用 Hibernate 初始化数据库 -可以显式地设置`spring.jpa.hibernate.ddl-auto`,标准 Hibernate 属性值为`none`、`validate`、`update`、`create`和`create-drop`。 Spring Boot 根据它是否认为你的数据库是嵌入式的,为你选择一个默认值。如果没有检测到模式管理器,则默认为`create-drop`,或者在所有其他情况下,默认为`none`。通过查看`Connection`类型和 JDBC URL,可以检测到嵌入式数据库。`hsqldb`、`h2`和`derby`是候选项,其他不是候选项。在从内存中切换到“真实”数据库时要小心,不要对新平台中的表和数据的存在做出假设。你必须显式地设置`ddl-auto`,或者使用其他机制之一来初始化数据库。 +可以显式地设置`spring.jpa.hibernate.ddl-auto`,标准 Hibernate 属性值为`none`、`validate`、`update`、`create`和`create-drop`。 Spring Boot 根据它是否认为你的数据库是嵌入式的,为你选择一个默认值。如果没有检测到模式管理器,则默认为`create-drop`,或者在所有其他情况下,默认为`none`。通过查看`Connection`类型和 JDBC URL 来检测嵌入式数据库。`hsqldb`、`h2`和`derby`是候选项,其他不是候选项。在从内存中切换到“真实”数据库时要小心,不要对新平台中的表和数据的存在做出假设。你必须显式地设置`ddl-auto`,或者使用其他机制之一来初始化数据库。 | |你可以通过启用`org.hibernate.SQL`记录器来输出模式创建。
如果你启用[debug mode](features.html#features.logging.console-output),这将自动为你完成。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -此外,如果 Hibernate 从头创建模式(即,如果`ddl-auto`属性设置为`create`或`create-drop`),则在启动时执行 Classpath 根中名为`import.sql`的文件。这对于演示和测试是有用的,如果你很小心的话,但可能不是你希望在生产 Classpath 中使用的东西。这是一个 Hibernate 特性(与 Spring 无关)。 +此外,如果 Hibernate 从头创建模式(即,如果`ddl-auto`属性设置为`create`或`create-drop`),则在启动时执行 Classpath 根中名为`import.sql`的文件。这对于演示和测试是有用的,如果你非常小心的话,但这可能不是你希望在生产 Classpath 中使用的东西。这是一个 Hibernate 特性(与 Spring 无关)。 ### 9.3.使用基本 SQL 脚本初始化数据库 -Spring 引导可以自动创建你的 JDBC`DataSource`或 R2DBC`ConnectionFactory`的模式(DDL 脚本)并对其进行初始化(DML 脚本)。它从标准的根 Classpath 位置加载 SQL:分别是`schema.sql`和`data.sql`。此外, Spring 引导处理`schema-${platform}.sql`和`data-${platform}.sql`文件(如果存在),其中`platform`是`spring.sql.init.platform`的值。这允许你在必要时切换到特定于数据库的脚本。例如,你可以选择将其设置为数据库的供应商名称(`hsqldb`,`h2`,`oracle`,`mysql`,`postgresql`,等等)。默认情况下,SQL 数据库初始化仅在使用嵌入式内存数据库时执行。要始终初始化 SQL 数据库(无论其类型如何),请将`spring.sql.init.mode`设置为`always`。类似地,要禁用初始化,请将`spring.sql.init.mode`设置为`never`。默认情况下, Spring 启动启用其基于脚本的数据库初始化器的抗故障特性。这意味着,如果脚本导致异常,则应用程序将无法启动。你可以通过设置`spring.sql.init.continue-on-error`来调整该行为。 +Spring 引导可以自动创建你的 JDBC`DataSource`或 R2DBC`ConnectionFactory`的模式(DDL 脚本)并对其进行初始化(DML 脚本)。它从标准的根 Classpath 位置加载 SQL:分别是`schema.sql`和`data.sql`。此外, Spring 引导处理`schema-${platform}.sql`和`data-${platform}.sql`文件(如果存在),其中`platform`是`spring.sql.init.platform`的值。这允许你在必要时切换到特定于数据库的脚本。例如,你可以选择将其设置为数据库的供应商名称(`hsqldb`,`h2`,`oracle`,`mysql`,`postgresql`,以此类推)。默认情况下,SQL 数据库初始化仅在使用嵌入式内存数据库时执行。要始终初始化 SQL 数据库(无论其类型如何),请将`spring.sql.init.mode`设置为`always`。类似地,要禁用初始化,请将`spring.sql.init.mode`设置为`never`。默认情况下, Spring 启动支持其基于脚本的数据库初始化器的抗故障特性。这意味着,如果脚本导致异常,则应用程序将无法启动。你可以通过设置`spring.sql.init.continue-on-error`来调整该行为。 -默认情况下,在创建任何 JPA `EntityManagerFactory`bean 之前,将执行基于脚本的`DataSource`初始化。可以使用 schema.sql’为 JPA 管理的实体创建模式,也可以使用`data.sql`填充它。虽然我们不建议使用多个数据源初始化技术,但如果你希望基于脚本的`DataSource`初始化能够构建在 Hibernate 执行的模式创建上,请将`spring.jpa.defer-datasource-initialization`设置为`true`。这将推迟数据源初始化,直到创建和初始化了任何`EntityManagerFactory`bean 之后。然后可以使用 schema.sql’对 Hibernate 执行的任何模式创建进行添加,并且`data.sql`可以用于填充它。 +默认情况下,在创建任何 JPA `EntityManagerFactory`bean 之前,执行基于脚本的`DataSource`初始化。`schema.sql`可用于为 JPA 管理的实体创建模式,而`data.sql`可用于填充它。虽然我们不推荐使用多个数据源初始化技术,但如果你希望基于脚本的`DataSource`初始化能够构建在 Hibernate 执行的模式创建上,请将`spring.jpa.defer-datasource-initialization`设置为`true`。这将推迟数据源的初始化,直到任何`EntityManagerFactory`bean 被创建和初始化之后。`schema.sql`然后可用于对 Hibernate 执行的任何模式创建进行添加,而`data.sql`可用于填充它。 如果你使用[高级数据库迁移工具](#howto.data-initialization.migration-tool),比如 Flyway 或 Liquibase,那么你应该单独使用它们来创建和初始化模式。不建议在 Flyway 或 Liquibase 旁边使用基本的`schema.sql`和`data.sql`脚本,并且在未来的版本中将取消支持。 ### 9.4.初始化 Spring 批处理数据库 -如果你使用 Spring 批处理,它会预先打包为大多数流行的数据库平台的 SQL 初始化脚本。 Spring 启动可以检测到你的数据库类型,并在启动时执行这些脚本。如果使用嵌入式数据库,默认情况下会发生这种情况。你还可以为任何数据库类型启用它,如以下示例所示: +如果你使用 Spring batch,那么它会预先打包为大多数流行的数据库平台的 SQL 初始化脚本。 Spring 启动可以检测到你的数据库类型,并在启动时执行这些脚本。如果使用嵌入式数据库,默认情况下会发生这种情况。你还可以为任何数据库类型启用它,如以下示例所示: 属性 @@ -2204,7 +2204,7 @@ spring: initialize-schema: "always" ``` -还可以通过将`spring.batch.jdbc.initialize-schema`设置为`never`,显式地关闭初始化。 +你还可以通过将`spring.batch.jdbc.initialize-schema`设置为`never`来显式地关闭初始化。 ### 9.5.使用更高级的数据库迁移工具 @@ -2246,21 +2246,21 @@ spring: locations: "classpath:db/migration/{vendor}" ``` -前面的配置不使用`db/migration`,而是根据数据库的类型设置要使用的目录(例如`db/migration/mysql`for MySQL)。支持的数据库列表在[“数据库驱动程序”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java)中可用。 +前面的配置不使用`db/migration`,而是根据数据库的类型设置要使用的目录(例如,对于 MySQL,`db/migration/mysql`)。支持的数据库列表可在[`DatabaseDriver`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/boot/jdbc/datasedriver.java)中找到。 迁移也可以用 Java 编写。Flyway 将使用实现`JavaMigration`的任何 bean 自动配置。 -[“Flyway属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/Flyway属性.java)提供了 Flyway 的大部分设置和一小组附加属性,可用于禁用迁移或关闭位置检查。如果需要对配置进行更多控制,可以考虑注册`FlywayConfigurationCustomizer` Bean。 +[`Flyway属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofconfigure/SRC/main/java/org/org/springframework/boot/autofigure/flyway/flywayproperties.java)提供了 Flyway 的大部分设置和一小部分附加属性,可用于禁用迁移或关闭位置检查。如果需要对配置进行更多控制,可以考虑注册`FlywayConfigurationCustomizer` Bean。 -Spring 引导调用`Flyway.migrate()`来执行数据库迁移。如果你想要更多的控制,请提供一个`@Bean`,实现[“FlywayMigrationStrategy”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayMigrationStrategy.java)。 +Spring 引导调用`Flyway.migrate()`来执行数据库迁移。如果你想要更多的控制,请提供一个`@Bean`,它实现了[`FlywayMigrationStrategy`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofconfigure/autofigure/flyway/flywaymigrationstrateg Flyway 支持 SQL 和 Java[callbacks](https://flywaydb.org/documentation/concepts/callbacks)。要使用基于 SQL 的回调,请将回调脚本放置在`classpath:db/migration`目录中。要使用基于 Java 的回调,请创建一个或多个实现`Callback`的 bean。任何这样的 bean 都会自动注册为`Flyway`。它们可以通过使用`@Order`或实现`Ordered`来订购。也可以检测到实现不推荐的`FlywayCallback`接口的 bean,但是它们不能与`Callback`bean 一起使用。 -默认情况下,Flyway 会自动连接上下文中的`DataSource`,并将其用于迁移。如果你希望使用不同的`DataSource`,则可以创建一个,并将其`@Bean`标记为`@FlywayDataSource`。如果你这样做并且需要两个数据源,请记住创建另一个数据源并将其标记为`@Primary`。或者,你可以通过在外部属性中设置`spring.flyway.[url,user,password]`来使用 Flyway 的本机`DataSource`。设置`spring.flyway.url`或`spring.flyway.user`就足以使 Flyway 使用自己的`DataSource`。如果没有设置这三个属性中的任何一个,则将使用其等效的`spring.datasource`属性的值。 +默认情况下,Flyway 在上下文中自动连接(`@Primary`)`DataSource`,并将其用于迁移。如果你希望使用不同的`DataSource`,则可以创建一个,并将其`@Bean`标记为`@FlywayDataSource`。如果你这样做并且需要两个数据源,请记住创建另一个数据源并将其标记为`@Primary`。或者,你可以通过在外部属性中设置`spring.flyway.[url,user,password]`来使用 Flyway 的本机`DataSource`。设置`spring.liquibase.user`或`spring.flyway.user`就足以使 Flyway 使用其自己的`DataSource`。如果没有设置这三个属性中的任何一个,则将使用其等效的`spring.datasource`属性的值。 你还可以使用 Flyway 为特定场景提供数据。例如,你可以在`src/test/resources`中放置特定于测试的迁移,并且仅在应用程序开始测试时才运行这些迁移。此外,你还可以使用配置文件特定的配置文件来定制`spring.flyway.locations`,以便仅在特定配置文件处于活动状态时才运行某些迁移。例如,在`application-dev.properties`中,你可以指定以下设置: -Properties +属性 ``` spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration @@ -2278,16 +2278,16 @@ spring: #### 9.5.2.在启动时执行 Liquibase 数据库迁移 ### -若要在启动时自动运行 Liquibase 数据库迁移,请将`org.liquibase:liquibase-core`添加到 Classpath 中。 +若要在启动时自动运行 Liquibase 数据库迁移,请将`org.liquibase:liquibase-core`添加到你的 Classpath 中。 -| |当你将`org.liquibase:liquibase-core`添加到 Classpath 中时,默认情况下,在应用程序启动期间和测试运行之前都会运行数据库迁移,
可以通过使用`spring.liquibase.enabled`属性来定制此行为,在`main`和`test`配置中设置不同的值。
不可能使用两种不同的方式来初始化数据库(例如,用于应用程序启动的 Liquibase,用于测试运行的 JPA)。| +| |当你将`org.liquibase:liquibase-core`添加到你的 Classpath 中时,默认情况下,在应用程序启动期间和测试运行之前都会运行数据库迁移,
可以通过使用`spring.liquibase.enabled`属性来定制此行为,在`main`和`test`配置中设置不同的值。
不可能使用两种不同的方式来初始化数据库(例如,用于应用程序启动的 Liquibase,用于测试运行的 JPA)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -默认情况下,从`spring.liquibase.change-log`读取主更改日志,但是你可以通过设置`spring.liquibase.change-log`来更改位置。除了 YAML,Liquibase 还支持 JSON、XML 和 SQL 更改日志格式。 +默认情况下,从`db/changelog/db.changelog-master.yaml`读取主更改日志,但是你可以通过设置`spring.liquibase.change-log`来更改位置。除了 YAML,Liquibase 还支持 JSON、XML 和 SQL 更改日志格式。 -默认情况下,Liquibase 在上下文中自动连接`DataSource`,并将其用于迁移。如果需要使用不同的`DataSource`,则可以创建一个,并将其`@Bean`标记为`@LiquibaseDataSource`。如果这样做,并且需要两个数据源,请记住创建另一个数据源,并将其标记为`@Primary`。或者,你可以通过在外部属性中设置`spring.liquibase.[driver-class-name,url,user,password]`来使用 Liquibase 的本机`DataSource`。设置`spring.liquibase.url`或`spring.liquibase.user`就足以使 Liquibase 使用自己的`DataSource`。如果没有设置这三个属性中的任何一个,则将使用其等效的`spring.datasource`属性的值。 +默认情况下,Liquibase 在上下文中自动连接(`@Primary`)`DataSource`,并将其用于迁移。如果需要使用不同的`DataSource`,则可以创建一个,并将其`@Bean`标记为`@LiquibaseDataSource`。如果这样做,并且需要两个数据源,请记住创建另一个数据源,并将其标记为`@Primary`。或者,你可以通过在外部属性中设置`spring.liquibase.[driver-class-name,url,user,password]`来使用 Liquibase 的本机`DataSource`。设置`spring.liquibase.url`或`spring.liquibase.user`就足以使 Liquibase 使用自己的`DataSource`。如果没有设置这三个属性中的任何一个,则将使用其等效的`spring.datasource`属性的值。 -有关上下文、默认模式等可用设置的详细信息,请参见[`LiquibaseProperties’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.java)。 +参见[`LiquibaseProperties`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/liquibase/liquibase/liquibaseproperties.java),以获取关于上下文、默认模式等可用设置的详细信息。 ### 9.6.依赖于初始化的数据库 @@ -2325,7 +2325,7 @@ Spring 启动将自动检测依赖于数据库初始化的以下类型的 bean: * `NamedParameterJdbcOperations` -如果你使用的是第三方启动器数据访问库,那么它可能会提供一个检测器,使得其他类型的 bean 也会被自动检测到。要检测到其他 bean,请在`META-INF/spring-factories`中注册`DependsOnDatabaseInitializationDetector`的实现。或者,用`@DependsOnDatabaseInitialization`注释 Bean 的类或其`@Bean`方法。 +如果你使用的是第三方启动器数据访问库,那么它可能会提供一个检测器,使得其他类型的 bean 也会被自动检测到。要检测到其他 bean,请在`META-INF/spring-factories`中注册`spring-boot-devtools`的实现。或者,用`@DependsOnDatabaseInitialization`注释 Bean 的类或其`@Bean`方法。 ## 10. 消息传递 @@ -2333,7 +2333,7 @@ Spring Boot 提供了许多启动器来支持消息传递。本节回答了在 S ### 10.1.禁用已处理的 JMS 会话 -如果你的 JMS 代理不支持事务会话,那么你必须完全禁用事务的支持。如果你创建自己的`JmsListenerContainerFactory`,则无需做任何事情,因为默认情况下无法进行交易。如果你想使用`DefaultJmsListenerContainerFactoryConfigurer`重用 Spring 引导的默认值,可以禁用已处理的会话,如下所示: +如果你的 JMS 代理不支持事务会话,那么你必须完全禁用事务的支持。如果你创建自己的`JmsListenerContainerFactory`,则无需做任何事情,因为默认情况下无法进行交易。如果你想使用`DefaultJmsListenerContainerFactoryConfigurer`来重用 Spring boot 的默认值,可以禁用已处理的会话,如下所示: ``` import javax.jms.ConnectionFactory; @@ -2368,27 +2368,27 @@ public class MyJmsConfiguration { ### 11.1.指定批处理数据源 -默认情况下,批处理应用程序需要`DataSource`来存储作业详细信息。 Spring 批处理默认情况下期望单个`DataSource`。要让它使用应用程序的主`DataSource`以外的`DataSource`,请声明一个`DataSource` Bean,并用`@BatchDataSource`注释其`@Bean`方法。如果你这样做并且需要两个数据源,请记住标记另一个`@Primary`。要获得更大的控制权,请实现`BatchConfigurer`。有关更多详细信息,请参见[The Javadoc of `@EnableBatchProcessing`](https://docs.spring.io/spring-batch/docs/4.3.5/api/org/springframework/batch/core/configuration/annotation/EnableBatchProcessing.html)。 +默认情况下,批处理应用程序需要`DataSource`来存储作业详细信息。 Spring 批处理默认情况下期望单个`DataSource`。要使用应用程序的主`DataSource`以外的`DataSource`,请声明`DataSource` Bean,并用`@BatchDataSource`注释其`@Bean`方法。如果你这样做并且需要两个数据源,请记住标记另一个`@Primary`。要获得更大的控制权,请实现`BatchConfigurer`。有关更多详细信息,请参见[`@EnableBatchProcessing`的 Javadoc](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.5/api/org/springframework/batch/core/configuration/annotation/enablebatchprocessing.html)。 -有关 Spring 批处理的更多信息,请参见[Testcontainers](https://www.testcontainers.org/)。 +有关 Spring 批处理的更多信息,请参见[Spring Batch project page](https://spring.io/projects/spring-batch)。 -### 11.2.在启动时运行批处理作业 +### 11.2.在启动时运行 Spring 批处理作业 -Spring 通过将`@EnableBatchProcessing`添加到你的`@Configuration`类中的一个来启用批处理自动配置。 +Spring 通过将`@EnableBatchProcessing`添加到你的一个`@Configuration`类,可以启用批处理自动配置。 -默认情况下,它在启动时在应用程序上下文中执行**全部**`Jobs`(有关详细信息,请参见[“JobLauncherApplicationRunner”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/JobLauncherApplicationRunner.java))。你可以通过指定`spring.batch.job.names`(它接受以逗号分隔的作业名称模式列表),将范围缩小到特定的一个或多个作业。 +默认情况下,它在启动时在应用程序上下文中执行**全部**`Jobs`(详见[`JobLauncherApplicationRunner`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/main/java/org/applingframework/boot/autofoot/autocutorunner.java))。你可以通过指定`spring.batch.job.names`(它接受一个以逗号分隔的作业名称模式列表),将范围缩小到一个或多个特定的作业。 有关更多详细信息,请参见[BatchaAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java)和[@enableBatchProcessing](https://docs.spring.io/spring-batch/docs/4.3.5/api/org/springframework/batch/core/configuration/annotation/EnableBatchProcessing.html)。 ### 11.3.从命令行运行 -Spring Boot 将以`--`开头的任何命令行参数转换为要添加到`Environment`的属性,请参见[访问命令行属性](features.html#features.external-config.command-line-args)。这不应用于将参数传递给批处理作业。要在命令行上指定批处理参数,请使用常规格式(即不使用`--`),如下例所示: +Spring Boot 将以`--`开头的任何命令行参数转换为要添加到`Environment`中的属性,请参见。这不应用于将参数传递给批处理作业。要在命令行上指定批处理参数,请使用常规格式(即不使用`--`),如下例所示: ``` $ java -jar myapp.jar someParameter=someValue anotherParameter=anotherValue ``` -如果你在命令行上指定`Environment`的属性,它将被作业忽略。考虑以下命令: +如果在命令行上指定`Environment`的属性,则作业将忽略该属性。考虑以下命令: ``` $ java -jar myapp.jar --server.port=7070 someParameter=someValue @@ -2408,24 +2408,24 @@ Spring 引导包括 Spring 引导致动器。这一节回答了在使用中经 在独立的应用程序中,Actuator HTTP 端口默认与主 HTTP 端口相同。要使应用程序侦听不同的端口,请设置外部属性:`management.server.port`。要侦听完全不同的网络地址(例如,当你有用于管理的内部网络和用于用户应用程序的外部网络时),还可以将`management.server.address`设置为服务器能够绑定的有效 IP 地址。 -有关更多详细信息,请参见[“管理服务资产”](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/web/server/ManagementServerProperties.java)源代码和“[actuator.html](actuator.html#actuator.monitoring.customizing-management-server-port)”中的“生产就绪特性”部分。 +有关更多详细信息,请参见[`DataSource`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-actuator-autofigure/SRC/main/java/org/springframework/boot/actuate/actuate/autofconfigure/web/server/managementserverproperties.java)源代码和“[actuator.html](actuator.html#actuator.monitoring.customizing-management-server-port)”部分的“production-re ### 12.2.自定义“白标”错误页面 -Spring 启动安装一个“WhiteLabel”错误页面,如果遇到服务器错误(使用 JSON 和其他媒体类型的机器客户端应该会看到一个具有正确错误代码的合理响应),你将在浏览器客户端中看到该页面。 +Spring 如果遇到服务器错误(使用 JSON 和其他媒体类型的机器客户端应该看到具有正确错误代码的合理响应),则启动安装你在浏览器客户端中看到的“WhiteLabel”错误页面。 | |设置`server.error.whitelabel.enabled=false`关闭默认的错误页。
这样做会恢复你正在使用的 Servlet 容器的默认值。
注意, Spring boot 仍然尝试解析错误视图,因此你可能应该添加自己的错误页,而不是完全禁用它。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -使用自己的模板技术覆盖错误页面,这取决于你使用的模板技术。例如,如果使用 ThymeLeaf,则可以添加`error.html`模板。如果使用 freemarker,则可以添加`error.ftlh`模板。通常,你需要一个名为`View`的`View`解析,或者一个处理`/error`路径的解析。除非你替换了一些默认配置,否则你应该在`ApplicationContext`中找到`BeanNameViewResolver`,因此名为`@Bean`的`error`将是一种方法。有关更多选项,请参见[“错误的 cautoform”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.java)。 +使用自己的模板技术覆盖错误页面,这取决于你使用的模板技术。例如,如果使用 ThymeLeaf,则可以添加`error.html`模板。如果使用 freemarker,则可以添加`error.ftlh`模板。通常,需要一个名为`View`的`View`解析,或者一个处理`@Controller`路径的`@Controller`解析。除非你替换了一些默认配置,否则你应该在`ApplicationContext`中找到一个`BeanNameViewResolver`,所以一个名为`@Bean`的`error`将是这样做的一种方式。参见[`ErrorMvcAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/SpringFramework/boot/autofigure/autofigure/web/ Servlet/error/errormvcautofconfiguration.javoration)以获取更多选项。 -有关如何在 Servlet 容器中注册处理程序的详细信息,请参见“[@enableBatchProcessing](https://docs.spring.io/spring-batch/docs/4.3.5/api/org/springframework/batch/core/configuration/annotation/EnableBatchProcessing.html)”一节。 +有关如何在 Servlet 容器中注册处理程序的详细信息,请参见“[错误处理](web.html#web.servlet.spring-mvc.error-handling)”一节。 ### 12.3.清除敏感值 -由`env`和`configprops`端点返回的信息可能有些敏感,因此默认情况下匹配某些模式的键将被清除(即它们的值被`******`代替)。 Spring 对于这样的密钥,引导使用合理的默认值:任何以单词“password”、“secret”、“key”、“token”、“vcap\_services”、“sun.java.command”结尾的密钥都是完全净化的。此外,将单词`credentials`(配置为正则表达式,即`.*credentials.*`)作为键的一部分的任何键也将被完全清除。 +由`env`和`configprops`端点返回的信息可能比较敏感,因此默认情况下匹配某些模式的键将被清除(即它们的值被`******`代替)。 Spring 对于这样的密钥,引导使用合理的默认值:任何以单词“password”、“secret”、“key”、“token”、“vcap\_services”、“sun.java.command”结尾的密钥都是完全净化的。此外,将单词`credentials`(配置为正则表达式,即`.*credentials.*`)作为键的一部分的任何键也将被完全清除。 -此外, Spring 引导将使用以下结尾之一的键的类 URI 值的敏感部分净化: +此外, Spring 引导使用以下结尾之一来清除键的类 URI 值的敏感部分: * `address` @@ -2439,13 +2439,13 @@ Spring 启动安装一个“WhiteLabel”错误页面,如果遇到服务器错 * `urls` -使用`://:@:/`格式标识 URI 的敏感部分。例如,对于属性`myclient.uri=http://user1:[[email protected]](/cdn-cgi/l/email-protection):8081`,得到的净化值是 `http://user1:******@localhost:8081`。 +URI 的敏感部分使用`://:@:/`格式标识。例如,对于属性`myclient.uri=http://user1:[[email protected]](/cdn-cgi/l/email-protection):8081`,生成的经过净化的值是`http://user1:******@localhost:8081`。 `env`和`configprops`端点使用的默认模式可以分别使用`management.endpoint.env.keys-to-sanitize`和`management.endpoint.configprops.keys-to-sanitize`替换。或者,可以使用`management.endpoint.env.additional-keys-to-sanitize`和`management.endpoint.configprops.additional-keys-to-sanitize`来配置其他模式。 ### 12.4.将健康指标映射到千分尺指标 -Spring 引导健康指示器返回一个`Status`类型,以指示整个系统的健康状况。如果你想要监视或提醒特定应用程序的健康水平,那么可以使用 Micrometer 将这些状态导出为度量。默认情况下,状态代码“上”、“下”、“Out\_of\_service”和“unknown”在 Spring boot 中使用。要导出这些值,你需要将这些状态转换为一组数字,以便它们可以与千分尺`Gauge`一起使用。 +Spring 引导健康指示器返回一个`Status`类型,以指示整个系统的健康状况。如果你想要监视或提醒特定应用程序的健康水平,那么可以使用 Micrometer 将这些状态导出为度量。默认情况下,状态代码“上”、“下”、“Out\_of\_Service”和“Unknown”用于 Spring 引导。要导出这些值,你需要将这些状态转换为一组数字,以便它们可以与千分尺`Gauge`一起使用。 下面的示例展示了一种编写这种输出器的方法: @@ -2485,23 +2485,23 @@ public class MyHealthMetricsExportConfiguration { ## 13. 安全 -本节讨论了使用 Spring 引导时的安全性问题,包括在 Spring 引导中使用 Spring 安全性所产生的问题。 +本节讨论了使用 Spring 引导时的安全性问题,包括在 Spring 引导时使用 Spring 安全性所产生的问题。 有关 Spring 安全性的更多信息,请参见[Spring Security project page](https://spring.io/projects/spring-security)。 ### 13.1.关闭 Spring 启动安全配置 ### -如果在应用程序中使用`Status`或`SecurityFilterChain` Bean 定义,则会在 Spring 启动时关闭默认的 WebApp 安全设置。 +如果在应用程序中使用`WebSecurityConfigurerAdapter`或`SecurityFilterChain` Bean 定义`@Configuration`,则会在 Spring 引导中关闭默认的 WebApp 安全设置。 ### 13.2.更改 UserDetailsService 并添加用户帐户 ### -如果提供`@Bean`、`AuthenticationProvider`或`UserDetailsService`类型的`@Bean`,则不会创建`@Bean`的默认`@Bean`。这意味着你拥有 Spring 安全性的完整功能集(例如[各种身份验证选项](https://docs.spring.io/spring-security/reference/5.6.2/servlet/authentication/index.html))。 +如果提供`AuthenticationManager`、`AuthenticationProvider`或`UserDetailsService`类型的`View`,则不会创建`InMemoryUserDetailsManager`的默认。这意味着你拥有 Spring 安全性的完整功能集(例如[各种身份验证选项](https://docs.spring.io/spring-security/reference/5.6.2/servlet/authentication/index.html))。 -添加用户帐户的最简单方法是提供自己的`UserDetailsService` Bean。 +添加用户帐户的最简单方法是提供你自己的`UserDetailsService` Bean。 ### 13.3.在代理服务器后面运行时启用 HTTPS -对于任何应用程序来说,确保你的所有主要端点仅在 HTTPS 上可用都是一项重要的工作。如果你使用 Tomcat 作为 Servlet 容器,那么 Spring 启动将自动添加 Tomcat 自己的`RemoteIpValve`,如果它检测到某些环境设置,并且你应该能够依赖`HttpServletRequest`来报告它是否安全(甚至在处理真正的 SSL 终止的代理服务器的下游)。标准行为是由某些请求头的存在或不存在决定的(“x-forward-for”和`x-forwarded-proto`),它们的名称是常规的,因此它应该与大多数前端代理一起工作。可以通过向`application.properties`添加一些条目来打开阀门,如以下示例所示: +对于任何应用程序来说,确保你的所有主要端点仅在 HTTPS 上可用都是一项重要的工作。如果你使用 Tomcat 作为 Servlet 容器,那么 Spring 启动将自动添加 Tomcat 自己的`RemoteIpValve`,如果它检测到某些环境设置,并且你应该能够依赖`UserDetailsService`来报告它是否安全(甚至在处理真正的 SSL 终止的代理服务器的下游)。标准行为是由某些请求头的存在或不存在决定的(`x-forwarded-for`和`x-forwarded-proto`),它们的名称是常规的,因此它应该与大多数前端代理一起工作。可以通过向`application.properties`添加一些条目来打开阀门,如以下示例所示: Properties @@ -2550,33 +2550,33 @@ Spring 启动支持热交换。这一部分回答了有关它如何工作的问 ### 14.1.重新加载静态内容 -热重装有几种选择。推荐的方法是使用`addresses`,因为它提供了额外的开发时功能,例如支持快速应用程序重启和 LiveReload 以及合理的开发时配置(例如模板缓存)。DevTools 通过监视 Classpath 的变化来工作。这意味着静态资源更改必须“构建”以使更改生效。默认情况下,在 Eclipse 中,当你保存更改时,这会自动发生。在 IntelliJ IDEA 中,make 项目命令触发了必要的构建。由于[默认重启排除项](using.html#using.devtools.restart.excluding-resources),对静态资源的更改不会触发应用程序的重新启动。然而,它们确实会触发一次实时重装。 +热重装有几种选择。推荐的方法是使用[`spring-boot-devtools`](使用.html#using.devtools),因为它提供了额外的开发时功能,例如支持快速应用程序重启和 LiveReload 以及合理的开发时配置(例如模板缓存)。DevTools 通过监视 Classpath 的变化来工作。这意味着静态资源更改必须“构建”以使更改生效。默认情况下,在 Eclipse 中,当你保存更改时,这会自动发生。在 IntelliJ IDEA 中,make 项目命令触发了必要的构建。由于[默认重启排除项](using.html#using.devtools.restart.excluding-resources),对静态资源的更改不会触发应用程序的重新启动。然而,它们确实会触发一次实时重装。 或者,在 IDE 中运行(尤其是在调试的情况下)是进行开发的一种好方法(所有现代 IDE 都允许重新加载静态资源,并且通常还允许对 Java 类的更改进行热交换)。 -最后,可以配置[Maven and Gradle plugins](build-tool-plugins.html#build-tool-plugins)(参见`addResources`属性)以支持从命令行运行,并直接从源重新加载静态文件。如果你使用更高级的工具编写代码,那么你可以将其与外部 CSS/JS 编译器进程一起使用。 +最后,[Maven and Gradle plugins](build-tool-plugins.html#build-tool-plugins)可以配置(参见`addResources`属性)以支持从命令行运行,并直接从源重新加载静态文件。如果你使用更高级的工具编写代码,那么你可以将其与外部 CSS/JS 编译器进程一起使用。 ### 14.2.在不重新启动容器的情况下重新加载模板 -Spring Boot 支持的大多数模板化技术包括禁用缓存的配置选项(本文将在后面描述)。如果你使用[自动配置](using.html#using.devtools.property-defaults)模块,这些属性在开发时对你来说是[自动配置](using.html#using.devtools.property-defaults)。 +Spring Boot 支持的大多数模板化技术都包括禁用缓存的配置选项(本文将在后面描述)。如果你使用`spring-boot-devtools`模块,那么在开发时,这些属性对你来说就是[自动配置](using.html#using.devtools.property-defaults)。 #### 14.2.1.百香叶模板 -如果使用 thymeleaf,请将`spring.thymeleaf.cache`设置为`false`。有关其他胸腺叶自定义选项,请参见[胸腺叶自动构型](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java)。 +如果使用 thymeleaf,请将`spring.thymeleaf.cache`设置为`false`。参见[`ThymeleafAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/thymeleautofconfiguration.javoration)了解其他 thymeleaf 定制选项。 #### 14.2.2.自由标记模板 -如果使用 freemarker,请将`false`设置为`false`。有关其他自由标记定制选项,请参见[FreemarkerAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java)。 +如果使用 freemarker,请将`spring.freemarker.cache`设置为`false`。参见[`FreeMarkerAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/autofigure/fremark/freemortification.java)了解其他自由标记定制选项。 #### 14.2.3.Groovy 模板 -如果使用 Groovy 模板,请将`spring.groovy.template.cache`设置为`false`。有关其他 Groovy 定制选项,请参见[GroovytemplateAutoConfiguration](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java)。 +如果使用 Groovy 模板,请将`spring.groovy.template.cache`设置为`false`。参见[`false`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofconfigure/groovy/templatautofconfiguration.javis)以获取其他 Groovy 定制选项。 ### 14.3.快速应用程序重启 `spring-boot-devtools`模块包括对应用程序自动重启的支持。虽然没有[JRebel](https://www.jrebel.com/products/jrebel)等技术那么快,但它通常比“冷启动”快得多。在研究本文后面讨论的一些更复杂的重新加载选项之前,你可能应该尝试一下。 -有关更多详细信息,请参见[using.html](using.html#using.devtools)小节。 +有关更多详细信息,请参见[using.html](using.html#using.devtools)部分。 ### 14.4.在不重新启动容器的情况下重新加载 Java 类 ### @@ -2586,7 +2586,7 @@ Spring Boot 支持的大多数模板化技术包括禁用缓存的配置选项 Spring 引导包括许多测试实用程序和支持类,以及提供公共测试依赖关系的专用启动器。这一节回答了有关考试的常见问题。 -### 15.1.使用 Spring 安全性进行测试 +### 15.1.用 Spring 安全性进行测试 Spring 安全性为作为特定用户运行测试提供了支持。例如,下面代码片段中的测试将与具有`ADMIN`角色的经过身份验证的用户一起运行。 @@ -2618,11 +2618,11 @@ class MySecurityTests { Spring 安全性提供了与 Spring MVC 测试的全面集成,并且这也可以在使用`@WebMvcTest`切片和`MockMvc`测试控制器时使用。 -有关 Spring Security 的测试支持的更多详细信息,请参见 Spring Security 的[参考文献](https://docs.spring.io/spring-security/reference/5.6.2/servlet/test/index.html)。 +有关 Spring Security 的测试支持的更多详细信息,请参见 Spring Security 的`main`。 ### 15.2.使用 TestContainers 进行集成测试 -[Testcontainers](https://www.testcontainers.org/)库提供了一种管理在 Docker 容器中运行的服务的方法。它集成了 JUnit,允许你编写一个测试类,可以在运行任何测试之前启动一个容器。TestContainers 对于编写与真正的后端服务(如 MySQL、MongoDB、Cassandra 等)对话的集成测试特别有用。 Spring 启动测试中可以使用 TestContainers,如下所示: +[测试容器](https://www.testcontainers.org/)库提供了一种管理在 Docker 容器中运行的服务的方法。它集成了 JUnit,允许你编写一个测试类,可以在运行任何测试之前启动一个容器。TestContainers 对于编写与真正的后端服务(如 MySQL、MongoDB、Cassandra 等)对话的集成测试特别有用。 Spring 启动测试中可以使用 TestContainers,如下所示: ``` import org.junit.jupiter.api.Test; @@ -2650,7 +2650,7 @@ class MyIntegrationTests { 这将在运行任何测试之前启动运行 NEO4j 的 Docker 容器(如果 Docker 在本地运行)。在大多数情况下,你将需要使用正在运行的容器中的详细信息来配置应用程序,例如容器 IP 或端口。 -这可以通过允许向 Spring 环境中添加动态属性值的静态`SpringApplication`方法来完成。 +这可以通过静态`@DynamicPropertySource`方法来完成,该方法允许向 Spring 环境添加动态属性值。 ``` import org.junit.jupiter.api.Test; @@ -2687,7 +2687,7 @@ class MyIntegrationTests { ## 16. 建立 -Spring 引导包括 Maven 和 Gradle 的构建插件。本节回答有关这些插件的常见问题。 +Spring 引导包括用于 Maven 和 Gradle 的构建插件。本节回答有关这些插件的常见问题。 ### 16.1.生成构建信息 @@ -2714,7 +2714,7 @@ Maven 插件和 Gradle 插件都允许生成包含项目的坐标、名称和版
``` -| |有关更多详细信息,请参见[Spring Boot Maven Plugin documentation](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#goals-build-info)。| +| |有关更多详细信息,请参见**全部**。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| 下面的示例对 Gradle 执行相同的操作: @@ -2732,7 +2732,7 @@ springBoot { Maven 和 Gradle 都允许生成一个`git.properties`文件,该文件包含有关在构建项目时你的`git`源代码库的状态的信息。 -对于 Maven 用户,`spring-boot-starter-parent` POM 包括一个预先配置的插件以生成`git.properties`文件。要使用它,请将`git.properties`的以下声明添加到你的 POM 中: +对于 Maven 用户,`spring-boot-starter-parent` POM 包括一个预先配置的插件以生成`git.properties`文件。要使用它,请将[`Git Commit Id Plugin`](https://github.com/git-commit-id/git-commit-id- Maven-plugin)的以下声明添加到你的 POM: ``` @@ -2745,7 +2745,7 @@ Maven 和 Gradle 都允许生成一个`git.properties`文件,该文件包含 ``` -Gradle 用户可以通过使用[`gradle-git-properties`](https://plugins.gradle.org/plugin/com.gorylenko.gradle-git-properties)插件来实现相同的结果,如以下示例所示: +Gradle 用户可以通过使用[`gradle-git-properties`](https://plugins. Gradle.org/plugin/com.gorylenko. Gradle-git-properties)插件来实现相同的结果,如以下示例所示: ``` plugins { @@ -2760,18 +2760,18 @@ Maven 和 Gradle 插件都允许配置`git.properties`中包含的属性。 ### 16.3.自定义依赖版本 -`spring-boot-dependencies` POM 管理公共依赖关系的版本。 Spring Maven 和 Gradle 的引导插件允许使用构建属性定制这些托管依赖版本。 +`spring-boot-dependencies` POM 管理公共依赖关系的版本。 Maven 和 Gradle 的 Spring 引导插件允许使用构建属性定制这些托管依赖版本。 | |Spring 每个启动版本都是针对这一组特定的第三方依赖关系进行设计和测试的。
重写版本可能会导致兼容性问题。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------| -要用 Maven 重写依赖版本,请参见 Maven 插件文档中的[this section](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#using)。 +要用 Maven 重写依赖版本,请参见 Maven 插件文档中的[本节](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#using)。 -要重写 Gradle 中的依赖关系版本,请参见 Gradle 插件文档中的[this section](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#managing-dependencies-dependency-management-plugin-customizing)。 +要重写 Gradle 中的依赖关系版本,请参见 Gradle 插件文档中的[本节](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#managing-dependencies-dependency-management-plugin-customizing)。 ### 16.4.用 Maven 创建可执行文件 jar -
可用于创建可执行的“fat” jar。如果你使用`spring-boot-starter-parent` POM,你可以声明该插件,并且你的 JAR 被重新打包如下: +`spring-boot-maven-plugin`可用于创建可执行的“fat” jar。如果你使用`spring-boot-starter-parent` POM,你可以声明该插件,并且你的 JAR 被重新打包如下: ``` @@ -2784,7 +2784,7 @@ Maven 和 Gradle 插件都允许配置`git.properties`中包含的属性。 ``` -如果不使用父 POM,则仍然可以使用该插件。但是,你必须另外添加``部分,如下所示: +如果你不使用父 POM,你仍然可以使用该插件。但是,你必须另外添加``部分,如下所示: ``` @@ -2811,7 +2811,7 @@ Maven 和 Gradle 插件都允许配置`git.properties`中包含的属性。 与 WAR 文件一样, Spring 引导应用程序不打算用作依赖项。如果你的应用程序包含希望与其他项目共享的类,那么推荐的方法是将该代码移动到单独的模块中。然后,你的应用程序和其他项目可以依赖于单独的模块。 -如果无法按照上面的建议重新排列代码,则必须配置 Spring boot 的 Maven 和 Gradle 插件,以生成一个单独的工件,该工件适合用作依赖项。可执行归档文件不能作为[executable jar format](executable-jar.html#appendix.executable-jar.nested-jars.jar-structure)中的`BOOT-INF/classes`包应用程序类的依赖项使用。这意味着当可执行文件 jar 用作依赖项时,无法找到它们。 +如果不能按照上面的建议重新排列代码,则必须对 Spring 引导的 Maven 和 Gradle 插件进行配置,以生成一个单独的工件,该工件适合用作依赖项。可执行归档文件不能作为[executable jar format](executable-jar.html#appendix.executable-jar.nested-jars.jar-structure)中的`BOOT-INF/classes`包应用程序类的依赖项使用。这意味着当可执行文件 jar 用作依赖项时,无法找到它们。 要生成两个工件(一个可用作依赖项,另一个可执行),必须指定一个分类器。此分类器应用于可执行归档的名称,将默认归档作为依赖项使用。 @@ -2840,7 +2840,7 @@ jar 可执行文件中的大多数嵌套库不需要解压缩才能运行。然 | |应该注意确保配置了你的操作系统,以便在应用程序仍在运行时,它不会删除已解压缩到临时目录的 JAR。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -例如,为了表明应该使用 Maven 插件标记 JRuby 以进行解包,你可以添加以下配置: +例如,为了表明应该使用 Maven 插件标记 JRuby 以进行解包,你需要添加以下配置: ``` @@ -2861,11 +2861,11 @@ jar 可执行文件中的大多数嵌套库不需要解压缩才能运行。然 ``` -### 16.7.创建带有排除项的不可执行程序 jar +### 16.7.创建带有排除项的不可执行文件 jar jar 通常,如果将可执行文件和不可执行文件作为两个单独的构建产品,则可执行版本具有库 jar 中不需要的附加配置文件。例如,`application.yml`配置文件可能被从非可执行文件 jar 中排除。 -在 Maven 中,可执行文件 jar 必须是主要工件,并且可以为库添加一个分类文件 jar,如下所示: +在 Maven 中,可执行文件 jar 必须是主要工件,并且可以为库添加一个分类 jar,如下所示: ``` @@ -2898,17 +2898,17 @@ jar 通常,如果将可执行文件和不可执行文件作为两个单独的 ### 16.8.用 Maven 启动的 Spring 启动应用程序的远程调试 -要将远程调试器附加到用 Maven 启动的 Spring 启动应用程序,可以使用`jvmArguments`属性的[maven plugin](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/)。 +要将远程调试器附加到用 Maven 启动的 Spring 引导应用程序,可以使用`jvmArguments`属性的[maven plugin](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/)。 -有关更多详细信息,请参见[this example](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#run-example-debug)。 +有关更多详细信息,请参见[这个例子](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#run-example-debug)。 -### 16.9.在不使用 Spring-boot-antlib#### 的情况下,从 Ant 构建一个可执行的归档文件 +### 16.9.在不使用 Spring-boot-antlib### 的情况下,从 Ant 构建一个可执行的归档文件 要使用 Ant 进行构建,你需要获取依赖项、进行编译,然后创建 jar 或 WAR 归档。要使其可执行,你可以使用`spring-boot-antlib`模块,也可以遵循以下说明: 1. 如果正在构建 jar,则将应用程序的类和资源打包到嵌套的`BOOT-INF/classes`目录中。如果正在构建 WAR,则像往常一样将应用程序的类打包到嵌套的`WEB-INF/classes`目录中。 -2. 在嵌套的`BOOT-INF/lib`目录中为 jar 或`WEB-INF/lib`目录中为 WAR 添加运行时依赖项。记住**不是**来压缩归档中的条目。 +2. 在嵌套的`BOOT-INF/lib`目录中为 jar 或`WEB-INF/lib`为 WAR 添加运行时依赖项。记住**不是**来压缩归档中的条目。 3. 在嵌套的`BOOT-INF/lib`目录中添加`provided`(嵌入式容器)依赖项,用于 jar 或用于 WAR 的`WEB-INF/lib-provided`。记住**不是**来压缩归档中的条目。 @@ -2944,11 +2944,11 @@ jar 通常,如果将可执行文件和不可执行文件作为两个单独的 ## 17. 传统部署 -Spring 启动支持传统的部署以及更现代的部署形式。本节回答有关传统部署的常见问题。 +Spring 引导支持传统的部署以及更现代的部署形式。本节回答有关传统部署的常见问题。 ### 17.1.创建一个可部署的 WAR 文件 -| |由于 Spring WebFlux 并不严格依赖于 Servlet API,并且应用程序在默认情况下部署在嵌入式的 Reactor Netty 服务器上,因此 WebFlux 应用程序不支持 WAR 部署。| +| |Spring 由于 WebFlux 并不严格依赖于 Servlet API,并且应用程序是默认部署在嵌入式反应堆 Netty 服务器上的,因此 WebFlux 应用程序不支持 WAR 部署。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 生成可部署 WAR 文件的第一步是提供`SpringBootServletInitializer`子类并覆盖其`configure`方法。这样做利用了 Spring Framework 的 Servlet 3.0 支持,并允许你在 Servlet 容器启动应用程序时对其进行配置。通常,你应该更新应用程序的主类以扩展`SpringBootServletInitializer`,如下例所示: @@ -2987,7 +2987,7 @@ public class MyApplication extends SpringBootServletInitializer { apply plugin: 'war' ``` -该过程中的最后一步是确保嵌入式 Servlet 容器不会干扰部署 WAR 文件的 Servlet 容器。要做到这一点,你需要将嵌入的 Servlet 容器依赖标记为已提供的。 +该过程中的最后一步是确保所嵌入的 Servlet 容器不会干扰部署了 WAR 文件的 Servlet 容器。要做到这一点,你需要将嵌入的 Servlet 容器依赖标记为已提供的。 如果使用 Maven,则以下示例将 Servlet 容器( Tomcat,在本例中)标记为被提供的: @@ -3003,7 +3003,7 @@ apply plugin: 'war'
``` -如果使用 Gradle,则以下示例将 Servlet 容器( Tomcat,在本例中)标记为被提供的: +如果使用 Gradle,以下示例将 Servlet 容器( Tomcat,在这种情况下)标记为被提供的: ``` dependencies { @@ -3016,13 +3016,13 @@ dependencies { | |`providedRuntime`优于 Gradle 的`compileOnly`配置。
在其他限制中,`compileOnly`依赖项不在测试 Classpath 上,因此任何基于 Web 的集成测试都会失败。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果使用[Spring Boot build tools](build-tool-plugins.html#build-tool-plugins),将嵌入的 Servlet 容器依赖项标记为提供的,则生成一个可执行的 WAR 文件,该文件包含打包在`lib-provided`目录中的所提供的依赖项。这意味着,除了可以部署到 Servlet 容器之外,还可以通过在命令行上使用`java -jar`来运行应用程序。 +如果使用[Spring Boot build tools](build-tool-plugins.html#build-tool-plugins),将嵌入的 Servlet 容器依赖项标记为提供的,则生成一个可执行的 WAR 文件,其所提供的依赖项打包在`lib-provided`目录中。这意味着,除了可以部署到 Servlet 容器之外,还可以通过在命令行上使用`java -jar`来运行应用程序。 ### 17.2.将现有的应用程序转换为 Spring 引导 ### -要将现有的非 Web Spring 应用程序转换为 Spring 引导应用程序,请替换创建`ApplicationContext`的代码,并将其替换为对`SpringApplication`或`SpringApplicationBuilder`的调用。 Spring MVC Web 应用程序通常易于首先创建可部署的 WAR 应用程序,然后随后将其迁移到可执行的 WAR 或 jar。参见[Getting Started Guide on Converting a jar to a war](https://spring.io/guides/gs/convert-jar-to-war/)。 +要将现有的非 Web Spring 应用程序转换为 Spring 引导应用程序,请替换创建`ApplicationContext`的代码,并将其替换为对`SpringApplication`或`SpringApplicationBuilder`的调用。 Spring MVC Web 应用程序通常适于首先创建可部署的 WAR 应用程序,然后将其稍后迁移到可执行的 WAR 或 jar。参见[Getting Started Guide on Converting a jar to a war](https://spring.io/guides/gs/convert-jar-to-war/)。 -要通过扩展`SpringBootServletInitializer`(例如,在一个名为`Application`的类中)并添加 Spring boot`@SpringBootApplication`注释来创建可部署的 WAR,请使用类似于以下示例中所示的代码: +要通过扩展`SpringBootServletInitializer`(例如,在一个名为[Getting Started Guide on Converting a jar to a war](https://spring.io/guides/gs/convert-jar-to-war/)的类中)并添加 Spring boot`@SpringBootApplication`注释来创建可部署的 WAR,请使用类似于以下示例中所示的代码: ``` import org.springframework.boot.SpringApplication; @@ -3045,19 +3045,19 @@ public class MyApplication extends SpringBootServletInitializer { ``` -请记住,无论你在`sources`中放入什么,都只是一个 Spring `ApplicationContext`。通常情况下,任何已经起作用的东西都应该在这里起作用。可能有一些 bean 可以稍后删除,然后让 Spring Boot 为它们提供自己的默认值,但是在你需要这样做之前,应该有可能使某些工作正常进行。 +请记住,无论你在`sources`中放入什么,都只是一个 Spring `ApplicationContext`。通常情况下,任何已经起作用的东西都应该在这里起作用。可能有一些 bean 可以稍后删除,并让 Spring boot 为它们提供自己的默认值,但是在你需要这样做之前,应该有可能使某些工作正常进行。 -静态资源可以在 Classpath 根中移动到`/public`(或`/static`或`/resources`或`/META-INF/resources`)。这同样适用于`messages.properties`( Spring boot 在 Classpath 的根中自动检测)。 +静态资源可以在 Classpath 根中移动到`/public`(或`/static`或[Getting Started Guide on Converting a jar to a war](https://spring.io/guides/gs/convert-jar-to-war/)或`/META-INF/resources`)。这同样适用于`messages.properties`( Spring boot 在 Classpath 的根中自动检测)。 -Spring `DispatcherServlet`和 Spring 安全性的普通用法应该不需要进一步的更改。如果你的应用程序中有其他特性(例如,使用其他 servlet 或过滤器),那么你可能需要通过替换`web.xml`中的那些元素,向`Application`上下文添加一些配置,如下所示: +Spring `DispatcherServlet`和 Spring 安全性的普通用法应该不需要进一步的更改。如果你的应用程序中有其他功能(例如,使用其他 servlet 或过滤器),则可能需要通过替换`web.xml`中的那些元素,向`Application`上下文添加一些配置,如下所示: -* `@Bean`或`ServletRegistrationBean`类型的`@Bean`将 Bean 安装到容器中,就好像它是``和``中的`web.xml`一样。 +* 类型为`Servlet`或`ServletRegistrationBean`的`@Bean`将 Bean 安装到容器中,就好像它是``和``中的容器一样。 -* 类型`Filter`或`FilterRegistrationBean`的`ADMIN`的行为类似(如``和``)。 +* 类型`Filter`或`FilterRegistrationBean`的`@Bean`的行为类似(如``和``)。 -* XML 文件中的`ApplicationContext`可以通过``中的`Application`添加。或者,注释配置已经被大量使用的情况可以用几行重新创建`@Bean`定义。 +* XML 文件中的`ApplicationContext`可以通过`@ImportResource`中的`Application`添加。或者,注释配置已经被大量使用的情况可以用几行重新创建`@Bean`定义。 -一旦 WAR 文件开始工作,你就可以通过在`Application`中添加`main`方法使其可执行,如以下示例所示: +一旦 WAR 文件开始工作,你就可以通过向你的`Application`添加`main`方法使其可执行,如以下示例所示: ``` public static void main(String[] args) { @@ -3066,14 +3066,14 @@ public static void main(String[] args) { ``` -| |如果你打算以 WAR 或可执行应用程序的形式启动你的应用程序,你需要在一个方法中共享构建器的自定义。这对`SpringBootServletInitializer`回调都是可用的而在`main`方法中的一个类类似于:

``
Import org.SpringFramework.Boot.Banner;
Import org.SpringFramework.Boot.Boot.216.SpringBuilder;<1210"/>Import org.SpringtFramework.gt=”[SpringtBuilder]。支持.SpringtExtExtends;“/”/“公共应用程序 =”/“SpringtServframework=”/“初始化应用程序 =”@styletIntegtApplicalizr=main{
CustomizerBuilder(New SpringApplicationBuilder())).run;


Private Static SpringationBuilder CustomizerBuilder{<
Return Builder.sources.sources(myApplication.class).bannermode(banner.mode.mode.gt=“1226”/>gt r=“1227”/><1228"gt r="/>“1230”<>“>”>“>”r=“qt=”qt| +| |如果你打算以 WAR 或可执行应用程序的形式启动你的应用程序,你需要在一个方法中共享构建器的自定义,该方法对`SpringBootServletInitializer`回调和`main`方法都是可用的,其类类似于:

| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 应用程序可以分为多个类别: * Servlet 3.0+no`web.xml`的应用程序。 -* 带有
的应用程序。 +* 带有`web.xml`的应用程序。 * 具有上下文层次结构的应用程序。 @@ -3081,9 +3081,9 @@ public static void main(String[] args) { 所有这些都应该易于翻译,但每一种可能需要略有不同的技术。 -Servlet 3.0+ 应用程序如果已经使用了 Spring Servlet 3.0+ 初始化器支持类,则可以非常容易地进行转换。通常,来自现有`WebApplicationInitializer`的所有代码都可以移动到`SpringBootServletInitializer`中。如果你现有的应用程序有多个`AbstractDispatcherServletInitializer`(例如,如果它使用`AbstractDispatcherServletInitializer`),那么你可以将所有的上下文源合并到一个`SpringApplication`中。你可能遇到的主要复杂情况是,如果合并不起作用,并且需要维护上下文层次结构。有关示例,请参见[关于建立层次结构的条目](#howto.application.context-hierarchy)。包含特定于 Web 的特性的现有父上下文通常需要分解,以便所有`ServletContextAware`组件都在子上下文中。 +Servlet 3.0+ 应用程序如果已经使用了 Spring Servlet 3.0+ 初始化器支持类,可能会非常容易地进行转换。通常,来自现有`WebApplicationInitializer`的所有代码都可以移动到`SpringBootServletInitializer`中。如果你现有的应用程序有多个`ApplicationContext`(例如,如果它使用`AbstractDispatcherServletInitializer`),那么你可以将所有的上下文源合并到一个`main`中。你可能遇到的主要复杂情况是,如果合并不起作用,并且需要维护上下文层次结构。有关示例,请参见[关于建立层次结构的条目](#howto.application.context-hierarchy)。包含特定于 Web 的特性的现有父上下文通常需要分解,以便所有`ServletContextAware`组件都在子上下文中。 -Spring 尚未应用的应用程序可以转换为 Spring 引导应用程序,并且前面提到的指导可能会有所帮助。然而,你可能还会遇到问题。在这种情况下,我们建议[asking questions on Stack Overflow with a tag of `spring-boot`](https://stackoverflow.com/questions/tagged/spring-boot)。 +Spring 应用程序可能可转换为 Spring 引导应用程序,而前面提到的指导可能会有所帮助。然而,你可能还会遇到问题。在这种情况下,我们建议[使用`spring-boot`标记在堆栈溢出上提出问题](https://stackoverflow.com/questions/tagged/ Spring-boot)。 ### 17.3.向 WebLogic 部署一场战争 diff --git a/docs/spring-boot/io.md b/docs/spring-boot/io.md index c412490aa8c40c57ae91dc8069c100d2da1365c2..dc992167cef9438e007ef06798082a04f73cf86a 100644 --- a/docs/spring-boot/io.md +++ b/docs/spring-boot/io.md @@ -4,9 +4,9 @@ ## 1. 缓存 -Spring 框架为透明地向应用程序添加缓存提供了支持。在其核心部分,抽象将缓存应用于方法,从而减少了基于缓存中可用信息的执行次数。缓存逻辑是透明地应用的,不会对调用者造成任何干扰。 Spring 只要使用`@EnableCaching`注释启用缓存支持,启动就会自动配置缓存基础设施。 +Spring 框架提供了对向应用程序透明地添加缓存的支持。在其核心部分,抽象将缓存应用于方法,从而减少了基于缓存中可用信息的执行次数。缓存逻辑是透明地应用的,不会对调用程序造成任何干扰。 Spring 只要使用`@EnableCaching`注释启用缓存支持,启动就会自动配置缓存基础设施。 -| |查看 Spring 框架引用的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#cache)以获取更多详细信息。| +| |查看 Spring 框架引用的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#cache)以获得更多详细信息。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 简而言之,要将缓存添加到服务的操作中,请将相关的注释添加到其方法中,如以下示例所示: @@ -32,7 +32,7 @@ public class MyMathService { | |你也可以透明地使用标准的 JSR-107 注释(例如`@CacheResult`)。但是,我们强烈建议你不要混合和匹配 Spring 缓存和 JCache 注释。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果不添加任何特定的缓存库, Spring 引导自动配置一个[simple provider](#io.caching.provider.simple),它在内存中使用并发映射。当需要缓存时(例如前面示例中的`piDecimals`),此提供程序将为你创建它。简单的提供者并不是真正推荐用于生产使用的,但是它对于开始使用和确保你了解这些特性是非常好的。当你决定使用缓存提供程序时,请务必阅读其文档,以了解如何配置应用程序使用的缓存。几乎所有的提供程序都要求你显式地配置应用程序中使用的每个缓存。一些提供了一种方法来定制由`spring.cache.cache-names`属性定义的默认缓存。 +如果不添加任何特定的缓存库, Spring 引导自动配置一个[简单提供者](#io.caching.provider.simple),它在内存中使用并发映射。当需要缓存时(例如前面示例中的`piDecimals`),此提供程序将为你创建它。简单的提供者并不是真正推荐用于生产使用的,但是它对于开始使用和确保你了解这些特性是非常好的。当你决定使用缓存提供程序时,请务必阅读其文档,以了解如何配置应用程序使用的缓存。几乎所有的提供程序都要求你显式地配置应用程序中使用的每个缓存。一些提供了一种方法来定制由`spring.cache.cache-names`属性定义的默认缓存。 | |还可以透明地从缓存中获取[update](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#cache-annotations-put)或[evict](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#cache-annotations-evict)数据。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -41,13 +41,13 @@ public class MyMathService { 缓存抽象不提供实际的存储,而是依赖于由`org.springframework.cache.Cache`和`org.springframework.cache.CacheManager`接口实现的抽象。 -如果你还没有定义类型`CacheManager`的 Bean 或名为`cacheResolver`的`CacheResolver`(参见[“CachingConfigurer”](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/cache/annotation/CachingConfigurer.html)), Spring 引导将尝试检测以下提供程序(按指定的顺序): +如果你没有定义类型`CacheManager`的 Bean 或类型`CacheResolver`的`cacheResolver`(参见[`CachingConfigurer`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/cache/annotation/cachingconfigurer.html)), Spring boot 将尝试检测以下提供者(按指定的顺序): 1. [Generic](#io.caching.provider.generic) 2. [JCache(JSR-107)](#io.caching.provider.jcache)(Ehcache3、黑泽尔卡斯特、Infinispan 等) -3. [EhCache 2.x](#io.caching.provider.ehcache2) +3. [Ehcache2.x](#io.caching.provider.ehcache2) 4. [Hazelcast](#io.caching.provider.hazelcast) @@ -64,7 +64,7 @@ public class MyMathService { | |通过设置`spring.cache.type`属性,也可以*力*特定的缓存提供程序。
如果在某些环境(例如测试)中需要[完全禁用缓存](#io.caching.provider.none),请使用此属性。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |使用`spring-boot-starter-cache`“starter”快速添加基本的缓存依赖关系。
starter 带来`spring-context-support`。
如果手动添加依赖关系,则必须包含`spring-context-support`才能使用 jcache、ehcache2.x 或咖啡因支持。| +| |使用`spring-boot-starter-cache`“starter”快速添加基本的缓存依赖关系。
starter 带来`spring-context-support`。
如果手动添加依赖关系,则必须包含`spring-context-support`才能使用 JCache、EhCache2.x 或咖啡因支持。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果`CacheManager`是通过 Spring 引导自动配置的,那么可以通过公开实现`CacheManagerCustomizer`接口的 Bean 来在它完全初始化之前进一步优化其配置。下面的示例设置了一个标志,表示`null`值不应向下传递到底层映射: @@ -98,7 +98,7 @@ public class MyCacheManagerConfiguration { [JCache](https://jcp.org/en/jsr/detail?id=107)是通过在 Classpath 上存在`javax.cache.spi.CachingProvider`(即在 Classpath 上存在符合 JSR-107 的缓存库)来引导的,而`JCacheCacheManager`是由`spring-boot-starter-cache`“starter”提供的。各种兼容的库是可用的,并且 Spring Boot 为 Ehcache3、HazelCast 和 Infinispan 提供了依赖管理。还可以添加任何其他兼容的库。 -可能会出现多个提供程序,在这种情况下,必须显式地指定提供程序。 Spring 即使 JSR-107 标准没有强制使用一种标准化的方式来定义配置文件的位置, Spring Boot 也会尽最大的努力来适应使用实现细节来设置缓存,如下面的示例所示: +可能会出现多个提供程序,在这种情况下,必须显式地指定提供程序。 Spring 即使 JSR-107 标准没有强制使用一种标准化的方式来定义配置文件的位置, Spring Boot 也会尽其所能地适应使用实现细节来设置缓存,如以下示例所示: 属性 @@ -131,7 +131,7 @@ spring: * `org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer`bean 是用`CacheManager`的引用调用的,用于完全定制。 -| |如果定义了一个标准的`javax.cache.CacheManager` Bean,则它会自动包装在抽象所期望的`org.springframework.cache.CacheManager`实现中。
不会对其应用进一步的自定义。| +| |如果定义了一个标准`javax.cache.CacheManager` Bean,则它会自动包装在抽象所期望的`org.springframework.cache.CacheManager`实现中。
不会对其应用进一步的自定义。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.3.Ehcache2.x @@ -178,7 +178,7 @@ spring: 通过设置`spring.cache.cache-names`属性,可以在启动时创建缓存。如果定义了自定义`ConfigurationBuilder` Bean,则使用它来定制缓存。 -| |Spring boot 中对 Infinispan 的支持仅限于嵌入式模式,非常基本。
如果你想要更多选项,应该使用官方的 Infinispan Spring boot starter。
查看[Infinispan 的文档](https://github.com/infinispan/infinispan-spring-boot)了解更多详细信息。| +| |Spring boot 中对 Infinispan 的支持仅限于嵌入式模式,非常基本。
如果你想要更多选项,应该使用官方的 Infinispan Spring boot starter。
有关更多详细信息,请参见[Infinispan 的文档](https://github.com/infinispan/infinispan-spring-boot)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.6.Couchbase @@ -356,22 +356,22 @@ spring: 如果[Hazelcast](https://hazelcast.com/)在 Classpath 上,并且找到了合适的配置, Spring 引导自动配置一个`HazelcastInstance`,你可以将其注入到应用程序中。 -Spring 通过检查以下配置选项,启动首先尝试创建客户端: +Spring 引导首先尝试通过检查以下配置选项来创建客户端: -* 存在`com.hazelcast.client.config.ClientConfig` Bean。 +* a`com.hazelcast.client.config.ClientConfig` Bean 的存在。 * 由`spring.hazelcast.config`属性定义的配置文件。 * 存在`hazelcast.client.config`系统属性。 -* 在 Classpath 的工作目录或根目录中的`hazelcast-client.xml`。 +* Classpath 的工作目录或根目录中的`hazelcast-client.xml`。 -* 在 Classpath 的工作目录或根目录中的`hazelcast-client.yaml`。 +* Classpath 的工作目录或根目录中的`hazelcast-client.yaml`。 | |Spring Boot 同时支持 Hazelcast4 和 Hazelcast3。
如果降级为 Hazelcast3,则应将`hazelcast-client`添加到 Classpath 中以配置客户端。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring 如果无法创建客户端,则引导尝试配置嵌入式服务器。如果你定义了`com.hazelcast.config.Config` Bean, Spring boot 将使用它。如果你的配置定义了一个实例名, Spring 引导将尝试定位一个现有的实例,而不是创建一个新的实例。 +如果不能创建客户端, Spring 引导将尝试配置嵌入式服务器。如果你定义了`com.hazelcast.config.Config` Bean, Spring boot 就会使用它。如果你的配置定义了一个实例名, Spring 引导将尝试定位一个现有的实例,而不是创建一个新的实例。 你还可以指定通过配置使用的 HazelCast 配置文件,如以下示例所示: @@ -389,7 +389,7 @@ spring: config: "classpath:config/my-hazelcast.xml" ``` -否则, Spring 引导将尝试从默认位置查找 HazelCast 配置:工作目录中或 Classpath 根目录中的`hazelcast.xml`,或相同位置中的`.yaml`对应位置。我们还检查`hazelcast.config`系统属性是否已设置。有关更多详细信息,请参见[Hazelcast 文档](https://docs.hazelcast.org/docs/latest/manual/html-single/)。 +否则, Spring 引导将尝试从默认位置查找 Hazelcast 配置:在工作目录中或 Classpath 的根目录中的`hazelcast.xml`,或在相同位置中的`.yaml`对应位置。我们还检查`hazelcast.config`系统属性是否已设置。有关更多详细信息,请参见[Hazelcast 文档](https://docs.hazelcast.org/docs/latest/manual/html-single/)。 | |Spring 引导还具有[对 HazelCast 的显式缓存支持](#io.caching.provider.hazelcast)。
如果启用了缓存,`HazelcastInstance`将自动包装在`CacheManager`实现中。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -400,7 +400,7 @@ Spring Boot 为使用[石英调度器](https://www.quartz-scheduler.org/)提供 以下类型的 bean 将被自动拾取并与`Scheduler`关联: -* `JobDetail`:定义特定的作业。`JobDetail’实例可以用`JobBuilder`API 构建。 +* `JobDetail`:定义特定的作业。`JobDetail`实例可以用`JobBuilder`API 构建。 * `Calendar`. @@ -493,7 +493,7 @@ Spring 框架提供了用于通过使用`JavaMailSender`接口发送电子邮件 | |有关如何使用`JavaMailSender`的详细说明,请参见[参考文献](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#mail)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果`spring.mail.host`和相关的库(由`spring-boot-starter-mail`定义)是可用的,则如果不存在,则创建一个默认的`JavaMailSender`。发送方可以通过`spring.mail`名称空间中的配置项进行进一步定制。有关更多详细信息,请参见[“Mail属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/Mail属性.java)。 +如果`spring.mail.host`和相关的库(由`spring-boot-starter-mail`定义)是可用的,则如果不存在,则创建一个默认的`JavaMailSender`。发送方可以通过`spring.mail`名称空间中的配置项进行进一步定制。详见[`Mail属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/mail/mailproperties.java)了解更多详情。 特别是,某些默认的超时值是无限的,你可能希望对其进行更改,以避免线程被无响应的邮件服务器阻塞,如以下示例所示: @@ -518,7 +518,7 @@ spring: 也可以使用 JNDI 中现有的`Session`配置`JavaMailSender`: -Properties +属性 ``` spring.mail.jndi-name=mail/Session @@ -536,7 +536,7 @@ spring: ## 5. 验证 -Bean 验证 1.1 支持的方法验证功能是自动启用的,只要在 Classpath 上有一个 JSR-303 实现(例如 Hibernate 验证器)。这使得 Bean 方法在其参数和/或返回值上使用`javax.validation`约束进行注释。具有这种注释方法的目标类需要在类型级别使用`@Validated`注释进行注释,以便在内联约束注释中搜索它们的方法。 +Bean 验证 1.1 支持的方法验证功能是自动启用的,只要在 Classpath 上有一个 JSR-303 实现(例如 Hibernate 验证器)。这使得 Bean 方法在其参数和/或其返回值上使用`javax.validation`约束进行注释。具有这种注释方法的目标类需要在类型级别使用`@Validated`注释进行注释,以便在内联约束注释中搜索它们的方法。 例如,下面的服务将触发第一个参数的验证,以确保其大小在 8 到 10 之间: @@ -558,15 +558,15 @@ public class MyBean { ``` -在解析约束消息中的`{parameters}`时,将使用应用程序的`MessageSource`。这允许你对 Bean 验证消息使用[your application’s `messages.properties` files](features.html#features.internationalization)。一旦解决了参数问题,就使用 Bean 验证的默认内插器完成消息插值。 +在解析约束消息中的`{parameters}`时,将使用应用程序的`MessageSource`。这允许你使用[应用程序的`messages.properties`文件](features.html#features.internationalization)来获取 Bean 验证消息。一旦解决了参数问题,就使用 Bean 验证的默认内插器完成消息插值。 ## 6. 呼叫 REST 服务 -如果你的应用程序调用远程 REST 服务, Spring 启动使用`RestTemplate`或`WebClient`使这一点非常方便。 +如果你的应用程序调用远程 REST 服务, Spring boot 使用`RestTemplate`或`WebClient`使这一点非常方便。 ### 6.1.RESTTemplate -如果需要从应用程序调用远程 REST 服务,可以使用 Spring 框架的[`RestTemplate`](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/web/client/RestTemplate.html)类。由于`RestTemplate`实例在使用之前通常需要进行自定义, Spring Boot 不提供任何单独的自动配置`RestTemplate` Bean。但是,它会自动配置`RestTemplateBuilder`,在需要时可以使用它来创建`RestTemplate`实例。自动配置的`RestTemplateBuilder`确保将合理的`HttpMessageConverters`应用于`RestTemplate`实例。 +如果需要从应用程序调用远程 REST 服务,可以使用 Spring 框架的[`RestTemplate`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/web/client/resttemplate.html)类。由于`RestTemplate`实例在使用之前通常需要进行自定义, Spring Boot 不提供任何单独的自动配置`RestTemplate` Bean。但是,它可以自动配置`RestTemplateBuilder`,在需要时可以使用它来创建`RestTemplate`实例。自动配置的`RestTemplateBuilder`确保将合理的`HttpMessageConverters`应用于`RestTemplate`实例。 下面的代码展示了一个典型的示例: @@ -603,7 +603,7 @@ public class MyService { 要进行应用程序范围的可加性定制,请使用`RestTemplateCustomizer` Bean。所有这样的 bean 都会自动注册到自动配置的`RestTemplateBuilder`中,并应用到用它构建的任何模板中。 -下面的示例显示了一个自定义程序,它为除`192.168.0.5`以外的所有主机配置代理的使用: +下面的示例显示了一个定制程序,该定制程序为所有主机配置代理的使用,但`192.168.0.5`除外: ``` import org.apache.http.HttpException; @@ -675,7 +675,7 @@ public class MyRestTemplateBuilderConfiguration { ### 6.2.WebClient -如果你的 Classpath 上有 Spring WebFlux,你还可以选择使用`WebClient`来调用远程 REST 服务。与`RestTemplate`相比,该客户机具有更多的功能,并且完全具有反应性。你可以在专用的[section in the Spring Framework docs](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#webflux-client)中了解有关`WebClient`的更多信息。 +如果你的 Classpath 上有 Spring WebFlux,你还可以选择使用`WebClient`来调用远程 REST 服务。与`RestTemplate`相比,该客户机具有更多的功能感觉,并且完全具有反应性。你可以在专用的[section in the Spring Framework docs](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#webflux-client)中了解有关`WebClient`的更多信息。 Spring 引导为你创建并预配置一个`WebClient.Builder`。强烈建议将其注入到组件中,并使用它来创建`WebClient`实例。 Spring 引导正在配置该构建器来共享 HTTP 资源,以与服务器相同的方式反映编解码器设置(参见[WebFlux HTTP 编解码器自动配置](web.html#web.reactive.webflux.httpcodecs)),等等。 @@ -707,7 +707,7 @@ public class MyService { #### 6.2.1.WebClient 运行时 -Spring 根据应用程序上可用的库 Classpath,启动将自动检测要使用哪个`ClientHttpConnector`来驱动`WebClient`。目前,反应堆网络和 Jetty RS 客户端是受支持的。 +Spring 启动将自动检测使用哪个`ClientHttpConnector`来驱动`WebClient`,这取决于应用程序上可用的库 Classpath。目前,反应堆网络和 Jetty RS 客户端是受支持的。 默认情况下,`spring-boot-starter-webflux`starter 依赖于`io.projectreactor.netty:reactor-netty`,这带来了服务器和客户端实现。如果你选择使用 Jetty 作为反应性服务器,那么你应该在 Jetty 反应性 HTTP 客户库上添加一个依赖项,`org.eclipse.jetty:jetty-reactive-httpclient`。使用同样的技术对服务器和客户端都有它的优点,因为它会自动地在客户端和服务器之间共享 HTTP 资源。 @@ -715,13 +715,13 @@ Spring 根据应用程序上可用的库 Classpath,启动将自动检测要使 如果你希望为客户机重写该选择,那么你可以定义自己的`ClientHttpConnector` Bean 并对客户机配置拥有完全的控制权。 -你可以了解更多关于[`WebClient` configuration options in the Spring Framework reference documentation](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#webflux-client-builder)的信息。 +你可以在 Spring 框架参考文档中了解有关[`WebClient`配置选项的更多信息](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/web-active.html#webflux-client-builder)。 #### 6.2.2.WebClient 自定义 对于`WebClient`定制,有三种主要的方法,这取决于你希望定制应用的范围。 -要使任何自定义的范围尽可能窄,请插入自动配置的`WebClient.Builder`,然后根据需要调用其方法。`Webclient.Builder’实例是有状态的:构建器上的任何更改都反映在随后与其一起创建的所有客户机中。如果你想用同一个构建器创建多个客户机,还可以考虑用`WebClient.Builder other = builder.clone();`克隆构建器。 +要使任何自定义的范围尽可能窄,请插入自动配置的`WebClient.Builder`,然后根据需要调用其方法。`WebClient.Builder`实例是有状态的:构建器上的任何更改都会反映在随后使用它创建的所有客户机中。如果你想用同一个构建器创建多个客户机,还可以考虑用`WebClient.Builder other = builder.clone();`克隆构建器。 要对所有`WebClient.Builder`实例进行应用程序范围的加性定制,你可以声明`WebClientCustomizer`bean,并在注入点本地更改`WebClient.Builder`。 @@ -751,7 +751,7 @@ spring: ### 7.1.使用 WebServiceTemplate 调用 Web 服务 -如果需要从应用程序调用远程 Web 服务,可以使用[“WebServiceTemplate”](https://docs.spring.io/spring-ws/docs/3.1.2/reference/html/#client-web-service-template)类。由于`WebServiceTemplate`实例在使用之前通常需要进行自定义, Spring boot 不提供任何单独的自动配置`WebServiceTemplate` Bean。但是,它可以自动配置`WebServiceTemplateBuilder`,在需要时可以使用它来创建`WebServiceTemplate`实例。 +如果需要从应用程序调用远程 Web 服务,可以使用[`WebServiceTemplate`](https://DOCS. Spring.io/ Spring-ws/DOCS/3.1.2/reference/html/#client-web-service-template)类。由于`WebServiceTemplate`实例在使用之前通常需要进行自定义, Spring Boot 不提供任何单独的自动配置`WebServiceTemplate` Bean。但是,它可以自动配置`WebServiceTemplateBuilder`,在需要时可以使用它来创建`WebServiceTemplate`实例。 下面的代码展示了一个典型的示例: @@ -817,14 +817,14 @@ Spring 通过使用[Atomikos](https://www.atomikos.com/)嵌入式事务管理器 [Atomikos](https://www.atomikos.com/)是一种流行的开源事务管理器,它可以嵌入到你的 Spring 引导应用程序中。你可以使用`spring-boot-starter-jta-atomikos`启动器来获取适当的 Atomikos 库。 Spring 引导自动配置 Atomikos,并确保将适当的`depends-on`设置应用到你的 Spring bean,以进行正确的启动和关闭排序。 -默认情况下,Atomikos 事务日志被写入应用程序主目录(应用程序 jar 文件所在的目录)中的`transaction-logs`目录。可以通过在`application.properties`文件中设置`spring.jta.log-dir`属性来自定义此目录的位置。以`spring.jta.atomikos.properties`开头的属性也可用于自定义 Atomikos`UserTransactionServiceImp`。有关完整的详细信息,请参见[`AtomikosProperties`Javadoc](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/jta/atomikos/AtomikosProperties.html)。 +默认情况下,Atomikos 事务日志被写入应用程序主目录(应用程序 jar 文件所在的目录)中的`transaction-logs`目录。可以通过在`application.properties`文件中设置`spring.jta.log-dir`属性来自定义此目录的位置。以`spring.jta.atomikos.properties`开头的属性也可用于自定义 Atomikos`UserTransactionServiceImp`。有关完整的详细信息,请参见[`AtomikosProperties`Javadoc](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/jta/atomikos/atomikosproperties.html)。 | |为了确保多个事务管理器能够安全地协调相同的资源管理器,每个 Atomikos 实例都必须配置一个唯一的 ID,
默认情况下,这个 ID 是运行 Atomikos 的机器的 IP 地址,
以确保生产中的唯一性,你应该为应用程序的每个实例配置具有不同值的`spring.jta.transaction-manager-id`属性。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 8.2.使用 Java EE 托管事务管理器 -如果将 Spring 引导应用程序打包为`war`或`ear`文件,并将其部署到 Java EE 应用服务器,则可以使用应用服务器的内置事务管理器。 Spring 引导试图通过查看常见的 JNDI 位置(`java:comp/usertransaction`,`java:comp/TransactionManager`,等等)来自动配置事务管理器。如果使用应用程序服务器提供的事务服务,通常还需要确保所有资源都由服务器管理,并通过 JNDI 公开。 Spring Boot 试图通过在 JNDI 路径(`java:/jmsxa` 或`java:/XAConnectionFactory`)上查找`ConnectionFactory`来自动配置 JMS,并且你可以使用[`spring.datasource.jndi-name` property](data.html#data.sql.datasource.jndi)来配置你的`DataSource`。 +如果你将 Spring 引导应用程序打包为`war`或`ear`文件并将其部署到 Java EE 应用程序服务器,则可以使用应用程序服务器的内置事务管理器。 Spring 引导试图通过查看常见的 JNDI 位置(`java:comp/UserTransaction`,`java:comp/TransactionManager`,以此类推)来自动配置事务管理器。如果使用应用程序服务器提供的事务服务,通常还需要确保所有资源都由服务器管理,并通过 JNDI 公开。 Spring Boot 试图通过在 JNDI 路径(`java:/JmsXA`或`java:/XAConnectionFactory`)上查找`ConnectionFactory`来自动配置 JMS,并且你可以使用[`spring.datasource.jndi-name`属性]来配置你的`DataSource`。 ### 8.3.混合 XA 和非 XA JMS 连接 @@ -859,12 +859,12 @@ public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionF ### 8.4.支持另一种嵌入式事务管理器 ### -[xaconnectionFactoryWrapper](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jms/XAConnectionFactoryWrapper.java)和[XadataSourceWrapper](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/XADataSourceWrapper.java)接口可用于支持替代的嵌入式事务管理器。接口负责包装`XAConnectionFactory`和`XADataSource`bean,并将它们公开为常规的`ConnectionFactory`和`DataSource`bean,这些 bean 透明地登记在分布式事务中。数据源和 JMS 自动配置使用 JTA 变体,只要你有`JtaTransactionManager` Bean 和在`ApplicationContext`中注册的适当的 XA 包装 bean。 +[`XAConnectionFactoryWrapper`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/java/org/springframework/boot/boot/jms/xaconnectionfactorywrapper.java.java)和[<](https://github.com/ Spring-projects/[ Spring-tree/-tree/tree/v2.6.4/ Spring-boo 接口负责包装`XAConnectionFactory`和`XADataSource`bean,并将它们公开为常规的`ConnectionFactory`和`DataSource`bean,这些 bean 透明地登记在分布式事务中。数据源和 JMS 自动配置使用 JTA 变体,只要你有`JtaTransactionManager` Bean 和在`ApplicationContext`中注册的适当的 XA 包装 bean。 [AtomikosxaconnectionFactoryWrapper](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jta/atomikos/AtomikosXAConnectionFactoryWrapper.java)和[Atomikosxadatasourcewrapper](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jta/atomikos/AtomikosXADataSourceWrapper.java)为如何编写 XA 包装器提供了很好的示例。 -## 9. 接下来读什么? +## 9. 接下来要读什么? -现在你应该对 Spring boot 的[core features](features.html#features)以及 Spring boot 通过自动配置提供支持的各种技术有了很好的了解。 +你现在应该对 Spring boot 的[核心功能](features.html#features)以及 Spring boot 通过自动配置提供支持的各种技术有了很好的了解。 接下来的几节将详细介绍如何将应用程序部署到云平台上。你可以在下一节中阅读有关[构建容器图像](container-images.html#container-images)的内容,也可以跳到[可投入生产的功能](actuator.html#actuator)的部分。 diff --git a/docs/spring-boot/messaging.md b/docs/spring-boot/messaging.md index b2354870e959f2dc7a8dc26a51d07e8582bbd17d..e0b55b74e2904ec164e52f4acbd75f7673e2fbda 100644 --- a/docs/spring-boot/messaging.md +++ b/docs/spring-boot/messaging.md @@ -4,7 +4,7 @@ Spring 框架为与消息传递系统集成提供了广泛的支持,从使用` ## 1. JMS -`javax.jms.ConnectionFactory`接口提供了一种标准方法,用于创建用于与 JMS 代理交互的`javax.jms.Connection`。尽管 Spring 需要`ConnectionFactory`来处理 JMS,但你通常不需要自己直接使用它,而是可以依赖于更高级别的消息传递抽象。(有关详细信息,请参见 Spring Framework 参考文档的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#jms)。) Spring Boot 还自动配置发送和接收消息所需的基础设施。 +`javax.jms.ConnectionFactory`接口提供了一种标准方法来创建用于与 JMS 代理交互的`javax.jms.Connection`。尽管 Spring 需要`ConnectionFactory`来处理 JMS,但你通常不需要自己直接使用它,而是可以依赖于更高级别的消息传递抽象。(有关详细信息,请参见 Spring Framework 参考文档的[相关部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/integration.html#jms)。) Spring Boot 还自动配置发送和接收消息所需的基础设施。 ### 1.1.ActiveMQ 支持 @@ -15,7 +15,7 @@ Spring 框架为与消息传递系统集成提供了广泛的支持,从使用` ActiveMQ 配置由`spring.activemq.*`中的外部配置属性控制。 -默认情况下,ActiveMQ 被自动配置为使用[VM transport](https://activemq.apache.org/vm-transport-reference.html),它启动嵌入在同一 JVM 实例中的代理。 +默认情况下,ActiveMQ 被自动配置为使用[VM 传输](https://activemq.apache.org/vm-transport-reference.html),它启动嵌入在同一 JVM 实例中的代理。 可以通过配置`spring.activemq.in-memory`属性禁用嵌入式代理,如以下示例所示: @@ -91,7 +91,7 @@ spring: max-connections: 50 ``` -| |有关更多支持的选项,请参见[“ActiveMQ属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQ属性.java)。
你还可以注册任意数量的实现`ActiveMQConnectionFactoryCustomizer`的 bean,以获得更高级的自定义。| +| |参见[`ActiveMQ属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/jms/activemq/activemqproperties.java)以获得更多支持的选项。
还可以注册任意数量的 bean 来实现`ActiveMQConnectionFactoryCustomizer`以进行更高级的定制。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 默认情况下,ActiveMQ 会创建一个尚不存在的目标,以便根据其提供的名称对目标进行解析。 @@ -163,7 +163,7 @@ spring: max-connections: 50 ``` -有关更多支持的选项,请参见[` 青蒿素特性’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/Artemis属性.java)。 +参见[`Artemis属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/jms/artemis/artemproperties.java)以获得更多支持的选项。 不涉及 JNDI 查找,并且使用 Artemis 配置中的`name`属性或通过配置提供的名称,根据它们的名称解析目标。 @@ -212,7 +212,7 @@ public class MyBean { ``` -| |[jmsmessagingtemplate’](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/jms/core/JmsMessagingTemplate.html)可以以类似的方式注入。
如果定义了一个`DestinationResolver`或一个`MessageConverter` Bean,则自动将其关联到自动配置的`JmsTemplate`。| +| |[`JmsMessagingTemplate`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/jms/core/jmssagingtemplate.html)可以以类似的方式注入。
如果定义了`DestinationResolver`或`MessageConverter` Bean,则自动关联到自动配置的`JmsTemplate`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 1.5.接收消息 @@ -239,10 +239,10 @@ public class MyBean { ``` -| |有关更多详细信息,请参见[the Javadoc of `@EnableJms`](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/jms/annotation/EnableJms.html)。| +| |有关更多详细信息,请参见[`@EnableJms`的 Javadoc](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/jms/annotation/enablejms.html)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果你需要创建更多的`JmsListenerContainerFactory`实例,或者如果你想要重写默认值, Spring boot 提供一个`DefaultJmsListenerContainerFactoryConfigurer`,你可以使用它初始化`DefaultJmsListenerContainerFactory`,并使用与自动配置的设置相同的设置。 +如果你需要创建更多的`JmsListenerContainerFactory`实例,或者如果你想重写默认值, Spring Boot 提供了一个`DefaultJmsListenerContainerFactoryConfigurer`,你可以使用它初始化`DefaultJmsListenerContainerFactory`,并使用与自动配置的设置相同的设置。 例如,下面的示例公开了另一个使用特定`MessageConverter`的工厂: @@ -274,7 +274,7 @@ public class MyJmsConfiguration { ``` -然后,你可以在任何`@JmsListener`-注释的方法中使用工厂,如下所示: +然后,你可以在任何`@JmsListener`注释的方法中使用工厂,如下所示: ``` import org.springframework.jms.annotation.JmsListener; @@ -341,9 +341,9 @@ spring: | |当以这种方式指定地址时,`host`和`port`属性将被忽略。
如果地址使用`amqps`协议,则将自动启用 SSL 支持。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -有关更多支持的基于属性的配置选项,请参见[`Rabbit属性’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/Rabbit属性.java)。要配置 Spring AMQP 使用的 RabbitMQ`ConnectionFactory`的较低级别的详细信息,请定义`ConnectionFactoryCustomizer` Bean。 +参见[`Rabbit属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/amqp/rabbitproperties.java)以获得更多支持的基于属性的配置选项。要配置 Spring AMQP 使用的 RabbitMQ`ConnectionFactory`的较低级别的详细信息,请定义`ConnectionFactoryCustomizer` Bean。 -如果上下文中存在`ConnectionNameStrategy` Bean,则将自动使用它来命名由自动配置的`CachingConnectionFactory`创建的连接。 +如果在上下文中存在`ConnectionNameStrategy` Bean,则将自动使用它来命名由自动配置的`CachingConnectionFactory`创建的连接。 | |有关更多详细信息,请参见[理解 RabbitMQ 使用的协议 AMQP](https://spring.io/blog/2010/06/14/understanding-amqp-the-protocol-used-by-rabbitmq/)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -383,7 +383,7 @@ public class MyBean { ``` -| |[RabbitMessagingTemplate](https://docs.spring.io/spring-amqp/docs/2.4.2/api/org/springframework/amqp/rabbit/core/RabbitMessagingTemplate.html)可以以类似的方式注入。
如果定义了`MessageConverter` Bean,则自动将其关联到自动配置的`AmqpTemplate`。| +| |[`RabbitMessagingTemplate`](https://DOCS. Spring.io/ Spring-amqp/DOCS/2.4.2/api/org/springframework/amqp/rabbit/core/rabbitmessagingtemplate.html)可以以类似的方式注入。
如果定义了`MessageConverter` Bean,则自动关联到自动配置的`AmqpTemplate`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果有必要,任何被定义为 Bean 的`org.springframework.amqp.core.Queue`都会自动用于在 RabbitMQ 实例上声明相应的队列。 @@ -410,7 +410,7 @@ spring: 默认情况下,重试是禁用的。你还可以通过声明一个`RabbitRetryTemplateCustomizer` Bean 以编程方式定制`RetryTemplate`。 -如果你需要创建更多的`RabbitTemplate`实例,或者如果你想要重写默认设置, Spring boot 提供了一个`RabbitTemplateConfigurer` Bean,你可以使用它初始化`RabbitTemplate`,并使用与自动配置所使用的工厂相同的设置。 +如果你需要创建更多的`RabbitTemplate`实例,或者如果你想要重写默认值, Spring boot 提供了一个`RabbitTemplateConfigurer` Bean,你可以使用它初始化`RabbitTemplate`,并使用与自动配置所使用的工厂相同的设置。 ### 2.3.接收消息 @@ -434,7 +434,7 @@ public class MyBean { ``` -| |有关更多详细信息,请参见[the Javadoc of `@EnableRabbit`](https://docs.spring.io/spring-amqp/docs/2.4.2/api/org/springframework/amqp/rabbit/annotation/EnableRabbit.html)。| +| |有关更多详细信息,请参见[`@EnableRabbit`的 javadoc](https://DOCS. Spring.io/ Spring-amqp/DOCS/2.4.2/api/org/springframework/amqp/rabbit/annotation/enablerabbit.html)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| 如果你需要创建更多的`RabbitListenerContainerFactory`实例,或者你想要重写默认值, Spring Boot 提供了一个`SimpleRabbitListenerContainerFactoryConfigurer`和一个`DirectRabbitListenerContainerFactoryConfigurer`,你可以使用它们初始化一个`SimpleRabbitListenerContainerFactory`和一个`DirectRabbitListenerContainerFactory`,其设置与自动配置所使用的工厂相同。 @@ -517,10 +517,10 @@ spring: group-id: "myGroup" ``` -| |要在启动时创建一个主题,请添加类型`NewTopic`的 Bean。
如果该主题已经存在,则忽略 Bean。| +| |要在启动时创建主题,请添加类型`NewTopic`的 Bean。如果主题已经存在,则忽略 Bean。| |---|------------------------------------------------------------------------------------------------------------------| -有关更多支持的选项,请参见[Kafkaproperties’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/Kafka属性.java)。 +参见[`Kafka属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/kafka/kaproperties.java)以获得更多支持的选项。 ### 3.1.发送消息 @@ -574,16 +574,16 @@ public class MyBean { ``` -如果定义了`KafkaTransactionManager` Bean,则自动将其关联到容器工厂。类似地,如果定义了 a`RecordFilterStrategy`、`CommonErrorHandler`、`AfterRollbackProcessor`或`ConsumerAwareRebalanceListener` Bean,则自动将其与默认工厂关联。 +如果定义了`KafkaTransactionManager` Bean,则它将自动与容器工厂关联。类似地,如果定义了一个`RecordFilterStrategy`、`CommonErrorHandler`、`AfterRollbackProcessor`或`ConsumerAwareRebalanceListener` Bean,则它将自动关联到默认工厂。 -根据侦听器类型,与默认工厂关联的是`RecordMessageConverter`或`BatchMessageConverter` Bean。如果批处理侦听器只存在一个`RecordMessageConverter` Bean,则将其包装在`BatchMessageConverter`中。 +根据侦听器类型,与默认工厂关联的是`RecordMessageConverter`或`BatchMessageConverter` Bean。如果批处理侦听器仅存在一个`RecordMessageConverter` Bean,则将其包装在`BatchMessageConverter`中。 | |自定义`ChainedKafkaTransactionManager`必须标记`@Primary`,因为它通常引用自动配置的`KafkaTransactionManager` Bean。| |---|------------------------------------------------------------------------------------------------------------------------------------------------| ### 3.3.卡夫卡溪流 -Spring 对于 Apache,Kafka 提供了一个工厂 Bean 来创建`StreamsBuilder`对象并管理其流的生命周期。 Spring 启动自动配置所需的`KafkaStreamsConfiguration` Bean,只要`kafka-streams`在 Classpath 上并且 Kafka 流是由`@EnableKafkaStreams`注释启用的。 +Spring 对于 Apache,Kafka 提供了一种工厂 Bean 来创建`StreamsBuilder`对象并管理其流的生命周期。 Spring 引导自动配置所需的`KafkaStreamsConfiguration` Bean,只要`kafka-streams`在 Classpath 上并且 Kafka 流是由`@EnableKafkaStreams`注释启用的。 启用 Kafka 流意味着必须设置应用程序 ID 和引导程序服务器。前者可以使用`spring.kafka.streams.application-id`进行配置,如果没有设置,则默认为`spring.application.name`。后者可以全局设置,也可以只针对流专门重写。 @@ -663,7 +663,7 @@ spring: "[prop.five]": "fifth" ``` -这将普通的`prop.one`Kafka 属性设置为`first`(适用于生产者、消费者和管理员),`prop.two`管理属性设置为`second`,`prop.three`消费者属性设置为`third`,`prop.four`生产者属性设置为`fourth`,`prop.five`流属性设置为`fifth`。 +这会将常见的`prop.one`Kafka 属性设置为`first`(适用于生产者、消费者和管理员),将`prop.two`管理属性设置为`second`,将`prop.three`消费者属性设置为`prop.four`生产者属性设置为`fourth`,将`prop.five`流属性设置为`fifth`。 还可以将 Spring kafka`JsonDeserializer`配置如下: @@ -689,7 +689,7 @@ spring: 类似地,你可以禁用`JsonSerializer`在标题中发送类型信息的默认行为: -Properties +属性 ``` spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer @@ -707,12 +707,12 @@ spring: "[spring.json.add.type.headers]": false ``` -| |以这种方式设置的属性将覆盖 Spring 引导明确支持的任何配置项。| +| |以这种方式设置的属性覆盖 Spring 引导明确支持的任何配置项。| |---|------------------------------------------------------------------------------------------------| ### 3.5.嵌入式 Kafka 测试 -Spring 对于 Apache Kafka 提供了一种方便的方式来测试带有嵌入式 Apache Kafka 代理的项目。要使用此功能,请使用`spring-kafka-test`模块中的`@EmbeddedKafka`对测试类进行注释。有关更多信息,请参见 Apache Kafka[参考手册](https://docs.spring.io/spring-kafka/docs/2.8.3/reference/html/#embedded-kafka-annotation)的 Spring。 +Spring 对于 Apache Kafka 提供了一种方便的方式来测试带有嵌入式 Apache Kafka 代理的项目。要使用此功能,请在`spring-kafka-test`模块中用`@EmbeddedKafka`注释一个测试类。有关更多信息,请参见 Apache Kafka[参考手册](https://docs.spring.io/spring-kafka/docs/2.8.3/reference/html/#embedded-kafka-annotation)的 Spring。 要使 Spring 引导自动配置与前面提到的嵌入式 Apache Kafka 代理一起工作,你需要将嵌入式代理地址(由`EmbeddedKafkaBroker`填充)的系统属性重新映射到 Apache Kafka 的 Spring 引导配置属性中。有几种方法可以做到这一点: @@ -743,7 +743,7 @@ class MyTest { * 在配置属性中使用占位符: -Properties +属性 ``` spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers} @@ -761,7 +761,7 @@ spring: [RSocket](https://rsocket.io)是一种用于字节流传输的二进制协议。它支持通过在单个连接上传递异步消息的对称交互模型。 -Spring 框架的`spring-messaging`模块在客户端和服务器端为 RSocket 请求者和响应者提供支持。有关更多详细信息,请参见 Spring 框架引用的[RSocket section](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#rsocket-spring),包括 RSocket 协议的概述。 +Spring 框架的`spring-messaging`模块在客户端和服务器端为 RSocket 请求者和响应者提供支持。有关更多详细信息,请参见 Spring 框架引用的[RSocket 部分](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#rsocket-spring),包括 RSocket 协议的概述。 ### 4.1.RSocket 策略自动配置 @@ -771,7 +771,7 @@ Spring 引导自动配置`RSocketStrategies` Bean,该配置提供了编码和 2. 具有 Jackson 的 JSON 编解码器 -`spring-boot-starter-rsocket`启动器提供了这两个依赖项。请参阅[Jackson 支助科](features.html#features.json.jackson)以了解有关自定义可能性的更多信息。 +`spring-boot-starter-rsocket`starter 提供了这两个依赖项。请参阅[Jackson 支助科](features.html#features.json.jackson)以了解更多有关定制可能性的信息。 开发人员可以通过创建实现`RSocketStrategiesCustomizer`接口的 bean 来定制`RSocketStrategies`组件。请注意,它们的`@Order`很重要,因为它决定了编解码器的顺序。 @@ -779,7 +779,7 @@ Spring 引导自动配置`RSocketStrategies` Bean,该配置提供了编码和 Spring 启动提供了 RSocket 服务器的自动配置。所需的依赖关系由`spring-boot-starter-rsocket`提供。 -Spring 启动允许在 WebSocket 上从 WebFlux 服务器公开 RSocket,或者在独立的 RSocket 服务器上公开 RSocket。这取决于应用程序的类型及其配置。 +Spring 启动允许在 WebSocket 上从 WebFlux 服务器公开 RSocket,或者支持独立的 RSocket 服务器。这取决于应用程序的类型及其配置。 对于 WebFlux 应用程序(类型为`WebApplicationType.REACTIVE`),只有在以下属性匹配的情况下,才会将 RSocket 服务器插入到 Web 服务器中: @@ -822,7 +822,7 @@ spring: ### 4.3. Spring 消息 RSocket 支持 -Spring 启动将自动为 RSocket 配置 Spring 消息传递基础设施。 +Spring 启动将自动为 RSocket 配置 Spring 消息传递基础结构。 这意味着 Spring 引导将创建一个`RSocketMessageHandler` Bean,它将处理对应用程序的 RSocket 请求。 @@ -863,9 +863,9 @@ public class MyService { Spring Boot 为使用[Spring Integration](https://spring.io/projects/spring-integration)提供了几种便利,包括`spring-boot-starter-integration`“starter”。 Spring 集成在消息传递和其他传输(例如 HTTP、TCP 和其他传输)上提供了抽象。如果 Spring 集成在你的 Classpath 上可用,则通过`@EnableIntegration`注释对其进行初始化。 -Spring 集成轮询逻辑依赖于[on the auto-configured `TaskScheduler`](features.html#features.task-execution-and-scheduling)。默认的`PollerMetadata`(每秒轮询无界的消息数量)可以使用`spring.integration.poller.*`配置属性进行定制。 +Spring 集成轮询逻辑依赖于[自动配置的`TaskScheduler`](features.html#features.task-execution-and-schedule)。可以使用`spring.integration.poller.*`配置属性定制默认的`PollerMetadata`(每秒轮询无界的消息数量)。 -Spring 引导还配置了由存在额外的 Spring 集成模块触发的一些特征。如果`spring-integration-jmx`也在 Classpath 上,则消息处理统计信息将在 JMX 上发布。如果`spring-integration-jdbc`可用,则可以在启动时创建默认的数据库模式,如下所示: +Spring 引导还配置了由存在额外的 Spring 集成模块触发的一些特征。如果`spring-integration-jmx`也在 Classpath 上,则消息处理统计信息将在 JMX 上发布。如果`spring-integration-jdbc`可用,则可以在启动时创建默认的数据库模式,如下列所示: Properties @@ -882,7 +882,7 @@ spring: initialize-schema: "always" ``` -如果`spring-integration-rsocket`可用,开发人员可以使用`"spring.rsocket.server.*"`属性配置 RSocket 服务器,并让它使用`IntegrationRSocketEndpoint`或`RSocketOutboundGateway`组件来处理传入的 RSocket 消息。该基础结构可以处理 Spring 集成 RSocket 通道适配器和`@MessageMapping`处理程序(已配置`"spring.integration.rsocket.server.message-mapping-enabled"`)。 +如果`spring-integration-rsocket`可用,开发人员可以使用`"spring.rsocket.server.*"`属性配置 RSocket 服务器,并让它使用`IntegrationRSocketEndpoint`或`RSocketOutboundGateway`组件来处理传入的 RSocket 消息。这个基础结构可以处理 Spring 集成 RSocket 通道适配器和`@MessageMapping`处理程序(给定`"spring.integration.rsocket.server.message-mapping-enabled"`是已配置的)。 Spring 启动还可以使用配置属性自动配置`ClientRSocketConnector`: @@ -924,8 +924,8 @@ spring: uri: "ws://example.org" ``` -有关更多详细信息,请参见[“IntegrationAutoConfiguration”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java)和[“整合属性”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java)类。 +参见[`IntegrationAutoConfiguration`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofconfigure/SRC/main/java/org/org/SpringFramework/Boot/autoframework/autoframework/autoframework/AutoConfigation/AutoConfiguration/justion.java)和[<`IntegrationProperties`](https:///github.com/[[ Spring-projects/ Spring- -## 6. 接下来读什么? +## 6. 接下来要读什么? -下一节介绍如何在应用程序中启用[IO capabilities](io.html#io)。你可以在本节中阅读有关[caching](io.html#io.caching)、[mail](io.html#io.email)、[validation](io.html#io.validation)、[rest clients](io.html#io.rest-client)等内容。 +下一节介绍如何在应用程序中启用[IO 功能](io.html#io)。你可以在本节中阅读有关[caching](io.html#io.caching)、[mail](io.html#io.email)、[validation](io.html#io.validation)、[REST 客户](io.html#io.rest-client)等内容。 diff --git a/docs/spring-boot/upgrading.md b/docs/spring-boot/upgrading.md index d615d42f24a282218562fe7228fb407963e81c32..46ae4dba5450aa66574e94027e3c84f3021a7ff0 100644 --- a/docs/spring-boot/upgrading.md +++ b/docs/spring-boot/upgrading.md @@ -1,12 +1,12 @@ # 升级 Spring 引导 -在项目[wiki](https://github.com/spring-projects/spring-boot/wiki)上提供了如何从 Spring 启动的早期版本升级的说明。按照[release notes](https://github.com/spring-projects/spring-boot/wiki#release-notes)部分中的链接查找要升级到的版本。 +在项目[wiki](https://github.com/spring-projects/spring-boot/wiki)上提供了如何从 Spring 启动的早期版本升级的说明。按照[发行说明](https://github.com/spring-projects/spring-boot/wiki#release-notes)部分中的链接查找要升级到的版本。 升级说明总是发布说明中的第一项。如果你落后于多个版本,请确保你还查看了跳过的版本的发布说明。 ## 1. 从 1.x 升级 -如果你正在从 Spring 启动的`1.x`版本进行升级,请检查提供详细升级说明的[维基项目中的“迁移指南”](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide)。还可以在[“release notes”](https://github.com/spring-projects/spring-boot/wiki)中查看每个版本的“新的和值得注意的”特性列表。 +如果你正在从 Spring 启动的`1.x`版本进行升级,请检查提供详细升级说明的[维基项目中的“迁移指南”](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide)。还可以在[“发行说明”](https://github.com/spring-projects/spring-boot/wiki)中查看每个版本的“新的和值得注意的”特性列表。 ## 2. 升级到新的功能版本 @@ -30,7 +30,7 @@ 要升级现有的 CLI 安装,请使用适当的 PackageManager 命令(例如,)。如果你手动安装了 CLI,请按照[标准说明](getting-started.html#getting-started.installing.cli.manual-installation),记住更新你的`PATH`环境变量,以删除任何旧的引用。 -## 4. 接下来读什么? +## 4. 接下来要读什么? 一旦你决定升级你的应用程序,你可以在文档的其余部分找到关于特定功能的详细信息。 diff --git a/docs/spring-boot/using.md b/docs/spring-boot/using.md index 6e6693081cc677149b0d6baa5d8c5e0917a284bd..278071d025237b38570d3e99e71776042b78963c 100644 --- a/docs/spring-boot/using.md +++ b/docs/spring-boot/using.md @@ -2,7 +2,7 @@ 本节将更详细地介绍如何使用 Spring 引导。它涵盖了诸如构建系统、自动配置以及如何运行应用程序等主题。我们还介绍了一些引导最佳实践。虽然 Spring boot 并没有什么特别之处(它只是另一个你可以使用的库),但有一些建议,如果遵循这些建议,将使你的开发过程变得更容易一些。 -如果你是从 Spring boot 开始的,那么在深入了解本节之前,你可能应该阅读*[Getting Started](getting-started.html#getting-started)*指南。 +如果你是从 Spring boot 开始的,那么在深入讨论这一部分之前,你可能应该阅读 *[开始](getting-started.html#getting-started)* 指南。 ## 1. 建立系统 @@ -15,7 +15,7 @@ Spring 启动的每个版本都提供了它所支持的依赖关系的精心策 | |你仍然可以指定一个版本,并在需要时重写 Spring Boot 的建议。| |---|------------------------------------------------------------------------------------------------| -这个精心策划的列表包含你可以在 Spring 启动时使用的所有 Spring 模块,以及第三方库的完善列表。这份清单是一份标准的材料清单(` Spring-boot-dependencies`),可用于[Maven](#using.build-systems.maven)和[Gradle](#using.build-systems.gradle)。 +这个精心策划的列表包含你可以在 Spring 启动时使用的所有 Spring 模块,以及第三方库的完善列表。该清单是一份标准的材料清单(`spring-boot-dependencies`),可用于[Maven](#using.build-systems.maven)和[Gradle](#using.build-systems.gradle)。 | |Spring 启动的每个版本都与 Spring 框架的基本版本相关联。
我们**高度**建议你不要指定其版本。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------| @@ -94,7 +94,7 @@ Spring 启动的每个版本都提供了它所支持的依赖关系的精心策 ``` -| |如果你不想使用`spring-boot-antlib`模块,请参阅*[howto.html](howto.html#howto.build.build-an-executable-archive-with-ant-without-using-spring-boot-antlib)*“how-to”。| +| |如果你不想使用`spring-boot-antlib`模块,请参阅 *[howto.html](howto.html#howto.build.build-an-executable-archive-with-ant-without-using-spring-boot-antlib)*“how-to”。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 1.5.初学者 @@ -105,7 +105,7 @@ Spring 启动的每个版本都提供了它所支持的依赖关系的精心策 名字里的含义是什么? -所有**官员**启动器都遵循类似的命名模式;`spring-boot-starter-*`,其中`*`是一种特定类型的应用程序。此命名结构旨在帮助你在需要查找启动器时使用。 Maven 在许多 IDE 中的集成允许你按名称搜索依赖项。例如,在安装了适当的 Eclipse 或 Spring Tools 插件后,你可以在 POM 编辑器中按`ctrl-space`并输入“ Spring-boot-starter”以获得完整的列表。 +所有**官员**启动器都遵循类似的命名模式;`spring-boot-starter-*`,其中`*`是一种特定类型的应用程序。此命名结构旨在帮助你在需要查找启动器时使用。 Maven 许多 IDE 中的集成允许你按名称搜索依赖项。例如,安装了适当的 Eclipse 或 Spring Tools 插件后,你可以在 POM 编辑器中按`ctrl-space`并输入“ Spring-boot-starter”以获得完整的列表。 正如在“[创建自己的启动器](features.html#features.developing-auto-configuration.custom-starter)”部分中所解释的,第三方启动器不应该以`spring-boot`开头,因为它是为官方 Spring 引导工件保留的。相反,第三方启动程序通常以项目的名称开始。例如,一个名为`thirdpartyproject`的第三方启动项目通常被命名为`thirdpartyproject-spring-boot-starter`。 @@ -115,39 +115,39 @@ Spring Boot 在`org.springframework.boot`组下提供了以下应用程序启动 |-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | []()`spring-boot-starter` |核心启动器,包括自动配置支持、日志记录和 YAML| | []()`spring-boot-starter-activemq` |使用 Apache ActiveMQ 进行 JMS 消息传递的启动器| -| []()`spring-boot-starter-amqp` |使用 Spring AMQP 和 Rabbit MQ 的启动器| +| []()`spring-boot-starter-amqp` |Spring AMQP 和兔 MQ 使用启动器| | []()`spring-boot-starter-aop` |Spring AOP 和 AspectJ 用于面向方面编程的启动器| | []()`spring-boot-starter-artemis` |使用 Apache Artemis 进行 JMS 消息传递的启动器| | []()`spring-boot-starter-batch` |用于使用 Spring 批的启动器| | []()`spring-boot-starter-cache` |使用 Spring Framework 的缓存支持的入门工具| -| []()`spring-boot-starter-data-cassandra` |用于使用 Cassandra 分布式数据库和 Spring 数据的启动器 Cassandra| +| []()`spring-boot-starter-data-cassandra` |用于使用 Cassandra 分布式数据库的启动器和 Spring 数据 Cassandra| |[]()`spring-boot-starter-data-cassandra-reactive`|用于使用 Cassandra 分布式数据库的启动器和 Spring 数据 Cassandra 反应| -| []()`spring-boot-starter-data-couchbase` |用于使用 CouchBase 面向文档的数据库和 Spring DataCouchBase 的启动器| -|[]()`spring-boot-starter-data-couchbase-reactive`|Spring 用于使用 CouchBase 文档的面向数据库和 CouchBase 数据库的启动器| -| []()`spring-boot-starter-data-elasticsearch` |用于使用 ElasticSearch 搜索和分析引擎的启动器和 Spring 数据 ElasticSearch| +| []()`spring-boot-starter-data-couchbase` |用于使用 CouchBase 文档的面向数据库和 Spring 数据 CouchBase 的启动器| +|[]()`spring-boot-starter-data-couchbase-reactive`|用于使用 CouchBase 面向文档的数据库和 Spring CouchBase 数据库的启动器| +| []()`spring-boot-starter-data-elasticsearch` |Spring 用于使用 ElasticSearch 搜索和分析引擎的启动器和数据 ElasticSearch| | []()`spring-boot-starter-data-jdbc` |用于使用 Spring 数据 JDBC 的启动器| | []()`spring-boot-starter-data-jpa` |用于使用 Spring 数据 JPA 和 Hibernate 的启动器| | []()`spring-boot-starter-data-ldap` |用于使用 Spring 数据 LDAP 的启动器| | []()`spring-boot-starter-data-mongodb` |用于使用 MongoDB 面向文档的数据库和 Spring 数据 MongoDB 的启动器| -| []()`spring-boot-starter-data-mongodb-reactive` |用于使用 MongoDB 面向文档的数据库的启动器和 Spring 数据 MongoDB Active| +| []()`spring-boot-starter-data-mongodb-reactive` |用于使用 MongoDB 面向文档的数据库和 Spring MongoDB 数据的启动器| | []()`spring-boot-starter-data-neo4j` |用于使用 NEO 的启动器 4j 图数据库和 Spring 数据 NEO4j| | []()`spring-boot-starter-data-r2dbc` |用于使用 Spring 数据 R2DBC 的启动器| | []()`spring-boot-starter-data-redis` |用 Spring 数据 Redis 和生菜客户机使用 Redis 键值数据存储的启动器| -| []()`spring-boot-starter-data-redis-reactive` |用于使用 Redis 键值数据存储的启动器 Spring 数据 Redis 是被动的和生菜客户机| -| []()`spring-boot-starter-data-rest` |用于使用 Spring 数据 REST 在 REST 上公开 Spring 数据存储库的启动器| +| []()`spring-boot-starter-data-redis-reactive` |用于使用 Redis 键值数据存储 Spring 数据的启动器 Redis Reactive 和 Lettuce 客户端| +| []()`spring-boot-starter-data-rest` |使用 Spring 数据 REST 在 REST 上公开 Spring 数据存储库的启动器| | []()`spring-boot-starter-freemarker` |使用 Freemarker 视图构建 MVC Web 应用程序的启动器| | []()`spring-boot-starter-groovy-templates` |使用 Groovy Templates 视图构建 MVC Web 应用程序的入门工具| | []()`spring-boot-starter-hateoas` |用 Spring MVC 和 Spring Hateoas 构建基于超媒体的 RESTful Web 应用程序的启动器| | []()`spring-boot-starter-integration` |用于使用 Spring 集成的启动器| | []()`spring-boot-starter-jdbc` |使用 JDBC 和 HikarICP 连接池的启动器| -| []()`spring-boot-starter-jersey` |使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的入门工具。[`spring-boot-starter-web`](#spring-boot-starter-web)的一种替代方法| -| []()`spring-boot-starter-jooq` |使用 Jooq 使用 JDBC 访问 SQL 数据库的启动器。[`spring-boot-starter-data-jpa`](#spring-boot-starter-data-jpa)或[`spring-boot-starter-jdbc`](#spring-boot-starter-jdbc)的替代方案| +| []()`spring-boot-starter-jersey` |使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的入门工具。[`spring-boot-starter-web`](# Spring-boot-starter-web)的一种替代方法| +| []()`spring-boot-starter-jooq` |使用 Jooq 使用 JDBC 访问 SQL 数据库的启动器。[`spring-boot-starter-data-jpa`](# Spring-boot-starter-data- JPA)或[`spring-boot-starter-jdbc`](# Spring-boot-starter-jdbc)的替代方案)| | []()`spring-boot-starter-json` |读写 JSON 的启动器| | []()`spring-boot-starter-jta-atomikos` |使用 Atomikos 的 JTA 事务启动器| | []()`spring-boot-starter-mail` |使用 Java Mail 的启动器和 Spring Framework 的电子邮件发送支持| | []()`spring-boot-starter-mustache` |使用 Mustache 视图构建 Web 应用程序的入门工具| | []()`spring-boot-starter-oauth2-client` |使用 Spring Security 的 OAuth2/OpenID Connect 客户端功能的启动器| -|[]()`spring-boot-starter-oauth2-resource-server` |使用 Spring Security 的 OAuth2 资源服务器特性的启动器| +|[]()`spring-boot-starter-oauth2-resource-server` |使用 Spring Security 的 OAuth2Resource Server 特性的启动器| | []()`spring-boot-starter-quartz` |使用 Quartz 调度器的启动器| | []()`spring-boot-starter-rsocket` |用于构建 RSocket 客户机和服务器的启动器| | []()`spring-boot-starter-security` |使用 Spring 安全性的启动器| @@ -156,29 +156,29 @@ Spring Boot 在`org.springframework.boot`组下提供了以下应用程序启动 | []()`spring-boot-starter-validation` |用 Hibernate 验证器使用 Java Bean 验证的启动器| | []()`spring-boot-starter-web` |用于使用 Spring MVC 构建 Web(包括 RESTful)应用程序的启动器。使用 Tomcat 作为默认的嵌入式容器| | []()`spring-boot-starter-web-services` |用于使用 Spring Web 服务的启动器| -| []()`spring-boot-starter-webflux` |使用 Spring 框架的反应性 Web 支持构建 WebFlux 应用程序的启动器| +| []()`spring-boot-starter-webflux` |使用 Spring 框架的反应式 Web 支持构建 WebFlux 应用程序的启动器| | []()`spring-boot-starter-websocket` |用于使用 Spring 框架的 WebSocket 支持构建 WebSocket 应用程序的启动器| -除了应用程序启动器之外,还可以使用以下启动器添加*[生产准备就绪](actuator.html#actuator)*特性: +除了应用程序启动器之外,还可以使用以下启动器添加 *[生产准备就绪](actuator.html#actuator)* 特性: | Name |说明| |----------------------------------|---------------------------------------------------------------------------------------------------------------------------------| -|[]()`spring-boot-starter-actuator`|使用 Spring Boot 的执行器的启动器,该执行器提供了生产就绪的功能,以帮助你监视和管理你的应用程序| +|[]()`spring-boot-starter-actuator`|使用 Spring Boot’s Actuator 的启动器,它提供了生产就绪功能,可帮助你监视和管理你的应用程序| 最后, Spring 引导还包括以下启动器,如果你想要排除或交换特定的技术方面,可以使用这些启动器: | Name |说明| |---------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------| -| []()`spring-boot-starter-jetty` |用于使用 Jetty 作为嵌入式 Servlet 容器的启动器。[`spring-boot-starter-tomcat`](#spring-boot-starter-tomcat)的一种替代方法| -| []()`spring-boot-starter-log4j2` |使用 log4j2 进行日志记录的启动器。[`spring-boot-starter-logging`](#spring-boot-starter-logging)的一种替代方法| +| []()`spring-boot-starter-jetty` |用于使用 Jetty 作为嵌入式 Servlet 容器的启动器。[`spring-boot-starter-tomcat`]的替代方法(# Spring-boot-starter- Tomcat)| +| []()`spring-boot-starter-log4j2` |使用 log4j2 进行日志记录的启动器。[`spring-boot-starter-logging`](# Spring-boot-starter-logging)的一种替代方法)| | []()`spring-boot-starter-logging` |使用日志记录的启动器。默认日志启动器| |[]()`spring-boot-starter-reactor-netty`|使用反应器网络作为嵌入式反应性 HTTP 服务器的启动器。| -| []()`spring-boot-starter-tomcat` |用于使用 Tomcat 作为嵌入式 Servlet 容器的启动器。由[`spring-boot-starter-web`](#spring-boot-starter-web)使用的默认 Servlet 容器启动器| -| []()`spring-boot-starter-undertow` |用于使用 Undertow 作为嵌入式 Servlet 容器的启动器。[`spring-boot-starter-tomcat`](#spring-boot-starter-tomcat)的一种替代方法| +| []()`spring-boot-starter-tomcat` |用于使用 Tomcat 作为嵌入式 Servlet 容器的启动器。[`spring-boot-starter-web`]使用的默认 Servlet 容器启动器(# Spring-boot-starter-web)| +| []()`spring-boot-starter-undertow` |用于使用 Undertow 作为嵌入式 Servlet 容器的启动器。[`spring-boot-starter-tomcat`](# Spring-boot-starter- Tomcat)的替代方案)| -要了解如何交换技术方面,请参阅[交换 Web 服务器](howto.html#howto.webserver.use-another)和[logging system](howto.html#howto.logging.log4j)的操作文档。 +要了解如何交换技术方面,请参阅[交换 Web 服务器](howto.html#howto.webserver.use-another)和[测井系统](howto.html#howto.logging.log4j)的操作文档。 -| |有关其他社区贡献的启动器的列表,请参见 Github 上`spring-boot-starters`模块中的[README file](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-starters/README.adoc)。| +| |有关其他社区贡献的启动器的列表,请参见 Github 上`spring-boot-starters`模块中的[自述文件](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-starters/README.adoc)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 2. 构建你的代码 @@ -194,7 +194,7 @@ Spring 启动不需要任何特定的代码布局来工作。然而,有一些 ### 2.2.定位主应用程序类 -我们通常建议你将主应用程序类定位在一个根包中,而不是其他类。[@SpringBootApplication](#using.using-the-springbootapplication-annotation)通常放在主类上,它隐式地为某些项定义了一个基本的“搜索包”。例如,如果你正在编写 JPA 应用程序,则使用`@SpringBootApplication`注释类的包来搜索`@Entity`项。使用根包还允许组件扫描仅应用于你的项目。 +我们通常建议你将主应用程序类定位在一个根包中,而不是其他类。[`@SpringBootApplication`注释](#using.using-the-springbootapplication-annotation)通常放在主类上,它隐式地为某些项定义了一个基本的“搜索包”。例如,如果你正在编写 JPA 应用程序,则使用`@SpringBootApplication`注释类的包来搜索`@Entity`项。使用根包还允许组件扫描仅应用于你的项目。 | |如果不想使用`@SpringBootApplication`,则它导入的`@EnableAutoConfiguration`和`@ComponentScan`注释定义了该行为,因此你也可以使用这些注释。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -256,7 +256,7 @@ Spring 引导有利于基于 Java 的配置。尽管在 XML 源中可以使用`S Spring 引导自动配置尝试基于你已添加的 jar 依赖项自动配置你的 Spring 应用程序。例如,如果`HSQLDB`在你的 Classpath 上,并且你还没有手动配置任何数据库连接 bean,那么 Spring 引导自动配置内存中的数据库。 -你需要通过向你的`@Configuration`类中的一个添加`@EnableAutoConfiguration`或`@SpringBootApplication`注释来 OPT 到自动配置中。 +你需要通过将`@EnableAutoConfiguration`或`@SpringBootApplication`注释添加到你的`@Configuration`类中来 OPT 到自动配置中。 | |你应该只添加一个`@SpringBootApplication`或`@EnableAutoConfiguration`注释。
我们通常建议你只在主`@Configuration`类中添加一个或另一个。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -282,7 +282,7 @@ public class MyApplication { ``` -如果类不在 Classpath 上,则可以使用注释的`excludeName`属性并指定完全限定的名称。如果你更喜欢使用`@EnableAutoConfiguration`而不是`@SpringBootApplication`,也可以使用`exclude`和`excludeName`。最后,还可以使用`spring.autoconfigure.exclude`属性控制要排除的自动配置类列表。 +如果类不在 Classpath 上,则可以使用注释的`excludeName`属性并指定完全限定的名称。如果你更喜欢使用`@EnableAutoConfiguration`而不是`@SpringBootApplication`,也可以使用`exclude`和`excludeName`。最后,你还可以使用`spring.autoconfigure.exclude`属性来控制要排除的自动配置类列表。 | |你可以在注释级别和通过使用属性来定义排除。| |---|---------------------------------------------------------------------------------| @@ -292,9 +292,9 @@ public class MyApplication { ## 5. Spring bean 和依赖注入 -你可以自由地使用任何标准的 Spring 框架技术来定义你的 bean 及其注入的依赖项。我们通常建议使用构造函数注入连接依赖项,并使用`@ComponentScan`查找 bean。 +你可以自由地使用任何标准的 Spring 框架技术来定义你的 bean 及其注入的依赖项。我们通常建议使用构造函数注入来连接依赖项,并使用`@ComponentScan`来查找 bean。 -如果按照上面的建议构造代码(将应用程序类定位在一个顶级包中),则可以添加`@ComponentScan`而不带任何参数,或者使用`@SpringBootApplication`注释,其中隐式地包含它。你的所有应用程序组件(“@component”、`@Service`、`@Repository`、`@Controller`等)都会自动注册为 Spring bean。 +如果按照上面的建议对代码进行结构设计(将应用程序类定位在顶级包中),则可以添加`@ComponentScan`而不带任何参数,或者使用`@SpringBootApplication`注释,隐式地包含它。你的所有应用程序组件(`@Component`,`@Service`,`@Repository`,`@Controller`,以及其他)都会自动注册为 Spring bean。 下面的示例显示了一个`@Service` Bean,它使用构造函数注入来获得所需的`RiskAssessor` Bean: @@ -359,7 +359,7 @@ Spring 许多引导开发人员喜欢他们的应用程序使用自动配置、 * `@ComponentScan`:在应用程序所在的包上启用`@Component`扫描(参见[最佳实践](#using.structuring-your-code)) -* `@SpringBootConfiguration`:允许在上下文中注册额外的 bean 或导入额外的配置类。 Spring 的标准`@Configuration`的一种替代方法,它在集成测试中帮助[配置检测](features.html#features.testing.spring-boot-applications.detecting-configuration)。 +* `@SpringBootConfiguration`:允许在上下文中注册额外的 bean 或导入额外的配置类。 Spring 的标准`@Configuration`的一种替代方法,在集成测试中辅助[配置检测](features.html#features.testing.spring-boot-applications.detecting-configuration)。 ``` import org.springframework.boot.SpringApplication; @@ -380,34 +380,34 @@ public class MyApplication { | |`@SpringBootApplication`还提供别名来定制`@EnableAutoConfiguration`和`@ComponentScan`的属性。| |---|------------------------------------------------------------------------------------------------------------------------------| -| |这些功能都不是强制性的,你可以选择用它启用的任何功能替换这一条注释。,例如,
,你可能不希望在应用程序中使用组件扫描或配置属性扫描:

``
导入 org.springframework.boot.springapplication;
导入 org.springframework.boof.autform.autofconfigure.enableautofconfiguration;
import.springtr.contexform.context.org.org.context.import;<<><<<<<>>>配置 =“156”Bootframmetation"/><}
}

``

在本例中,`MyApplication`就像任何其他 Spring 启动应用程序一样,除了`@Component`-注释的类和`@Configuration属性`-注释的类未被检测到,并且显式地导入了用户定义的 bean(参见`@Import`)。| +| |这些特性都不是强制性的,你可以选择用它启用的任何特性来替换这个注释。
例如,你可能不希望在应用程序中使用组件扫描或配置属性扫描:

```
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Import;

@SpringBootConfiguration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ SomeConfiguration.class, AnotherConfiguration.class })
public class MyApplication {

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

}

```
在此示例中,`MyApplication`就像任何其他 Spring 启动应用程序一样,除了`@Component`-带注释的类和`@Configuration属性`-带注释的类不会自动检测到,并且显式地导入了用户定义的 bean(参见`@Import`)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## 7. 运行你的应用程序 将应用程序打包为 jar 并使用嵌入式 HTTP 服务器的最大优势之一是,你可以像运行其他应用程序一样运行你的应用程序。该示例应用于调试 Spring 引导应用程序。你不需要任何特殊的 IDE 插件或扩展。 -| |本节仅涵盖基于 jar 的打包。
如果你选择将应用程序打包为 WAR 文件,请参阅你的服务器和 IDE 文档。| +| |本节只讨论基于 jar 的打包。
如果你选择将应用程序打包为 WAR 文件,请参阅你的服务器和 IDE 文档。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------| ### 7.1.从 IDE 中运行 你可以将 IDE 中的 Spring 引导应用程序作为 Java 应用程序运行。然而,你首先需要导入你的项目。导入步骤根据你的 IDE 和构建系统而有所不同。大多数 IDE 可以直接导入 Maven 项目。例如,Eclipse 用户可以从`File`菜单中选择`Import…​``Existing Maven Projects`。 -如果不能直接将项目导入 IDE,则可以使用构建插件生成 IDE 元数据。 Maven 包括用于[Eclipse](https://maven.apache.org/plugins/maven-eclipse-plugin/)和[IDEA](https://maven.apache.org/plugins/maven-idea-plugin/)的插件。 Gradle 为[various IDEs](https://docs.gradle.org/current/userguide/userguide.html)提供插件。 +如果不能直接将项目导入 IDE,则可以使用构建插件生成 IDE 元数据。 Maven 包括用于[Eclipse](https://maven.apache.org/plugins/maven-eclipse-plugin/)和[IDEA](https://maven.apache.org/plugins/maven-idea-plugin/)的插件。 Gradle 为[各种 IDE](https://docs.gradle.org/current/userguide/userguide.html)提供插件。 -| |如果你不小心运行了一个 Web 应用程序两次,你会看到一个“端口已在使用”错误。
Spring 工具用户可以使用`Relaunch`按钮,而不是`Run`按钮,以确保任何现有的实例都已关闭。| +| |如果你不小心运行了一个 Web 应用程序两次,你会看到一个“Port Already in Use”错误。
Spring Tools 用户可以使用`Relaunch`按钮,而不是`Run`按钮,以确保任何现有实例都已关闭。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 7.2.以打包应用程序的形式运行 -如果使用 Spring boot Maven 或 Gradle 插件创建可执行文件 jar,则可以使用`java -jar`运行应用程序,如以下示例所示: +如果使用 Spring 引导 Maven 或 Gradle 插件创建可执行文件 jar,则可以使用`java -jar`运行应用程序,如以下示例所示: ``` $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar ``` -还可以在启用远程调试支持的情况下运行打包的应用程序。这样做可以将一个调试器附加到打包的应用程序中,如以下示例所示: +还可以在启用远程调试支持的情况下运行打包应用程序。这样做可以将一个调试器附加到打包的应用程序中,如以下示例所示: ``` $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ @@ -450,7 +450,7 @@ Spring 由于引导应用程序是普通的 Java 应用程序,所以 JVM 热 ## 8. 开发工具 -Spring 启动包括一组额外的工具,这些工具可以使应用程序的开发体验稍微更愉快一些。`spring-boot-devtools`模块可以包含在任何项目中,以提供额外的开发时功能。要包含 DevTools 支持,请将模块依赖项添加到构建中,如以下 Maven 和 Gradle 的清单所示: +Spring 启动包括一组额外的工具,这些工具可以使应用程序的开发体验稍微更愉快一些。`spring-boot-devtools`模块可以包含在任何项目中,以提供额外的开发时功能。要包含 DevTools 支持,请将模块依赖项添加到你的构建中,如以下 Maven 和 Gradle 的清单所示: Maven @@ -475,13 +475,13 @@ dependencies { | |DevTools 可能会导致类加载问题,特别是在多模块项目中。[诊断类加载问题](#using.devtools.diagnosing-classloading-issues)解释了如何诊断和解决它们。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在运行完全打包的应用程序时,开发人员工具会自动禁用。
如果你的应用程序是从`java -jar`启动的,或者是从一个特殊的类加载器启动的,然后它被认为是一个“生产应用程序”,
你可以通过使用`spring.devtools.restart.enabled`系统属性来控制这种行为,
来启用 DevTools,而不考虑启动应用程序所使用的类加载器,设置`-Dspring.devtools.restart.enabled=true`系统属性。
在运行 DevTools 存在安全风险的生产环境中,不能这样做。
要禁用 DevTools,排除依赖关系或设置`-Dspring.devtools.restart.enabled=false`系统属性。| +| |在运行完全打包的应用程序时,开发人员工具会自动禁用。
如果你的应用程序是从`java -jar`启动的,或者是从一个特殊的类加载器启动的,然后,它被认为是一个“生产应用程序”,
你可以通过使用`spring.devtools.restart.enabled`系统属性来控制这种行为,
可以启用 DevTools,而不考虑启动应用程序所使用的类装入器,设置`-Dspring.devtools.restart.enabled=true`系统属性。
在运行 DevTools 存在安全风险的生产环境中,不能这样做。
要禁用 DevTools,排除依赖关系或设置`-Dspring.devtools.restart.enabled=false`系统属性。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在 Maven 中将依赖标记为可选的,或在 Gradle 中使用`developmentOnly`配置(如上图所示),可以防止将 DevTools 传递地应用于使用你的项目的其他模块。| +| |在 Maven 中将依赖标记为可选的,或者在 Gradle 中使用`developmentOnly`配置(如上图所示),可以防止将 DevTools 传递地应用于使用你的项目的其他模块。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |重新打包的归档文件默认不包含 DevTools。
如果你想使用[某些远程 DevTools 功能](#using.devtools.remote-applications),则需要包含它。
在使用 Maven 插件时,将`excludeDevtools`属性设置为`false`。
在使用 Gradle 插件时,[configure the task’s classpath to include the `developmentOnly` configuration](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#packaging-executable-configuring-including-development-only-dependencies)。| +| |重新打包的归档文件默认情况下不包含 DevTools。
如果你想使用[某些远程 DevTools 功能](#using.devtools.remote-applications),则需要包含它。
在使用 Maven 插件时,将`excludeDevtools`属性设置为`false`。在使用 Gradle 插件时,
,[将任务的 Classpath 配置为包括`developmentOnly`配置](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/ Gradle-plugin/reference/htmlsingle/#packaging-executable-configuring-inuiting-including-development-only-dependencies)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### 8.1.诊断类加载问题 @@ -498,7 +498,7 @@ Spring 引导支持的几个库使用缓存来提高性能。例如,[模板引 缓存选项通常由`application.properties`文件中的设置来配置。例如,ThymeLeaf 提供`spring.thymeleaf.cache`属性。不需要手动设置这些属性,`spring-boot-devtools`模块会自动应用合理的开发时配置。 -由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此 Developer Tools 建议你为`DEBUG`日志记录组启用`web`日志记录。这将为你提供有关传入请求的信息、处理该请求的处理程序、响应结果以及其他详细信息。如果希望记录所有请求详细信息(包括可能敏感的信息),可以打开`spring.mvc.log-request-details`或`spring.codec.log-request-details`配置属性。 +由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此 Developer Tools 建议你为`DEBUG`日志记录组启用`web`日志记录。这将为你提供有关传入请求的信息、处理该请求的处理程序、响应结果以及其他详细信息。如果希望记录所有请求细节(包括可能敏感的信息),可以打开`spring.mvc.log-request-details`或`spring.codec.log-request-details`配置属性。 | |如果不希望应用属性默认值,可以在`application.properties`中将`spring.devtools.add-properties`设置为`false`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------| @@ -508,7 +508,7 @@ Spring 引导支持的几个库使用缓存来提高性能。例如,[模板引 ### 8.3.自动重启 -每当 Classpath 上的文件发生更改时,使用`spring-boot-devtools`的应用程序会自动重新启动。在 IDE 中工作时,这可能是一个有用的特性,因为它为代码更改提供了非常快的反馈循环。默认情况下, Classpath 上指向某个目录的任何条目都会被监视以进行更改。请注意,某些资源,例如静态资产和视图模板,[不需要重新启动应用程序](#using.devtools.restart.excluding-resources)。 +每当 Classpath 上的文件发生更改时,使用`spring-boot-devtools`的应用程序会自动重新启动。当在 IDE 中工作时,这可能是一个有用的特性,因为它为代码更改提供了一个非常快的反馈循环。默认情况下, Classpath 上指向某个目录的任何条目都会被监视以进行更改。请注意,某些资源,例如静态资产和视图模板,[不需要重新启动应用程序](#using.devtools.restart.excluding-resources)。 触发重新启动 @@ -516,17 +516,17 @@ Spring 引导支持的几个库使用缓存来提高性能。例如,[模板引 * 在 Eclipse 中,保存修改后的文件会导致 Classpath 被更新并触发重新启动。 -* 在 IntelliJ IDEA 中,构建项目(“Build++Build 项目”)具有相同的效果。 +* 在 IntelliJ IDEA 中,构建项目(`Build +→+ Build Project`)具有相同的效果。 * 如果使用构建插件,对 Maven 运行`mvn compile`或对 Gradle 运行`gradle build`将触发重新启动。 | |如果使用 Maven 或 Gradle 使用构建插件重新启动,则必须将`forking`设置为`enabled`。
如果禁用分叉,将不会创建 DevTools 使用的隔离应用程序类装入器,并且重新启动将无法正常运行。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |与 LiveReload 一起使用时,自动重启非常有效。[参见 LiveReload 部分](#using.devtools.livereload)有关详细信息。
如果使用 JRebel,自动重启将被禁用,以利于动态类重新加载。
其他 DevTools 功能(例如 LiveReload 和 Property overrides)仍然可以使用。| +| |当与 LiveReload 一起使用时,自动重启非常有效。[参见 LiveReload 部分](#using.devtools.livereload)有关详细信息。
如果使用 JRebel,自动重启将被禁用,以利于动态类重新加载。
其他 DevTools 功能(例如 LiveReload 和 Property overrides)仍然可以使用。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |DevTools 依赖应用程序上下文的关闭钩子在重新启动时关闭它。
如果你禁用了关闭钩子,它将无法正常工作。| +| |DevTools 依赖应用程序上下文的关机钩子在重新启动时关闭它。
如果禁用了关机钩子(`SpringApplication.setRegisterShutdownHook(false)`),它将无法正常工作。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |DevTools 需要自定义`ApplicationContext`所使用的`ResourceLoader`。
如果你的应用程序已经提供了一个,它将被包装。
不支持`getResource`方法上的`getResource`直接覆盖。| @@ -564,7 +564,7 @@ spring: #### 8.3.2.不包括资源 -某些资源在被更改时不一定需要触发重新启动。例如,胸腺叶模板可以就地编辑。默认情况下,在`/META-INF/maven`、`/META-INF/resources`、`/resources`、`/static`、`/public`或`/templates`中更改资源不会触发重启,但会触发[live reload](#using.devtools.livereload)。如果希望自定义这些排除,可以使用`spring.devtools.restart.exclude`属性。例如,要仅排除`/static`和`/public`,你需要设置以下属性: +某些资源在被更改时不一定需要触发重新启动。例如,胸腺叶模板可以就地编辑。默认情况下,在`/META-INF/maven`、`/META-INF/resources`、`/resources`、`/static`、`/public`或`/templates`中更改资源不会触发重启,但会触发[实时重新加载](#using.devtools.livereload)。如果希望自定义这些排除,可以使用`spring.devtools.restart.exclude`属性。例如,要仅排除`/static`和`/public`,你需要设置以下属性: 属性 @@ -586,13 +586,13 @@ spring: #### 8.3.3.观看其他路径 -当你对不在 Classpath 上的文件进行更改时,你可能希望你的应用程序被重新启动或重新加载。要做到这一点,请使用`spring.devtools.restart.additional-paths`属性来配置其他路径,以监视更改。你可以使用`spring.devtools.restart.exclude`属性[前面描述的](#using.devtools.restart.excluding-resources)来控制附加路径下方的更改是否触发完全重新启动或[live reload](#using.devtools.livereload)。 +当你对不在 Classpath 上的文件进行更改时,你可能希望你的应用程序被重新启动或重新加载。要做到这一点,请使用`spring.devtools.restart.additional-paths`属性来配置其他路径,以监视更改。你可以使用`spring.devtools.restart.exclude`属性[前面描述的](#using.devtools.restart.excluding-resources)来控制附加路径下方的更改是否触发完全重新启动或[实时重新加载](#using.devtools.livereload)。 #### 8.3.4.禁用重新启动 如果不想使用 Restart 特性,可以使用`spring.devtools.restart.enabled`属性禁用它。在大多数情况下,你可以在`application.properties`中设置此属性(这样做仍然会初始化 Restart 类装入器,但它不会监视文件更改)。 -如果需要*完全*禁用重启支持(例如,因为它不能与特定的库一起工作),则需要在调用`spring.devtools.restart.enabled``System`之前将`false`属性设置为`false`,如以下示例所示: +如果需要*完全*禁用重启支持(例如,因为它不能与特定的库一起工作),则需要在调用`spring.devtools.restart.enabled``System`之前将`false`属性设置为`false`,如下面的示例所示: ``` import org.springframework.boot.SpringApplication; @@ -647,10 +647,10 @@ spring: 现在只有更新`src/main/resources/.reloadtrigger`时才会重新启动。 -| |你可能希望将`spring.devtools.restart.trigger-file`设置为[global setting](#using.devtools.globalsettings),以便所有项目都以相同的方式运行。| +| |你可能希望将`spring.devtools.restart.trigger-file`设置为[全局设置](#using.devtools.globalsettings),以便所有项目都以相同的方式运行。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| -有些 IDE 有一些特性,可以使你不必手动更新触发器文件。[Spring Tools for Eclipse](https://spring.io/tools)和[Intellij Idea(终极版)](https://www.jetbrains.com/idea/)都有这样的支持。使用 Spring 工具,你可以使用控制台视图中的“Reload”按钮(只要你的`trigger-file`被命名为`.reloadtrigger`)。对于 IntelliJ IDEA,你可以遵循[文件中的说明](https://www.jetbrains.com/help/idea/spring-boot.html#application-update-policies)。 +有些 IDE 有一些特性,可以使你不必手动更新触发器文件。[Spring Tools for Eclipse](https://spring.io/tools)和[Intellij Idea(终极版)](https://www.jetbrains.com/idea/)都有这样的支持。使用 Spring 工具,你可以使用控制台视图中的“Reload”按钮(只要你的`trigger-file`名为`.reloadtrigger`)。对于 IntelliJ IDEA,你可以遵循[文件中的说明](https://www.jetbrains.com/help/idea/spring-boot.html#application-update-policies)。 #### 8.3.6.自定义重新启动类装入器 @@ -691,7 +691,7 @@ restart: ### 8.4.LiveReload -`spring-boot-devtools`模块包括一个嵌入式 LiveReload 服务器,该服务器可用于在更改资源时触发浏览器刷新。LiveReload 浏览器扩展从[livereload.com](http://livereload.com/extensions/)免费提供给 Chrome、Firefox 和 Safari。 +`spring-boot-devtools`模块包括一个嵌入式 LiveReload 服务器,该服务器可用于在更改资源时触发浏览器刷新。LiveReload 浏览器扩展从[LiveReload.com](http://livereload.com/extensions/)免费提供给 Chrome、Firefox 和 Safari。 如果不想在应用程序运行时启动 LiveReload 服务器,可以将`spring.devtools.livereload.enabled`属性设置为`false`。 @@ -703,7 +703,7 @@ restart: ### 8.5.全局设置 -你可以通过向`$HOME/.config/spring-boot`目录中添加以下任意一个文件来配置全局 devtools 设置: +你可以通过向`$HOME/.config/spring-boot`目录添加以下任意文件来配置全局 devtools 设置: 1. `spring-boot-devtools.properties` @@ -711,7 +711,7 @@ restart: 3. `spring-boot-devtools.yml` -添加到这些文件中的任何属性都适用于机器上使用 DevTools 的*全部* Spring 引导应用程序。例如,要将 Restart 配置为始终使用[trigger file](#using.devtools.restart.triggerfile),你可以将以下属性添加到`spring-boot-devtools`文件中: +添加到这些文件中的任何属性都适用于机器上使用 DevTools 的*全部* Spring 引导应用程序。例如,要将 Restart 配置为始终使用[触发器文件](#using.devtools.restart.triggerfile),你可以将以下属性添加到`spring-boot-devtools`文件中: Properties @@ -733,12 +733,12 @@ spring: | |如果在`$HOME/.config/spring-boot`中未找到 DevTools 配置文件,在`$HOME`目录的根目录中搜索是否存在`.spring-boot-devtools.properties`文件。
这允许你与不支持`$HOME/.config/spring-boot`位置的旧版本 Spring 启动上的应用程序共享 DevTools 全局配置。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |DevTools Properties/YAML 文件不支持配置文件。

在`.spring-boot-devtools.properties`中激活的任何配置文件都不会影响[特定于配置文件的配置文件](features.html#features.external-config.files.profile-specific)的加载。
配置文件特定的文件名(`spring-boot-devtools-.properties`)和`spring.config.activate.on-profile`文件在 YAML 和 Properties 文件中都不受支持。| +| |在 DevTools Properties/YAML 文件中不支持配置文件。

在`.spring-boot-devtools.properties`中激活的任何配置文件都不会影响[特定于配置文件的配置文件](features.html#features.external-config.files.profile-specific)的加载。
配置文件特定的文件名(`spring-boot-devtools-.properties`)和`spring.config.activate.on-profile`文件在 YAML 和属性文件中都不受支持。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 8.5.1.配置文件系统监视器 -[Filesystemwatcher](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/filewatch/FileSystemWatcher.java)的工作原理是轮询具有一定时间间隔的类更改,然后等待预定义的静默期,以确保没有更多更改。由于 Spring 引导完全依赖于 IDE 来编译和复制文件到 Spring 引导可以读取它们的位置,所以当 DevTools 重新启动应用程序时,你可能会发现有时某些更改没有得到反映。如果你经常观察到这样的问题,请尝试将`spring.devtools.restart.poll-interval`和`spring.devtools.restart.quiet-period`参数增加到适合你的开发环境的值: +[Filesystemwatcher](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/filewatch/FileSystemWatcher.java)的工作原理是轮询具有一定时间间隔的类更改,然后等待预定义的静默期,以确保没有更多更改。由于 Spring 启动完全依赖于 IDE 来编译并将文件复制到 Spring 启动可以读取它们的位置,因此你可能会发现,当 DevTools 重新启动应用程序时,有时某些更改没有得到反映。如果你经常看到这样的问题,请尝试将`spring.devtools.restart.poll-interval`和`spring.devtools.restart.quiet-period`参数增加到适合你的开发环境的值: Properties @@ -788,7 +788,7 @@ Spring 引导开发人员工具不限于本地开发。在远程运行应用程 #### 8.6.1.运行远程客户端应用程序 -远程客户机应用程序被设计为在你的 IDE 中运行。你需要以与所连接的远程项目相同的 Classpath 运行`org.springframework.boot.devtools.RemoteSpringApplication`。应用程序唯一需要的参数是它所连接的远程 URL。 +远程客户机应用程序被设计为在你的 IDE 中运行。你需要以与你所连接的远程项目相同的 Classpath 运行`org.springframework.boot.devtools.RemoteSpringApplication`。应用程序唯一需要的参数是它所连接的远程 URL。 例如,如果你正在使用 Eclipse 或 Spring 工具,并且你有一个名为`my-app`的项目已部署到 Cloud Foundry,那么你将执行以下操作: @@ -820,7 +820,7 @@ Spring 引导开发人员工具不限于本地开发。在远程运行应用程 2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105) ``` -| |因为远程客户端使用的是与实际应用相同的 Classpath,所以它可以直接读取应用程序属性。
这就是`spring.devtools.remote.secret`属性的读取方式,并将其传递给服务器以进行身份验证。| +| |Classpath 因为远程客户端使用的是与实际应用相同的应用程序,所以它可以直接读取应用程序属性。
这就是`spring.devtools.remote.secret`属性的读取方式,并将其传递给服务器以进行身份验证。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |始终建议使用`https://`作为连接协议,以便对流量进行加密,并且不能拦截密码。| @@ -831,7 +831,7 @@ Spring 引导开发人员工具不限于本地开发。在远程运行应用程 #### 8.6.2.远程更新 -远程客户端以与[local restart](#using.devtools.restart)相同的方式监视你的应用程序 Classpath 的更改。任何更新的资源都会被推送到远程应用程序,并(* 如果需要 *)触发重新启动。如果你迭代使用本地没有的云服务的功能,这将很有帮助。通常,远程更新和重启要比完整的重建和部署周期快得多。 +远程客户端以与[本地重启](#using.devtools.restart)相同的方式监视你的应用程序 Classpath 的更改。任何更新的资源都会被推送到远程应用程序,并(* 如果需要 *)触发重新启动。如果你迭代使用本地不具备的云服务的功能,这将很有帮助。通常,远程更新和重启要比完整的重建和部署周期快得多。 在较慢的开发环境中,可能会出现静默期不够的情况,并且类中的更改可能会被分解为批处理。上载第一批类更改后,服务器将重新启动。由于服务器正在重新启动,下一个批处理不能发送到应用程序。 @@ -844,8 +844,8 @@ Spring 引导开发人员工具不限于本地开发。在远程运行应用程 可执行 JAR 可用于生产部署。由于它们是自包含的,因此也非常适合基于云的部署。 -对于额外的“生产就绪”特性,例如健康状态、审计和度量休息或 JMX 端点,可以考虑添加`spring-boot-actuator`。详见*[actuator.html](actuator.html#actuator)*。 +对于额外的“生产就绪”特性,例如健康状态、审计和度量休息或 JMX 端点,可以考虑添加`spring-boot-actuator`。详见 *[actuator.html](actuator.html#actuator)*。 -## 10. 接下来读什么? +## 10. 接下来要读什么? -你现在应该了解如何使用 Spring 引导和一些你应该遵循的最佳实践。你现在可以继续深入了解特定的*[Spring Boot features](features.html#features)*,或者你可以跳过并阅读 Spring 引导的“[生产准备就绪](actuator.html#actuator)”方面。 +你现在应该了解如何使用 Spring 引导和一些你应该遵循的最佳实践。你现在可以继续深入了解特定的 *[Spring Boot features](features.html#features)*,或者你可以跳过并阅读 Spring boot 的“[生产准备就绪](actuator.html#actuator)”方面。 diff --git a/docs/spring-boot/web.md b/docs/spring-boot/web.md index 7a5d12cb48f7f75a6232ae2ef82055126995b799..1f63d1d3b3f5a5d33aa0d6cef5882c83c14f4b1a 100644 --- a/docs/spring-boot/web.md +++ b/docs/spring-boot/web.md @@ -2,7 +2,7 @@ Spring 启动非常适合于 Web 应用程序开发。你可以使用嵌入式 Tomcat、 Jetty、 Undertow 或 Netty 创建一个自包含的 HTTP 服务器。大多数 Web 应用程序使用`spring-boot-starter-web`模块来快速启动和运行。你还可以选择使用`spring-boot-starter-webflux`模块构建反应性 Web 应用程序。 -如果你还没有开发 Spring 启动 Web 应用程序,那么可以按照*[Getting started](getting-started.html#getting-started.first-application)*部分中的“Hello World!”示例进行操作。 +如果你还没有开发 Spring 启动 Web 应用程序,那么可以按照 *[开始](getting-started.html#getting-started.first-application)* 部分中的“Hello World!”示例进行操作。 ## 1. Servlet Web 应用程序 @@ -12,7 +12,7 @@ Spring 启动非常适合于 Web 应用程序开发。你可以使用嵌入式 T [Spring Web MVC framework](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc)(通常被称为“ Spring MVC”)是一个丰富的“模型视图控制器”Web 框架。 Spring MVC 允许你创建特殊的`@Controller`或`@RestController`bean 来处理传入的 HTTP 请求。通过使用`@RequestMapping`注释,将控制器中的方法映射到 HTTP。 -下面的代码显示了一个提供 JSON 数据的典型`@RestController`: +下面的代码显示了提供 JSON 数据的典型`@RestController`: ``` import java.util.List; @@ -140,9 +140,9 @@ Spring Boot 为 Spring MVC 提供了自动配置,该配置在大多数应用 如果你希望保留那些 Spring 引导 MVC 自定义并使更多[MVC 定制](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc)(拦截器、格式化程序、视图控制器和其他功能),则可以添加你自己的`@Configuration`类型的`WebMvcConfigurer`但**没有**`@EnableWebMvc`类。 -如果希望提供`RequestMappingHandlerMapping`、`RequestMappingHandlerAdapter`或`ExceptionHandlerExceptionResolver`的自定义实例,并且仍然保留 Spring 引导 MVC 自定义,则可以声明类型`WebMvcRegistrations`的 Bean 并使用它来提供这些组件的自定义实例。 +如果希望提供`RequestMappingHandlerMapping`、`RequestMappingHandlerAdapter`或`ExceptionHandlerExceptionResolver`的自定义实例,并且仍然保持 Spring 引导 MVC 自定义,则可以声明类型`WebMvcRegistrations`的 Bean 并使用它来提供这些组件的自定义实例。 -如果你想完全控制 Spring MVC,可以添加你自己的`@Configuration`,并使用`@EnableWebMvc`进行注释,或者也可以添加你自己的`@Configuration`-注释`DelegatingWebMvcConfiguration`,如`@EnableWebMvc`的 javadoc 中所描述的。 +如果你想完全控制 Spring MVC,你可以添加你自己的`@Configuration`,并使用`@EnableWebMvc`进行注释,或者也可以添加你自己的`@Configuration`-注释`DelegatingWebMvcConfiguration`,如`@EnableWebMvc`的 Javadoc 中所描述的。 | |Spring MVC 使用不同的`ConversionService`来转换来自`application.properties`或`application.yaml`文件的值,
表示`Period`,`Duration`和`DataSize`转换器不可用,并且`@DurationUnit`和`@DataSizeUnit`注释将被忽略。

如果你想定制 Spring MVC 使用的`ConversionService`,你可以提供带有`WebMvcConfigurer` Bean 的`addFormatters`方法。
从该方法你可以注册任何你喜欢的转换器,或者你可以将其委托给`ApplicationConversionService`上可用的静态方法。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -229,9 +229,9 @@ public class MyJsonComponent { 在`ApplicationContext`中的所有`@JsonComponent`bean 都会自动注册到 Jackson 中。由于`@JsonComponent`是用`@Component`进行元注释的,因此通常的组件扫描规则适用。 -Spring Boot 还提供了[jsonobjectserializer’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonObjectSerializer.java)和[jsonobjectdeserializer’](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonObjectDeserializer.java)基类,它们在序列化对象时为标准 Jackson 版本提供了有用的替代方案。有关详细信息,请参见 Javadoc 中的[jsonobjectserializer’](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/jackson/JsonObjectSerializer.html)和[jsonobjectdeserializer’](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/jackson/JsonObjectDeserializer.html)。 +Spring Boot 还提供了[`JsonObjectSerializer`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/Jackson/jsonobjectserializer.java.java)和[](https://github.com/[ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring- Spring-boot-project-project/[参见[`JsonObjectSerializer`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/Jackson/jsonobjectserializer.html)和[`JsonObjectDeserializer`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/Jackson/jsonobjeserializer.html)中的 JavaDoc 以获取详细信息。 -上面的示例可以重写为使用`JsonObjectSerializer`/`jsonobjectdeserializer’,如下所示: +上面的示例可以重写为使用`JsonObjectSerializer`/`JsonObjectDeserializer`如下: ``` import java.io.IOException; @@ -277,9 +277,9 @@ public class MyJsonComponent { ``` -#### 1.1.4.MessageCodesResolver +#### 1.1.4.Messenger EcodesResolver -Spring MVC 具有用于生成用于从绑定错误呈现错误消息的错误代码的策略:。如果你设置`spring.mvc.message-codes-resolver-format`属性`PREFIX_ERROR_CODE`或`POSTFIX_ERROR_CODE`, Spring boot 将为你创建一个属性(请参见[`DefaultMessageCodesResolver.format’](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/validation/DefaultMessageCodesResolver.Format.html)中的枚举)。 +Spring MVC 具有用于生成用于从绑定错误呈现错误消息的错误代码的策略:。如果你设置`spring.mvc.message-codes-resolver-format`属性`PREFIX_ERROR_CODE`或`POSTFIX_ERROR_CODE`, Spring boot 将为你创建一个(参见[`DefaultMessageCodesResolver.Format`]中的枚举(https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/defalidation/ressMessagecover.format.html))。 #### 1.1.5.静态内容 @@ -305,9 +305,9 @@ spring: 你还可以通过使用`spring.web.resources.static-locations`属性(用目录位置列表替换默认值)来定制静态资源位置。根 Servlet 上下文路径`"/"`也会自动添加为位置。 -除了前面提到的“标准”静态资源位置之外,[Webjars content](https://www.webjars.org/)还有一个特殊情况。路径在`/webjars/**`中的任何资源,如果以 WebJARS 格式打包,都将从 jar 文件中得到服务。 +除了前面提到的“标准”静态资源位置之外,[Webjars 内容](https://www.webjars.org/)还有一个特殊情况。路径在`/webjars/**`中的任何资源,如果以 WebJARS 格式打包,都将从 jar 文件中得到服务。 -| |如果你的应用程序被打包为 jar,请不要使用`src/main/webapp`目录。
虽然这个目录是一个通用的标准,但是它在 WAR 打包中是**只是**的,如果你生成 jar,大多数构建工具都会默默地忽略它。| +| |如果你的应用程序被打包为 jar,请不要使用`src/main/webapp`目录。
虽然这个目录是一个通用的标准,但是它在 WAR 打包中是**只有**的,如果你生成 jar,大多数构建工具都会默默地忽略它。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Spring 启动还支持由 Spring MVC 提供的高级资源处理功能,允许使用诸如破坏缓存的静态资源或使用用于 WebJAR 的与版本无关的 URL 的情况。 @@ -339,7 +339,7 @@ spring: paths: "/**" ``` -| |资源的链接在运行时在模板中被重写,由于`ResourceUrlEncodingFilter`是为 ThymeLeaf 和 FreeMarker 自动配置的。
在使用 JSP 时,你应该手动声明此过滤器。
其他模板引擎目前不能自动支持,但可以与自定义模板宏/助手一起使用[` 资源提供者’](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/web/servlet/resource/ResourceUrlProvider.html)。| +| |资源的链接在运行时在模板中被重写,由于`ResourceUrlEncodingFilter`是为 ThymeLeaf 和 Freemarker 自动配置的。
在使用 JSP 时,你应该手动声明此过滤器。
其他模板引擎目前不能自动支持,但可以与自定义模板宏/助手一起使用[`ResourceUrlProvider`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javc-api/org/spramework/spramework/ Servlet/resource/resourceurceurlprovider.html)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 例如,当使用 JavaScript 模块加载程序动态加载资源时,不能选择重命名文件。这就是为什么其他策略也得到了支持,并且可以结合在一起。“固定”策略在不更改文件名的情况下在 URL 中添加静态版本字符串,如下例所示: @@ -371,11 +371,11 @@ spring: version: "v12" ``` -在这种配置下,位于`"/js/lib/"`下的 JavaScript 模块使用固定的版本控制策略(`“/v12/js/lib/mymodule.js”`),而其他资源仍然使用 Content One(``)。 +通过这种配置,位于`"/js/lib/"`下的 JavaScript 模块使用固定的版本控制策略(`"/v12/js/lib/mymodule.js"`),而其他资源仍然使用 Content One(``)。 -有关更多支持的选项,请参见[“Web属性.resources”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/Web属性.java)。 +参见[`Web属性.Resources`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/web/webproperties.java)以获得更多支持的选项。 -| |这个特性已经在专用的[blog post](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources)和 Spring 框架的[参考文献](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-config-static-resources)中进行了详细的描述。| +| |这个特性已经在一个专用的[blog post](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources)和 Spring 框架的[参考文献](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-config-static-resources)中进行了详细的描述。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.6.欢迎页面 @@ -384,9 +384,9 @@ Spring 启动支持静态和模板化欢迎页面。它首先在配置的静态 #### 1.1.7.路径匹配和内容协商 -Spring MVC 可以通过查看请求路径并将其与应用程序中定义的映射(例如,控制器方法上的`@GetMapping`注释)进行匹配,将传入的 HTTP 请求映射到处理程序。 +Spring MVC 可以通过查看请求路径并将其与你的应用程序中定义的映射(例如,控制器方法上的`@GetMapping`注释)匹配,将传入的 HTTP 请求映射到处理程序。 -Spring Boot 默认情况下选择禁用后缀模式匹配,这意味着像`"GET /projects/spring-boot.json"`这样的请求将不会匹配到`@GetMapping("/projects/spring-boot")`映射。这被认为是[best practice for Spring MVC applications](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-ann-requestmapping-suffix-pattern-match)。这个特性在过去主要用于 HTTP 客户机,因为 HTTP 客户机没有发送正确的“接受”请求头;我们需要确保向客户机发送正确的内容类型。如今,内容协商更可靠了。 +Spring 引导默认情况下选择禁用后缀模式匹配,这意味着像`"GET /projects/spring-boot.json"`这样的请求将不会匹配到`@GetMapping("/projects/spring-boot")`映射。这被认为是[best practice for Spring MVC applications](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-ann-requestmapping-suffix-pattern-match)。这个特性在过去主要用于 HTTP 客户机,因为 HTTP 客户机没有发送正确的“接受”请求头;我们需要确保向客户机发送正确的内容类型。如今,内容协商更可靠了。 还有其他方法来处理不能始终发送正确的“接受”请求头的 HTTP 客户机。与使用后缀匹配不同,我们可以使用一个查询参数来确保像`"GET /projects/spring-boot?format=json"`这样的请求将被映射到`@GetMapping("/projects/spring-boot")`: @@ -501,7 +501,7 @@ spring: 有关为什么应该考虑这个新实现的更多详细信息,请参见[专门的博客文章](https://spring.io/blog/2020/06/30/url-matching-with-pathpattern-in-spring-mvc)。 -| |`PathPatternParser`是一种优化的实现,但限制了[一些路径模式变体](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-ann-requestmapping-uri-templates)的使用,并且与后缀模式匹配(` Spring.mvc.pathmatch.use-suffix-pattern`,` Spring.mvc.pathmatch.use-registered-suffix-spattern`)或映射带有 Servlet 前缀的`DispatcherServlet`(` Spring.mvc. Servlet.path`)不兼容。| +| |`PathPatternParser`是一个优化的实现,但限制了[一些路径模式变体](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-ann-requestmapping-uri-templates)的使用,并且与后缀模式匹配(`spring.mvc.pathmatch.use-suffix-pattern`,`spring.mvc.pathmatch.use-registered-suffix-pattern`)或映射带有 Servlet 前缀(`spring.mvc.servlet.path`)的`DispatcherServlet`不兼容。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.8.配置 WebBindingInitializer @@ -525,14 +525,14 @@ Spring 启动包括对以下模板引擎的自动配置支持: | |如果可能的话,应该避免使用 JSP。
在使用嵌入式 Servlet 容器时,有几个[已知限制](#web.servlet.embedded-container.jsp-limitations)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -当你使用这些模板引擎中的一个具有默认配置时,你的模板将从`src/main/resources/templates`中自动拾取。 +当你使用这些模板引擎中的一个具有默认配置时,你的模板将自动从`src/main/resources/templates`中提取。 -| |取决于你如何运行你的应用程序,你的 IDE 可能会以不同的方式对 Classpath 进行排序。
在 IDE 中从其主方法运行应用程序会导致与使用 Maven 或 Gradle 运行应用程序时不同的排序。或者从其打包的 jar。
这可能会导致 Spring 引导无法找到预期的模板。
如果你有这个问题,你可以重新排序 IDE 中的 Classpath,以便首先放置模块的类和资源。| +| |取决于你如何运行你的应用程序,你的 IDE 可能会以不同的方式对 Classpath 进行排序。
在 IDE 中从其主方法运行你的应用程序会导致与使用 Maven 或 Gradle 运行你的应用程序时不同的排序。或者从其打包的 jar。
这可能会导致 Spring 引导无法找到预期的模板。
如果你有这个问题,你可以重新排序 IDE 中的 Classpath,以便首先放置模块的类和资源。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.1.10.错误处理 -默认情况下, Spring Boot 提供了一个`/error`映射,该映射以合理的方式处理所有错误,并且在 Servlet 容器中将其注册为“全局”错误页。对于机器客户机,它生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户端,有一个“whitelabel”错误视图,该视图以 HTML 格式呈现相同的数据(要对其进行自定义,请添加一个`View`,将其解析为`error`)。 +默认情况下, Spring Boot 提供了一个`/error`映射,该映射以合理的方式处理所有错误,并将其注册为 Servlet 容器中的“全局”错误页。对于机器客户机,它生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户机,有一个“WhiteLabel”错误视图,该视图以 HTML 格式呈现相同的数据(要对其进行自定义,请添加一个`View`,将其解析为`error`)。 如果你想定制默认的错误处理行为,那么可以设置许多`server.error`属性。参见附录中的[“服务器属性”](application-properties.html#appendix.application-properties.server)部分。 @@ -657,11 +657,11 @@ public class MyErrorViewResolver implements ErrorViewResolver { ``` -还可以使用常规的 Spring MVC 特性,例如[@ExceptionHandler 方法](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-exceptionhandlers)和[@controlleradvice](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-ann-controller-advice)。然后,`ErrorController`将获取任何未处理的异常。 +你也可以使用常规的 Spring MVC 特性,例如[`@ExceptionHandler`方法](https://DOCS. Spring.io/ Spring-Framework/DOCS/5.3.16/Reference/html/web.html#MVC-ExceptionHandlers)和[`@ControllerAdvice`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/reference/html/web.html-controller-mover-advc-advice)。然后,`ErrorController`将获取任何未处理的异常。 -##### 映射 Spring MVC#### 以外的错误页面 +##### 映射 Spring MVC#### 之外的错误页面 -对于不使用 Spring MVC 的应用程序,可以使用`ErrorPageRegistrar`接口直接注册`ErrorPages`。这个抽象可以直接与底层嵌入的 Servlet 容器一起工作,即使你没有 Spring MVC也可以工作。 +对于不使用 Spring MVC 的应用程序,可以使用`ErrorPageRegistrar`接口直接注册`ErrorPages`。这个抽象可以直接与底层嵌入的 Servlet 容器一起工作,并且即使你没有 Spring MVC也可以工作。 ``` import org.springframework.boot.web.server.ErrorPage; @@ -718,17 +718,17 @@ public class MyFilterConfiguration { ##### WAR 部署中的错误处理 -当部署到 Servlet 容器时, Spring 引导使用其错误页过滤器将具有错误状态的请求转发到适当的错误页。这是必要的,因为 Servlet 规范没有提供用于注册错误页的 API。根据部署 WAR 文件的容器和应用程序使用的技术,可能需要进行一些额外的配置。 +当部署到 Servlet 容器时, Spring 引导使用其错误页过滤器将具有错误状态的请求转发到适当的错误页。这是必要的,因为 Servlet 规范不提供用于注册错误页的 API。根据部署 WAR 文件的容器和应用程序使用的技术,可能需要进行一些额外的配置。 -如果响应尚未提交,则错误页筛选器只能将请求转发到正确的错误页。默认情况下,WebSphere Application Server8.0 及更高版本在成功完成 Servlet 的服务方法后提交响应。你应该通过将`com.ibm.ws.webcontainer.invokeFlushAfterService`设置为`false`来禁用此行为。 +如果响应尚未提交,则错误页筛选器只能将请求转发到正确的错误页。默认情况下,WebSphere Application Server8.0 及以后版本在成功完成 Servlet 的服务方法后提交响应。你应该通过将`com.ibm.ws.webcontainer.invokeFlushAfterService`设置为`false`来禁用此行为。 -如果你正在使用 Spring 安全性,并且希望访问错误页中的主体,则必须配置 Spring Security 的筛选器,以便在错误分派时调用该筛选器。为此,将`spring.security.filter.dispatcher-types`属性设置为`async, error, forward, request`。 +如果你正在使用 Spring 安全,并且希望访问错误页中的主体,则必须配置 Spring Security 的筛选器,以便在错误分派时调用该筛选器。为此,将`spring.security.filter.dispatcher-types`属性设置为`async, error, forward, request`。 #### 1.1.11.CORS 支持 -[跨源资源共享](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)是一个[W3C 规范](https://www.w3.org/TR/cors/)由[most browsers](https://caniuse.com/#feat=cors)实现的[W3C 规范](https://www.w3.org/TR/cors/),它允许你以一种灵活的方式指定授权哪种类型的跨域请求,而不是使用一些安全性较低、功能较弱的方法,例如 IFRAME 或 JSONP。 +[跨源资源共享](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)是一个[W3C 规范](https://www.w3.org/TR/cors/)由[大多数浏览器](https://caniuse.com/#feat=cors)实现的[W3C 规范](https://www.w3.org/TR/cors/),它允许你以一种灵活的方式指定授权哪种类型的跨域请求,而不是使用一些安全性较低、功能较弱的方法,例如 IFRAME 或 JSONP。 -截至版本 4.2, Spring MVC[supports CORS](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors)。在 Spring 引导应用程序中使用[控制器方法 CORS 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors-controller)和[`@CrossOrigin`](https://docs.spring.io/spring-framework/docs/5.3.16/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html)注释不需要任何特定的配置。[全局 CORS 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors-global)可以通过使用自定义的`WebMvcConfigurer` Bean 方法注册`addCorsMappings(CorsRegistry)`方法来定义[全局 CORS 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors-global),如以下示例所示: +在版本 4.2 中, Spring MVC[支持 CORS](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors)。在 Spring 引导应用程序中使用[控制器方法 CORS 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors-controller)与[`@CrossOrigin`](https://DOCS. Spring.io/ Spring-framework/DOCS/5.3.16/javadoc-api/org/springframework/web/bind/annotation/crossorigin.html)注释不需要任何特定的配置。[全局 CORS 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc-cors-global)可以通过使用定制的`WebMvcConfigurer`[gt116]注册一个`addCorsMappings(CorsRegistry)`方法来定义,如下例所示: ``` import org.springframework.context.annotation.Bean; @@ -757,7 +757,7 @@ public class MyCorsConfiguration { ### 1.2.JAX-RS 和泽西岛 -如果你更喜欢用于 REST 端点的 JAX-RS 编程模型,那么你可以使用其中一个可用的实现,而不是 Spring MVC。和完全可以开箱即用。CXF 要求你在应用程序上下文中将其`Servlet`或`Filter`注册为`@Bean`。Jersey 提供了一些本机 Spring 支持,因此我们还在 Spring 启动中为它提供了自动配置支持,以及一个启动器。 +如果你更喜欢用于 REST 端点的 JAX-RS 编程模型,那么你可以使用其中一个可用的实现,而不是 Spring MVC。和在开箱即用的情况下工作得很好。CXF 要求你在应用程序上下文中将其`Servlet`或`Filter`注册为`@Bean`。Jersey 有一些本机的 Spring 支持,因此我们还在 Spring 启动中为它提供了自动配置支持,以及一个启动器。 要开始使用 Jersey,将`spring-boot-starter-jersey`作为依赖项,然后需要一个类型为`ResourceConfig`的`@Bean`,在其中注册所有端点,如以下示例所示: @@ -777,12 +777,12 @@ public class MyJerseyConfig extends ResourceConfig { ``` -| |Jersey 对扫描可执行文档的支持相当有限,例如,当运行可执行 WAR 文件时,它无法扫描在[fully executable jar file](deployment.html#deployment.installing)或`WEB-INF/classes`中找到的包中的端点。
为了避免这种限制,不应使用`packages`方法,端点应该使用`register`方法单独注册,如前面的示例所示。| +| |Jersey 对扫描可执行文档的支持相当有限,例如,当运行可执行 WAR 文件时,它不能扫描在[fully executable jar file](deployment.html#deployment.installing)或`WEB-INF/classes`中找到的包中的端点。
为了避免这种限制,不应使用`packages`方法,端点应该使用`register`方法单独注册,如前面的示例所示。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 对于更高级的定制,你还可以注册任意数量的 bean 来实现`ResourceConfigCustomizer`。 -所有注册的端点都应该是`@Components`,带有 HTTP 资源注释(`@get’和其他),如下例所示: +所有注册的端点都应该是`@Components`,带有 HTTP 资源注释(`@GET`等),如下例所示: ``` import javax.ws.rs.GET; @@ -803,9 +803,9 @@ public class MyEndpoint { ``` -由于`Endpoint`是 Spring `@Component`,因此其生命周期由 Spring 管理,你可以使用`@Autowired`注释来注入依赖项,并使用`@Value`注释来注入外部配置。默认情况下,泽西 Servlet 被注册并映射到`/*`。你可以通过将`@ApplicationPath`添加到你的`ResourceConfig`来更改映射。 +由于`Endpoint`是一个 Spring `@Component`,其生命周期由 Spring 管理,你可以使用`@Autowired`注释来注入依赖项,并使用`@Value`注释来注入外部配置。默认情况下,泽西 Servlet 被注册并映射到`/*`。可以通过将`@ApplicationPath`添加到`ResourceConfig`来更改映射。 -默认情况下,在`ServletRegistrationBean`类型的`@Bean`中将泽西设置为 Servlet,命名为`jerseyServletRegistration`。默认情况下, Servlet 是惰性初始化的,但是你可以通过设置`spring.jersey.servlet.load-on-startup`来定制这种行为。你可以通过创建你自己的同名应用程序来禁用或重写它 Bean。还可以通过设置`spring.jersey.type=filter`(在这种情况下,要替换或覆盖的`@Bean`是`jerseyFilterRegistration`)来使用过滤器而不是 Servlet。过滤器有一个`@Order`,你可以用`spring.jersey.filter.order`对其进行设置。当使用 Jersey 作为过滤器时,必须有一个 Servlet 来处理未被 Jersey 截获的任何请求。如果你的应用程序不包含这样的 Servlet,那么你可能希望通过将`server.servlet.register-default-servlet`设置为`true`来启用缺省 Servlet。 Servlet 和过滤器注册都可以通过使用`spring.jersey.init.*`来指定属性的映射来给定 init 参数。 +默认情况下,在`ServletRegistrationBean`类型的`@Bean`中将泽西设置为 Servlet,名称为`jerseyServletRegistration`。默认情况下, Servlet 是惰性初始化的,但是你可以通过设置`spring.jersey.servlet.load-on-startup`来定制这种行为。你可以通过创建自己的同名应用程序来禁用或重写该 Bean。还可以通过设置`spring.jersey.type=filter`(在这种情况下,要替换或覆盖的`@Bean`是`jerseyFilterRegistration`)来使用过滤器而不是 Servlet。过滤器有一个`@Order`,你可以用`spring.jersey.filter.order`设置它。当使用 Jersey 作为过滤器时,必须有一个 Servlet 来处理未被 Jersey 截获的任何请求。如果你的应用程序不包含这样的 Servlet,那么你可能希望通过将`server.servlet.register-default-servlet`设置为`true`来启用缺省 Servlet。 Servlet 和过滤器注册都可以通过使用`spring.jersey.init.*`来指定属性的映射来给定 init 参数。 ### 1.3.嵌入式 Servlet 容器支持 @@ -817,7 +817,7 @@ public class MyEndpoint { ##### 将 servlet、过滤器和侦听器注册为 Spring bean##### -任何`Servlet`,`Filter`,或 Servlet `*Listener`实例中的 Spring Bean 都是在嵌入式容器中注册的。如果你希望在配置过程中引用来自`application.properties`的值,那么这将非常方便。 +任何`Servlet`,`Filter`,或 Servlet `*Listener`实例中的 Spring Bean 是在嵌入式容器中注册的。如果你希望在配置过程中引用来自`application.properties`的值,那么这将非常方便。 默认情况下,如果上下文只包含一个 Servlet,则将其映射到`/`。在多个 Servlet bean 的情况下, Bean 名称被用作路径前缀。过滤器映射到`/*`。 @@ -825,51 +825,51 @@ public class MyEndpoint { 通常情况下,保持过滤豆的无序状态是安全的。如果需要特定的顺序,你应该用`@Order`注释`Filter`,或者使其实现`Ordered`。不能通过用`@Order`注释其 Bean 方法来配置`Filter`的顺序。如果不能将`Filter`类更改为添加`@Order`或实现`Ordered`,则必须为`Filter`定义一个`FilterRegistrationBean`,并使用`setOrder(int)`方法设置注册 Bean 的顺序。避免配置读取请求主体`Ordered.HIGHEST_PRECEDENCE`的筛选器,因为它可能与应用程序的字符编码配置不一致。如果 Servlet 过滤器包装了该请求,则应将其配置为小于或等于`OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER`的顺序。 -| |要查看应用程序中每个`Filter`的顺序,请启用`web`[logging group](features.html#features.logging.log-groups)的调试级别日志。
将在启动时记录已注册过滤器的详细信息,包括它们的顺序和 URL 模式。| +| |要查看应用程序中每个`Filter`的顺序,请启用`web`[伐木组](features.html#features.logging.log-groups)(`logging.level.web=debug`)的调试级别日志。
将在启动时记录已注册过滤器的详细信息,包括它们的顺序和 URL 模式。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在注册`Filter`bean 时要小心,因为它们是在应用程序生命周期的早期进行初始化的。
如果需要注册与其他 bean 交互的`Filter`,请考虑使用[“委托过滤程序注册”](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/web/servlet/DelegatingFilterProxyRegistrationBean.html)。| +| |注册`Filter`bean 时要小心,因为它们在应用程序生命周期的很早就被初始化了。
如果需要注册一个与其他 bean 交互的`Filter`,请考虑使用一个[`DelegatingFilterProxyRegistrationBean`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/web/ Servlet/delegatingfilterbean.html)来代替。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.3.2. Servlet 上下文初始化 -嵌入式 Servlet 容器不直接执行 Servlet 3.0+`javax.servlet.ServletContainerInitializer`接口或 Spring 的`org.springframework.web.WebApplicationInitializer`接口。这是一种有意的设计决策,旨在降低设计用于在 WAR 内部运行的第三方库可能破坏 Spring 引导应用程序的风险。 +嵌入式 Servlet 容器不直接执行 Servlet 3.0+`javax.servlet.ServletContainerInitializer`接口或 Spring 的`org.springframework.web.WebApplicationInitializer`接口。这是一种有意的设计决策,旨在降低设计用于在 WAR 内部运行的第三方库可能会破坏 Spring 引导应用程序的风险。 -如果需要在 Spring 引导应用程序中执行 Servlet 上下文初始化,则应注册实现`org.springframework.boot.web.servlet.ServletContextInitializer`接口的 Bean。单一的`onStartup`方法提供了对`ServletContext`的访问,并且如果需要,可以很容易地用作现有`WebApplicationInitializer`的适配器。 +如果需要在 Spring 引导应用程序中执行 Servlet 上下文初始化,则应该注册一个实现`org.springframework.boot.web.servlet.ServletContextInitializer`接口的 Bean。单一的`onStartup`方法提供了对`ServletContext`的访问,并且如果需要,可以很容易地用作现有`WebApplicationInitializer`的适配器。 ##### 扫描 servlet、过滤器和侦听器 #### 当使用嵌入式容器时,使用`@WebServlet`、`@WebFilter`和`@WebListener`注释的类的自动注册可以通过使用`@ServletComponentScan`来启用。 -| |`@ServletComponentScan`在独立的容器中没有任何作用,相反,在独立的容器中使用的是容器的内置发现机制。| +| |`@ServletComponentScan`在独立容器中没有任何作用,相反,在独立容器中使用的是容器的内置发现机制。| |---|--------------------------------------------------------------------------------------------------------------------------------------| #### 1.3.3.ServletWebServerApplicationContext -在引擎盖下, Spring 引导使用不同类型的`ApplicationContext`用于嵌入式 Servlet 容器支持。`ServletWebServerApplicationContext`是`WebApplicationContext`的一种特殊类型,它通过搜索单个`ServletWebServerFactory`来引导自身。通常`TomcatServletWebServerFactory`、`JettyServletWebServerFactory`或`UndertowServletWebServerFactory`已被自动配置。 +在引擎盖下, Spring 引导使用不同类型的`ApplicationContext`用于嵌入式 Servlet 容器支持。`ServletWebServerApplicationContext`是`WebApplicationContext`的一种特殊类型,它通过搜索单个`ServletWebServerFactory` Bean 来引导自身。通常`TomcatServletWebServerFactory`、`JettyServletWebServerFactory`或`UndertowServletWebServerFactory`已被自动配置。 | |你通常不需要了解这些实现类。
大多数应用程序都是自动配置的,并且适当的`ApplicationContext`和`ServletWebServerFactory`是代表你创建的。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### 1.3.4.自定义嵌入式 Servlet 容器 -公共 Servlet 容器设置可以通过使用 Spring `Environment`属性来配置。通常,你会在`application.properties`或`application.yaml`文件中定义属性。 +可通过使用 Spring `Environment`属性来配置公共 Servlet 容器设置。通常,你会在`application.properties`或`application.yaml`文件中定义属性。 常见的服务器设置包括: -* 网络设置:监听传入 HTTP 请求的端口,绑定到`server.address`的接口地址,等等。 +* 网络设置:用于接收 HTTP 请求(`server.port`)的侦听端口,绑定到`server.address`的接口地址,以此类推。 -* 会话设置:会话是否持久(“服务器. Servlet.会话.Persistent”)、会话超时(“服务器. Servlet.会话.Timeout”)、会话数据的位置(“服务器. Servlet.会话.存储-目录”)以及会话-cookie 配置(“服务器. Servlet.会话.cookie.*”)。 +* 会话设置:会话是否持久(`server.servlet.session.persistent`)、会话超时(`server.servlet.session.timeout`)、会话数据的位置(`server.servlet.session.store-dir`)和会话-cookie 配置(`server.servlet.session.cookie.*`)。 -* 错误管理:错误页面的位置(“server.error.path”)等等。 +* 错误管理:错误页面的位置(`server.error.path`)等等。 * [SSL](howto.html#howto.webserver.configure-ssl) * [HTTP 压缩](howto.html#howto.webserver.enable-response-compression) -Spring 引导尝试尽可能多地公开公共设置,但这并不总是可能的。对于这些情况,专用的名称空间提供了特定于服务器的定制(参见`server.tomcat`和`server.undertow`)。例如,[access logs](howto.html#howto.webserver.configure-access-logs)可以配置具有嵌入式 Servlet 容器的特定特征。 +Spring 引导尝试尽可能多地公开公共设置,但这并不总是可能的。对于这些情况,专用的名称空间提供了特定于服务器的定制(参见`server.tomcat`和`server.undertow`)。例如,[访问日志](howto.html#howto.webserver.configure-access-logs)可以配置具有嵌入式 Servlet 容器的特定特征。 -| |有关完整列表,请参见[“serverproperties”](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/Server属性.java)类。| +| |参见[`Server属性`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/springframework/boot/autofigure/web/serverproperties.java)类的完整列表。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### Samesite 饼干 @@ -896,9 +896,9 @@ server: same-site: "none" ``` -如果要更改添加到`HttpServletResponse`的其他 cookie 上的`SameSite`属性,可以使用`CookieSameSiteSupplier`。`CookieSameSiteSupplier`传递了一个`Cookie`,并可能返回一个`SameSite`值,或`null`。 +如果要更改添加到`HttpServletResponse`中的其他 cookie 上的`SameSite`属性,可以使用`CookieSameSiteSupplier`。`CookieSameSiteSupplier`传递了一个`Cookie`,并可能返回一个`SameSite`值,或`null`。 -有许多方便的工厂和过滤方法,你可以使用它们来快速匹配特定的 Cookie。例如,添加下面的 Bean 将自动为所有名称与正则表达式`myapp.*`匹配的 cookie 应用`SameSite`的`SameSite`。 +有许多方便的工厂和过滤方法,你可以使用它们来快速匹配特定的 Cookie。例如,添加以下 Bean 将自动为所有名称与正则表达式`myapp.*`匹配的 cookie 应用`SameSite`的`SameSite`。 ``` import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier; @@ -919,7 +919,7 @@ public class MySameSiteConfiguration { ##### 程序化定制 -如果你需要以编程方式配置你的嵌入式 Servlet 容器,那么你可以注册一个 Spring Bean 来实现`WebServerFactoryCustomizer`接口。`WebServerFactoryCustomizer` 提供对`ConfigurableServletWebServerFactory`的访问,其中包括许多自定义设置器方法。下面的示例以编程方式显示了端口的设置: +如果需要以编程方式配置你的嵌入式 Servlet 容器,则可以注册一个实现`WebServerFactoryCustomizer`接口的 Spring Bean。`WebServerFactoryCustomizer`提供对`ConfigurableServletWebServerFactory`的访问,其中包括许多自定义 setter 方法。下面的示例以编程方式显示了端口的设置: ``` import org.springframework.boot.web.server.WebServerFactoryCustomizer; @@ -938,7 +938,7 @@ public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer< ``` -`TomcatServletWebServerFactory`、`JettyServletWebServerFactory`和`UndertowServletWebServerFactory`是`ConfigurableServletWebServerFactory`的专用变体,它们分别具有用于 Tomcat、 Jetty 和 Undertow 的附加自定义设置器方法。下面的示例展示了如何定制`TomcatServletWebServerFactory`,从而提供对 Tomcat 特定配置选项的访问: +`TomcatServletWebServerFactory`、`JettyServletWebServerFactory`和`UndertowServletWebServerFactory`是`ConfigurableServletWebServerFactory`的专用变体,它们分别具有用于 Tomcat、 Jetty 和 Undertow 的附加自定义 setter 方法。下面的示例展示了如何定制`TomcatServletWebServerFactory`,从而提供对 Tomcat 特定配置选项的访问: ``` import java.time.Duration; @@ -976,7 +976,7 @@ public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCusto * Undertow 不支持 JSP。 -* 创建自定义`error.jsp`页面不会覆盖[error handling](#web.servlet.spring-mvc.error-handling)的默认视图。应该使用[自定义错误页面](#web.servlet.spring-mvc.error-handling.error-pages)。 +* 创建自定义`error.jsp`页面不会覆盖[错误处理](#web.servlet.spring-mvc.error-handling)的默认视图。应该使用[自定义错误页面](#web.servlet.spring-mvc.error-handling.error-pages)。 ## 2. 反应式 Web 应用程序 @@ -1094,7 +1094,7 @@ WebFlux 是 Spring 框架的一部分,其[参考文献](https://docs.spring.io 要开始,将`spring-boot-starter-webflux`模块添加到应用程序中。 -| |在应用程序中同时添加`spring-boot-starter-web`和`spring-boot-starter-webflux`模块将导致 Spring 引导自动配置 Spring MVC,不是 WebFlux.
之所以选择这种行为,是因为许多 Spring 开发人员将`spring-boot-starter-webflux`添加到他们的 Spring MVC 应用程序中,以使用反应式`WebClient`。
你仍然可以通过将选择的应用程序类型设置为`SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)`来强制执行你的选择。| +| |在应用程序中同时添加`spring-boot-starter-web`和`spring-boot-starter-webflux`模块会导致 Spring 引导自动配置 Spring MVC,不是 WebFlux.
之所以选择这种行为,是因为许多 Spring 开发人员将`spring-boot-starter-webflux`添加到他们的 Spring MVC 应用程序中,以使用反应式`WebClient`。
你仍然可以通过将选择的应用程序类型设置为`SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)`来强制执行你的选择。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| “WebFlux.FN”是一种功能变体,它将路由配置与请求的实际处理分离开来,如下例所示: @@ -1166,7 +1166,7 @@ WebFlux 是 Spring 框架的一部分,其[参考文献](https://docs.spring.io #### 2.1.1. Spring WebFlux 自动配置 -Spring Boot 为 Spring WebFlux 提供了能够在大多数应用程序中很好地工作的自动配置。 +Spring 启动为 Spring WebFlux 提供了自动配置,该配置在大多数应用程序中都能很好地工作。 自动配置在 Spring 的默认值之上添加了以下功能: @@ -1174,13 +1174,13 @@ Spring Boot 为 Spring WebFlux 提供了能够在大多数应用程序中很好 * 对服务静态资源的支持,包括对 WebJAR 的支持(描述[在本文的后面部分](#web.servlet.spring-mvc.static-content))。 -如果你希望保留 Spring Boot WebFlux 特性并且希望添加额外的[WebFlux 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#webflux-config),则可以添加你自己的`@Configuration`类型的类别`WebFluxConfigurer`但是**没有**`@EnableWebFlux`。 +如果你希望保留 Spring boot WebFlux 特性并且希望添加额外的[WebFlux 配置](https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web-reactive.html#webflux-config),则可以添加你自己的`@Configuration`类型的类别`WebFluxConfigurer`但是**没有**`@EnableWebFlux`。 如果你想完全控制 Spring WebFlux,那么可以添加你自己的`@Configuration`,并使用`@EnableWebFlux`进行注释。 #### 2.1.2.带有 HttpMessageReaders 和 HttpMessageWriters 的 HTTP 编解码器 -Spring WebFlux 使用`HttpMessageReader`和`HttpMessageWriter`接口来转换 HTTP 请求和响应。通过查看 Classpath 中可用的库,将它们配置为`CodecConfigurer`,以具有合理的默认值。 +Spring WebFlux 使用`HttpMessageReader`和`HttpMessageWriter`接口来转换 HTTP 请求和响应。通过查看 Classpath 中可用的库,将`CodecConfigurer`配置为具有合理的默认值。 Spring Boot 为编解码器提供了专用的配置属性,`spring.codec.*`。它还通过使用`CodecCustomizer`实例应用进一步的定制。例如,`spring.jackson.*`配置键被应用于 Jackson 编解码器。 @@ -1212,7 +1212,7 @@ public class MyCodecsConfiguration { #### 2.1.3.静态内容 -默认情况下, Spring 引导从 Classpath 中的一个名为`/static`(或`/public`或`/resources`或`/META-INF/resources`)的目录中提供静态内容。它使用 Spring WebFlux 中的`ResourceWebHandler`,这样你就可以通过添加自己的`WebFluxConfigurer`并重写`addResourceHandlers`方法来修改该行为。 +默认情况下, Spring 引导从 Classpath 中的一个名为`/static`(或`/public`或`/resources`或`/META-INF/resources`)的目录中提供静态内容。它使用 Spring WebFlux 中的`ResourceWebHandler`,以便你可以通过添加自己的`WebFluxConfigurer`并重写`addResourceHandlers`方法来修改该行为。 默认情况下,资源映射在`/**`上,但是你可以通过设置`spring.webflux.static-path-pattern`属性对其进行调优。例如,将所有资源重新定位到`/resources/**`可以通过以下方式实现: @@ -1232,7 +1232,7 @@ spring: 你还可以使用`spring.web.resources.static-locations`自定义静态资源位置。这样做可以用目录位置列表替换默认值。如果你这样做,默认的欢迎页面检测将切换到你的自定义位置。因此,如果在启动时的任何位置都有`index.html`,那么它就是应用程序的主页。 -除了前面列出的“标准”静态资源位置之外,[Webjars content](https://www.webjars.org/)还有一个特殊情况。路径在`/webjars/**`中的任何资源,如果以 WebJARS 格式打包,都将从 jar 文件中得到服务。 +除了前面列出的“标准”静态资源位置之外,[Webjars 内容](https://www.webjars.org/)还有一个特殊情况。路径在`/webjars/**`中的任何资源,如果以 WebJARS 格式打包,都将从 jar 文件中得到服务。 | |Spring WebFlux 应用程序不严格依赖于 Servlet API,因此它们不能作为 WAR 文件部署,也不使用`src/main/webapp`目录。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -1243,7 +1243,7 @@ Spring 启动支持静态和模板化欢迎页面。它首先在配置的静态 #### 2.1.5.模板引擎 -与 REST Web 服务一样,你也可以使用 Spring WebFlux 来提供动态 HTML 内容。 Spring WebFlux 支持各种模板化技术,包括胸腺叶、自由标记和胡子。 +与 REST Web 服务一样,你也可以使用 Spring WebFlux 来服务动态 HTML 内容。 Spring WebFlux 支持各种模板化技术,包括胸腺叶、自由标记和胡子。 Spring 启动包括对以下模板引擎的自动配置支持: @@ -1257,11 +1257,11 @@ Spring 启动包括对以下模板引擎的自动配置支持: #### 2.1.6.错误处理 -Spring Boot 提供了一个`WebExceptionHandler`,它以合理的方式处理所有错误。它在处理顺序中的位置紧随 WebFlux 提供的处理程序之前,后者被认为是最后一个处理程序。对于机器客户机,它生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户端,有一个“WhiteLabel”错误处理程序,它以 HTML 格式呈现相同的数据。你也可以提供自己的 HTML 模板来显示错误(参见[next section](#web.reactive.webflux.error-handling.error-pages))。 +Spring Boot 提供了一个`WebExceptionHandler`,它以合理的方式处理所有错误。它在处理顺序中的位置紧随 WebFlux 提供的处理程序之前,后者被认为是最后一个处理程序。对于机器客户机,它生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户端,有一个“WhiteLabel”错误处理程序,它以 HTML 格式呈现相同的数据。你也可以提供自己的 HTML 模板来显示错误(参见[下一节](#web.reactive.webflux.error-handling.error-pages))。 -定制此功能的第一步通常涉及使用现有机制,但要替换或增加错误内容。为此,可以添加`ErrorAttributes`类型的 Bean。 +定制此功能的第一步通常涉及使用现有机制,但要替换或增加错误内容。为此,你可以添加类型`ErrorAttributes`的 Bean。 -要更改错误处理行为,可以实现`ErrorWebExceptionHandler`并注册该类型的 Bean 定义。因为`ErrorWebExceptionHandler`是相当低级的, Spring Boot 还提供了一个方便的`AbstractErrorWebExceptionHandler`,让你以 WebFlux 功能方式处理错误,如以下示例所示: +要更改错误处理行为,可以实现`ErrorWebExceptionHandler`并注册该类型的 Bean 定义。因为`ErrorWebExceptionHandler`是相当低级的, Spring boot 还提供了一个方便的`AbstractErrorWebExceptionHandler`,让你以 WebFlux 功能方式处理错误,如以下示例所示: ``` import reactor.core.publisher.Mono; @@ -1306,9 +1306,9 @@ public class MyErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler ``` -为了获得更完整的图像,你还可以直接重写子类`DefaultErrorWebExceptionHandler`并覆盖特定的方法。 +为了获得更完整的图片,你还可以直接重写子类`DefaultErrorWebExceptionHandler`并覆盖特定的方法。 -在某些情况下,[度量基础设施](actuator.html#actuator.metrics.supported.spring-webflux)不会记录在控制器或处理程序函数级别上处理的错误。通过将已处理的异常设置为请求属性,应用程序可以确保将此类异常与请求度量一起记录: +在某些情况下,在控制器或处理程序函数级别处理的错误不会被[度量基础设施](actuator.html#actuator.metrics.supported.spring-webflux)记录。通过将已处理的异常设置为请求属性,应用程序可以确保将此类异常与请求度量一起记录: ``` import org.springframework.boot.web.reactive.error.ErrorAttributes; @@ -1371,14 +1371,14 @@ src/ #### 2.1.7.网页过滤器 -Spring WebFlux 提供了一个`WebFilter`接口,该接口可以实现为过滤 HTTP 请求-响应交换。在应用程序上下文中找到的 `WebFilter’bean 将自动用于过滤每个交换。 +Spring WebFlux 提供了一个`WebFilter`接口,其可以实现为过滤 HTTP 请求-响应交换。`WebFilter`在应用程序上下文中找到的 bean 将自动用于过滤每个交换。 在过滤器的顺序很重要的地方,它们可以实现`Ordered`或用`@Order`进行注释。 Spring 引导自动配置可以为你配置 Web 过滤器。当它这样做时,将使用下表所示的订单: |网页过滤器| Order | |---------------------------------------|--------------------------------| |`MetricsWebFilter`|`Ordered.HIGHEST_PRECEDENCE + 1`| -|`WebFilterChainProxy`( Spring security)| `-100` | +|`WebFilterChainProxy`( Spring 证券)| `-100` | |`HttpTraceWebFilter`|`Ordered.LOWEST_PRECEDENCE - 10`| ### 2.2.嵌入式反应式服务器支持 @@ -1387,9 +1387,9 @@ Spring 引导包括对以下嵌入式反应性 Web 服务器的支持:Reactor ### 2.3.反应式服务器资源配置 -在自动配置反应堆网络或 Jetty 服务器时, Spring 启动将创建特定的 bean,这些 bean 将向服务器实例提供 HTTP 资源:`ReactorResourceFactory`或`JettyResourceFactory`。 +当自动配置反应堆网络或 Jetty 服务器时, Spring 引导将创建特定的 bean,这些 bean 将向服务器实例提供 HTTP 资源:`ReactorResourceFactory`或`JettyResourceFactory`。 -默认情况下,这些资源也将与 Reactor Netty 和 Jetty 客户端共享,以获得最佳性能,前提是: +默认情况下,这些资源也将与 Reactor Netty 和 Jetty 客户端共享,以获得最佳性能,给定: * 同样的技术也用于服务器和客户端。 @@ -1401,7 +1401,7 @@ Spring 引导包括对以下嵌入式反应性 Web 服务器的支持:Reactor ## 3. 优雅的关机 -所有四个嵌入式 Web 服务器( Jetty、Reactor Netty、 Tomcat 和 Undertow)以及反应式和基于 Servlet 的 Web 应用程序都支持优雅的关闭。它作为关闭应用程序上下文的一部分出现,并在停止`SmartLifecycle`bean 的最早阶段执行。此停止处理使用超时,该超时提供了一个宽限期,在此期间,将允许完成现有请求,但不允许新的请求。不允许新请求的确切方式取决于所使用的 Web 服务器。 Jetty、反应器网和 Tomcat 将在网络层停止接受请求。 Undertow 将接受请求,但立即响应具有服务不可用的(503)响应。 +所有四个嵌入式 Web 服务器( Jetty、Reactor Netty、 Tomcat 和 Undertow)以及反应式和基于 Servlet 的 Web 应用程序都支持优雅的关闭。它作为关闭应用程序上下文的一部分出现,并在停止`SmartLifecycle`bean 的最早阶段执行。此停止处理使用超时,超时提供了一个宽限期,在此期间将允许完成现有的请求,但不允许新的请求。不允许新请求的确切方式取决于所使用的 Web 服务器。 Jetty、反应堆网络和 Tomcat 将在网络层停止接受请求。 Undertow 将接受请求,但立即响应具有服务不可用的(503)响应。 | |使用 Tomcat 的优雅关机需要 Tomcat 9.0.33 或更高版本。| |---|--------------------------------------------------------------| @@ -1442,7 +1442,7 @@ spring: ## 4. Spring Security -如果[Spring Security](https://spring.io/projects/spring-security)在 Classpath 上,那么默认情况下 Web 应用程序是安全的。 Spring 启动依赖于 Spring 安全性的内容协商策略来确定是使用`httpBasic`还是`formLogin`。要向 Web 应用程序添加方法级安全性,还可以添加带有所需设置的`@EnableGlobalMethodSecurity`。其他信息可以在[Spring Security Reference Guide](https://docs.spring.io/spring-security/reference/5.6.2/servlet/authorization/method-security.html)中找到。 +如果[Spring Security](https://spring.io/projects/spring-security)在 Classpath 上,那么默认情况下 Web 应用程序是安全的。 Spring 启动依赖于 Spring 安全性的内容协商策略来确定是否使用`httpBasic`或`formLogin`。要向 Web 应用程序添加方法级安全性,还可以添加带有所需设置的`@EnableGlobalMethodSecurity`。其他信息可以在[Spring Security Reference Guide](https://docs.spring.io/spring-security/reference/5.6.2/servlet/authorization/method-security.html)中找到。 默认的`UserDetailsService`只有一个用户。用户名是`user`,密码是随机的,并在应用程序启动时在信息级别打印,如以下示例所示: @@ -1457,29 +1457,29 @@ Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35 默认情况下,在 Web 应用程序中获得的基本特性是: -* Bean 具有内存存储和具有生成密码的单个用户(有关用户的属性,请参见[securityproperties.user](https://docs.spring.io/spring-boot/docs/2.6.4/api/org/springframework/boot/autoconfigure/security/Security属性.User.html))的`UserDetailsService`(在 WebFlux 应用程序的情况下为`ReactiveUserDetailsService`)。 +* a`UserDetailsService`(或`ReactiveUserDetailsService`在 WebFlux 应用程序的情况下) Bean 具有内存存储和单个用户生成的密码(参见[`Security属性.User`](https://DOCS. Spring.io/ Spring-boot/DOCS/2.6.4/api/org/springframework/boot/autoformit/autofigure/security/securityproperties.user.html)用于用户的属性)。 -* 基于表单的登录或 HTTP 基本安全性(取决于请求中的`Accept`头)用于整个应用程序(如果致动器在 Classpath 上,则包括致动器端点)。 +* 基于表单的登录或 HTTP 基本安全性(取决于请求中的头)用于整个应用程序(如果致动器在 Classpath 上,则包括致动器端点)。 * 用于发布身份验证事件的`DefaultAuthenticationEventPublisher`。 -你可以通过为它添加一个 Bean 来提供一个不同的`AuthenticationEventPublisher`。 +你可以通过为它添加 Bean 来提供不同的`AuthenticationEventPublisher`。 ### 4.1.MVC 安全 -默认的安全配置是在`SecurityAutoConfiguration`和`UserDetailsServiceAutoConfiguration`中实现的。`SecurityAutoConfiguration`imports`SpringBootWebSecurityConfiguration`用于 Web 安全和`UserDetailsServiceAutoConfiguration`配置身份验证,这在非 Web 应用程序中也是相关的。要完全关闭默认的 Web 应用程序安全配置,或者组合多个 Spring 安全组件,例如 OAuth2 客户机和资源服务器,请添加类型`SecurityFilterChain`的 Bean(这样做不会禁用`UserDetailsService`配置或执行器的安全性)。 +默认的安全配置是在`SecurityAutoConfiguration`和`UserDetailsServiceAutoConfiguration`中实现的。`SecurityAutoConfiguration`用于 Web 安全的 imports`SpringBootWebSecurityConfiguration`和`UserDetailsServiceAutoConfiguration`配置身份验证,这在非 Web 应用程序中也是相关的。要完全关闭默认的 Web 应用程序安全配置,或者合并多个 Spring 安全组件,例如 OAuth2 客户机和资源服务器,请添加类型`SecurityFilterChain`的 Bean(这样做不会禁用`UserDetailsService`配置或执行器的安全性)。 要同时关闭`UserDetailsService`配置,可以添加类型为`UserDetailsService`、`AuthenticationProvider`或`AuthenticationManager`的 Bean。 -可以通过添加自定义`SecurityFilterChain`或`WebSecurityConfigurerAdapter` Bean 来覆盖访问规则。 Spring Boot 提供了方便的方法,可以用来覆盖对执行器端点和静态资源的访问规则。`EndPointRequest’可以用来创建一个基于属性的。`PathRequest’可以用来为常用位置的资源创建一个。 +可以通过添加自定义`SecurityFilterChain`或`WebSecurityConfigurerAdapter`来覆盖访问规则 Bean。 Spring Boot 提供了方便的方法,这些方法可用于重写执行器端点和静态资源的访问规则。`EndpointRequest`可用于创建`RequestMatcher`这是基于`management.endpoints.web.base-path`属性的。`PathRequest`可用于为常用位置中的资源创建`RequestMatcher`。 ### 4.2.WebFlux 安全性 -与 Spring MVC 应用程序类似,你可以通过添加`spring-boot-starter-security`依赖项来保护你的 WebFlux 应用程序。默认的安全配置是在`ReactiveSecurityAutoConfiguration`和`UserDetailsServiceAutoConfiguration`中实现的。用于 Web 安全的 reactiveSecurityAutoConfiguration`imports`WebFluxSecurityConfiguration`和`UserDetailsServiceAutoConfiguration`配置身份验证,这在非 Web 应用程序中也是相关的。要完全关闭默认的 Web 应用程序安全配置,可以添加类型`WebFilterChainProxy`的 Bean(这样做不会禁用`UserDetailsService`配置或执行器的安全性)。 +与 Spring MVC 应用程序类似,你可以通过添加`spring-boot-starter-security`依赖项来保护你的 WebFlux 应用程序。默认的安全配置是在`ReactiveSecurityAutoConfiguration`和`UserDetailsServiceAutoConfiguration`中实现的。`ReactiveSecurityAutoConfiguration`导入`WebFluxSecurityConfiguration`用于 Web 安全和`UserDetailsServiceAutoConfiguration`配置身份验证,这在非 Web 应用程序中也是相关的。要完全关闭默认的 Web 应用程序安全配置,可以添加类型`WebFilterChainProxy`的 Bean(这样做不会禁用`UserDetailsService`配置或执行器的安全性)。 -要关闭`UserDetailsService`配置,可以添加类型`ReactiveUserDetailsService`或`ReactiveAuthenticationManager`的 Bean。 +要同时关闭`UserDetailsService`配置,可以添加类型`ReactiveUserDetailsService`或`ReactiveAuthenticationManager`的 Bean。 -Spring 使用诸如 OAuth2 客户端和资源服务器的多个安全组件的访问规则可以通过添加自定义 Bean 来配置。 Spring Boot 提供了方便的方法,这些方法可用于覆盖执行器端点和静态资源的访问规则。`EndPointRequest’可用于创建基于`ServerWebExchangeMatcher`的`management.endpoints.web.base-path`属性。 +Spring 使用诸如 OAuth2 客户端和资源服务器的多个安全组件的访问规则可以通过添加自定义 Bean 来配置。 Spring Boot 提供了方便的方法,这些方法可以用来覆盖执行器端点和静态资源的访问规则。`EndpointRequest`可以用来创建一个`ServerWebExchangeMatcher`,即基于`management.endpoints.web.base-path`的属性。 `PathRequest`可用于为常用位置中的资源创建`ServerWebExchangeMatcher`。 @@ -1515,9 +1515,9 @@ public class MyWebFluxSecurityConfiguration { #### 4.3.1.客户 -如果你的 Classpath 上有`spring-security-oauth2-client`,则可以利用一些自动配置来设置 OAuth2/Open ID Connect 客户端。此配置使用`OAuth2Client属性`下的属性。同样的性质也适用于 Servlet 和活性应用。 +如果你的 Classpath 上有`spring-security-oauth2-client`,则可以利用一些自动配置来设置 OAuth2/Open ID Connect 客户端。此配置使用`OAuth2Client属性`下的属性。相同的性质适用于 Servlet 和反应性应用。 -你可以在`spring.security.oauth2.client`前缀下注册多个 OAuth2 客户机和提供者,如下例所示: +你可以在`spring.security.oauth2.client`前缀下注册多个 OAuth2 客户机和提供者,如以下示例所示: 属性 @@ -1586,7 +1586,7 @@ spring: user-name-attribute: "name" ``` -对于支持[OpenID 连接发现](https://openid.net/specs/openid-connect-discovery-1_0.html)的 OpenID Connect 提供者,可以进一步简化配置。提供程序需要配置`issuer-uri`,这是它断言为其发行者标识符的 URI。例如,如果提供的`issuer-uri`是“https://example.com”,那么将对“https://example.com/.well-known/openid-configuration”进行`OpenID Provider Configuration Request`。预期结果是`OpenID Provider Configuration Response`。下面的示例展示了如何使用`issuer-uri`配置 OpenID Connect 提供程序: +对于支持[OpenID 连接发现](https://openid.net/specs/openid-connect-discovery-1_0.html)的 OpenID Connect 提供者,可以进一步简化配置。提供程序需要配置`issuer-uri`,这是它所断言的作为其发行者标识符的 URI。例如,如果提供的`issuer-uri`是“https://example.com”,那么将对“https://example.com/.well-nown/openid-configuration”进行`OpenID Provider Configuration Request`。预期结果是`OpenID Provider Configuration Response`。下面的示例展示了如何使用`issuer-uri`配置 OpenID Connect 提供程序: 属性 @@ -1633,7 +1633,7 @@ public class MyOAuthClientConfiguration { ##### OAuth2 共同提供者的客户端注册 -对于常见的 OAuth2 和 OpenID 提供者,包括 Google、GitHub、Facebook 和 OKTA,我们提供了一组提供者默认值(分别为 `google’、`github`、`facebook`和`okta`)。 +对于常见的 OAuth2 和 OpenID 提供者,包括 Google、GitHub、Facebook 和 OKTA,我们提供了一组提供者默认值(分别为`google`、`github`、`facebook`和`okta`)。 如果不需要自定义这些提供程序,可以将`provider`属性设置为需要推断默认值的属性。此外,如果客户端注册的键与缺省支持的提供者匹配, Spring 启动也会推断出这一点。 @@ -1687,7 +1687,7 @@ spring: jwk-set-uri: "https://example.com/oauth2/default/v1/keys" ``` -Properties +属性 ``` spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/ @@ -1734,13 +1734,13 @@ spring: client-secret: "my-client-secret" ``` -同样,同样的属性也适用于 Servlet 和无反应应用。 +同样,同样的性质也适用于 Servlet 和无反应的应用。 或者,你可以为 Servlet 应用程序定义自己的`OpaqueTokenIntrospector` Bean,或者为反应性应用程序定义`ReactiveOpaqueTokenIntrospector`。 #### 4.3.3.授权服务器 -Spring 目前,安全性不提供对实现 OAuth2.0 授权服务器的支持。然而,该功能可从[Spring Security OAuth](https://spring.io/projects/spring-security-oauth)项目中获得,该项目最终将完全被 Spring 安全性所取代。在此之前,你可以使用`spring-security-oauth2-autoconfigure`模块轻松地设置 OAuth2.0 授权服务器;有关说明,请参见其[documentation](https://docs.spring.io/spring-security-oauth2-boot/)。 +Spring 目前,安全性不提供对实现 OAuth2.0 授权服务器的支持。然而,该功能可从[Spring Security OAuth](https://spring.io/projects/spring-security-oauth)项目中获得,该项目最终将完全被 Spring 安全性所取代。在此之前,你可以使用`spring-security-oauth2-autoconfigure`模块轻松地设置 OAuth2.0 授权服务器;有关说明,请参见其[文件](https://docs.spring.io/spring-security-oauth2-boot/)。 ### 4.4.SAML2.0 @@ -1813,7 +1813,7 @@ spring: ## 5. Spring 届会议 -Spring 引导为广泛的数据存储范围提供[Spring Session](https://spring.io/projects/spring-session)自动配置。在构建 Servlet Web 应用程序时,可以自动配置以下存储: +Spring 引导为广泛的数据存储范围提供[Spring Session](https://spring.io/projects/spring-session)自动配置。 Servlet 在构建 Web 应用程序时,可以自动配置以下存储: * JDBC @@ -1833,7 +1833,7 @@ Servlet 自动配置取代了使用`@Enable*HttpSession`的需要。 反应式自动配置取代了使用`@Enable*WebSession`的需要。 -如果在 Classpath 上存在单个 Spring 会话模块,则 Spring 引导自动使用该存储实现。如果有多个实现,则必须选择要用来存储会话的[`StoreType`](https://github.com/spring-projects/spring-boot/tree/v2.6.4/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java)。例如,要使用 JDBC 作为后端存储,你可以按以下方式配置应用程序: +如果在 Classpath 上存在单个 Spring 会话模块,则 Spring 引导自动使用该存储实现。如果有多个实现,则必须选择希望用于存储会话的[`StoreType`](https://github.com/ Spring-projects/ Spring-boot/tree/v2.6.4/ Spring-boot-project/ Spring-boot-autofigure/SRC/main/java/org/org/springframework/boot/autofigure/autofigure/session/storetype.java)。例如,要使用 JDBC 作为后端存储,你可以按以下方式配置应用程序: Properties @@ -1869,7 +1869,7 @@ spring: table-name: "SESSIONS" ``` -为了设置会话的超时,你可以使用`spring.session.timeout`属性。如果该属性未在 Servlet Web 应用程序中设置,则自动配置将返回到`server.servlet.session.timeout`的值。 +为了设置会话的超时,你可以使用`spring.session.timeout`属性。如果在 Servlet Web 应用程序中未设置该属性,则自动配置将返回到`server.servlet.session.timeout`的值。 你可以使用`@Enable*HttpSession`( Servlet)或`@Enable*WebSession`(反应式)来控制 Spring 会话的配置。这将导致自动配置后退。 Spring 然后可以使用注释的属性而不是先前描述的配置属性来配置会话。 @@ -1877,11 +1877,11 @@ spring: 如果你开发了一个使用超媒体的 RESTful API, Spring Boot 为 Spring Hateoas 提供了自动配置,这在大多数应用程序中都能很好地工作。自动配置取代了使用`@EnableHypermediaSupport`的需要,并注册了许多 bean,以方便构建基于超媒体的应用程序,包括`LinkDiscoverers`(用于客户端支持)和`ObjectMapper`,这些配置用于将响应正确地编组到所需的表示中。`ObjectMapper`是通过设置各种`spring.jackson.*`属性来定制的,或者,如果存在一个属性,则通过`Jackson2ObjectMapperBuilder`来定制 Bean。 -你可以通过使用`@EnableHypermediaSupport`来控制 Spring Hateoas 的配置。请注意,这样做会禁用前面描述的`ObjectMapper`定制。 +你可以通过使用`@EnableHypermediaSupport`来控制 Spring Hateoas 的配置。注意,这样做会禁用前面描述的`ObjectMapper`定制。 -| |`spring-boot-starter-hateoas`是特定于 Spring MVC 的,并且不应该与 Spring WebFlux 合并。
为了使用 Spring Hateoas 与 Spring WebFlux,可以在`org.springframework.hateoas:spring-hateoas`以及`spring-boot-starter-webflux`上添加一个直接依赖项。| +| |`spring-boot-starter-hateoas`是特定于 Spring MVC 的,不应与 Spring WebFlux 合并。
为了在 Spring WebFlux 中使用 Spring Hateoas,可以在`org.springframework.hateoas:spring-hateoas`以及`spring-boot-starter-webflux`上添加一个直接依赖项。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -## 7. 接下来读什么? +## 7. 接下来要读什么? -你现在应该对如何使用 Spring 启动来开发 Web 应用程序有了很好的了解。接下来的几个部分描述了 Spring 引导如何集成各种[数据技术](data.html#data)、[消息传递系统](messaging.html#messaging)和其他 IO 功能。你可以根据应用程序的需求选择其中的任何一个。 +你现在应该对如何使用 Spring 引导来开发 Web 应用程序有了很好的了解。接下来的几个部分描述了 Spring 引导如何集成各种[数据技术](data.html#data)、[消息传递系统](messaging.html#messaging)和其他 IO 功能。你可以根据应用程序的需求选择其中的任何一个。 diff --git a/docs/spring-cloud-data-flow/READEME.md b/docs/spring-cloud-data-flow/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-cloud/README.md b/docs/spring-cloud/README.md index 0e1a784f054e84dbe04a1c778f197a26b343ff2c..3459163893b871c32d10340cafed9e6f94fec65d 100644 --- a/docs/spring-cloud/README.md +++ b/docs/spring-cloud/README.md @@ -1 +1 @@ -# Spring 云 \ No newline at end of file +# Spring Cloud \ No newline at end of file diff --git a/docs/spring-cloud/document-overview.md b/docs/spring-cloud/document-overview.md deleted file mode 100644 index b4ca8578b675c95fa0d8f2e51207ae8b6d7531b8..0000000000000000000000000000000000000000 --- a/docs/spring-cloud/document-overview.md +++ /dev/null @@ -1,30 +0,0 @@ -# Spring 云文档 - - -本节提供了 Spring 云参考文档的简要概述。它是这份文件其余部分的一张地图。 - -## [](#documentation-about)[1.关于文档](#documentation-about) - -Spring 云参考指南如下所示 - -* [Multi-page HTML](https://docs.spring.io/spring-cloud/docs/2021.0.1/reference/html) - -* [单页 HTML](https://docs.spring.io/spring-cloud/docs/2021.0.1/reference/htmlsingle) - -* [PDF](https://docs.spring.io/spring-cloud/docs/2021.0.1/reference/pdf/spring-cloud.pdf) - -本文件的副本可供你自己使用并分发给他人,但前提是你不对此类副本收取任何费用,并且还需每一份副本均包含本版权声明,无论是以印刷形式还是以电子方式分发。 - -## [](#documentation-getting-help)[2. Getting Help](#documentation-getting-help) - -如果你在云计算方面有困难,我们愿意提供帮助。 - -* 学习云的基础知识。如果你从 Spring Cloud 开始,请尝试使用[guides](https://spring.io/guides)中的一个。 - -* 问一个问题。我们监控[stackoverflow.com](https://stackoverflow.com)中带有[`spring-cloud`](https://stackoverflow.com/tags/spring-cloud)标记的问题。 - -* 在[Spring Cloud Gitter](https://gitter.im/spring-cloud/spring-cloud)与我们聊天 - -| |所有的云都是开源的,包括文档。如果你发现
DOCS 存在问题,或者你希望改进这些问题,请参与进来。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------| - diff --git a/docs/spring-cloud/legal.md b/docs/spring-cloud/legal.md index 2ab36e85c11e8bbc13dad3363afd5376928c119a..a96d9fa5acbfa7302073308c07718bc0176ca098 100644 --- a/docs/spring-cloud/legal.md +++ b/docs/spring-cloud/legal.md @@ -5,3 +5,5 @@ 版权所有 2012-2020 本文件的副本可供你自己使用并分发给他人,但前提是你不对此类副本收取任何费用,并且还需每一份副本均包含本版权声明,无论是以印刷形式还是以电子方式分发。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-build.md b/docs/spring-cloud/spring-cloud-build.md index 6ac37b28b508c8d0bc34f11f0d7b95e50df7f7aa..ec724e11fe83b72da267161ef4b9efac7552fa26 100644 --- a/docs/spring-cloud/spring-cloud-build.md +++ b/docs/spring-cloud/spring-cloud-build.md @@ -1,11 +1,9 @@ -# Spring 云构建 +# Spring Cloud构建 - -Spring 云构建是 Spring 云用于插件和依赖管理的一个常见实用程序项目。 +Spring Cloud构建是 Spring Cloud用于插件和依赖管理的一个常见实用程序项目。 ## [构建和部署](#_building_and_deploying) - 要在本地安装: ``` @@ -38,8 +36,7 @@ $ mvn deploy -P central -DaltReleaseDeploymentRepository=sonatype-nexus-staging: (“central”profile 可用于 Spring Cloud 中的所有项目,并且它设置了 GPG jar 签名,并且存储库必须为该项目单独指定,因为它是启动器父程序的父程序,用户反过来将其作为自己的父程序)。 -## [Contributing](#_contributing) - +## [贡献](#_contributing) Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,遵循非常标准的 GitHub 开发流程,使用 GitHub Tracker 处理问题,并将拉请求合并到 Master 中。如果你想贡献一些微不足道的东西,请不要犹豫,但要遵循下面的指导方针。 @@ -47,21 +44,21 @@ Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,遵循非常 在我们接受一个重要的补丁或拉请求之前,我们需要你签署[贡献者许可协议](https://cla.pivotal.io/sign/spring)。签署贡献者协议并不会授予任何人对主库的提交权限,但这确实意味着我们可以接受你的贡献,并且如果我们接受了,你将获得作者信用。活跃的贡献者可能会被要求加入核心团队,并被赋予合并拉请求的能力。 -### [Code of Conduct](#_code_of_conduct) +### [行为守则](#_code_of_conduct) -该项目遵守贡献者契约[code of conduct](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#98ebe8EAF 1f6ffb5fbf7fcfdb5fbf7fbf6fcedfbecd8e8f1eeef7ECF 9f4b6f1f7)。 +该项目遵守贡献者契约[行为守则](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#DBA8aba9b2b5bcf6b8b4bfbef6b4bdf6b8b8b4b5bfaeb8af9babb2adb4afbab7f5b2b4)。 ### [守则惯例和内部管理](#_code_conventions_and_housekeeping) 这些都不是拉请求所必需的,但它们都会有所帮助。它们也可以在原始的拉请求之后但在合并之前添加。 -* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目中的 `eclipse-code-formatter.xml’文件导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 +* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用`eclipse-code-formatter.xml`文件从[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 -* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个“@author”标记来标识你,并且最好至少有一个段落来说明这个类的目的。 +* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个`@author`标记来标识你,并且最好至少有一个段落来说明类的用途。 * 将 ASF 许可标头注释添加到所有新的`.java`文件(从项目中的现有文件复制) -* 将自己作为`@author`添加到要进行实质性修改的.java 文件中(不仅仅是外观上的更改)。 +* 将自己作为`@author`添加到你要进行实质性修改的.java 文件中(不仅仅是外观上的更改)。 * 添加一些 Javadocs,如果你更改了名称空间,还可以添加一些 XSDDOC 元素。 @@ -71,9 +68,9 @@ Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,遵循非常 * 在编写提交消息时,请遵循[这些约定](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),如果你正在修复现有的问题,请在提交消息的末尾添加`Fixes gh-XXXX`(其中 xxxx 是问题编号)。 -### [checkstyle](#_checkstyle) +### [Checkstyle](#_checkstyle) -Spring 云构建附带了一组 checkstyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: +Spring Cloud构建附带了一组 checkstyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: Spring-云构建工具/ @@ -137,7 +134,7 @@ POM.xml |**4**|添加 Spring Java 格式插件,该插件将重新格式化你的代码,以传递大多数 CheckStyle 格式设置规则| |**5**|将 CheckStyle 插件添加到构建和报告阶段| -如果你需要抑制一些规则(例如,行长需要更长),那么在`${project.root}/src/checkstyle/checkstyle-suppressions.xml`下定义一个文件就足够了。示例: +如果你需要抑制一些规则(例如行长需要更长),那么在`${project.root}/src/checkstyle/checkstyle-suppressions.xml`下定义一个文件就足够了。示例: projectRoot/SRC/checkstyle/checkstyle-suppresions.xml @@ -161,7 +158,7 @@ $ touch .springformat ### [IDE setup](#_ide_setup) -#### [Intellij IDEA](#_intellij_idea) +#### [Intellij 思想](#_intellij_idea) 为了设置 IntelliJ,你应该导入我们的编码约定、检查配置文件并设置 CheckStyle 插件。以下文件可以在[Spring Cloud Build](https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools)项目中找到。 @@ -205,7 +202,7 @@ Checkstyle ![Checkstyle](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/docs/src/main/asciidoc/images/intellij-checkstyle.png) -转到`File``Settings``Other settings``Checkstyle`。点击`Configuration file`部分中的`+`图标。在这里,你必须定义应该从哪里选择 CheckStyle 规则。在上面的图片中,我们从克隆的云构建存储库中选择了规则。但是,你可以指向 Spring Cloud Build 的 GitHub 存储库(例如`checkstyle.xml`:`[https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml)`)。我们需要提供以下变量: +转到`File``Settings``Other settings``Checkstyle`。点击`+`区域中的`Configuration file`图标。在这里,你必须定义应该从哪里选择 CheckStyle 规则。在上面的图片中,我们从克隆的云构建存储库中选择了规则。但是,你可以指向 Spring Cloud Build 的 GitHub 存储库(例如`checkstyle.xml`:`[https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml)`)。我们需要提供以下变量: * `checkstyle.header.file`-请将其指向 Spring Cloud Build 的`spring-cloud-build-tools/src/main/resources/checkstyle-header.txt`文件,可以在你的克隆 repo 中,也可以通过`[https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt)`URL。 @@ -213,18 +210,18 @@ Checkstyle * `checkstyle.additional.suppressions.file`-此变量对应于本地项目中的抑制。例如,你正在处理`spring-cloud-contract`。然后指向`project-root/src/checkstyle/checkstyle-suppressions.xml`文件夹。`spring-cloud-contract`的例子是:`/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`。 -| |记住将`Scan Scope`设置为`All sources`,因为我们为生产和测试源应用了 checkstyle 规则。| +| |请记住将`Scan Scope`设置为`All sources`,因为我们为生产和测试源应用了 checkstyle 规则。| |---|------------------------------------------------------------------------------------------------------------------| ### [重复查找器](#_duplicate_finder) -Spring 云构建带来了`basepom:duplicate-finder-maven-plugin`,它允许在 Java Classpath 上标记重复的和冲突的类和资源。 +Spring Cloud构建带来了`basepom:duplicate-finder-maven-plugin`,它允许在 Java Classpath 上标记重复的和冲突的类和资源。 #### [重复查找器配置](#_duplicate_finder_configuration) -重复查找器是**默认启用**,将在 Maven 构建的`verify`阶段运行,但是只有在项目的`duplicate-finder-maven-plugin`部分中添加`duplicate-finder-maven-plugin`,它才会在项目中生效。 +重复查找器是**默认启用**,将在 Maven 构建的`verify`阶段运行,但是只有在将`duplicate-finder-maven-plugin`添加到项目的`build`部分`POM.xml`时,它才会在项目中生效。 -POM.xml +pom.xml ``` @@ -265,8 +262,7 @@ POM.xml ## [压平 Poms](#_flattening_the_poms) - -为了避免传播构建 Spring 云项目所需的构建设置,我们使用了 Maven Flaten 插件。它的优点是允许你在将“Clean” POM 发布到存储库时使用所需的任何功能。 +为了避免传播构建 Spring Cloud项目所需的构建设置,我们使用了 Maven Flaten 插件。它的优点是允许你在将“Clean” POM 发布到存储库时使用所需的任何功能。 为了添加它,将`org.codehaus.mojo:flatten-maven-plugin`添加到你的`pom.xml`中。 @@ -283,8 +279,7 @@ POM.xml ## [重用文档](#_reusing_the_documentation) - -Spring Cloud Build 发布其`spring-cloud-build-docs`模块,该模块包含有用的脚本(例如 Readme Generation Ruby 脚本)和用于 Spring 云文档的 CSS、XSLT 和图像。如果你想遵循生成文档的相同约定方法,只需将这些插件添加到`docs`模块中 +Spring Cloud Build 发布其`spring-cloud-build-docs`模块,该模块包含有用的脚本(例如 Readme Generation Ruby 脚本)和用于 Spring Cloud文档的 CSS、XSLT 和图像。如果你想遵循生成文档的相同约定方法,只需将这些插件添加到`docs`模块中 ``` @@ -345,7 +340,7 @@ Spring Cloud Build 发布其`spring-cloud-build-docs`模块,该模块包含有 如果你想修改将哪些配置属性放入表中,你可以调整`configprops.inclusionPattern`模式,以仅包括属性的一个子集(例如`spring.sleuth.*`)。 -Spring 云构建 DOCS 附带了一组可以重用的 ASCIIDoctor 属性。 +Spring Cloud构建 DOCS 附带了一组可以重用的 ASCIIDoctor 属性。 ``` @@ -391,7 +386,6 @@ Spring 云构建 DOCS 附带了一组可以重用的 ASCIIDoctor 属性。 ## [更新指南](#_updating_the_guides) - 我们假设你的项目包含`guides`文件夹下的指南。 ``` @@ -421,3 +415,5 @@ $ ./mvnw clean deploy -Pguides 通过不添加`guides`配置文件,或者在打开配置文件时传递`-DskipGuides`系统属性,你可以跳过此操作。 你可以通过`guides-project.version`(默认为`${project.version}`)配置传递给指南的项目版本。指南更新的阶段可以通过`guides-update.phase`进行配置(默认为`deploy`)。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-bus.md b/docs/spring-cloud/spring-cloud-bus.md index 6be7f7ee7b18d7f75f601da6d72a5338c73d3ec2..221c69069af81947a0b765a8056cb433da239087 100644 --- a/docs/spring-cloud/spring-cloud-bus.md +++ b/docs/spring-cloud/spring-cloud-bus.md @@ -1,13 +1,13 @@ -# Spring 云总线 +# Spring Cloud 总线 -Spring 云总线将分布式系统的节点与轻量级消息代理连接起来。然后可以使用此代理来广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,总线就像是 Spring 启动应用程序的分布式执行器,该应用程序是按比例扩展的。然而,它也可以用作应用程序之间的沟通渠道。该项目为 AMQP 代理或 Kafka 提供了作为传输的启动器。 +Spring Cloud总线将分布式系统的节点与轻量级消息代理连接起来。然后可以使用此代理来广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,总线就像是 Spring 启动应用程序的分布式执行器,该应用程序是按比例扩展的。然而,它也可以用作应用程序之间的沟通渠道。该项目为 AMQP 代理或 Kafka 提供了作为传输的启动器。 -| |Spring 云是在非限制性的 Apache2.0 许可下发布的。如果你想对文档的这一部分做出贡献,或者你发现了一个错误,请在[github](https://github.com/spring-cloud/spring-cloud-bus)上找到项目中的源代码和问题追踪器。| +| |Spring Cloud是在非限制性的 Apache2.0 许可下发布的。如果你想对文档的这一部分做出贡献,或者你发现了一个错误,请在[github](https://github.com/spring-cloud/spring-cloud-bus)的项目中找到源代码和问题追踪器。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -## [](#quick-start)[1. Quick Start](#quick-start) +## [](#quick-start)[1.快速启动](#quick-start) -Spring 如果云总线在 Classpath 上检测到自身,则通过添加 Spring 引导自动配置来工作。要启用总线,请在依赖管理中添加`spring-cloud-starter-bus-amqp`或 ` Spring-cloud-starter-bus-kafka`。 Spring 剩下的事由云来解决。确保代理(RabbitMQ 或 Kafka)可用并进行了配置。在 LocalHost 上运行时,你不需要做任何事情。如果远程运行,请使用 Spring Cloud Connectors 或 Spring Boot 约定来定义代理凭据,如下面的 Rabbit 示例所示: +Spring Cloud总线的工作原理是,如果在 Classpath 上检测到自身,则添加 Spring 引导自动配置。要启用总线,请将`spring-cloud-starter-bus-amqp`或`spring-cloud-starter-bus-kafka`添加到依赖项管理中。 Spring 剩下的事由云来解决。确保代理(RabbitMQ 或 Kafka)可用并进行了配置。在 LocalHost 上运行时,你不需要做任何事情。如果远程运行,请使用 Spring Cloud Connectors 或 Spring Boot 约定来定义代理凭据,如下面的 Rabbit 示例所示: 应用程序.yml @@ -20,18 +20,18 @@ spring: password: secret ``` -总线目前支持将消息发送到监听的所有节点或特定服务的所有节点(由 Eureka 定义)。执行器名称空间`/bus/*`具有一些 HTTP 端点。目前,有两个项目已经实施。第一种是`/bus/env`,它发送键/值对来更新每个节点的 Spring 环境。第二种是`/bus/refresh`,它重新加载每个应用程序的配置,就好像它们都在其`/refresh`端点上被 pinged 了一样。 +总线目前支持将消息发送到监听的所有节点或特定服务的所有节点(由 Eureka 定义)。执行器名称空间`/bus/*`具有一些 HTTP 端点。目前,有两个项目已经实施。第一种是`/bus/env`,它发送键/值对来更新每个节点的 Spring 环境。第二种是`/bus/refresh`,重新加载每个应用程序的配置,就好像它们都在其`/refresh`端点上被 pinged 了一样。 -| |Spring 云总线启动器覆盖 Rabbit 和 Kafka,因为这是两个最
的常见实现。然而, Spring 云流是相当灵活的,并且活页夹
与`spring-cloud-bus`一起工作。| +| |Spring Cloud总线启动器覆盖 Rabbit 和 Kafka,因为这是两个最
的常见实现。然而, Spring Cloud流是相当灵活的,并且活页夹
与`spring-cloud-bus`一起工作。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## [](#bus-endpoints)[2.总线端点](#bus-endpoints) -Spring 云总线提供了两个端点,`/actuator/busrefresh`和`/actuator/busenv`,这两个端点分别对应于 Spring 云共享空间中的各个执行器端点,`/actuator/refresh` 和`/actuator/env`。 +Spring Cloud Bus 提供了两个端点,`/actuator/busrefresh`和`/actuator/busenv`,它们分别对应于 Spring Cloud Commons 中的单个执行器端点,`/actuator/refresh`和`/actuator/env`。 ### [](#bus-refresh-endpoint)[2.1.总线刷新端点](#bus-refresh-endpoint) -`/actuator/busrefresh`端点清除`RefreshScope`缓存并重新绑定 @configrationProperties`。有关更多信息,请参见[Refresh Scope](#refresh-scope)文档。 +`/actuator/busrefresh`端点清除`RefreshScope`缓存并重新绑定`@ConfigurationProperties`。有关更多信息,请参见[刷新范围](#refresh-scope)文档。 要公开`/actuator/busrefresh`端点,需要向应用程序添加以下配置: @@ -60,33 +60,33 @@ management.endpoints.web.exposure.include=busenv ## [](#addressing-an-instance)[3.寻址实例](#addressing-an-instance) -应用程序的每个实例都有一个服务 ID,其值可以用 ` Spring.cloud.bus.id` 设置,其值应该是一个以冒号分隔的标识符列表,顺序从最小特定到最特定。默认值是作为`spring.application.name`和 `server.port’(或`spring.application.index`,如果设置)的组合从环境构造的。ID 的默认值以`app:index:id`的形式构造,其中: +应用程序的每个实例都有一个服务 ID,其值可以用`spring.cloud.bus.id`设置,其值应该是一个以冒号分隔的标识符列表,顺序从最不特定到最特定。默认值是作为`spring.application.name`和`server.port`(或`spring.application.index`,如果设置)的组合从环境构造的。ID 的默认值以`app:index:id`的形式构造,其中: * `app`是`vcap.application.name`,如果它存在,或者`spring.application.name` -* `index`是`vcap.application.instance_index`,如果存在,` Spring.application.index`,`local.server.port`,`server.port`,或`0`(按此顺序排列)。 +* `index`是`vcap.application.instance_index`,如果存在,`spring.application.index`,`local.server.port`,`server.port`,或`0`(按此顺序排列)。 * `id`是`vcap.application.instance_id`,如果它存在,或者是一个随机值。 -HTTP 端点接受一个“destination”路径参数,例如“/busrefresh/customers:9000”,其中`destination`是一个服务 ID。如果 ID 由总线上的一个实例拥有,那么它将处理消息,而所有其他实例将忽略它。 +HTTP 端点接受一个“destination”路径参数,例如`/busrefresh/customers:9000`,其中`destination`是一个服务 ID。如果 ID 由总线上的一个实例拥有,那么它将处理消息,而所有其他实例将忽略它。 ## [](#addressing-all-instances-of-a-service)[4.处理服务的所有实例](#addressing-all-instances-of-a-service) -在 Spring `PathMatcher`(路径分隔符为冒号—`:`)中使用“destination”参数来确定实例是否处理消息。使用前面的示例,`/busenv/customers:**`的目标是“Customers”服务的所有实例,而不考虑服务 ID 的其余部分。 +在 Spring `PathMatcher`(路径分隔符为冒号—`:`)中使用“destination”参数来确定实例是否处理消息。使用前面的示例,`/busenv/customers:**`以“客户”服务的所有实例为目标,而不考虑服务 ID 的其余部分。 ## [](#service-id-must-be-unique)[5.服务 ID 必须是唯一的](#service-id-must-be-unique) -总线尝试两次消除处理一个事件——一次从原始的“ApplicationEvent”中删除,一次从队列中删除。为此,它会根据当前的服务 ID 检查发送服务 ID。如果一个服务的多个实例具有相同的 ID,则不会对事件进行处理。当在本地机器上运行时,每个服务都位于不同的端口上,而该端口是 ID 的一部分。Cloud Foundry 提供了一个用于区分的索引。要确保 ID 在 Cloud Foundry 之外是唯一的,请将`spring.application.index`设置为服务的每个实例都是唯一的。 +总线尝试两次消除处理一个事件——一次来自原始`ApplicationEvent`,一次来自队列。为此,它会根据当前的服务 ID 检查发送服务 ID。如果一个服务的多个实例具有相同的 ID,则不会对事件进行处理。当在本地机器上运行时,每个服务都位于不同的端口上,而该端口是 ID 的一部分。Cloud Foundry 提供了一个用于区分的索引。要确保 ID 在 Cloud Foundry 之外是唯一的,请将`spring.application.index`设置为服务的每个实例都是唯一的。 ## [](#customizing-the-message-broker)[6.自定义消息代理](#customizing-the-message-broker) -Spring 云总线使用[Spring Cloud Stream](https://cloud.spring.io/spring-cloud-stream)来广播消息。因此,要使消息流起来,你只需要在 Classpath 中包含你选择的绑定器实现。与 AMQP 和 Kafka(` Spring-cloud-starter-bus-[AMQP|Kafka]`)的总线有方便的启动器。一般来说, Spring Cloud Stream 依赖于 Spring Boot AutoConfiguration 约定来配置中间件。例如,可以使用 ` Spring.RabbitMQ.*` 配置属性来更改 AMQP 代理地址。 Spring Cloud Bus 在`spring.cloud.bus.*`中具有少量的本机配置属性(例如,` Spring.cloud.bus.destination` 是要用作外部中间件的主题的名称)。通常情况下,默认值就足够了。 +Spring Cloud总线使用[Spring Cloud Stream](https://cloud.spring.io/spring-cloud-stream)来广播消息。因此,要使消息流起来,你只需要在 Classpath 中包含你选择的绑定器实现。对于具有 AMQP 和 Kafka(`spring-cloud-starter-bus-[amqp|kafka]`)的总线,有方便的启动器。一般来说, Spring Cloud Stream 依赖于 Spring Boot AutoConfiguration 约定来配置中间件。例如,可以使用`spring.rabbitmq.*`配置属性更改 AMQP 代理地址。 Spring Cloud Bus 在`spring.cloud.bus.*`中具有少量的本机配置属性(例如,`spring.cloud.bus.destination`是用作外部中间件的主题的名称)。通常情况下,默认值就足够了。 -要了解有关如何自定义 Message Broker 设置的更多信息,请参阅 Spring Cloud Stream 文档。 +要了解有关如何自定义消息代理设置的更多信息,请参阅 Spring Cloud Stream 文档。 ## [](#tracing-bus-events)[7.追踪总线事件](#tracing-bus-events) -可以通过设置 ` Spring.cloud.bus.trace.enabled=true` 来跟踪总线事件(`RemoteApplicationEvent`的子类)。如果这样做, Spring boot`TraceRepository`(如果存在)将显示发送的每个事件和来自每个服务实例的所有 ACK。以下示例来自`/trace`端点: +总线事件(`RemoteApplicationEvent`的子类)可以通过设置`spring.cloud.bus.trace.enabled=true`来跟踪。如果这样做, Spring boot`TraceRepository`(如果存在)将显示发送的每个事件和来自每个服务实例的所有 ACK。以下示例来自`/trace`端点: ``` { @@ -121,16 +121,16 @@ Spring 云总线使用[Spring Cloud Stream](https://cloud.spring.io/spring-cloud } ``` -前面的跟踪显示,`RefreshRemoteApplicationEvent`是从 `customers:9000’发送的,向所有服务广播,并由`customers:9000`和 `stores:8081’接收。 +前面的跟踪显示,一个`RefreshRemoteApplicationEvent`从`customers:9000`发送,广播到所有服务,并由`customers:9000`和`stores:8081`接收。 -为了自己处理 ACK 信号,你可以为“AckRemoteApplicationEvent”添加类型和类型到你的应用程序(并启用跟踪)。或者,你可以利用`TraceRepository`并从那里挖掘数据。 +要自己处理 ACK 信号,可以在应用程序中添加`@EventListener`和`SentApplicationEvent`类型的`@EventListener`(并启用跟踪)。或者,你可以利用`TraceRepository`并从那里挖掘数据。 | |任何总线应用程序都可以跟踪 ACK。然而,有时,在可以对数据执行更复杂的
查询或将其转发给专门的跟踪服务的中心服务中执行此操作是很有用的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## [](#broadcasting-your-own-events)[8.播放自己的活动](#broadcasting-your-own-events) -总线可以承载`RemoteApplicationEvent`类型的任何事件。默认传输是 JSON,反序列化器需要提前知道将使用哪些类型。要注册一个新类型,你必须将其放入“org.springframework.cloud.bus.event”的子包中。 +总线可以承载类型`RemoteApplicationEvent`的任何事件。默认传输是 JSON,反序列化器需要提前知道要使用哪些类型。要注册一个新类型,必须将其放入`org.springframework.cloud.bus.event`的子包中。 要自定义事件名,你可以在自定义类上使用`@JsonTypeName`,也可以使用默认策略,即使用类的简单名称。 @@ -139,7 +139,7 @@ Spring 云总线使用[Spring Cloud Stream](https://cloud.spring.io/spring-cloud ### [](#registering-events-in-custom-packages)[8.1.在自定义包中注册事件](#registering-events-in-custom-packages) -如果不能或不想使用`org.springframework.cloud.bus.event`的子包处理自定义事件,则必须使用`@RemoteApplicationEventScan`注释指定要扫描 `RemoteApplicationEvent’类型事件的包。用`@RemoteApplicationEventScan`指定的包包括子包。 +如果你不能或不想使用`org.springframework.cloud.bus.event`的子包来表示你的自定义事件,那么你必须指定要使用`RemoteApplicationEvent`注释来扫描类型为`@RemoteApplicationEventScan`的事件的包。用`@RemoteApplicationEventScan`指定的包包括子包。 例如,考虑以下自定义事件,称为`MyEvent`: @@ -163,7 +163,7 @@ public class BusConfiguration { } ``` -在不指定值的情况下,将注册使用`@RemoteApplicationEventScan`的类的包。在本例中,`com.acme`通过使用“BusConfiguration”包进行注册。 +在不指定值的情况下,注册了使用`@RemoteApplicationEventScan`的类的包。在本例中,`com.acme`通过使用`BusConfiguration`的包进行注册。 还可以在`@RemoteApplicationEventScan`上使用`value`、`basePackages`或`basePackageClasses`属性显式地指定要扫描的包,如以下示例所示: @@ -179,7 +179,7 @@ public class BusConfiguration { } ``` -上述`@RemoteApplicationEventScan`的所有示例都是等效的,因为通过在 `@remoteApplicationEventScan’上显式指定包,可以注册 `com.acme’包。 +前面的`@RemoteApplicationEventScan`的所有示例都是等效的,因为`com.acme`包是通过在`@RemoteApplicationEventScan`上显式指定包来注册的。 | |你可以指定要扫描的多个基包。| |---|-----------------------------------------------| @@ -187,3 +187,5 @@ public class BusConfiguration { ## [](#configuration-properties)[9.配置属性](#configuration-properties) 要查看所有与总线相关的配置属性的列表,请检查[附录页](appendix.html)。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-circuitbreaker.md b/docs/spring-cloud/spring-cloud-circuitbreaker.md index ca7a457ca63f857f9346be66969bf7f62b83e05f..87f5bc5030c3f577787eef6e71e7a128f0f7dd67 100644 --- a/docs/spring-cloud/spring-cloud-circuitbreaker.md +++ b/docs/spring-cloud/spring-cloud-circuitbreaker.md @@ -1,13 +1,14 @@ -# Spring 云断路器 +# Spring Cloud断路器 +**2.1.1** -[](#usage-documentation)[1.使用文档](#usage-documentation) +## [](#usage-documentation)[1.使用文档](#usage-documentation) Spring Cloud Circuitbreaker 项目包含 Resilience4J 和 Spring Retry 的实现。在 Spring cloud circuitbreaker 中实现的 API 是在 Spring cloud commons 中实现的。这些 API 的使用文档位于[Spring Cloud Commons documentation](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-circuit-breaker)中。 ### [](#configuring-resilience4j-circuit-breakers)[1.1.配置弹性 4J 断路器](#configuring-resilience4j-circuit-breakers) -#### [](#starters)[1.1.1. Starters](#starters) +#### [](#starters)[1.1.1.初学者](#starters) 弹性 4J 实现有两个启动器,一个用于反应性应用程序,另一个用于非反应性应用程序。 @@ -17,11 +18,11 @@ Spring Cloud Circuitbreaker 项目包含 Resilience4J 和 Spring Retry 的实现 #### [](#auto-configuration)[1.1.2.自动配置](#auto-configuration) -你可以通过将 ` Spring.cloud.circuitbreaker.resilience4j.enabled` 设置为`false`来禁用 Resilience4j 自动配置。 +通过将`spring.cloud.circuitbreaker.resilience4j.enabled`设置为`false`,可以禁用 Resilience4j 自动配置。 #### [](#default-configuration)[1.1.3.默认配置](#default-configuration) -要为你的所有断路器提供默认配置,请创建一个`Customize` Bean,并传递一个 `Resilience4jcircuitbreakerFactory’或`ReactiveResilience4JCircuitBreakerFactory`。`configureDefault`方法可用于提供默认配置。 +要为你的所有断路器提供默认配置,请创建一个`Customize` Bean,它传递一个`Resilience4JCircuitBreakerFactory`或`ReactiveResilience4JCircuitBreakerFactory`。`configureDefault`方法可用于提供默认配置。 ``` @Bean @@ -46,7 +47,7 @@ public Customizer defaultCustomizer() #### [](#specific-circuit-breaker-configuration)[1.1.4.特定断路器配置](#specific-circuit-breaker-configuration) -与提供默认配置类似,你可以创建一个`Customize` Bean,这传递了一个 `Resilience4jcircuitbreakerFactory’或`ReactiveResilience4JCircuitBreakerFactory`。 +与提供默认配置类似,你可以创建一个`Customize` Bean 这是传递一个`Resilience4JCircuitBreakerFactory`或`ReactiveResilience4JCircuitBreakerFactory`。 ``` @Bean @@ -192,18 +193,18 @@ resilience4j.bulkhead: #### [](#collecting-metrics)[1.1.9.收集指标](#collecting-metrics) -Spring 云断路器弹性 4j 包括自动配置以设置度量收集,只要正确的依赖关系是在 Classpath 上。要启用度量集合,必须包括`org.springframework.boot:spring-boot-starter-actuator`和`io.github.resilience4j:resilience4j-micrometer`。有关存在这些依赖关系时产生的度量的更多信息,请参见[复原力 4J 文档](https://resilience4j.readme.io/docs/micrometer)。 +Spring Cloud断路器弹性 4j 包括自动配置以设置度量收集,只要正确的依赖关系是在 Classpath 上。要启用度量集合,必须包括`org.springframework.boot:spring-boot-starter-actuator`和`io.github.resilience4j:resilience4j-micrometer`。有关存在这些依赖关系时产生的度量的更多信息,请参见[复原力 4J 文档](https://resilience4j.readme.io/docs/micrometer)。 | |你不必直接包含`micrometer-core`,因为它是由`spring-boot-starter-actuator`引入的| |---|----------------------------------------------------------------------------------------------------------| ### [](#configuring-spring-retry-circuit-breakers)[1.2. Configuring Spring Retry Circuit Breakers](#configuring-spring-retry-circuit-breakers) -Spring Retry 为 Spring 应用程序提供声明性重试支持。该项目的一个子集包括实现断路器功能的能力。 Spring 重试通过它的[“circuitbreakerretrypolicy”](https://github.com/spring-projects/spring-retry/blob/master/src/main/java/org/springframework/retry/policy/CircuitBreakerRetryPolicy.java)和[stateful retry](https://github.com/spring-projects/spring-retry#stateful-retry)的组合提供了一种断路器实现方式。使用 Spring 重试创建的所有断路器都将使用`CircuitBreakerRetryPolicy`和[“违约状态”](https://github.com/spring-projects/spring-retry/blob/master/src/main/java/org/springframework/retry/support/DefaultRetryState.java)创建。这两个类都可以使用`SpringRetryConfigBuilder`进行配置。 +Spring Retry 为 Spring 应用程序提供声明性重试支持。该项目的一个子集包括实现断路器功能的能力。 Spring Retry 通过它的[`CircuitBreakerRetryPolicy`](https://github.com/ Spring-projects/ Spring-retry/blob/master/SRC/main/java/org/springframework/retry/policy/circuitbreakerretrygt.java)和<的组合提供了一个断路器实现。所有使用 Spring 重试创建的断路器都将使用`CircuitBreakerRetryPolicy`和[`DefaultRetryState`](https://github.com/ Spring-projects/ Spring-retry/blob/master/SRC/main/java/org/springframework/retry/support/defaultrystate.java)创建。这两个类都可以使用`SpringRetryConfigBuilder`进行配置。 #### [](#default-configuration-2)[1.2.1.默认配置](#default-configuration-2) -要为你的所有断路器提供默认配置,请创建一个`Customize` Bean,它传递一个“SpringretryCircuitBreakerFactory”。`configureDefault`方法可用于提供默认配置。 +要为你的所有断路器提供默认配置,请创建一个`Customize` Bean,传递一个`SpringRetryCircuitBreakerFactory`。`configureDefault`方法可用于提供默认配置。 ``` @Bean @@ -215,7 +216,7 @@ public Customizer defaultCustomizer() { #### [](#specific-circuit-breaker-configuration-2)[1.2.2.特定断路器配置](#specific-circuit-breaker-configuration-2) -与提供默认配置类似,你可以创建`Customize` Bean 这传递了一个“SpringRetryCircuitBreakerFactory”。 +与提供默认配置类似,你可以创建`Customize` Bean 这是传递的`SpringRetryCircuitBreakerFactory`。 ``` @Bean @@ -249,13 +250,13 @@ public Customizer slowCustomizer() { } ``` -## [](#building)[2. Building](#building) +## [](#building)[2.建筑物](#building) ### [](#basic-compile-and-test)[2.1.基本编译和测试](#basic-compile-and-test) 要构建源代码,你需要安装 JDK17。 -Spring Cloud 在大多数与构建相关的活动中使用 Maven,你应该能够通过克隆感兴趣的项目并键入来很快地启动它。 +Spring Cloud 在大多数与构建相关的活动中使用 Maven,你应该能够通过克隆感兴趣的项目并键入来很快地开始工作。 ``` $ ./mvnw install @@ -264,14 +265,14 @@ $ ./mvnw install | |你也可以自己安装 Maven(\>=3.3.3),并在下面的示例中运行`mvn`命令
来代替`./mvnw`。如果你这样做,那么如果你的本地 Maven 设置不
包含 Spring 预发布工件的存储库声明,那么你可能还需要添加`-P spring`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |请注意,你可能需要通过使用
设置一个`MAVEN_OPTS`的环境变量来增加 Maven 可用的
内存量`-Xmx512m -XX:MaxPermSize=128m`这样的值。我们试图在
`.mvn`配置中覆盖此内容,因此,如果你发现必须这样做才能使
构建成功,请举出一张票来将设置添加到
源代码控制中。| +| |请注意,你可能需要通过使用
设置`-Xmx512m -XX:MaxPermSize=128m`这样的值的`MAVEN_OPTS`环境变量来增加 Maven 可用的
内存量。我们试图在
的`.mvn`配置中覆盖此内容,因此,如果你发现必须这样做才能使
构建成功,请举出一张票来将设置添加到
源代码控制中。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 需要中间件(即 Redis)进行测试的项目通常需要安装并运行[Docker]([WWW.docker.com/get-started](https://www.docker.com/get-started))的本地实例。 ### [](#documentation)[2.2.文件](#documentation) -Spring-cloud-build 模块有一个“DOCS”配置文件,如果将其打开,将尝试从 `SRC/Main/ASCIIDoc’构建 ASCIIDoc 源。作为该过程的一部分,它将寻找一个“readme.ADOC”,并通过加载所有包含来处理它,但不是解析或呈现它,只是将其复制到`${main.basedir}`(默认为`$/tmp/releaser-1645116950347-0/spring-cloud-circuitbreaker/docs`,即项目的根)。如果 README 中有任何更改,那么在构建 Maven 之后,它将在正确的位置显示为经过修改的文件。只要承诺并推动改变就行了。 +Spring-cloud-build 模块具有一个“DOCS”配置文件,如果你将其打开,它将尝试从`src/main/asciidoc`构建 ASCIIDoc 源。作为该过程的一部分,它将寻找`README.adoc`,并通过加载所有的包含来处理它,但不是解析或呈现它,只是将其复制到`${main.basedir}`(默认为`$/tmp/releaser-1645116950347-0/spring-cloud-circuitbreaker/docs`,即项目的根)。如果 README 中有任何更改,那么在构建 Maven 之后,它将在正确的位置显示为经过修改的文件。只要承诺并推动改变就行了。 ### [](#working-with-the-code)[2.3.使用代码](#working-with-the-code) @@ -279,13 +280,13 @@ Spring-cloud-build 模块有一个“DOCS”配置文件,如果将其打开, #### [](#activate-the-spring-maven-profile)[2.3.1. Activate the Spring Maven profile](#activate-the-spring-maven-profile) -Spring 云项目需要激活“ Spring” Maven 配置文件,以解析 Spring 里程碑和快照存储库。使用你首选的 IDE 将此配置文件设置为活动的,否则你可能会遇到构建错误。 +Spring Cloud项目需要激活“ Spring” Maven 配置文件,以解析 Spring 里程碑和快照存储库。使用你首选的 IDE 将此配置文件设置为活动的,否则你可能会遇到构建错误。 #### [](#importing-into-eclipse-with-m2eclipse)[2.3.2.用 M2Eclipse 导入到 Eclipse 中](#importing-into-eclipse-with-m2eclipse) 在使用 Eclipse 时,我们推荐[m2eclipse](https://eclipse.org/m2e/)Eclipse 插件。如果你还没有安装 M2Eclipse,它可以从“Eclipse 市场”获得。 -| |较早版本的 M2E 不支持 Maven 3.3,因此,一旦
项目导入到 Eclipse 中,你还需要告诉
M2Eclipse 为项目使用正确的配置文件。如果你
在项目中看到与 POM 相关的许多不同错误,请检查
是否有最新的安装。如果你不能升级 M2E,
将“ Spring”配置文件添加到你的`settings.xml`。或者,你可以
将存储库设置从父
POM 的“ Spring”配置文件复制到你的`settings.xml`中。| +| |较早版本的 M2E 不支持 Maven 3.3,因此,一旦
项目导入到 Eclipse 中,你还需要告诉
M2Eclipse 为项目使用正确的配置文件。如果你
在项目中看到许多与 POM 相关的错误,请检查
是否有最新的安装。如果你不能升级 M2E,
将“ Spring”配置文件添加到你的`settings.xml`。或者,你可以
将存储库设置从父
POM 的“ Spring”配置文件复制到你的`settings.xml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### [](#importing-into-eclipse-without-m2eclipse)[2.3.3.在没有 M2Eclipse 的情况下导入 Eclipse](#importing-into-eclipse-without-m2eclipse) @@ -298,8 +299,7 @@ $ ./mvnw eclipse:eclipse 可以通过从`file`菜单中选择`import existing projects`来导入生成的 Eclipse 项目。 -## [](#contributing)[3. Contributing](#contributing) ----------- +## [](#contributing)[3.贡献](#contributing) Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,并遵循非常标准的 GitHub 开发流程,使用 GitHub Tracker 处理问题并将拉请求合并到 Master 中。如果你想贡献一些微不足道的东西,请不要犹豫,但要遵循下面的指导方针。 @@ -309,15 +309,15 @@ Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,并遵循非 ### [](#code-of-conduct)[3.2.行为守则](#code-of-conduct) -该项目遵守贡献者契约[code of conduct](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#fd8e8d8f94939ad09e929998d0929bd09e92939889e89bd8d948b92899c91d39492)。 +该项目遵守贡献者契约[行为守则](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#4c3f3c3e25222b612f23282961232a612f232228392f380c3c253a23382d20622523)。 ### [](#code-conventions-and-housekeeping)[3.3.守则惯例和内部管理](#code-conventions-and-housekeeping) 这些都不是拉请求所必需的,但它们都会有所帮助。它们也可以在原始的拉请求之后但在合并之前添加。 -* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目中的 `eclipse-code-formatter.xml’文件导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 +* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用`eclipse-code-formatter.xml`文件从[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 -* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个 `@author’标记来标识你,并且最好至少有一个段落来说明这个类的用途。 +* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个`@author`标记来标识你,并且最好至少有一个段落来说明类的用途。 * 将 ASF 许可标头注释添加到所有新的`.java`文件(从项目中的现有文件复制) @@ -329,11 +329,11 @@ Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,并遵循非 * 如果没有其他人正在使用你的分支,请将它重新设置为当前的主分支(或主项目中的其他目标分支)。 -* 在编写提交消息时,请遵循[这些约定](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),如果你正在修复现有的问题,请在提交消息的末尾添加`Fixes gh-XXXX`(其中 xxxx 是问题编号)。 +* 在写提交消息时,请遵循[这些约定](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),如果你正在修复现有的问题,请在提交消息的末尾添加`Fixes gh-XXXX`(其中 xxxx 是问题编号)。 -### [](#checkstyle)[3.4. checkstyle](#checkstyle) +### [](#checkstyle)[3.4.checkstyle](#checkstyle) -Spring 云构建附带一组 CheckStyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: +Spring Cloud构建附带一组 CheckStyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: Spring-云构建工具/ @@ -419,7 +419,7 @@ $ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/ $ touch .springformat ``` -### [](#ide-setup)[3.5. IDE setup](#ide-setup) +### [](#ide-setup)[3.5.IDE 设置](#ide-setup) #### [](#intellij-idea)[3.5.1.Intellij 思想](#intellij-idea) @@ -459,7 +459,7 @@ Spring-云构建工具/ 转到`File``Settings``Editor``Inspections`。点击`Profile`区域旁边的图标。在那里,单击`Import Profile`并导入`spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml`文件。 -Checkstyle +checkstyle 要让 IntelliJ 使用 CheckStyle,你必须安装`Checkstyle`插件。建议还安装`Assertions2Assertj`来自动转换 JUnit 断言 @@ -471,14 +471,14 @@ Checkstyle * `checkstyle.suppressions.file`-默认抑制。请将它指向 Spring Cloud Build 的`spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml`文件,或者在你的克隆 repo 中,或者通过`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml)`URL。 -* `checkstyle.additional.suppressions.file`-此变量对应于本地项目中的抑制。例如,你正在处理`spring-cloud-contract`。然后指向`project-root/src/checkstyle/checkstyle-suppressions.xml`文件夹。`spring-cloud-contract`的例子是:`/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`。 +* `checkstyle.additional.suppressions.file`-此变量对应于本地项目中的抑制。例如,你正在处理`spring-cloud-contract`。然后指向`project-root/src/checkstyle/checkstyle-suppressions.xml`文件夹。`spring-cloud-contract`的示例是:`/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`。 -| |记住将`Scan Scope`设置为`All sources`,因为我们为生产和测试源应用了 checkstyle 规则。| +| |请记住将`Scan Scope`设置为`All sources`,因为我们为生产和测试源应用了 checkstyle 规则。| |---|------------------------------------------------------------------------------------------------------------------| ### [](#duplicate-finder)[3.6.重复查找器](#duplicate-finder) -Spring 云构建带来了`basepom:duplicate-finder-maven-plugin`,这使得能够在 Java Classpath 上标记重复的和冲突的类和资源。 +Spring Cloud构建带来了`basepom:duplicate-finder-maven-plugin`,这使得能够在 Java Classpath 上标记重复的和冲突的类和资源。 #### [](#duplicate-finder-configuration)[3.6.1.重复查找器配置](#duplicate-finder-configuration) @@ -521,4 +521,6 @@ pom.xml
-``` \ No newline at end of file +``` + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-cli.md b/docs/spring-cloud/spring-cloud-cli.md index 0321eaf32d21c946ef3599c8e702bf8b882f02b9..b172c74b67ac9e04a52d21c305d8ef9bc275ddcf 100644 --- a/docs/spring-cloud/spring-cloud-cli.md +++ b/docs/spring-cloud/spring-cloud-cli.md @@ -1,12 +1,11 @@ # Spring 引导云 CLI +Spring Boot CLI 为[Spring Boot](https://projects.spring.io/spring-boot)提供了[Spring Cloud](https://github.com/spring-cloud)命令行功能。你可以编写 Groovy 脚本来运行 Spring Cloud组件应用程序(例如`@EnableEurekaServer`)。你还可以轻松地进行加密和解密等操作,以支持具有秘密配置值的云配置客户机。通过 Launcher CLI,你可以方便地从命令行同时启动像 Eureka、Zipkin、Config Server 这样的服务(在开发时非常有用)。 -Spring Boot CLI 为[Spring Boot](https://projects.spring.io/spring-boot)提供了[Spring Cloud](https://github.com/spring-cloud)命令行功能。你可以编写 Groovy 脚本来运行 Spring 云组件应用程序(例如`@EnableEurekaServer`)。你还可以轻松地进行加密和解密等操作,以支持具有秘密配置值的云配置客户机。通过 Launcher CLI,你可以方便地从命令行同时启动像 Eureka、Zipkin、Config Server 这样的服务(在开发时非常有用)。 - -| |Spring 云是在非限制性的 Apache2.0 许可下发布的。如果你想对文档的这一部分做出贡献,或者你发现了一个错误,请在[github](https://github.com/spring-cloud/spring-cloud-cli)上找到项目中的源代码和问题追踪器。| +| |Spring Cloud是在非限制性的 Apache2.0 许可下发布的。如果你想对文档的这一部分做出贡献,或者你发现了一个错误,请在[github](https://github.com/spring-cloud/spring-cloud-cli)上找到项目中的源代码和问题追踪器。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -## [Installation](#_installation) +## [安装](#_installation) 要安装,请确保你有[Spring Boot CLI](https://github.com/spring-projects/spring-boot)(2.0.0 或更好): @@ -22,14 +21,14 @@ $ sdk install springboot 2.2.3.RELEASE $ sdk use springboot 2.2.3.RELEASE ``` -并安装 Spring 云插件 +并安装 Spring Cloud插件 ``` $ mvn install $ spring install org.springframework.cloud:spring-cloud-cli:2.2.0.RELEASE ``` -| |**先决条件:**要使用加密和解密功能
,你需要在你的 JVM 中安装全强度 JCE(默认情况下不存在)。
你可以从 Oracle 下载“Java Cryptography Extension(JCE)Unlimited Strength Juridictory Policy Files”
,并遵循安装说明(基本上将 JRElib/security 目录中的 2Policy 文件
替换为你下载的文件)。| +| |**先决条件:**要使用加密和解密功能
,你需要在你的 JVM 中安装全强度 JCE(默认情况下不存在)。
你可以从 Oracle 下载“Java Cryptography Extension(JCE)Unlimited Strength Juridictory Policy Files”
,并遵循安装说明(基本上将 JRElib/security 目录中的 2 个策略文件
替换为你下载的文件)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## [Running Spring Cloud Services in Development](#_running_spring_cloud_services_in_development) @@ -52,7 +51,7 @@ $ spring cloud eureka configserver h2 kafka stubrunner zipkin | zipkin | Zipkin Server | [http://localhost:9411](http://localhost:9411) |Zipkin 服务器与 UI 可视化的痕迹。存储在内存中的跨数据,并通过 JSON 数据的 HTTP POST 接受它们。| | stubrunner |Stub Runner Boot| [http://localhost:8750](http://localhost:8750) |下载 WiRemock 存根,启动 WiRemock,并用存储的存根向启动的服务器提供信息。传递`stubrunner.ids`以传递存根坐标,然后转到`[http://localhost:8750/stubs](http://localhost:8750/stubs)`。| -可以使用同名的本地 YAML 文件(在当前工作目录或名为“config”的子目录中或在`~/.spring-cloud`中)配置这些应用程序。例如,在`configserver.yml`中,你可能想要执行这样的操作来为后端定位一个本地 Git 存储库: +这些应用程序中的每一个都可以使用同名的本地 YAML 文件进行配置(在当前工作目录或名为“config”的子目录中或在`~/.spring-cloud`中)。例如,在`configserver.yml`中,你可能想做这样的事情来为后端定位一个本地 Git 存储库: configserver.yml @@ -80,7 +79,7 @@ stubrunner: ### [添加其他应用程序](#_adding_additional_applications) -可以将其他应用程序添加到`./config/cloud.yml`(不是 `./config.yml`,因为这将替换缺省值),例如使用 +可以将其他应用程序添加到`./config/cloud.yml`(而不是`./config.yml`,因为这将替换默认值),例如使用 config/cloud.yml @@ -108,7 +107,7 @@ source sink configserver dataflow eureka h2 kafka stubrunner zipkin ## [编写 Groovy 脚本并运行应用程序](#_writing_groovy_scripts_and_running_applications) -Spring 云 CLI 具有对 Spring 云的大多数声明性功能的支持,例如`@Enable*`类的注释。例如,这里有一个功能齐全的 Eureka 服务器 +Spring Cloud CLI 具有对 Spring Cloud的大多数声明性功能的支持,例如`@Enable*`类的注释。例如,这里有一个功能齐全的 Eureka 服务器 App.Groovy @@ -123,7 +122,7 @@ class Eureka {} $ spring run app.groovy ``` -要包含额外的依赖关系,通常只需添加适当的支持特性的注释就足够了,例如`@EnableConfigServer`,`@enableOAuth2SSO’或`@EnableEurekaClient`。要手动包含依赖项,你可以使用`@Grab`和特殊的“ Spring 引导”短样式工件坐标,即只使用工件 ID(不需要组或版本信息),例如,设置一个客户端应用程序,以便在 AMQP 上监听来自 Spring 云总线的管理事件: +要包含额外的依赖关系,通常只需添加适当的支持特性的注释就足够了,例如`@EnableConfigServer`,`@EnableOAuth2Sso`或`@EnableEurekaClient`。要手动包含依赖项,你可以使用`@Grab`和特殊的“ Spring 引导”短样式工件坐标,即只使用工件 ID(不需要组或版本信息),例如,设置一个客户端应用程序,以便在 AMQP 上监听来自 Spring Cloud总线的管理事件: App.Groovy @@ -138,7 +137,7 @@ class Service { ## [加密和解密](#_encryption_and_decryption) -Spring cloud cli 带有一个“加密”和一个“解密”命令。两者都接受相同形式的参数,并将键指定为强制性的“--key”,例如。 +Spring cloud cli 带有一个“加密”和一个“解密”命令。两者都接受相同形式的参数,其中一个键被指定为强制性的“--key”,例如。 ``` $ spring encrypt mysecret --key foo @@ -153,3 +152,5 @@ mysecret $ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+... ``` + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-cloudfoundry.md b/docs/spring-cloud/spring-cloud-cloudfoundry.md index 54c4ffca06c890f092e390d9130dabe4bdbacf53..72e907af8a3cbf94d0e5a5b3fa717490a605e838 100644 --- a/docs/spring-cloud/spring-cloud-cloudfoundry.md +++ b/docs/spring-cloud/spring-cloud-cloudfoundry.md @@ -1,19 +1,18 @@ # Spring Cloud for Cloud Foundry - Spring Cloud for CloudFoundry 使得在[Cloud Foundry](https://github.com/cloudfoundry)(平台即服务)中运行[Spring Cloud](https://github.com/spring-cloud)应用程序变得很容易。Cloud Foundry 有一个“服务”的概念,这是一个可以“绑定”到应用程序的中间软件,本质上为它提供了一个包含凭据的环境变量(例如,用于服务的位置和用户名)。 `spring-cloud-cloudfoundry-commons`模块配置了基于反应堆的 Cloud Foundry Java 客户端 V3.0,并且可以独立使用。 `spring-cloud-cloudfoundry-web`项目为 Cloud Foundry 中 WebApps 的一些增强功能提供了基本支持:自动绑定到单点登录服务,并可选地为发现启用粘性路由。 -`spring-cloud-cloudfoundry-discovery`项目提供了 Spring Cloud Commons`DiscoveryClient`的实现,因此你可以 `@enableDiscoveryClient’并提供你的凭据为 ` Spring.cloud.cloudfoundry.Discovery.[username,password]`(如果你没有连接到[Pivotal Web 服务](https://run.pivotal.io),也可以`*.url`),然后你可以直接使用`DiscoveryClient`,或者通过`LoadBalancerClient`。 +`spring-cloud-cloudfoundry-discovery`项目提供了 Spring Cloud Commons`DiscoveryClient`的实现,因此你可以`@EnableDiscoveryClient`并提供你的凭据为`spring.cloud.cloudfoundry.discovery.[username,password]`(如果你没有连接到[Pivotal Web 服务](https://run.pivotal.io),也可以`*.url`),然后你可以直接使用`DiscoveryClient`,或者通过`LoadBalancerClient`。 第一次使用 Discovery 客户机时,由于它必须从 Cloud Foundry 获得一个访问令牌,因此它可能会比较慢。 -## [](#discovery)[1. Discovery](#discovery) +## [](#discovery)[1.发现](#discovery) -以下是一款带有 Cloud Foundry Discovery 的 Spring 云应用: +以下是一款带有 Cloud Foundry Discovery 的 Spring Cloud应用: App.Groovy @@ -47,12 +46,13 @@ $ cf push -p app.jar ## [](#single-sign-on)[2.单点登录](#single-sign-on) -| |在版本 1.3 中,所有的 OAuth2SSO 和资源服务器功能都移动到了 Spring boot
。你可以在[Spring Boot user guide](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)中找到文档。| +| |在版本 1.3 中,所有的 OAuth2SSO 和资源服务器功能都移到了 Spring boot
。你可以在[Spring Boot user guide](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)中找到文档。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -该项目提供了从 CloudFoundry 服务凭据到 Spring 启动特性的自动绑定。例如,如果你有一个名为“SSO”的 CloudFoundry 服务,其凭据中包含“client\_id”、“client\_secret”和“auth\_domain”,那么它将自动绑定到你用 `@enableoAuth2SSO’启用的 Spring OAuth2 客户端(从 Spring 启动)。服务的名称可以使用`spring.oauth2.sso.serviceId`进行参数化。 +该项目提供了从 CloudFoundry 服务凭据到 Spring 启动特性的自动绑定。例如,如果你有一个名为“SSO”的 CloudFoundry 服务,其凭据包含“client\_id”、“client\_secret”和“auth\_domain”,那么它将自动绑定到你通过`@EnableOAuth2Sso`(从 Spring 启动)启用的 Spring OAuth2 客户端。服务的名称可以使用`spring.oauth2.sso.serviceId`进行参数化。 ## [](#configuration)[3.配置](#configuration) 要查看所有 Spring Cloud Foundry 相关配置属性的列表,请检查[附录页](appendix.html)。 +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-commons.md b/docs/spring-cloud/spring-cloud-commons.md index 934604f4834f09c66c50612e2b9a74bc40afd24f..b1ba7e96ab941a55d57064bdff0dfc2394cc57e8 100644 --- a/docs/spring-cloud/spring-cloud-commons.md +++ b/docs/spring-cloud/spring-cloud-commons.md @@ -1,8 +1,8 @@ # 云原生应用程序 -[Cloud Native](https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook)是一种应用程序开发风格,它鼓励在持续交付和价值驱动的开发领域轻松采用最佳实践。一个相关的规程是构建[12 因素应用程序](https://12factor.net/),在该规程中,开发实践与交付和操作目标保持一致——例如,通过使用声明式编程以及管理和监视。 Spring 云以许多特定的方式促进了这些开发风格。起点是一组特性,分布式系统中的所有组件都需要轻松访问这些特性。 +[云原生](https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook)是一种应用程序开发风格,它鼓励在持续交付和价值驱动的开发领域轻松采用最佳实践。一个相关的规程是构建[12 因素应用程序](https://12factor.net/),在该规程中,开发实践与交付和操作目标保持一致——例如,通过使用声明式编程以及管理和监视。 Spring Cloud以许多特定的方式促进了这些开发风格。起点是一组特性,分布式系统中的所有组件都需要轻松访问这些特性。 -这些特性中的许多都包含在[Spring Boot](https://projects.spring.io/spring-boot)中, Spring 云就是建立在这些特性上的。 Spring Cloud 以两个库的形式提供了更多的功能: Spring Cloud Context 和 Spring Cloud Commons。 Spring Cloud Context 为 Spring 云应用程序的`ApplicationContext`提供实用程序和特殊服务(Bootstrap 上下文、加密、刷新范围和环境端点)。 Spring Cloud Commons 是一组抽象和公共类,用于不同的云实现(例如 Spring Cloud Netflix 和 Spring Cloud Consul)。 +这些特性中的许多都包含在[Spring Boot](https://projects.spring.io/spring-boot)中, Spring Cloud 就是建立在这些特性上的。 Spring Cloud 以两个库的形式提供了更多的功能: Spring Cloud Context 和 Spring Cloud Commons。 Spring Cloud Context 为 Spring Cloud应用程序的`ApplicationContext`提供实用工具和特殊服务(Bootstrap 上下文、加密、刷新范围和环境端点)。 Spring Cloud Commons 是在不同的 Spring Cloud实现中使用的一组抽象和公共类(例如 Spring Cloud Netflix 和 Spring Cloud Consul)。 如果由于“非法密钥大小”而导致异常,并且使用了 Sun 的 JDK,则需要安装 JCE 的无限强度管辖权策略文件。有关更多信息,请参见以下链接: @@ -12,20 +12,20 @@ * [Java 8 JCE](https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html) -将这些文件解压缩到 JDK/JRE/lib/security 文件夹中,用于你使用的 JRE/JDK x64/x86 的任何版本。 +将这些文件解压缩到 JDK/JRE/lib/security 文件夹中,用于你使用的任何版本的 JRE/JDK x64/x86。 -| |Spring 云是在非限制性的 Apache2.0 许可下发布的。
如果你想对文档的这一部分做出贡献,或者如果你发现了一个错误,那么你可以在{docslink}[github]上找到该项目的源代码和发行追踪器。| +| |Spring Cloud 是在非限制性的 Apache2.0 许可下发布的。
如果你想对文档的这一部分做出贡献,或者如果你发现了一个错误,那么你可以在{docslink}[github]上找到该项目的源代码并发布该项目的追踪器。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## [](#spring-cloud-context-application-context-services)[1. Spring Cloud Context: Application Context Services](#spring-cloud-context-application-context-services) -Spring 对于如何使用 Spring 构建应用程序,Boot 持有一种固执己见的观点。例如,它具有用于公共配置文件的常规位置,并且具有用于公共管理和监视任务的端点。 Spring 云在此基础上构建,并添加了一些系统中的许多组件将使用或偶尔需要的功能。 +Spring 对于如何使用 Spring 构建应用程序,Boot 持有一种固执己见的观点。例如,它具有用于公共配置文件的常规位置,并且具有用于公共管理和监视任务的端点。 Spring Cloud在此基础上构建,并添加了一些系统中的许多组件将使用或偶尔需要的功能。 ### [](#the-bootstrap-application-context)[1.1.引导程序应用程序上下文](#the-bootstrap-application-context) -Spring 云应用程序通过创建“引导”上下文来操作,该上下文是主应用程序的父上下文。这个上下文负责从外部源加载配置属性,并对本地外部配置文件中的属性进行解密。这两个上下文共享一个`Environment`,它是任何 Spring 应用程序的外部属性的源。默认情况下,Bootstrap 属性(不是`bootstrap.properties`,而是在 Bootstrap 阶段加载的属性)是以较高的优先级添加的,因此它们不能被本地配置覆盖。 +Spring Cloud应用程序通过创建“引导”上下文来操作,该上下文是主应用程序的父上下文。这个上下文负责从外部源加载配置属性,并对本地外部配置文件中的属性进行解密。这两个上下文共享一个`Environment`,它是任何 Spring 应用程序的外部属性的源。默认情况下,Bootstrap 属性(不是`bootstrap.properties`,而是在 Bootstrap 阶段加载的属性)是以较高的优先级添加的,因此它们不能被本地配置覆盖。 -与主应用程序上下文相比,引导程序上下文使用不同的约定来定位外部配置。而不是`application.yml`(或`.properties`),你可以使用`bootstrap.yml`,将引导程序和主上下文的外部配置很好地分开。下面的清单展示了一个示例: +与主应用程序上下文相比,引导程序上下文使用不同的约定来定位外部配置。而不是`application.yml`(或`.properties`),你可以使用`bootstrap.yml`,从而将引导程序和主上下文的外部配置很好地分开。下面的清单展示了一个示例: 示例 1.bootstrap.yml @@ -46,15 +46,15 @@ spring: ### [](#application-context-hierarchies)[1.2.应用程序上下文层次结构](#application-context-hierarchies) -如果你从`SpringApplication`或`SpringApplicationBuilder`构建应用程序上下文,则引导程序上下文将作为父上下文添加到该上下文。 Spring 的一个特性是,子上下文从其父上下文继承属性源和配置文件,因此,与在没有 Spring 云配置的情况下构建相同的上下文相比,“主”应用程序上下文包含额外的属性源。额外的财产来源是: +如果你从`SpringApplication`或`SpringApplicationBuilder`构建应用程序上下文,则引导程序上下文将作为父上下文添加到该上下文。 Spring 的一个特性是,子上下文从其父上下文继承属性源和配置文件,因此,与在没有 Spring Cloud配置的情况下构建相同的上下文相比,“主”应用程序上下文包含额外的属性源。额外的财产来源是: -* “bootstrap”:如果在 bootstrap 上下文中找到任何`PropertySourceLocators`,并且它们具有非空属性,则会以高优先级出现一个可选的`CompositePropertySource`。一个例子是来自 Spring Cloud Config 服务器的属性。有关如何自定义此属性源的内容,请参见“[自定义引导程序属性源](#customizing-bootstrap-property-sources)”。 +* “bootstrap”:如果在 bootstrap 上下文中找到任何`PropertySourceLocators`,并且它们具有非空属性,则会以高优先级出现可选的`CompositePropertySource`。一个例子是来自 Spring Cloud Config 服务器的属性。有关如何自定义此属性源的内容,请参见“[自定义引导程序属性源](#customizing-bootstrap-property-sources)”。 -* “ApplicationConfig:[ Classpath:bootstrap.yml]”(如果 Spring 配置文件处于活动状态,则包含相关文件):如果你有`bootstrap.yml`(或`.properties`),则这些属性将用于配置 bootstrap 上下文。然后,当设置其父上下文时,它们被添加到子上下文中。它们的优先级低于`application.yml`(或`.properties`)和作为创建 Spring 引导应用程序过程的正常部分添加到子程序的任何其他属性源。有关如何自定义这些属性源的内容,请参见“[更改 BootStrap 属性的位置](#customizing-bootstrap-properties)”。 +* “ApplicationConfig:[ Classpath:bootstrap.yml]”(如果 Spring profiles 处于活动状态,则包含相关文件):如果你有`bootstrap.yml`(或`.properties`),则这些属性将用于配置 bootstrap 上下文。然后,当设置其父上下文时,它们被添加到子上下文中。它们的优先级低于`application.yml`(或`.properties`)和作为创建 Spring 引导应用程序过程的正常部分添加到子级的任何其他属性源。有关如何自定义这些属性源的内容,请参见“[更改 BootStrap 属性的位置](#customizing-bootstrap-properties)”。 由于属性源的排序规则,“bootstrap”条目优先。然而,请注意,这些不包含来自`bootstrap.yml`的任何数据,这具有很低的优先级,但可以用来设置默认值。 -你可以通过设置你创建的任何`ApplicationContext`的父上下文来扩展上下文层次结构——例如,通过使用它自己的接口或使用`SpringApplicationBuilder`便利方法(`parent(),`child()`和`sibling()`)。引导程序上下文是你自己创建的最高级祖先的父级。层次结构中的每个上下文都有自己的“Bootstrap”(可能是空的)属性源,以避免无意中将值从父级推广到子级。如果有一个配置服务器,层次结构中的每个上下文(原则上)也可以有不同的`spring.application.name`,因此也可以有不同的远程属性源。 Spring 正常的应用程序上下文行为规则适用于属性解析:来自子上下文的属性通过名称和属性源名覆盖父上下文中的属性。(如果子具有与父具有相同名称的属性源,则来自父的值不包含在子属性中)。 +你可以通过设置你创建的任何`ApplicationContext`的父上下文来扩展上下文层次结构——例如,通过使用它自己的接口或使用`SpringApplicationBuilder`便利方法(`parent()`,`child()`和`sibling()`)。引导程序上下文是你自己创建的最高级祖先的父级。层次结构中的每个上下文都有自己的“Bootstrap”(可能是空的)属性源,以避免无意中将值从父级推广到子级。如果有一个配置服务器,层次结构中的每个上下文(原则上)也可以有不同的`spring.application.name`,因此也可以有不同的远程属性源。 Spring 正常的应用程序上下文行为规则适用于属性解析:来自子上下文的属性通过名称和属性源名覆盖父上下文中的属性。(如果子具有与父具有相同名称的属性源,则来自父的值不包含在子属性中)。 请注意,`SpringApplicationBuilder`允许你在整个层次结构中共享`Environment`,但这不是默认的。因此,兄弟上下文(尤其是)不需要具有相同的概要文件或属性源,即使它们可能与父上下文共享公共值。 @@ -62,7 +62,7 @@ spring: `bootstrap.yml`(或`.properties`)位置可以通过设置`spring.cloud.bootstrap.name`(默认:`bootstrap`)、`spring.cloud.bootstrap.location`(默认:空)或`spring.cloud.bootstrap.additional-location`(默认:空)来指定——例如,在系统属性中。 -这些属性的行为类似于同名的`spring.config.*`变体。用`spring.cloud.bootstrap.location`替换默认位置,只使用指定的位置。要将位置添加到默认位置列表中,可以使用`spring.cloud.bootstrap.additional-location`。实际上,它们是用来设置 Bootstrap`ApplicationContext`的,方法是在其`Environment`中设置这些属性。如果有一个活动配置文件(来自`spring.profiles.active`或通过你正在构建的上下文中的`Environment`API),则该配置文件中的属性也将被加载,这与常规 Spring 启动应用程序中的属性相同——例如,对于`development`配置文件,从`bootstrap-development.properties`开始。 +这些属性的行为类似于同名的`spring.config.*`变体。用`spring.cloud.bootstrap.location`替换默认位置,只使用指定的位置。要将位置添加到默认位置列表中,可以使用`spring.cloud.bootstrap.additional-location`。实际上,它们是用来设置 Bootstrap`ApplicationContext`的,方法是在其`Environment`中设置这些属性。如果有一个活动配置文件(从`spring.profiles.active`或通过你正在构建的上下文中的`Environment`API),则该配置文件中的属性也将被加载,这与常规 Spring 启动应用程序中的属性相同——例如,对于`development`配置文件,从`bootstrap-development.properties`开始。 ### [](#overriding-bootstrap-properties)[1.4.重写远程属性的值](#overriding-bootstrap-properties) @@ -70,13 +70,13 @@ spring: * `spring.cloud.config.overrideNone=true`:覆盖任何本地属性源。 -* `spring.cloud.config.overrideSystemProperties=false`:只有系统属性、命令行参数和环境变量(但不包括本地配置文件)才应覆盖远程设置。 +* `spring.cloud.config.overrideSystemProperties=false`:只有系统属性、命令行参数和环境变量(但不包括本地配置文件)应覆盖远程设置。 ### [](#customizing-the-bootstrap-configuration)[1.5.自定义引导程序配置](#customizing-the-bootstrap-configuration) -通过在名为`org.springframework.cloud.bootstrap.BootstrapConfiguration`的键下向`/META-INF/spring.factories`添加条目,可以将引导程序上下文设置为执行任何你喜欢的操作。这包含一个用逗号分隔的列表 Spring `@Configuration`类,这些类用于创建上下文。可以在这里创建你希望在主应用程序上下文中可用以进行自动连接的任何 bean。有一份`@Beans`型`ApplicationContextInitializer`的特殊合同。如果要控制启动序列,可以使用`@Order`注释标记类(默认顺序为`last`)。 +通过在名为`org.springframework.cloud.bootstrap.BootstrapConfiguration`的键下向`/META-INF/spring.factories`添加条目,可以将引导程序上下文设置为执行任何你喜欢的操作。这包含一个用逗号分隔的列表 Spring `@Configuration`类,这些类用于创建上下文。可以在这里创建你希望在主应用程序上下文中可用以进行自动连接的任何 bean。有一份`@Beans`型`ApplicationContextInitializer`的特别合同。如果要控制启动序列,可以使用`@Order`注释标记类(默认顺序是`last`)。 -| |在添加自定义`BootstrapConfiguration`时,请注意,所添加的类不是`@ComponentScanned`错误地添加到你的“主”应用程序上下文中,
为引导配置类使用一个单独的包名,并确保该名称尚未被`@ComponentScan`或`@SpringBootApplication`注释的配置类覆盖。| +| |在添加自定义`BootstrapConfiguration`时,请注意,你添加的类并不是错误地将`@ComponentScanned`添加到你的“主”应用程序上下文中,
对引导配置类使用一个单独的包名,并确保该名称尚未被`@ComponentScan`或`@SpringBootApplication`注释的配置类覆盖。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 引导程序通过将初始化器注入主`SpringApplication`实例(这是正常的 Spring 启动序列,无论它是作为独立应用程序运行还是部署在应用程序服务器中)而结束。首先,从`spring.factories`中的类创建一个引导程序上下文。然后,所有`@Beans`类型的`ApplicationContextInitializer`在启动之前被添加到主`SpringApplication`中。 @@ -102,7 +102,7 @@ public class CustomPropertySourceLocator implements PropertySourceLocator { 传入的`Environment`是即将被创建的`ApplicationContext`的属性——换句话说,是我们为其提供额外属性源的属性。它已经具有其正常的 Spring 引导提供的属性源,因此你可以使用这些源来定位特定于`Environment`的属性源(例如,通过在`spring.application.name`上键入它,就像在默认的 Spring Cloud Config Server 属性源定位器中所做的那样)。 -如果你创建了一个包含这个类的 jar,然后添加一个包含以下设置的`META-INF/spring.factories`,则`customProperty``PropertySource`将出现在其 Classpath 上包含该 jar 的任何应用程序中: +如果在其中创建一个 jar,然后添加一个包含以下设置的`META-INF/spring.factories`,则`customProperty``PropertySource`将出现在其 Classpath 上包含该 jar 的任何应用程序中: ``` org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator @@ -112,7 +112,7 @@ org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomP 如果你使用 Spring 引导来配置日志设置,那么如果你希望将此配置应用于所有事件,则应将其放置在`bootstrap.[yml | properties]`中。 -| |对于 Spring Cloud 要正确初始化日志配置,不能使用自定义前缀。例如,在初始化日志系统时,使用不会被 Spring Cloud 识别。| +| |对于 Spring Cloud 要正确初始化日志配置,不能使用自定义前缀。例如,在初始化日志系统时,使用不被 Spring Cloud 识别。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [](#environment-changes)[1.8.环境变化](#environment-changes) @@ -123,22 +123,22 @@ org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomP * 在`logging.level.*`中为任何属性设置记录器级别。 -请注意, Spring Cloud Config 客户机在默认情况下不会轮询`Environment`中的更改。通常,我们不建议使用这种方法来检测更改(尽管你可以使用“@schedule”注释对其进行设置)。如果你有一个扩展的客户机应用程序,那么最好向所有实例广播`EnvironmentChangeEvent`,而不是让它们轮询更改(例如,通过使用[Spring Cloud Bus](https://github.com/spring-cloud/spring-cloud-bus))。 +请注意, Spring Cloud Config 客户机在默认情况下不会轮询`Environment`中的更改。通常,我们不建议使用这种方法来检测更改(尽管你可以使用`@Scheduled`注释对其进行设置)。如果你有一个扩展的客户机应用程序,那么最好向所有实例广播`EnvironmentChangeEvent`,而不是让它们轮询更改(例如,通过使用[Spring Cloud Bus](https://github.com/spring-cloud/spring-cloud-bus))。 `EnvironmentChangeEvent`涵盖了一大类刷新用例,只要你可以实际对`Environment`进行更改并发布事件。请注意,这些 API 是公共的,并且是 CORE 的一部分 Spring)。你可以通过访问`/configprops`端点(一种标准的 Spring 引导执行器功能)来验证这些更改是否绑定到`@ConfigurationProperties`bean。例如,`DataSource`可以在运行时更改其`maxPoolSize`(由 Spring 引导创建的默认`DataSource`是`@ConfigurationProperties` Bean)并动态地增加容量。重新绑定`@ConfigurationProperties`并不包括另一大类用例,其中你需要对刷新进行更多控制,并且需要对整个`ApplicationContext`进行原子级更改。为了解决这些问题,我们有`@RefreshScope`。 ### [](#refresh-scope)[1.9.刷新范围](#refresh-scope) -当存在配置更改时,标记为`@RefreshScope`的 Spring `@Bean`将得到特殊处理。这个特性解决了有状态 bean 仅在初始化时才注入配置的问题。例如,如果当通过`Environment`更改数据库 URL 时,`DataSource`具有打开的连接,那么你可能希望这些连接的持有者能够完成他们正在做的事情。然后,下一次当某个对象从池中借用一个连接时,它将获得一个带有新 URL 的连接。 +当存在配置更改时,标记为`@RefreshScope`的 Spring `@Bean`得到特殊处理。这个特性解决了有状态 bean 仅在初始化时才注入配置的问题。例如,如果当通过`Environment`更改数据库 URL 时,`DataSource`具有打开的连接,那么你可能希望这些连接的持有者能够完成他们正在做的事情。然后,下一次当某个对象从池中借用一个连接时,它将获得一个带有新 URL 的连接。 有时,在某些只能初始化一次的 bean 上应用`@RefreshScope`注释甚至是强制性的。如果 Bean 是“不可变的”,则必须用`@RefreshScope`注释 Bean,或者在属性键下指定类名:`spring.cloud.refresh.extra-refreshable`。 -| |如果你有一个`DataSource` Bean,这是一个`HikariDataSource`,它不能被
刷新。它是`spring.cloud.refresh.never-refreshable`的默认值。如果需要刷新
不同的`DataSource`实现,请选择该实现。| +| |如果你有一个`DataSource` Bean,即是一个`HikariDataSource`,则它不能被
刷新。它是`spring.cloud.refresh.never-refreshable`的默认值。如果需要刷新,请选择一个
不同的`DataSource`实现。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Refresh Scope bean 是惰性代理,它在使用它们时(即调用方法时)进行初始化,并且作用域充当初始化值的缓存。要强制 Bean 在下一个方法调用时重新初始化,你必须使其缓存条目无效。 -`RefreshScope`是上下文中的 Bean,并具有一个公共`refreshAll()`方法,可以通过清除目标缓存来刷新范围内的所有 bean。`/refresh`端点公开此功能(通过 HTTP 或 JMX)。要按名称刷新个人 Bean,还存在`refresh(String)`方法。 +`RefreshScope`是上下文中的 Bean,并具有一个公共`refreshAll()`方法,可以通过清除目标缓存来刷新范围内的所有 bean。`/refresh`端点公开此功能(通过 HTTP 或 JMX)。要按名称刷新单个 Bean,还存在`refresh(String)`方法。 要公开`/refresh`端点,需要向应用程序添加以下配置: @@ -150,12 +150,12 @@ management: include: refresh ``` -| |`@RefreshScope`在`@Configuration`类上工作(技术上),但它可能会导致令人惊讶的行为。
例如,这并不意味着在该类中定义的所有`@Beans`本身都在`@RefreshScope`中。
,具体来说,任何依赖于这些 bean 的东西都不能依赖于在启动刷新时对它们进行更新,除非它本身在`@RefreshScope`中。
在这种情况下,它会在刷新时被重建,并且其依赖项会被重新注入。
在这一点上,它们会从刷新的`@Configuration`中重新初始化。| +| |`@RefreshScope`在`@Configuration`类上工作(技术上),但它可能会导致令人惊讶的行为。
例如,这并不意味着在该类中定义的所有`@Beans`本身都在`@RefreshScope`中。
特别地,任何依赖于这些 bean 的东西都不能依赖于它们在启动刷新时被更新,除非它本身在`@RefreshScope`中。
在这种情况下,它在刷新时被重建,并且它的依赖项被重新注入。
在这一点上,它们是从刷新的`@Configuration`中重新初始化的。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [](#encryption-and-decryption)[1.10.加密和解密](#encryption-and-decryption) -Spring 云具有用于本地解密属性值的`Environment`预处理器。它遵循与 Spring Cloud Config 服务器相同的规则,并且通过`encrypt.*`具有相同的外部配置。因此,你可以使用`{cipher}*`形式的加密值,并且,只要存在有效的密钥,就可以在主应用程序上下文获得`Environment`设置之前对它们进行解密。要在应用程序中使用加密功能,你需要在 Classpath( Maven 坐标:`org.springframework.security:spring-security-rsa`)中包括 Spring 安全 RSA,并且还需要在 JVM 中提供全强度的 JCE 扩展。 +Spring Cloud具有用于在本地解密属性值的`Environment`预处理器。它遵循与 Spring Cloud Config 服务器相同的规则,并且通过`encrypt.*`具有相同的外部配置。因此,你可以使用`{cipher}*`形式的加密值,并且,只要存在有效的密钥,就可以在主应用程序上下文获得`Environment`设置之前对它们进行解密。要在应用程序中使用加密功能,你需要在 Classpath( Maven 坐标:`org.springframework.security:spring-security-rsa`)中包括 Spring 安全 RSA,并且还需要在 JVM 中提供全强度的 JCE 扩展。 如果由于“非法密钥大小”而导致异常,并且使用了 Sun 的 JDK,则需要安装 JCE 的无限强度管辖权策略文件。有关更多信息,请参见以下链接: @@ -165,36 +165,36 @@ Spring 云具有用于本地解密属性值的`Environment`预处理器。它遵 * [Java 8 JCE](https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html) -将这些文件解压缩到 JDK/JRE/lib/security 文件夹中,用于你使用的 JRE/JDK x64/x86 的任何版本。 +将这些文件解压缩到 JDK/JRE/lib/security 文件夹中,用于你使用的任何版本的 JRE/JDK x64/x86。 -### [](#endpoints)[1.11. Endpoints](#endpoints) +### [](#endpoints)[1.11.端点](#endpoints) -对于 Spring 引导执行器应用程序,一些额外的管理端点是可用的。你可以使用: +Spring 对于引导执行器应用程序,一些额外的管理端点是可用的。你可以使用: -* `POST`到`/actuator/env`以更新`Environment`并重新绑定`@ConfigurationProperties`和日志级别。要启用此端点,你必须设置`management.endpoint.env.post.enabled=true`。 +* `POST`到`/actuator/env`来更新`Environment`并重新绑定`@ConfigurationProperties`和日志级别。要启用此端点,你必须设置`management.endpoint.env.post.enabled=true`。 * `/actuator/refresh`重新加载引导表带上下文并刷新`@RefreshScope`bean。 * `/actuator/restart`关闭`ApplicationContext`并重新启动它(默认禁用)。 -* `/actuator/pause`和`/actuator/resume`用于在`ApplicationContext`上调用`Lifecycle`方法(`stop()’和`start()`)。 +* `/actuator/pause`和`/actuator/resume`用于在`ApplicationContext`上调用`Lifecycle`方法(`stop()`和`start()`)。 -| |如果禁用`/actuator/restart`端点,那么`/actuator/pause`和`/actuator/resume`端点
也将被禁用,因为它们只是`/actuator/restart`的特殊情况。| +| |如果禁用`/actuator/restart`端点,则`/actuator/pause`和`/actuator/resume`端点
也将被禁用,因为它们只是`/actuator/restart`的特殊情况。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ## [](#spring-cloud-commons-common-abstractions)[2. Spring Cloud Commons: Common Abstractions](#spring-cloud-commons-common-abstractions) -诸如服务发现、负载平衡和断路器之类的模式将自身扩展到一个公共抽象层,该抽象层可以被所有 Spring 云客户机使用,而不依赖于实现(例如,使用 Eureka 或 Consul 的发现)。 +诸如服务发现、负载平衡和断路器之类的模式将自身扩展到一个公共抽象层,该抽象层可以被所有 Spring Cloud客户机使用,而不依赖于实现(例如,使用 Eureka 或 Consul 的发现)。 -### [](#discovery-client)[2.1. The `@EnableDiscoveryClient` Annotation](#discovery-client) +### [](#discovery-client)[2.1。`@EnableDiscoveryClient`注释](#discovery-client) -Spring Cloud Commons 提供了`@EnableDiscoveryClient`注释。这将查找带有`META-INF/spring.factories`和`ReactiveDiscoveryClient`接口的`META-INF/spring.factories`的实现。发现客户端的实现在`org.springframework.cloud.client.discovery.EnableDiscoveryClient`键下向`spring.factories`添加配置类。`DiscoveryClient`实现的示例包括[Spring Cloud Netflix Eureka](https://cloud.spring.io/spring-cloud-netflix/)、[Spring Cloud Consul Discovery](https://cloud.spring.io/spring-cloud-consul/)和[Spring Cloud Zookeeper Discovery](https://cloud.spring.io/spring-cloud-zookeeper/)。 +Spring Cloud Commons 提供了`@EnableDiscoveryClient`注释。这将寻找`DiscoveryClient`和`ReactiveDiscoveryClient`与`META-INF/spring.factories`接口的实现方式。发现客户端的实现在`org.springframework.cloud.client.discovery.EnableDiscoveryClient`键下向`spring.factories`添加一个配置类。`DiscoveryClient`实现的示例包括[Spring Cloud Netflix Eureka](https://cloud.spring.io/spring-cloud-netflix/)、[Spring Cloud Consul Discovery](https://cloud.spring.io/spring-cloud-consul/)和[Spring Cloud Zookeeper Discovery](https://cloud.spring.io/spring-cloud-zookeeper/)。 -Spring 默认情况下,云将提供阻塞和反应式服务发现客户端。通过设置`spring.cloud.discovery.blocking.enabled=false`或`spring.cloud.discovery.reactive.enabled=false`,你可以轻松地禁用阻塞和/或反应客户端。要完全禁用服务发现,只需设置`spring.cloud.discovery.enabled=false`。 +Spring 默认情况下,云将同时提供阻塞和反应服务发现客户端。通过设置`spring.cloud.discovery.blocking.enabled=false`或`spring.cloud.discovery.reactive.enabled=false`,你可以轻松地禁用阻塞和/或反应客户端。要完全禁用服务发现,只需设置`spring.cloud.discovery.enabled=false`。 默认情况下,`DiscoveryClient`的实现方式是用远程发现服务器自动注册本地 Spring 引导服务器。可以通过在`@EnableDiscoveryClient`中设置`autoRegister=false`来禁用此行为。 -| |`@EnableDiscoveryClient`不再需要。
你可以在 Classpath 上放置一个`DiscoveryClient`实现,以使 Spring 引导应用程序向服务发现服务器注册。| +| |`@EnableDiscoveryClient`不再是必需的。
你可以在 Classpath 上放置一个`DiscoveryClient`实现,以使 Spring 引导应用程序向服务发现服务器注册。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### [](#health-indicators)[2.1.1.健康指标](#health-indicators) @@ -215,19 +215,19 @@ Commons 自动配置以下 Spring 引导健康指示器。 这个复合健康指示器基于所有注册的`DiscoveryHealthIndicator`bean。要禁用,请设置`spring.cloud.discovery.client.composite-indicator.enabled=false`。 -#### [](#ordering-discoveryclient-instances)[2.1.2. Ordering `DiscoveryClient` instances](#ordering-discoveryclient-instances) +#### [](#ordering-discoveryclient-instances)[2.1.2。排序`DiscoveryClient`实例] -`DiscoveryClient`接口扩展`Ordered`。这在使用多个发现客户机时非常有用,因为它允许你定义返回的发现客户机的顺序,类似于你如何订购由 Spring 应用程序加载的 bean。默认情况下,任意`DiscoveryClient`的顺序设置为 `0’。如果你想为你的自定义`DiscoveryClient`实现设置不同的顺序,你只需要覆盖`getOrder()`方法,以便它返回适合你的设置的值。除此之外,你还可以使用属性来设置由 Spring Cloud 提供的`DiscoveryClient`实现的顺序,其中包括`ConsulDiscoveryClient`、`EurekaDiscoveryClient`和 `zookeeperDiscoveryclient’。为了做到这一点,你只需要将 ` Spring.cloud.{clientifier}.discovery.order`(或`eureka.client.order`for Eureka)属性设置为所需的值。 +`DiscoveryClient`接口扩展`Ordered`。这在使用多个发现客户机时非常有用,因为它允许你定义返回的发现客户机的顺序,类似于你如何订购由 Spring 应用程序加载的 bean。默认情况下,任意`DiscoveryClient`的顺序设置为`0`。如果你想为你的自定义`DiscoveryClient`实现设置不同的顺序,你只需要覆盖`getOrder()`方法,以便它返回适合你的设置的值。除此之外,还可以使用属性来设置由 Spring Cloud 提供的`DiscoveryClient`实现的顺序,其中包括`ConsulDiscoveryClient`、`EurekaDiscoveryClient`和`ZookeeperDiscoveryClient`。为了做到这一点,你只需要将`spring.cloud.{clientIdentifier}.discovery.order`(或`eureka.client.order`for Eureka)属性设置为所需的值。 #### [](#simplediscoveryclient)[2.1.3.简单的发现](#simplediscoveryclient) 如果在 Classpath 中没有支持服务注册中心的`DiscoveryClient`,则将使用`SimpleDiscoveryClient`实例,该实例使用属性来获取有关服务和实例的信息。 -有关可用实例的信息应通过以下格式的属性传递到:` Spring.cloud.discovery.client.simple.instants.service1[0].uri=http://s11:8080`,其中 ` Spring.cloud.discovery.client.simple.instants` 是常见的前缀,那么`service1`表示所讨论的服务的 ID,而`[0]`表示实例的索引号(在示例中可见,索引以`0`开始),然后`uri`的值是实例可用的实际 URI。 +关于可用实例的信息应该通过以下格式的属性传递给:`spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080`,其中`spring.cloud.discovery.client.simple.instances`是公共前缀,然后`service1`代表相关服务的 ID,虽然`[0]`表示实例的索引号(在示例中可见,索引以`0`开始),但是`uri`的值是实例可用的实际 URI。 ### [](#serviceregistry)[2.2.ServiceRegistry](#serviceregistry) -Commons 现在提供了一个`ServiceRegistry`接口,该接口提供了`register(Registration)`和`deregister(Registration)`等方法,这些方法允许你提供自定义注册服务。`registration’是一个标记接口。 +Commons 现在提供了一个`ServiceRegistry`接口,该接口提供了`register(Registration)`和`deregister(Registration)`等方法,这些方法允许你提供自定义注册服务。`Registration`是一个标记接口。 下面的示例显示了正在使用的`ServiceRegistry`: @@ -257,7 +257,7 @@ public class MyConfiguration { * `ConsulRegistration`与`ConsulServiceRegistry`连用 -如果你正在使用`ServiceRegistry`接口,那么你将需要为所使用的`Registry`实现传递正确的`Registry`实现。 +如果你正在使用`ServiceRegistry`接口,则需要为你正在使用的`ServiceRegistry`实现传递正确的`Registry`实现。 #### [](#serviceregistry-auto-registration)[2.2.1.ServiceRegistry 自动注册](#serviceregistry-auto-registration) @@ -265,14 +265,14 @@ public class MyConfiguration { ##### [](#serviceregistry-auto-registration-events)[ServiceRegistry 自动注册事件](#serviceregistry-auto-registration-events) -当服务自动注册时,将触发两个事件。第一个事件称为“InstancePreRegistereRedevent”,在服务注册之前被触发。第二个事件称为`InstanceRegisteredEvent`,在服务注册后触发。你可以注册一个“ApplicationListener”来监听这些事件并对其做出反应。 +当服务自动注册时,将触发两个事件。第一个事件称为`InstancePreRegisteredEvent`,在服务注册之前被触发。第二个事件称为`InstanceRegisteredEvent`,在服务注册后触发。你可以注册`ApplicationListener`(s)来侦听这些事件并对其做出反应。 | |如果`spring.cloud.service-registry.auto-registration.enabled`属性设置为`false`,则不会触发这些事件。| |---|---------------------------------------------------------------------------------------------------------------------------| #### [](#service-registry-actuator-endpoint)[2.2.2.服务注册中心执行器端点](#service-registry-actuator-endpoint) -Spring Cloud Commons 提供了`/service-registry`执行器端点。这个端点依赖于 Spring 应用程序上下文中的`Registration` Bean。用 get 调用`/service-registry`返回`Registration`的状态。使用 POST 到带有 JSON 主体的相同端点将当前`Registration`的状态更改为新值。JSON 主体必须包含带有首选值的`status`字段。请参阅`ServiceRegistry`实现的文档,用于更新状态时允许的值和为状态返回的值。例如,Eureka 支持的状态是`UP`、`DOWN`、`OUT_OF_SERVICE`和`UNKNOWN`。 +Spring Cloud Commons 提供了`/service-registry`执行器端点。这个端点依赖于 Spring 应用程序上下文中的`Registration` Bean。用 get 调用`/service-registry`返回`Registration`的状态。使用 POST 到带有 JSON 主体的相同端点将当前`Registration`的状态更改为新值。JSON 主体必须包含带有首选值的`status`字段。请参阅`ServiceRegistry`实现的文档,该实现用于更新状态时所允许的值以及为状态返回的值。例如,Eureka 支持的状态是`UP`、`DOWN`、`OUT_OF_SERVICE`和`UNKNOWN`。 ### [](#rest-template-loadbalancer-client)[2.3. Spring RestTemplate as a Load Balancer Client](#rest-template-loadbalancer-client) @@ -334,9 +334,9 @@ public class MyClass { } ``` -URI 需要使用虚拟主机名(即服务名,而不是主机名)。 Spring 云负载平衡器用于创建完整的物理地址。 +URI 需要使用虚拟主机名(即服务名,而不是主机名)。 Spring Cloud负载平衡器用于创建完整的物理地址。 -| |如果要使用`@LoadBalanced WebClient.Builder`,则需要在 Classpath 中有一个负载均衡器
实现。我们建议你将[Spring Cloud LoadBalancer starter](#spring-cloud-loadbalancer-starter)添加到你的项目中。
然后,下面使用`ReactiveLoadBalancer`。| +| |如果要使用`@LoadBalanced WebClient.Builder`,则需要在 Classpath 中有一个负载均衡器
实现。我们建议你将[Spring Cloud LoadBalancer starter](#spring-cloud-loadbalancer-starter)添加到项目中。
然后,下面使用`ReactiveLoadBalancer`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### [](#retrying-failed-requests)[2.4.1.重试失败的请求](#retrying-failed-requests) @@ -351,7 +351,7 @@ URI 需要使用虚拟主机名(即服务名,而不是主机名)。 Spring 你可以设置: -* `spring.cloud.loadbalancer.retry.maxRetriesOnSameServiceInstance`-表示在同一个`ServiceInstance`上应该重试请求多少次(对每个选定的实例单独计算) +* `spring.cloud.loadbalancer.retry.maxRetriesOnSameServiceInstance`-表示在同一个`ServiceInstance`上应该重试请求多少次(对于每个选定的实例,单独计算) * `spring.cloud.loadbalancer.retry.maxRetriesOnNextServiceInstance`-表示新选择的`ServiceInstance`请求应该重试多少次 @@ -362,12 +362,12 @@ URI 需要使用虚拟主机名(即服务名,而不是主机名)。 Spring - `spring.cloud.loadbalancer.retry.backoff.maxBackoff`-设置最大退避持续时间(默认情况下,最大长值为毫秒) - `spring.cloud.loadbalancer.retry.backoff.jitter`-设置用于计算的抖动 g 每个调用的实际退避持续时间(默认情况下为 0.5)。 -对于反应式实现,你还可以实现你自己的`LoadBalancerRetryPolicy`,以便对负载平衡的调用重试进行更详细的控制。 +对于反应式实现,你还可以实现自己的`LoadBalancerRetryPolicy`,以便对负载平衡的调用重试进行更详细的控制。 | |单独的 loadbalancer 客户机可以单独配置,具有与上面相同的属性,但前缀是`spring.cloud.loadbalancer.clients..*`,其中`clientId`是 loadbalancer 的名称。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |对于负载平衡的重试,默认情况下,我们将`ServiceInstanceListSupplier` Bean 换成`RetryAwareServiceInstanceListSupplier`,以便从先前选择的实例中选择不同的实例(如果可用的话)。可以通过将`spring.cloud.loadbalancer.retry.avoidPreviousInstance`的值设置为`false`来禁用此行为。| +| |对于负载平衡的重试,默认情况下,我们用`ServiceInstanceListSupplier` Bean 包装`RetryAwareServiceInstanceListSupplier`,以从先前选择的实例中选择不同的实例(如果可用的话)。可以通过将`spring.cloud.loadbalancer.retry.avoidPreviousInstance`的值设置为`false`来禁用此行为。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ``` @@ -418,7 +418,7 @@ public class MyConfiguration { } ``` -### [](#multiple-resttemplate-objects)[2.5. Multiple `RestTemplate` Objects](#multiple-resttemplate-objects) +### [](#multiple-resttemplate-objects)[2.5。多个`RestTemplate`对象](#multiple-resttemplate-objects) 如果你想要一个不是负载平衡的`RestTemplate`,请创建一个`RestTemplate` Bean 并注入它。要访问负载平衡的`RestTemplate`,在创建`@Bean`时使用`@LoadBalanced`限定符,如下例所示: @@ -504,15 +504,15 @@ public class MyClass { } ``` -### [](#loadbalanced-webclient)[2.7. Spring WebFlux `WebClient` as a Load Balancer Client](#loadbalanced-webclient) +### [](#loadbalanced-webclient)[2.7。 Spring WebFlux`WebClient`作为负载均衡器客户端] Spring WebFlux 可以同时处理反应性和非反应性`WebClient`配置,正如主题所描述的那样: -* [Spring WebFlux `WebClient` with `ReactorLoadBalancerExchangeFilterFunction`](#webflux-with-reactive-loadbalancer) +* [ Spring WebFlux`WebClient`with`ReactorLoadBalancerExchangeFilterFunction`](#WebFlux-with-ractive-loadBalancer) * [[负载平衡器-交换-过滤器-功能负载平衡器-交换-过滤器-功能]](# 负载平衡器-交换-过滤器-功能负载平衡器-交换-过滤器-功能) -#### [](#webflux-with-reactive-loadbalancer)[2.7.1. Spring WebFlux `WebClient` with `ReactorLoadBalancerExchangeFilterFunction`](#webflux-with-reactive-loadbalancer) +#### [](#webflux-with-reactive-loadbalancer)[2.7.1。 Spring WebFlux`WebClient`with`ReactorLoadBalancerExchangeFilterFunction`](#WebFlux-with-ractive-loadBalancer) 你可以将`WebClient`配置为使用`ReactiveLoadBalancer`。如果将[Spring Cloud LoadBalancer starter](#spring-cloud-loadbalancer-starter)添加到项目中,并且`spring-webflux`位于 Classpath 上,则`ReactorLoadBalancerExchangeFilterFunction`将自动配置。下面的示例展示了如何配置`WebClient`以使用无功负载均衡器: @@ -535,7 +535,7 @@ public class MyClass { URI 需要使用虚拟主机名(即服务名,而不是主机名)。`ReactorLoadBalancer`用于创建完整的物理地址。 -#### [](#load-balancer-exchange-filter-function)[2.7.2. Spring WebFlux `WebClient` with a Non-reactive Load Balancer Client](#load-balancer-exchange-filter-function) +#### [](#load-balancer-exchange-filter-function)[2.7.2。 Spring WebFlux`WebClient`带有无功负载均衡器的客户端](# 负载均衡器-交换-过滤器-函数) 如果`spring-webflux`在 Classpath 上,则`LoadBalancerExchangeFilterFunction`是自动配置的。然而,请注意,这使用了一个无反应的客户端。下面的示例展示了如何配置`WebClient`以使用负载均衡器: @@ -603,11 +603,11 @@ spring: ### [](#http-clients)[2.9.HTTP 客户端工厂](#http-clients) -Spring Cloud Commons 提供了用于创建 Apache HTTP 客户端和 OK HTTP 客户端的 bean。只有当确定的 HTTP jar 在 Classpath 上时,才会创建`OkHttpClientFactory` Bean。此外, Spring Cloud Commons 提供了用于创建两个客户端使用的连接管理器的 bean:用于 Apache HTTP 客户端的和用于 OK HTTP 客户端的。如果你想定制如何在下游项目中创建 HTTP 客户机,那么你可以提供你自己的这些 bean 的实现。此外,如果你提供了类型`HttpClientBuilder`或`OkHttpClient.Builder`的 Bean,则默认工厂将这些构建器用作将构建器返回到下游项目的基础。还可以通过将`spring.cloud.httpclientfactories.apache.enabled`或`spring.cloud.httpclientfactories.ok.enabled`设置为`false`来禁用这些 bean 的创建。 +Spring Cloud Commons 提供了用于同时创建 Apache HTTP 客户端()和 OK HTTP 客户端()的 bean。只有当确定的 HTTP jar 在 Classpath 上时,才会创建`OkHttpClientFactory` Bean。此外, Spring Cloud Commons 提供了用于创建两个客户端使用的连接管理器的 bean:用于 Apache HTTP 客户端的和用于 OK HTTP 客户端的。如果你想定制如何在下游项目中创建 HTTP 客户机,那么你可以提供你自己的这些 bean 的实现。此外,如果你提供了类型`HttpClientBuilder`或`OkHttpClient.Builder`的 Bean,则默认工厂将这些构建器用作将构建器返回到下游项目的基础。还可以通过将`spring.cloud.httpclientfactories.apache.enabled`或`spring.cloud.httpclientfactories.ok.enabled`设置为`false`来禁用这些 bean 的创建。 ### [](#enabled-features)[2.10.已启用的功能](#enabled-features) -Spring Cloud Commons 提供了`/features`执行器端点。这个端点返回 Classpath 上可用的功能以及它们是否被启用。返回的信息包括功能类型、名称、版本和供应商。 +Spring Cloud Commons 提供了`/features`执行器端点。此端点返回 Classpath 上可用的功能以及它们是否已启用。返回的信息包括功能类型、名称、版本和供应商。 #### [](#feature-types)[2.10.1.特征类型](#feature-types) @@ -615,7 +615,7 @@ Spring Cloud Commons 提供了`/features`执行器端点。这个端点返回 Cl 抽象特性是定义了接口或抽象类并创建了实现的特性,例如`DiscoveryClient`、`LoadBalancerClient`或`LockService`。抽象类或接口用于在上下文中查找该类型的 Bean。显示的版本是`bean.getClass().getPackage().getImplementationVersion()`。 -命名特性是指不具有它们实现的特定类的特性。这些功能包括“断路器”、“API 网关”、“ Spring 云总线”等。这些特征需要一个名称和 Bean 类型。 +命名特性是指不具有它们实现的特定类的特性。这些功能包括“断路器”、“API 网关”、“ Spring Cloud总线”等。这些特征需要一个名称和 Bean 类型。 #### [](#declaring-features)[2.10.2.声明功能](#declaring-features) @@ -648,7 +648,7 @@ HasFeatures localFeatures() { ### [](#spring-cloud-compatibility-verification)[2.11. Spring Cloud Compatibility Verification](#spring-cloud-compatibility-verification) -由于一些用户在设置 Spring 云应用程序时存在问题,我们决定添加一个兼容性验证机制。如果你当前的设置与 Spring 云需求不兼容,那么它将会中断,同时还会出现一份报告,显示出到底出了什么问题。 +由于一些用户在设置 Spring Cloud应用程序时存在问题,因此我们决定添加一个兼容性验证机制。如果你当前的设置与 Spring Cloud需求不兼容,那么它将会中断,同时还会出现一份报告,显示出到底出了什么问题。 目前,我们正在验证将哪个版本的 Spring 启动添加到你的 Classpath 中。 @@ -674,11 +674,11 @@ You can find the latest Spring Boot versions here [https://spring.io/projects/sp If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section. ``` -为了禁用此功能,请将`spring.cloud.compatibility-verifier.enabled`设置为`false`。如果你想要重写兼容的 Spring 启动版本,只需用逗号分隔的兼容 Spring 启动版本列表设置“ Spring.cloud.compatibility-verifier.compatible-boot-versions”属性。 +为了禁用此功能,请将`spring.cloud.compatibility-verifier.enabled`设置为`false`。如果你想要覆盖兼容的 Spring 启动版本,只需用逗号分隔的兼容 Spring 启动版本列表设置`spring.cloud.compatibility-verifier.compatible-boot-versions`属性。 ## [](#spring-cloud-loadbalancer)[3. Spring Cloud LoadBalancer](#spring-cloud-loadbalancer) -Spring 云提供了其自己的客户端负载均衡器的抽象和实现。对于负载平衡机制,增加了`ReactiveLoadBalancer`接口,并为其提供了**基于循环**和**随机**实现方式。为了得到要从反应中选择的实例`ServiceInstanceListSupplier`是使用的。目前,我们支持基于服务发现的`ServiceInstanceListSupplier`实现,该实现使用 Classpath 中可用的[发现客户端](#discovery-client)从服务发现中检索可用实例。 +Spring Cloud提供了其自己的客户端负载均衡器的抽象和实现。对于负载平衡机制,添加了`ReactiveLoadBalancer`接口,并为其提供了**基于循环**和**随机**实现方式。为了得到要从反应中选择的实例`ServiceInstanceListSupplier`是使用的。目前,我们支持基于服务发现的`ServiceInstanceListSupplier`实现,该实现使用 Classpath 中可用的[发现客户端](#discovery-client)从服务发现中检索可用实例。 | |通过将`spring.cloud.loadbalancer.enabled`的值设置为`false`,可以禁用 Spring Cloud LoadBalancer。| |---|---------------------------------------------------------------------------------------------------------------------------| @@ -714,13 +714,13 @@ Spring 为了使云负载平衡器易于使用,我们提供了`ReactorLoadBala * [Spring WebClient as a Load Balancer Client](#webclinet-loadbalancer-client) -* [Spring WebFlux WebClient with `ReactorLoadBalancerExchangeFilterFunction`](#webflux-with-reactive-loadbalancer) +* [ Spring WebFlux WebClient with`ReactorLoadBalancerExchangeFilterFunction`](#WebFlux-with-ractive-loadBalancer) ### [](#loadbalancer-caching)[3.3. Spring Cloud LoadBalancer Caching](#loadbalancer-caching) 除了基本的`ServiceInstanceListSupplier`实现外,我们还提供了两种缓存实现,这种实现在每次必须选择实例时都通过`DiscoveryClient`检索实例。 -#### [](#caffeine-backed-loadbalancer-cache-implementation)[3.3.1. ](#caffeine-backed-loadbalancer-cache-implementation)[Caffeine](https://github.com/ben-manes/caffeine)-支持负载平衡器缓存实现 +#### [](#caffeine-backed-loadbalancer-cache-implementation)[3.3.1. ](#caffeine-backed-loadbalancer-cache-implementation)[Caffeine](https://github.com/ben-manes/caffeine)-支持 loadBalancer 缓存实现 如果在 Classpath 中有,则将使用基于咖啡因的实现方式。有关如何配置它的信息,请参见[负荷平衡状态](#loadbalancer-cache-configuration)部分。 @@ -737,7 +737,7 @@ Spring 为了使云负载平衡器易于使用,我们提供了`ReactorLoadBala #### [](#loadbalancer-cache-configuration)[3.3.3.LoadBalancer 缓存配置](#loadbalancer-cache-configuration) -你可以将你自己的`ttl`值(写完之后条目应该过期的时间)表示为`Duration`,方法是传递一个与`String`兼容的[Spring Boot `String` to `Duration` converter syntax](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-conversion-duration).作为`spring.cloud.loadbalancer.cache.ttl`属性的值。还可以通过设置`spring.cloud.loadbalancer.cache.capacity`属性的值来设置自己的 LoadBalancer 缓存初始容量。 +你可以将自己的`ttl`值(写完之后条目应该过期的时间)表示为`Duration`,方法是将符合[ Spring boot`String`的`String`转换语法传递到`Duration`转换语法](https://DOCS. Spring. Spring-boot/DOCS/current/reference/html/ Spring-boot-features.html-externets-#confeatures-conversion-duration)。还可以通过设置`spring.cloud.loadbalancer.cache.capacity`属性的值来设置自己的 LoadBalancer 缓存初始容量。 默认设置包括将`ttl`设置为 35 秒,而默认的`initialCapacity`是`256`。 @@ -756,10 +756,10 @@ Spring 为了使云负载平衡器易于使用,我们提供了`ReactorLoadBala | |目前,只有 Eureka 发现客户机被检测来设置 loadBalancer 区域。对于其他发现客户端,设置`spring.cloud.loadbalancer.zone`属性。不久还会有更多的测试。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |为了确定检索到的`ServiceInstance`的区域,我们在其元数据映射中检查`"zone"`键下的值。| +| |为了确定检索到的`ServiceInstance`的区域,我们检查其元数据映射中`"zone"`键下的值。| |---|----------------------------------------------------------------------------------------------------------------------| -`ZonePreferenceServiceInstanceListSupplier`过滤检索到的实例,只返回同一区域内的实例。如果区域是`null`,或者同一区域内没有实例,则返回所有检索到的实例。 +`ZonePreferenceServiceInstanceListSupplier`过滤检索到的实例,并且只返回同一区域内的实例。如果区域是`null`,或者同一区域内没有实例,则返回所有检索到的实例。 为了使用基于区域的负载平衡方法,你必须在[自定义配置](#custom-loadbalancer-configuration)中实例化`ZonePreferenceServiceInstanceListSupplier` Bean。 @@ -784,7 +784,7 @@ public class CustomLoadBalancerConfiguration { ### [](#instance-health-check-for-loadbalancer)[3.5.LoadBalancer 的实例健康检查](#instance-health-check-for-loadbalancer) -可以为 loadBalancer 启用计划的 HealthCheck。为此提供了`HealthCheckServiceInstanceListSupplier`。它会定期验证委托“ServiceInstanceListSupplier”提供的实例是否还活着,并且只返回健康的实例,除非没有-然后返回所有检索到的实例。 +可以为 loadBalancer 启用计划的 HealthCheck。为此提供了`HealthCheckServiceInstanceListSupplier`。它会定期验证委托`ServiceInstanceListSupplier`提供的实例是否还活着,并且只返回健康的实例,除非没有-然后返回所有检索到的实例。 | |这种机制在使用`SimpleDiscoveryClient`时特别有用。对于由实际服务注册中心支持的
客户机,没有必要使用它,因为在查询外部服务发现之后,我们已经获得了
健康的实例。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -792,15 +792,15 @@ public class CustomLoadBalancerConfiguration { | |对于每个服务
具有少量实例的设置,也建议使用此供应商,以避免在失败的实例上重试调用。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------| -| |如果使用任何服务发现支持的供应商,通常不需要添加此健康检查机制,因为我们直接从服务注册中心检索实例的健康状态
。| +| |如果使用任何服务发现支持的供应商,通常不需要添加这种健康检查机制,因为我们直接从服务注册中心检索实例的健康状态
。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |`HealthCheckServiceInstanceListSupplier`依赖于由委托通量提供的更新实例。在极少数情况下,当你希望使用不刷新实例的委托时,即使实例列表可能会更改(例如我们提供的`DiscoveryClientServiceInstanceListSupplier`),你可以将`spring.cloud.loadbalancer.health-check.refetch-instances`设置为`true`,以便通过`HealthCheckServiceInstanceListSupplier`刷新实例列表。然后,你还可以通过修改`spring.cloud.loadbalancer.health-check.refetch-instances-interval`的值来调整刷新间隔,并 OPT 通过将`spring.cloud.loadbalancer.health-check.repeat-health-check`设置为`false`来禁用额外的 HealthCheck 重复,因为每个实例 refetch
也将触发 HealthCheck。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -`HealthCheckServiceInstanceListSupplier`使用带有 ` Spring.cloud.loadBalancer.health-check` 前缀的属性。你可以为调度程序设置`initialDelay`和`interval`。你可以通过设置`spring.cloud.loadbalancer.health-check.path.default`属性的值来设置 HealthCheck URL 的默认路径。还可以通过设置`spring.cloud.loadbalancer.health-check.path.[SERVICE_ID]`属性的值,用服务的正确 ID 替换`[SERVICE_ID]`,为任何给定的服务设置特定值。如果没有指定`[SERVICE_ID]`,则默认使用`/actuator/health`。如果`[SERVICE_ID]`被设置为`null`或作为一个值为空,那么将不执行健康检查。还可以通过设置`spring.cloud.loadbalancer.health-check.port`的值来为健康检查请求设置自定义端口。如果没有设置,则请求的服务在服务实例中可用的端口。 +`HealthCheckServiceInstanceListSupplier`使用带`spring.cloud.loadbalancer.health-check`前缀的属性。你可以为调度程序设置`initialDelay`和`interval`。你可以通过设置`spring.cloud.loadbalancer.health-check.path.default`属性的值来设置 HealthCheck URL 的默认路径。还可以通过设置`spring.cloud.loadbalancer.health-check.path.[SERVICE_ID]`属性的值,用服务的正确 ID 替换`[SERVICE_ID]`,为任何给定的服务设置特定值。如果没有指定`[SERVICE_ID]`,则默认使用`/actuator/health`。如果`[SERVICE_ID]`被设置为`null`或作为一个值为空,那么将不执行健康检查。还可以通过设置`spring.cloud.loadbalancer.health-check.port`的值来为健康检查请求设置自定义端口。如果没有设置,则请求的服务在服务实例中可用的端口。 -| |如果你依赖默认路径,请确保将`spring-boot-starter-actuator`添加到合作者的依赖项中,除非你打算自己添加这样的端点。| +| |如果依赖默认路径(`/actuator/health`),请确保将`spring-boot-starter-actuator`添加到合作者的依赖项中,除非你计划自己添加这样的端点。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 为了使用健康检查计划程序方法,你必须在[自定义配置](#custom-loadbalancer-configuration)中实例化`HealthCheckServiceInstanceListSupplier` Bean。 @@ -823,17 +823,17 @@ public class CustomLoadBalancerConfiguration { } ``` -| |对于非反应性堆栈,使用`withBlockingHealthChecks()`创建此供应商。
你还可以传递你自己的`WebClient`或`RestTemplate`实例用于检查。| +| |对于非反应堆栈,使用`withBlockingHealthChecks()`创建此供应商。
你还可以传递你自己的`WebClient`或`RestTemplate`实例用于检查。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |`HealthCheckServiceInstanceListSupplier`有自己的基于反应器流量`replay()`的缓存机制。因此,如果正在使用它,你可能希望跳过用`CachingServiceInstanceListSupplier`包装该供应商。| +| |`HealthCheckServiceInstanceListSupplier`有自己的基于反应堆流量`replay()`的缓存机制。因此,如果正在使用它,你可能希望跳过用`CachingServiceInstanceListSupplier`包装该供应商。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [](#same-instance-preference-for-loadbalancer)[3.6.LoadBalancer 的相同实例首选项](#same-instance-preference-for-loadbalancer) 你可以以这样一种方式设置 loadBalancer,即它更喜欢先前选择的实例(如果该实例可用的话)。 -为此,你需要使用`SameInstancePreferenceServiceInstanceListSupplier`。你可以通过将`spring.cloud.loadbalancer.configurations`的值设置为`same-instance-preference`,或者通过提供你自己的`ServiceInstanceListSupplier` Bean 来配置它——例如: +为此,你需要使用`SameInstancePreferenceServiceInstanceListSupplier`。你可以通过将`spring.cloud.loadbalancer.configurations`的值设置为`same-instance-preference`,或者通过提供自己的`ServiceInstanceListSupplier` Bean 来配置它——例如: ``` public class CustomLoadBalancerConfiguration { @@ -854,7 +854,7 @@ public class CustomLoadBalancerConfiguration { ### [](#request-based-sticky-session-for-loadbalancer)[3.7.LoadBalancer 中基于请求的粘性会话](#request-based-sticky-session-for-loadbalancer) -你可以以这样一种方式设置 loadBalancer,即它更喜欢请求 cookie 中提供的带有`instanceId`的实例。如果请求是通过`ClientRequestContext`或`ServerHttpRequestContext`传递给负载平衡器的,我们目前支持这一点,这是 SC 负载平衡器交换过滤器函数和过滤器所使用的。 +你可以以这样一种方式设置 loadBalancer,即它更喜欢请求 cookie 中提供的带有`instanceId`的实例。如果请求通过`ClientRequestContext`或`ServerHttpRequestContext`传递到负载平衡器,我们目前支持这一点,SC 负载平衡器交换过滤器函数和过滤器使用这些函数。 为此,你需要使用`RequestBasedStickySessionServiceInstanceListSupplier`。你可以通过将`spring.cloud.loadbalancer.configurations`的值设置为`request-based-sticky-session`,或者通过提供你自己的`ServiceInstanceListSupplier` Bean 来配置它——例如: @@ -881,7 +881,7 @@ public class CustomLoadBalancerConfiguration { ### [](#spring-cloud-loadbalancer-hints)[3.8. Spring Cloud LoadBalancer Hints](#spring-cloud-loadbalancer-hints) -Spring Cloud LoadBalancer 允许你设置在`Request`对象内传递给 LoadBalancer 的`String`提示,这些提示以后可以在`ReactiveLoadBalancer`实现中使用,这些实现可以处理它们。 +Spring Cloud LoadBalancer 允许你设置在`Request`对象中传递给 LoadBalancer 的`String`提示,这些提示以后可以在`ReactiveLoadBalancer`实现中使用,这些实现可以处理它们。 通过设置`spring.cloud.loadbalancer.hint.default`属性的值,可以为所有服务设置默认提示。还可以通过设置`spring.cloud.loadbalancer.hint.[SERVICE_ID]`属性的值,用服务的正确 ID 替换`[SERVICE_ID]`,为任何给定的服务设置特定值。如果提示不是由用户设置的,则使用`default`。 @@ -889,7 +889,7 @@ Spring Cloud LoadBalancer 允许你设置在`Request`对象内传递给 LoadBala 我们还提供了`HintBasedServiceInstanceListSupplier`,这是用于基于提示的实例选择的`ServiceInstanceListSupplier`实现。 -`HintBasedServiceInstanceListSupplier`检查提示请求标头(默认标头名称是`X-SC-LB-Hint`,但你可以通过更改`spring.cloud.loadbalancer.hint-header-name`属性的值来修改它),如果它发现了提示请求标头,则使用标头中传递的提示值来过滤服务实例。 +`HintBasedServiceInstanceListSupplier`检查提示请求标头(默认标头名称为`X-SC-LB-Hint`,但可以通过更改`spring.cloud.loadbalancer.hint-header-name`属性的值来修改它),如果它发现了提示请求标头,则使用标头中传递的提示值来过滤服务实例。 如果没有添加任何提示头,`HintBasedServiceInstanceListSupplier`将使用[来自属性的提示值](#spring-cloud-loadbalancer-hints)来过滤服务实例。 @@ -960,9 +960,9 @@ public LoadBalancerClientRequestTransformer transformer() { ### [](#spring-cloud-loadbalancer-starter)[3.11. Spring Cloud LoadBalancer Starter](#spring-cloud-loadbalancer-starter) -我们还提供了一个启动器,允许你在 Spring 启动应用程序中轻松添加 Spring Cloud LoadBalancer。为了使用它,只需在构建文件中的 Spring 云依赖项中添加`org.springframework.cloud:spring-cloud-starter-loadbalancer`。 +我们还提供了一个启动器,允许你在 Spring 启动应用程序中轻松添加 Spring Cloud LoadBalancer。为了使用它,只需在构建文件中的 Spring Cloud依赖项中添加`org.springframework.cloud:spring-cloud-starter-loadbalancer`。 -| |Spring 云负载平衡器启动器包括[Spring Boot Caching](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html)和[Evictor](https://github.com/stoyanr/Evictor)。| +| |Spring Cloud负载平衡器启动器包括[Spring Boot Caching](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html)和[Evictor](https://github.com/stoyanr/Evictor)。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [](#custom-loadbalancer-configuration)[3.12. Passing Your Own Spring Cloud LoadBalancer Configuration](#custom-loadbalancer-configuration) @@ -984,7 +984,7 @@ public class MyConfiguration { TIP -为了使在自己的 loadBalancer 配置上的工作更容易,我们在`ServiceInstanceListSupplier`类中添加了一个`builder()`方法。 +为了使在自己的 loadBalancer 配置上工作更容易,我们向`ServiceInstanceListSupplier`类添加了一个`builder()`方法。 TIP @@ -994,7 +994,7 @@ TIP 你可以看到一个自定义配置[here](#zoned-based-custom-loadbalancer-configuration)的示例。 -| |注释`value`参数(在上面的示例中为 `stores’)指定了我们应该通过给定的自定义配置向其发送请求的服务 ID。| +| |注释`value`参数(在上面的示例中为`stores`)指定了我们应该通过给定的自定义配置向其发送请求的服务的服务 ID。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 还可以通过`@LoadBalancerClients`注释传递多个配置(用于多个负载均衡器客户机),如下例所示: @@ -1017,13 +1017,13 @@ public class MyConfiguration { ### [](#loadbalancer-lifecycle)[3.13. Spring Cloud LoadBalancer Lifecycle](#loadbalancer-lifecycle) -Bean 中使用[自定义负载平衡器配置](#custom-loadbalancer-configuration)进行注册可能是有用的一种类型是`LoadBalancerLifecycle`。 +Bean 使用[自定义负载平衡器配置](#custom-loadbalancer-configuration)进行注册可能是有用的一种类型是`LoadBalancerLifecycle`。 `LoadBalancerLifecycle`bean 提供了名为`onStart(Request request)`、`onStartRequest(Request request, Response lbResponse)`和`onComplete(CompletionContext completionContext)`的回调方法,你应该实现这些方法来指定在负载平衡之前和之后应该进行哪些操作。 `onStart(Request request)`将`Request`对象作为参数。它包含用于选择适当实例的数据,包括下游客户机请求和[hint](#spring-cloud-loadbalancer-hints)。`onStartRequest`也接受`Request`对象,另外,`Response`对象作为参数。另一方面,将`CompletionContext`对象提供给`onComplete(CompletionContext completionContext)`方法。它包含 loadBalancer`Response`,包括所选择的服务实例、针对该服务实例执行的请求的`Status`和(如果可用的话)返回到下游客户端的响应,以及(如果发生了异常)相应的`Throwable`。 -`supports(Class requestContextClass, Class responseClass, Class serverTypeClass)`方法可用于确定所讨论的处理器是否处理所提供类型的对象。如果未被用户重写,则返回`true`。 +`supports(Class requestContextClass, Class responseClass, Class serverTypeClass)`方法可用于确定问题处理器是否处理所提供类型的对象。如果未被用户重写,则返回`true`。 | |在前面的方法调用中,`RC`表示`RequestContext`类型,`RES`表示客户端响应类型,`T`表示返回的服务器类型。| |---|--------------------------------------------------------------------------------------------------------------------------------------| @@ -1032,13 +1032,13 @@ Bean 中使用[自定义负载平衡器配置](#custom-loadbalancer-configuratio 我们提供了一个名为`LoadBalancerLifecycle` Bean 的`MicrometerStatsLoadBalancerLifecycle`,它使用 Micrometer 为负载平衡调用提供统计信息。 -为了将此 Bean 添加到你的应用程序上下文中,将`spring.cloud.loadbalancer.stats.micrometer.enabled`的值设置为`true`,并使`MeterRegistry`可用(例如,将[Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html)添加到你的项目中)。 +为了将此 Bean 添加到你的应用程序上下文中,将`spring.cloud.loadbalancer.stats.micrometer.enabled`的值设置为`true`,并使`MeterRegistry`可用(例如,通过向你的项目添加[Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html))。 `MicrometerStatsLoadBalancerLifecycle`在`MeterRegistry`中记录以下仪表: * `loadbalancer.requests.active`:允许你监视任何服务实例当前活动请求的数量(通过标记可获得的服务实例数据)的度量标准; -* `loadbalancer.requests.success`:一个计时器,用于度量以将响应传递给基础客户机而结束的任何负载平衡请求的执行时间; +* `loadbalancer.requests.success`:一个计时器,用于度量以将响应传递给底层客户端而结束的任何负载平衡请求的执行时间; * `loadbalancer.requests.failed`:一个计时器,用于度量任何负载平衡请求的执行时间,这些请求以异常结束; @@ -1052,12 +1052,12 @@ Bean 中使用[自定义负载平衡器配置](#custom-loadbalancer-configuratio | |当一个给定的计价器至少增加了一条记录时,计价器在注册表中进行注册。| |---|----------------------------------------------------------------------------------------------| -| |你可以通过[adding `MeterFilters`](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-per-meter-properties)进一步配置这些指标的行为(例如,添加[发布百分位和直方图](https://micrometer.io/docs/concepts#_histograms_and_percentiles))。| +| |你可以通过[添加`MeterFilters`](https://DOCS. Spring.io/ Spring-boot/DOCS/current/reference/html/production-ready-features.html#production-ready-metrics-per-meter-properties)来进一步配置这些指标的行为(例如,添加[发布百分位和直方图](https://micrometer.io/docs/concepts#_histograms_and_percentiles))。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [](#configuring-individual-loadbalancerclients)[3.15.配置单个 loadbalancerclient](#configuring-individual-loadbalancerclients) -单独的 loadBalancer 客户机可以单独配置不同的前缀`spring.cloud.loadbalancer.clients..`**where `clientId` is the name of the loadbalancer. Default configuration values may be set in the `spring.cloud.loadbalancer.`**名称空间,并将与客户机特定值优先合并。 +单独的 loadbalancer 客户机可以单独配置不同的前缀`spring.cloud.loadbalancer.clients..`**,其中`clientId`是 loadbalancer 的名称。默认配置值可以在`spring.cloud.loadbalancer.`** 名称空间中设置,并将优先与客户机特定的值合并。 示例 5.application.yml @@ -1079,9 +1079,9 @@ spring: * `spring.cloud.loadbalancer.enabled`-全局启用或禁用负载平衡 -* `spring.cloud.loadbalancer.retry.enabled`-全局启用或禁用负载平衡重试。如果全局启用它,仍然可以使用`client`-前缀属性禁用特定客户机的重试,但不能使用相反的方法。 +* `spring.cloud.loadbalancer.retry.enabled`-全局启用或禁用负载平衡重试。如果全局启用它,仍然可以使用`client`-前缀属性禁用特定客户机的重试,但不能使用相反的方法 -* `spring.cloud.loadbalancer.cache.enabled`-全局启用或禁用 LoadBalancer 缓存。如果你全局启用它,你仍然可以通过创建[自定义配置](#custom-loadbalancer-configuration)来禁用特定客户机的缓存,该命令不包括`CachingServiceInstanceListSupplier`在`ServiceInstanceListSupplier`委托层次结构中的`CachingServiceInstanceListSupplier`,但不是相反。 +* `spring.cloud.loadbalancer.cache.enabled`-全局启用或禁用 LoadBalancer 缓存。如果你在全局范围内启用它,那么你仍然可以通过创建[自定义配置](#custom-loadbalancer-configuration)来禁用特定客户机的缓存,该命令不包括`CachingServiceInstanceListSupplier`委托层次结构中的`CachingServiceInstanceListSupplier`,但不是相反。 * `spring.cloud.loadbalancer.stats.micrometer.enabled`-全局启用或禁用负载平衡器千分尺指标 @@ -1092,13 +1092,13 @@ spring: ### [](#introduction)[4.1.导言](#introduction) -Spring 云断路器提供了跨越不同断路器实现方式的抽象。它提供了在应用程序中使用的一致的 API,允许你(开发人员)选择最适合你的应用程序需求的断路器实现。 +Spring Cloud断路器提供了跨越不同断路器实现方式的抽象。它提供了在应用程序中使用的一致的 API,允许你(开发人员)选择最适合你的应用程序需求的断路器实现。 #### [](#supported-implementations)[4.1.1.支持的实现](#supported-implementations) -Spring 云支持以下断路器实现方式: +Spring Cloud支持以下断路器实现方式: -* [Resilience4J](https://github.com/resilience4j/resilience4j) +* [弹性 4J](https://github.com/resilience4j/resilience4j) * [Sentinel](https://github.com/alibaba/Sentinel) @@ -1106,7 +1106,7 @@ Spring 云支持以下断路器实现方式: ### [](#core-concepts)[4.2.核心概念](#core-concepts) -要在代码中创建断路器,可以使用`CircuitBreakerFactory`API。当你在 Classpath 上包含 Spring 云断路器启动器时,将自动为你创建实现此 API 的 Bean。下面的示例展示了如何使用此 API 的一个简单示例: +要在代码中创建断路器,可以使用`CircuitBreakerFactory`API。当你在 Classpath 上包含 Spring Cloud断路器启动器时,将自动为你创建实现此 API 的 Bean。下面的示例展示了如何使用此 API 的一个简单示例: ``` @Service @@ -1158,7 +1158,7 @@ public static class DemoControllerService { 有关如何定制给定实现的详细信息,请参见以下文档: -* [Resilience4J](../../../../spring-cloud-circuitbreaker/current/reference/html/spring-cloud-circuitbreaker.html#configuring-resilience4j-circuit-breakers) +* [弹性 4J](../../../../spring-cloud-circuitbreaker/current/reference/html/spring-cloud-circuitbreaker.html#configuring-resilience4j-circuit-breakers) * [Sentinel](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc/circuitbreaker-sentinel.adoc#circuit-breaker-spring-cloud-circuit-breaker-with-sentinel—​configuring-sentinel-circuit-breakers) @@ -1177,13 +1177,13 @@ Customizer.once(circuitBreaker -> { ## [](#cachedrandompropertysource)[5.cachedrandomPropertySource](#cachedrandompropertysource) -Spring 云上下文提供了一个`PropertySource`,该`PropertySource`基于键缓存随机值。在缓存功能之外,它的工作原理与 Spring boot 的[“随机价值 PropertySource”](https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/RandomValuePropertySource.java)相同。如果你想要一个即使在 Spring 应用程序上下文重新启动之后仍然保持一致的随机值,那么这个随机值可能是有用的。属性值采取`cachedrandom.[yourkey].[type]`的形式,其中`yourkey`是缓存中的键。`type`值可以是 Spring boot 的`RandomValuePropertySource`所支持的任何类型。 +Spring Cloud上下文提供了一个`PropertySource`,该`PropertySource`基于键缓存随机值。在缓存功能之外,它的工作原理与 Spring boot 的[`RandomValuePropertySource`](https://github.com/ Spring-projects/ Spring-boot/blob/main/ Spring-boot-project/ Spring-boot/SRC/main/java/org/springframework/boot/ENV/randomvalutypropertysource.java)相同。如果你想要一个即使在 Spring 应用程序上下文重新启动之后仍然保持一致的随机值,那么这个随机值可能是有用的。属性值采取`cachedrandom.[yourkey].[type]`的形式,其中`yourkey`是缓存中的键。`type`值可以是 Spring boot 的`RandomValuePropertySource`支持的任何类型。 ``` myrandom=${cachedrandom.appname.value} ``` -## [](#spring-cloud-security)[6. Security](#spring-cloud-security) +## [](#spring-cloud-security)[6.安全](#spring-cloud-security) ### [](#spring-cloud-security-single-sign-on)[6.1.单点登录](#spring-cloud-security-single-sign-on) @@ -1192,13 +1192,13 @@ myrandom=${cachedrandom.appname.value} #### [](#spring-cloud-security-client-token-relay)[6.1.1.客户端令牌中继](#spring-cloud-security-client-token-relay) -如果你的应用程序是一个面向 OAuth2 客户端的用户(即声明了 `@enableOAuth2SSO` 或`@EnableOAuth2Client`),那么它在 Spring 启动时的请求范围内有一个 `OAuth2ClientContext’。你可以从这个上下文创建自己的`OAuth2RestTemplate`和一个自动连线`OAuth2ProtectedResourceDetails`,然后上下文将始终向下游转发访问令牌,如果过期,还将自动刷新访问令牌。(这些是 Spring 安全性和 Spring 引导的功能。 +如果你的应用程序是一个面向 OAuth2 客户端的用户(即声明了`@EnableOAuth2Sso`或`@EnableOAuth2Client`),那么它在 Spring 启动的请求范围内具有`OAuth2ClientContext`。你可以从这个上下文和一个自动连接的`OAuth2RestTemplate`创建自己的`OAuth2ProtectedResourceDetails`,然后上下文将始终向下游转发访问令牌,如果过期,还将自动刷新访问令牌。(这些是 Spring 安全性和 Spring 引导的功能。 #### [](#spring-cloud-security-resource-server-token-relay)[6.1.2.资源服务器令牌中继](#spring-cloud-security-resource-server-token-relay) -如果你的应用程序有`@EnableResourceServer`,那么你可能希望将传入的令牌向下游中继到其他服务。如果你使用“RESTTemplate”来联系下游服务,那么这只是一个如何在正确的上下文中创建模板的问题。 +如果你的应用程序有`@EnableResourceServer`,那么你可能希望将传入的令牌向下游中继到其他服务。如果你使用`RestTemplate`来联系下游服务,那么这只是一个如何在正确的上下文中创建模板的问题。 -如果你的服务使用`UserInfoTokenServices`来验证传入的令牌(即它正在使用`security.oauth2.user-info-uri`配置),那么你可以简单地使用自动连线`OAuth2RestTemplate`创建`OAuth2RestTemplate`(它将在到达后端代码之前由身份验证过程填充)。相当于(使用 Spring Boot1.4),你可以在配置中注入一个“userinforesttemplateFactory”并获取它的。例如: +如果你的服务使用`UserInfoTokenServices`来验证传入的令牌(即它正在使用`security.oauth2.user-info-uri`配置),那么你可以简单地使用自动连接`OAuth2RestTemplate`创建`OAuth2RestTemplate`(它将在到达后端代码之前由身份验证过程填充)。等效地(对于 Spring Boot1.4),你可以在配置中注入一个`UserInfoRestTemplateFactory`并获取其`OAuth2RestTemplate`。例如: MyConfiguration.java @@ -1211,7 +1211,7 @@ public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) { 然后,这个 REST 模板将具有与身份验证筛选器使用的相同的`OAuth2ClientContext`(请求作用域),因此你可以使用它发送具有相同访问令牌的请求。 -如果你的应用程序没有使用`UserInfoTokenServices`,但仍然是一个客户端(即它声明`@EnableOAuth2Client`或`@EnableOAuth2Sso`),那么使用 Spring 安全云,用户从`@Autowired``OAuth2Context`创建的任何`OAuth2RestOperations`也将转发令牌。默认情况下,此功能是作为 MVC 处理程序拦截器实现的,因此它仅在 Spring MVC 中工作。如果你不使用 MVC,你可以使用自定义过滤器或 AOP 拦截器包装“AccessTokenContextRelay”来提供相同的功能。 +如果你的应用程序没有使用`UserInfoTokenServices`,但仍然是一个客户端(即它声明`@EnableOAuth2Client`或`@EnableOAuth2Sso`),那么使用 Spring 安全云,用户从`@Autowired``OAuth2Context`创建的任何`OAuth2RestOperations`也将转发令牌。默认情况下,此功能是作为 MVC 处理程序拦截器实现的,因此它仅在 Spring MVC 中工作。如果不使用 MVC,则可以使用自定义过滤器或 AOP 拦截器包装`AccessTokenContextRelay`来提供相同的功能。 下面是一个基本示例,展示了在其他地方创建的自动连线 REST 模板的使用情况(“foo.com”是一个资源服务器,接受与周围应用程序相同的令牌): @@ -1229,11 +1229,12 @@ public String relay() { } ``` -如果你不想转发令牌(这是一个有效的选择,因为你可能希望充当你自己的角色,而不是向你发送令牌的客户机),那么你只需要创建自己的“OAuth2Context”,而不是自动布线默认的。 +如果你不想转发令牌(这是一个有效的选择,因为你可能希望充当你自己的角色,而不是向你发送令牌的客户机),那么你只需要创建自己的`OAuth2Context`,而不是自动布线默认的。 -如果可用,Feign 客户机还将获取一个使用“OAuth2ClientContext”的拦截器,因此他们还应该在`RestTemplate`可以进行令牌中继的任何地方进行令牌中继。 +假客户端还将获取使用`OAuth2ClientContext`的拦截器(如果可用的话),因此他们还应该在`RestTemplate`可以进行令牌中继的任何地方进行令牌中继。 ## [](#configuration-properties)[7.配置属性](#configuration-properties) 要查看所有 Spring Cloud Commons 相关配置属性的列表,请检查[附录页](appendix.html)。 +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-config.md b/docs/spring-cloud/spring-cloud-config.md index e207084741ecfb8cfb61b0cf3a144b73e08414d1..6b99774e8489dcf93d4b96ec2eb3c3cd8d4d9e5d 100644 --- a/docs/spring-cloud/spring-cloud-config.md +++ b/docs/spring-cloud/spring-cloud-config.md @@ -1,1243 +1,10 @@ -# Spring 云配置 +# Spring Cloud 配置 -Spring 云配置为分布式系统中的外部化配置提供服务器端和客户端支持。有了 Config 服务器,你就有了一个中心位置来管理跨所有环境的应用程序的外部属性。客户机和服务器上的概念都映射到 Spring `Environment`和`PropertySource`的抽象,因此它们非常适合 Spring 应用程序,但可以用于运行在任何语言中的任何应用程序。当应用程序通过部署管道从开发到测试再到生产时,你可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行它们所需的一切。服务器存储后端的默认实现使用 Git,因此它很容易支持配置环境的标记版本,并且可以访问用于管理内容的各种工具。添加替代实现并将其插入 Spring 配置中是很容易的。 +**3.1.1** -## [Quick Start](#_quick_start) +Spring Cloud 配置为分布式系统中的外部化配置提供服务器端和客户端支持。有了 Config 服务器,你就有了一个中心位置来管理跨所有环境的应用程序的外部属性。客户机和服务器上的概念都映射到 Spring `Environment`和`PropertySource`的抽象,因此它们非常适合 Spring 应用程序,但可以用于运行在任何语言中的任何应用程序。当应用程序通过部署管道从开发到测试再到生产时,你可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行它们所需的一切。服务器存储后端的默认实现使用 Git,因此它很容易支持配置环境的标记版本,并且可以访问用于管理内容的各种工具。添加替代实现并将其插入 Spring 配置中是很容易的。 -这个快速启动同时使用了 Spring Cloud Config 服务器的服务器和客户端。 - -首先,启动服务器,如下所示: - -``` -$ cd spring-cloud-config-server -$ ../mvnw spring-boot:run -``` - -服务器是一个 Spring 引导应用程序,因此如果你愿意,可以从 IDE 运行它(主类是`ConfigServerApplication`)。 - -下一步测试一个客户机,如下所示: - -``` -$ curl localhost:8888/foo/development -{ - "name": "foo", - "profiles": [ - "development" - ] - .... - "propertySources": [ - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo-development.properties", - "source": { - "bar": "spam", - "foo": "from foo development" - } - }, - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo.properties", - "source": { - "foo": "from foo props", - "democonfigclient.message": "hello spring io" - } - }, - .... -``` - -定位属性源的默认策略是克隆一个 Git 存储库(at`spring.cloud.config.server.git.uri`),并使用它初始化一个 mini`SpringApplication`。迷你应用程序的`Environment`用于枚举属性源并在 JSON 端点上发布它们。 - -HTTP 服务具有以下形式的资源: - -``` -/{application}/{profile}[/{label}] -/{application}-{profile}.yml -/{label}/{application}-{profile}.yml -/{application}-{profile}.properties -/{label}/{application}-{profile}.properties -``` - -例如: - -``` -curl localhost:8888/foo/development -curl localhost:8888/foo/development/master -curl localhost:8888/foo/development,db/master -curl localhost:8888/foo-development.yml -curl localhost:8888/foo-db.properties -curl localhost:8888/master/foo-db.properties -``` - -其中`application`被注入为`spring.config.name`中的`spring.config.name`(在常规 Spring 引导应用程序中通常`application`),`profile`是一个活动配置文件(或逗号分隔的属性列表),`label`是一个可选的 git 标签(默认为`master`)。 - -Spring 云配置服务器从各种来源获取远程客户端的配置。下面的示例从 Git 存储库(必须提供)获取配置,如下面的示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo -``` - -其他来源包括任何与 JDBC 兼容的数据库、Subversion、HashiC或pVault、Credhub 和本地文件系统。 - -### [客户端使用](#_client_side_usage) - -要在应用程序中使用这些特性,你可以将其构建为一个依赖于 Spring-cloud-config-client 的 Spring 引导应用程序(例如,请参见 config-client 或示例应用程序的测试用例)。添加依赖项最方便的方法是使用 Spring 引导启动器`org.springframework.cloud:spring-cloud-starter-config`。还有一个用于 Maven 用户的父 POM 和 BOM(` Spring-cloud-starter-parent`),以及用于 Gradle 和 Spring CLI 用户的 Spring IO 版本管理属性文件。下面的示例显示了典型的 Maven 配置: - -POM.xml - -``` - - org.springframework.boot - spring-boot-starter-parent - {spring-boot-docs-version} - - - - - - - org.springframework.cloud - spring-cloud-dependencies - {spring-cloud-version} - pom - import - - - - - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - -``` - -现在,你可以创建一个标准的 Spring 启动应用程序,例如下面的 HTTP 服务器: - -``` -@SpringBootApplication -@RestController -public class Application { - - @RequestMapping("/") - public String home() { - return "Hello World!"; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} -``` - -当此 HTTP 服务器运行时,它会从端口 8888 上的默认本地配置服务器(如果正在运行)获取外部配置。要修改启动行为,可以使用`应用程序.属性`更改配置服务器的位置,如下例所示: - -``` -spring.config.import=optional:configserver:http://myconfigserver.com -``` - -默认情况下,如果没有设置应用程序名称,将使用`application`。要修改名称,可以将以下属性添加到`应用程序.属性`文件中: - -``` -spring.application.name: myapp -``` - -| |在设置属性`${spring.application.name}`时,不要在应用程序名称前加上保留的单词`application-`,以防止解决正确的属性源问题。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -配置服务器属性在`/env`端点中显示为高优先级属性源,如下面的示例所示。 - -``` -$ curl localhost:8080/env -{ - "activeProfiles": [], - { - "name": "servletContextInitParams", - "properties": {} - }, - { - "name": "configserver:https://github.com/spring-cloud-samples/config-repo/foo.properties", - "properties": { - "foo": { - "value": "bar", - "origin": "Config Server https://github.com/spring-cloud-samples/config-repo/foo.properties:2:12" - } - } - }, - ... -} -``` - -一个名为`configserver:/`的属性源包含`foo`属性,其值为`bar`。 - -| |属性源名称中的 URL 是 Git 存储库,而不是 Config Server URL。| -|---|-------------------------------------------------------------------------------------| - -| |如果使用 Spring Cloud Config Client,则需要设置`spring.config.import`属性,以便绑定到 Config Server。你可以阅读有关它的更多信息[in the Spring Cloud Config Reference Guide](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-data-import)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -## [Spring Cloud Config Server](#_spring_cloud_config_server) - -Spring Cloud Config Server 提供了用于外部配置(名称-值对或等效的 YAML 内容)的基于 HTTP 资源的 API。通过使用`@EnableConfigServer`注释,服务器可嵌入到 Spring 引导应用程序中。因此,以下应用程序是一个配置服务器: - -configserver.java - -``` -@SpringBootApplication -@EnableConfigServer -public class ConfigServer { - public static void main(String[] args) { - SpringApplication.run(ConfigServer.class, args); - } -} -``` - -像所有 Spring 启动应用程序一样,它默认情况下在 8080 端口上运行,但你可以通过各种方式将其切换到更传统的 8888 端口。最简单的方法是用`spring.config.name=configserver`启动它(在配置服务器 jar 中有一个`configserver.yml`)。另一种方法是使用自己的`应用程序.属性`,如下例所示: - -application.properties - -``` -server.port: 8888 -spring.cloud.config.server.git.uri: file://${user.home}/config-repo -``` - -其中`${user.home}/config-repo`是一个包含 YAML 和 Properties 文件的 Git 存储库。 - -| |在 Windows 上,如果文件 URL 是绝对的,并带有驱动器前缀,则需要在文件 URL 中添加一个额外的“/”(例如,`[文件:///${user.home}/config-repo](file:///${user.home}/config-repo)`)。| -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |下面的清单显示了在前面的示例中创建 Git 存储库的方法:

``
$cd$HOME
$mkdir$HOME
$cd config-repo
$git init<132"/>$git init<133"/>$echo info.foo:bar>properties$git add-a.gt r=”135“/>$git properties-m”/>你应该在生产中使用服务器来托管你的配置存储库。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |如果只保存文本文件,那么配置存储库的初始克隆将是快速有效的。
如果存储二进制文件,特别是大的二进制文件,你可能会在第一次请求配置时遇到延迟,或者在服务器中遇到内存不足的错误。| -|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -### [环境存储库](#_environment_repository) - -你应该将配置服务器的配置数据存储在哪里?管理此行为的策略是`EnvironmentRepository`,服务于`Environment`对象。这`Environment`是从 Spring `Environment`的域的浅拷贝(包括以`propertySources`为主要特征)。`Environment`资源由三个变量参数化: - -* `{application}`,它映射到客户端的`spring.application.name`。 - -* `{profile}`,它映射到客户机上的`spring.profiles.active`(以逗号分隔的列表)。 - -* `{label}`,这是一个服务器端特性,标记了一组“版本控制的”配置文件。 - -存储库实现的行为通常类似于 Spring 引导应用程序,从等于`spring.config.name`参数的`{application}`和等于`spring.profiles.active`参数的`{profiles}`中加载配置文件。配置文件的优先规则也与常规 Spring 引导应用程序中的规则相同:活动配置文件优先于默认值,并且,如果有多个配置文件,则最后一个优先(类似于将条目添加到`Map`)。 - -以下示例客户机应用程序具有此引导程序配置: - -``` -spring: - application: - name: foo - profiles: - active: dev,mysql -``` - -(与通常的 Spring 引导应用程序一样,这些属性也可以通过环境变量或命令行参数来设置)。 - -如果存储库是基于文件的,那么服务器将从`应用程序.yml`(所有客户机之间共享)和(以`foo.yml`为准)创建一个“环境”。如果 YAML 文件中有指向 Spring 配置文件的文档,则应用这些文档的优先级更高(按所列配置文件的顺序排列)。如果存在特定于配置文件的 YAML(或 Properties)文件,那么这些文件的应用优先级也要高于默认值。更高的优先级表示在`Environment`中列出的`PropertySource`。(这些相同的规则也适用于独立的引导应用程序。 - -你可以将 Spring.cloud.config.server.accept-empty 设置为 false,这样,如果没有找到应用程序,服务器将返回 HTTP404 状态。默认情况下,此标志设置为 true。 - -#### [Git Backend](#_git_backend) - -`EnvironmentRepository`的默认实现使用了 Git 后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在配置服务器中设置`spring.cloud.config.server.git.uri`配置属性(例如在`application.yml`中)。如果你使用`file:`前缀对它进行设置,那么它应该在本地存储库中工作,这样你就可以在没有服务器的情况下快速轻松地启动它。然而,在这种情况下,服务器直接在本地存储库上操作,而不克隆它(如果它不是裸露的,那也没关系,因为配置服务器从不对“远程”存储库进行更改)。要扩展配置服务器并使其高度可用,你需要让服务器的所有实例指向同一个存储库,这样只有共享文件系统才能工作。即使在这种情况下,对于共享文件系统存储库也最好使用`ssh:`协议,这样服务器就可以克隆它并使用本地工作副本作为缓存。 - -这个存储库实现将 HTTP 资源的`{label}`参数映射到一个 Git 标签(提交 ID、分支名称或标记)。如果 Git 分支或标记名包含斜杠,那么 HTTP URL 中的标签应该使用特殊字符串`(_)`来指定(以避免与其他 URL 路径产生歧义)。例如,如果标签是`foo/bar`,替换斜杠将导致以下标签:`foo(_)bar`。特殊字符串`(_)`的包含也可以应用于`{application}`参数。如果你使用命令行客户机(如 curl),请小心 URL 中的括号——你应该用单引号(“”)将它们从 shell 中转出。 - -##### [跳过 SSL 证书验证](#_skipping_ssl_certificate_validation) - -通过将`git.SkipsslValidation`属性设置为`true`(默认设置为`false`),可以禁用配置服务器对 Git 服务器的 SSL 证书的验证。 - -``` -spring: - cloud: - config: - server: - git: - uri: https://example.com/my/repo - skipSslValidation: true -``` - -##### [设置 HTTP 连接超时](#_setting_http_connection_timeout) - -你可以配置配置服务器等待获得 HTTP 连接的时间(以秒为单位)。使用`git.timeout`属性。 - -``` -spring: - cloud: - config: - server: - git: - uri: https://example.com/my/repo - timeout: 4 -``` - -##### [git uri 中的占位符](#_placeholders_in_git_uri) - -Spring Cloud Config Server 支持带有`{application}`和`{profile}`占位符的 Git Repository URL(如果需要的话,还支持`{label}`,但请记住该标签无论如何都是作为 Git 标签应用的)。因此,你可以使用类似于以下结构的结构来支持“每个应用程序一个存储库”策略: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/myorg/{application} -``` - -你还可以通过使用类似的模式(但使用“{profile}”)来支持“每个配置文件一个存储库”策略。 - -此外,使用`{application}`参数中的特殊字符串“(\_)”可以启用对多个组织的支持,如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/{application} -``` - -其中`{application}`在请求时以以下格式提供:`organization(_)application`。 - -##### [模式匹配和多个存储库](#_pattern_matching_and_multiple_repositories) - -Spring 云配置还包括支持在应用程序和配置文件名称上与模式匹配的更复杂的需求。模式格式是用逗号分隔的带有通配符的`{application}/{profile}`名称列表(请注意,可能需要引用以通配符开头的模式),如下例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - repos: - simple: https://github.com/simple/config-repo - special: - pattern: special*/dev*,*special*/dev* - uri: https://github.com/special/config-repo - local: - pattern: local* - uri: file:/home/configsvc/config-repo -``` - -如果`{application}/{profile}`不匹配任何模式,则使用在`spring.cloud.config.server.git.uri`下定义的默认 URI。在上面的示例中,对于“简单”存储库,模式是`simple/*`(在所有配置文件中,它只匹配一个名为`simple`的应用程序)。“local”存储库匹配所有配置文件中以`local`开头的所有应用程序名称(`/*`后缀会自动添加到任何没有配置文件匹配器的模式中)。 - -| |“简单”示例中使用的“单行”捷径仅在要设置的唯一属性是 URI 时才能使用。
如果需要设置其他任何内容(凭据、模式等),则需要使用完整的表单。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -repo 中的`pattern`属性实际上是一个数组,因此你可以使用 YAML 数组(或`[0]`、`[1]`等属性文件中的后缀)绑定到多个模式。如果要运行带有多个配置文件的应用程序,你可能需要这样做,如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - repos: - development: - pattern: - - '*/development' - - '*/staging' - uri: https://github.com/development/config-repo - staging: - pattern: - - '*/qa' - - '*/production' - uri: https://github.com/staging/config-repo -``` - -| |Spring 云猜测,包含配置文件的模式不以`*`结束,这意味着你实际上希望匹配以该模式开始的配置文件列表(因此`*/staging`是`["*/staging", "*/staging,*"]`的快捷方式,以此类推)。
例如,这是常见的,你需要在本地运行“开发”配置文件中的应用程序,还需要远程运行“云”配置文件中的应用程序。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -每个存储库还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以指定为`search-paths`。下面的示例显示了顶层的配置文件: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - search-paths: - - foo - - bar* -``` - -在前面的示例中,服务器在顶层和`foo/`子目录以及名称以`bar`开头的任意子目录中搜索配置文件。 - -默认情况下,服务器在首次请求配置时复制远程存储库。可以将服务器配置为在启动时克隆存储库,如下面的顶级示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://git/common/config-repo.git - repos: - team-a: - pattern: team-a-* - cloneOnStart: true - uri: https://git/team-a/config-repo.git - team-b: - pattern: team-b-* - cloneOnStart: false - uri: https://git/team-b/config-repo.git - team-c: - pattern: team-c-* - uri: https://git/team-a/config-repo.git -``` - -在前面的示例中,服务器在接受任何请求之前,在启动时复制 Team-A 的 config-repo。在请求从存储库进行配置之前,不会克隆所有其他存储库。 - -| |在 Config 服务器启动时设置要克隆的存储库,可以帮助在 Config 服务器启动时快速识别配置错误的配置源(例如无效的存储库 URI),
with`cloneOnStart`配置源未启用,配置服务器可以使用配置错误或无效的配置源成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。| -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [Authentication](#_authentication) - -要在远程存储库上使用 HTTP Basic 身份验证,请分别添加`username`和`password`属性(不在 URL 中),如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - username: trolley - password: strongpassword -``` - -如果你不使用 HTTPS 和用户凭据,那么当你将密钥存储在默认目录中并且 URI 指向 SSH 位置(例如)时,SSH 也应该在开箱即用的情况下工作。在`~/.ssh/known_hosts`文件中存在用于 Git 服务器的条目,并且该条目是`ssh-rsa`格式,这一点很重要。不支持其他格式(如`ecdsa-sha2-nistp256`)。为了避免意外,你应该确保 Git 服务器的`known_hosts`文件中只有一个条目,并且它与你提供给 Config 服务器的 URL 相匹配。如果在 URL 中使用主机名,则希望在`known_hosts`文件中使用该主机名(而不是 IP)。通过使用 JGIT 访问存储库,因此你在其中找到的任何文档都应该适用。HTTPS 代理设置可以设置在`~/.git/config`中,或者(以与任何其他 JVM 进程相同的方式)使用系统属性(`-dhttps.proxyhost` 和`-Dhttps.proxyPort`)。 - -| |如果你不知道你的`~/.git`目录在哪里,请使用`git config --global`来操作设置(例如,`git config --global http.sslVerify false`)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -JGIT 需要 PEM 格式的 RSA 密钥。下面是一个示例 ssh-keygen(来自 OpenSSH)命令,它将以 CORECT 格式生成一个键: - -``` -ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa -``` - -警告:在使用 SSH 密钥时,预期的 SSH 私钥必须以``-----BEGIN RSA PRIVATE KEY-----``开头。如果密钥以``-----BEGIN OPENSSH PRIVATE KEY-----``开始,那么当 Spring-cloud-config 服务器启动时,RSA 密钥将不会加载。这个错误看起来是这样的: - -``` -- Error in object 'spring.cloud.config.server.git': codes [PrivateKeyIsValid.spring.cloud.config.server.git,PrivateKeyIsValid]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.cloud.config.server.git.,]; arguments []; default message []]; default message [Property 'spring.cloud.config.server.git.privateKey' is not a valid private key] -``` - -要纠正上述错误,必须将 RSA 键转换为 PEM 格式。上面提供了一个使用 OpenSSH 生成适当格式的新键的示例。 - -##### [使用 AWS codecommit 进行身份验证](#_authentication_with_aws_codecommit) - -Spring 云配置服务器还支持[AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)身份验证。当从命令行使用 Git 时,AWS Codecommit 使用身份验证助手。此助手不与 JGIT 库一起使用,因此,如果 Git URI 与 AWS Codecommit 模式匹配,那么将创建用于 AWS Codecommit 的 JGit CredentialProvider。AWS codecommit URI 遵循以下模式: - -``` -https//git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}. -``` - -如果你提供了带有 AWS CodeCommit URI 的用户名和密码,那么它们必须是提供对存储库访问的[AWS AccessKeyID 和 SecretAccessKey](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)。如果你没有指定用户名和密码,那么将使用[AWS 默认凭据提供商链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html)检索 AccessKeyID 和 SecretAccessKey。 - -如果你的 Git URI 与 codecommit URI 模式匹配(如前所述),则必须在用户名和密码中或在默认凭据提供商链支持的位置之一中提供有效的 AWS 凭据。AWS EC2 实例可以使用[EC2 实例的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。 - -| |`aws-java-sdk-core` jar 是一个可选的依赖项。
如果`aws-java-sdk-core` jar 不在你的 Classpath 上,则不会创建 AWS 代码提交凭据提供程序,而不管 Git 服务器的 URI 是什么。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [使用 Google Cloud Source 进行身份验证](#_authentication_with_google_cloud_source) - -Spring 云配置服务器还支持针对[Google Cloud Source](https://cloud.google.com/source-repositories/)存储库进行身份验证。 - -如果你的 Git URI 使用`http`或`https`协议,并且域名是`source.developers.google.com`,则将使用 Google Cloud Source 凭据提供商。Google Cloud Source Repository 的 URI 格式为`[https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}](https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO})`。要获得存储库的 URI,请单击 Google Cloud Source UI 中的“Clone”,并选择“手动生成的凭据”。不生成任何凭据,只需复制显示的 URI。 - -Google Cloud Source 凭据提供商将使用 Google Cloud Platform 应用程序的默认凭据。关于如何为系统创建应用程序默认凭据,请参见[Google Cloud SDK 文档](https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login)。这种方法适用于开发环境中的用户帐户和生产环境中的服务帐户。 - -| |`com.google.auth:google-auth-library-oauth2-http`是一个可选的依赖项。
如果`google-auth-library-oauth2-http` jar 不在你的 Classpath 上,则不会创建 Google Cloud Source 凭据提供者,无论 Git 服务器的 URI 是什么。| -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [使用属性的 Git SSH 配置](#_git_ssh_configuration_using_properties) - -默认情况下, Spring Cloud Config Server 使用的 JGit 库在使用 SSH URI 连接到 Git 存储库时使用诸如`~/.ssh/known_hosts`和`/etc/ssh/ssh_config`等 SSH 配置文件。在云环境中,例如 Cloud Foundry,本地文件系统可能是短暂的,或者不容易访问。对于这些情况,可以使用 Java 属性设置 SSH 配置。为了激活基于属性的 SSH 配置,`spring.cloud.config.server.git.ignoreLocalSshSettings`属性必须设置为`true`,如以下示例所示: - -``` - spring: - cloud: - config: - server: - git: - uri: [email protected]:team/repo1.git - ignoreLocalSshSettings: true - hostKey: someHostKey - hostKeyAlgorithm: ssh-rsa - privateKey: | - -----BEGIN RSA PRIVATE KEY----- - MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX - IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF - ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud - 1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i - oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W - DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd - fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b - BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG - EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj - 5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8 - +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe - pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG - ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ - xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW - dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi - PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX - VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z - FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R - gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4 - VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV - cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee - KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N - CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs - q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J - 69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT - -----END RSA PRIVATE KEY----- -``` - -下表描述了 SSH 配置属性。 - -| Property Name |备注| -|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **ignoreLocalSshSettings** |如果`true`,使用基于属性而不是基于文件的 SSH 配置。必须在存储库定义中设置为`spring.cloud.config.server.git.ignoreLocalSshSettings`,**不是**。| -| **privateKey** |有效的 SSH 私钥。如果`ignoreLocalSshSettings`为 true 且 git uri 为 ssh 格式,则必须设置。| -| **hostKey** |有效的 SSH 主机键。如果`hostKeyAlgorithm`也已设置,则必须设置。| -| **hostKeyAlgorithm** |`ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521`中的一个。如果`hostKey`也已设置,则必须设置。| -| **strictHostKeyChecking** |`true`或`false`。如果为假,请忽略使用主机键的错误。| -| **knownHostsFile** |自定义`.known_hosts`文件的位置。| -|**preferredAuthentications**|重写服务器身份验证方法命令.如果服务器在`publickey`方法之前具有键盘交互身份验证,那么这将允许规避登录提示。| - -##### [git 搜索路径中的占位符](#_placeholders_in_git_search_paths) - -Spring Cloud Config Server 还支持带有`{application}`和`{profile}`(如果需要的话,还支持`{label}`)占位符的搜索路径,如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - search-paths: '{application}' -``` - -前面的列表导致在存储库中搜索与目录(以及顶层)同名的文件。通配符在带有占位符的搜索路径中也是有效的(搜索中包含任何匹配的目录)。 - -##### [强制拉入 Git 存储库](#_force_pull_in_git_repositories) - -正如前面提到的, Spring Cloud Config 服务器复制远程 Git 存储库,以防本地副本变脏(例如,由 OS 进程更改的文件夹内容),使得 Spring Cloud Config 服务器无法从远程存储库更新本地副本。 - -为了解决这个问题,有一个`force-pull`属性,如果本地副本是脏的,该属性将使 Spring Cloud Config 服务器强制从远程存储库中拉出,如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - force-pull: true -``` - -如果具有多存储库配置,则可以为每个存储库配置`force-pull`属性,如以下示例所示: - -``` -spring: - cloud: - config: - server: - git: - uri: https://git/common/config-repo.git - force-pull: true - repos: - team-a: - pattern: team-a-* - uri: https://git/team-a/config-repo.git - force-pull: true - team-b: - pattern: team-b-* - uri: https://git/team-b/config-repo.git - force-pull: true - team-c: - pattern: team-c-* - uri: https://git/team-a/config-repo.git -``` - -| |`force-pull`属性的默认值是`false`。| -|---|-------------------------------------------------------| - -##### [删除 Git 存储库中未跟踪的分支](#_deleting_untracked_branches_in_git_repositories) - -由于 Spring Cloud Config 服务器在将分支检查到本地 repo(例如通过标签获取属性)之后具有远程 Git 存储库的克隆,因此它将永远保留该分支,或者直到下一个服务器重新启动(这将创建新的本地 repo)。因此,可能存在这样一种情况,即远程分支被删除,但其本地副本仍可用于获取。而如果 Spring Cloud Config Server Client Service 以`--spring.cloud.config.label=deletedRemoteBranch,master`开始,它将从`deletedRemoteBranch`本地分支获取属性,而不是从`master`获取属性。 - -为了保持本地存储库分支的清理和到远程-`deleteUntrackedBranches`属性可以被设置。它将使 Spring 云配置服务器**力**从本地存储库中删除未跟踪的分支。示例: - -``` -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - deleteUntrackedBranches: true -``` - -| |`deleteUntrackedBranches`属性的默认值是`false`。| -|---|--------------------------------------------------------------------| - -##### [Git 刷新率](#_git_refresh_rate) - -你可以通过使用`spring.cloud.config.server.git.refreshRate`来控制配置服务器多久会从你的 Git 后端获取更新的配置数据。此属性的值以秒为单位指定。默认情况下,该值为 0,这意味着配置服务器将在每次请求时从 Git Repo 获取更新的配置。 - -##### [Default Label](#_default_label) - -Git 使用的默认标签是`main`。如果你没有设置`spring.cloud.config.server.git.defaultLabel`,并且一个名为`main`的分支不存在,则默认情况下,配置服务器还将尝试检出一个名为`master`的分支。如果你想禁用回退分支行为,可以将 ` Spring.cloud.config.server.git.trymasterbranch` 设置为`false`。 - -#### [版本控制后端文件系统的使用](#_version_control_backend_filesystem_use) - -| |使用基于 VCS 的后端,文件将被签出或克隆到本地文件系统中,
默认情况下,它们被放入系统临时目录中,前缀为`config-repo-`,例如,在 Linux 上,
,可能是`/tmp/config-repo-`。
某些操作系统[定期清理](https://serverfault.com/questions/377348/when-does-tmp-get-cleared/377349#377349)临时目录。
这可能会导致意想不到的行为,例如丢失属性。,
为了避免这个问题,将`spring.cloud.config.server.git.basedir`或`spring.cloud.config.server.svn.basedir`设置为不驻留在系统临时结构中的目录,从而更改 Config 服务器使用的目录。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -#### [文件系统后端](#_file_system_backend) - -配置服务器中还有一个“本机”配置文件,它不使用 Git,而是从本地 Classpath 或文件系统(你想用`spring.cloud.config.server.native.searchLocations`指向的任何静态 URL)加载配置文件。要使用本机配置文件,使用`spring.profiles.active=native`启动配置服务器。 - -| |记住对文件资源使用`file:`前缀(不带前缀的默认情况通常是 Classpath)。
与任何 Spring 引导配置一样,你可以嵌入`${}`-风格的环境占位符,但请记住,Windows 中的绝对路径需要额外的`/`(例如,`[file:///${user.home}/config-repo](file:///${user.home}/config-repo)`)。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |`searchLocations`的默认值与本地 Spring 引导应用程序(即`[classpath:/, classpath:/config,
file:./, file:./config]`)相同。
这不会将来自服务器的`application.properties`公开给所有客户端,因为服务器中存在的任何属性源在发送到客户端之前都会被删除。| -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |文件系统后端对于快速启动和测试非常有用。
要在生产中使用它,你需要确保文件系统是可靠的,并在配置服务器的所有实例之间共享。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -搜索位置可以包含`{application}`、`{profile}`和`{label}`的占位符。通过这种方式,你可以隔离路径中的目录,并选择对你有意义的策略(例如每个应用程序的子目录或每个配置文件的子目录)。 - -如果在搜索位置中不使用占位符,那么这个存储库还会将 HTTP 资源的`{label}`参数附加到搜索路径的后缀中,因此,属性文件是从每个搜索位置**和**一个与标签同名的子目录加载的(在 Spring 环境中,标记属性优先)。因此,不带占位符的默认行为与添加以`/{label}/`结尾的搜索位置相同。例如,`file:/tmp/config`与`file:/tmp/config,file:/tmp/config/{label}`相同。可以通过设置`spring.cloud.config.server.native.addLabelLocations=false`来禁用此行为。 - -#### [Vault Backend](#vault-backend) - -Spring Cloud Config Server 还支持[Vault](https://www.vaultproject.io)作为后端。 - -Vault 是一种安全访问机密的工具。秘密是你想要严格控制访问的任何内容,例如 API 密钥、密码、证书和其他敏感信息。Vault 在提供严格的访问控制和记录详细的审计日志的同时,为任何秘密提供了统一的接口。 - -有关 Vault 的更多信息,请参见[跳马快速启动指南](https://learn.hashicorp.com/vault/?track=getting-started#getting-started)。 - -要使 Config 服务器能够使用 Vault 后端,你可以使用`vault`配置文件运行你的 Config 服务器。例如,在配置服务器的`application.properties`中,可以添加`spring.profiles.active=vault`。 - -默认情况下, Spring Cloud Config Server 使用基于令牌的身份验证来从 Vault 获取配置。Vault 还支持其他身份验证方法,如 Approle、LDAP、JWT、CloudFoundry、Kubernetes Auth。为了使用除令牌或 X-Config-Token 头以外的任何身份验证方法,我们需要在 Classpath 上具有 Spring Vault core,以便 Config 服务器可以将身份验证委派给该库。请将以下依赖项添加到你的配置服务器应用程序中。 - -`Maven (POM.xml)` - -``` - - - org.springframework.vault - spring-vault-core - - -``` - -`Gradle (build.gradle)` - -``` -dependencies { - implementation "org.springframework.vault:spring-vault-core" -} -``` - -默认情况下,配置服务器假定你的 Vault 服务器运行在`[http://127.0.0.1:8200](http://127.0.0.1:8200)`。它还假定后端的名称是`secret`,键是`application`。所有这些默认值都可以在配置服务器的`application.properties`中进行配置。下表描述了可配置的保险库属性: - -|姓名|Default Value| -|-----------------|-------------| -|主机| 127.0.0.1 | -|港口| 8200 | -|方案| http | -|后端| secret | -|DefaultKey| application | -|Profileseparator| , | -|KVVersion| 1 | -|skipSslValidation| false | -|超时| 5 | -|名称空间| null | - -| |前一个表中的所有属性必须使用`spring.cloud.config.server.vault`作为前缀,或者放在复合配置的正确的保险库部分。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -所有可配置的属性都可以在`org.springframework.cloud.config.server.environment.VaultEnvironmentProperties`中找到。 - -| |Vault0.10.0 引入了一个版本控制的键值后端(k/v 后端版本 2),该版本公开了与早期版本不同的 API,现在它需要在挂载路径和实际上下文路径之间设置`data/`,并在`data`对象中包装秘密。设置`spring.cloud.config.server.vault.kv-version=2`将考虑到这一点。| -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -可选地,存在对 Vault Enterprise`X-Vault-Namespace`头的支持。要将它发送到 Vault,请设置`namespace`属性。 - -在配置服务器运行时,你可以向服务器发出 HTTP 请求,以便从保险库后端取回值。要做到这一点,你需要为你的保险库服务器提供一个令牌。 - -首先,在保险库中放置一些数据,如以下示例所示: - -``` -$ vault kv put secret/application foo=bar baz=bam -$ vault kv put secret/myapp foo=myappsbar -``` - -其次,向配置服务器发出 HTTP 请求,以检索这些值,如下例所示: - -`$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"` - -你应该会看到类似于以下内容的响应: - -``` -{ - "name":"myapp", - "profiles":[ - "default" - ], - "label":null, - "version":null, - "state":null, - "propertySources":[ - { - "name":"vault:myapp", - "source":{ - "foo":"myappsbar" - } - }, - { - "name":"vault:application", - "source":{ - "baz":"bam", - "foo":"bar" - } - } - ] -} -``` - -客户机提供必要的身份验证以让 Config Server 与 Vault 对话的默认方式是设置 X-Config-Token 头。但是,你可以通过设置与 Spring Cloud Vault 相同的配置属性,省略标题并在服务器中配置身份验证。要设置的属性是`spring.cloud.config.server.vault.authentication`。应该将其设置为受支持的身份验证方法之一。你可能还需要设置特定于你使用的身份验证方法的其他属性,方法是使用与`spring.cloud.vault`相同的属性名称,而不是使用`spring.cloud.config.server.vault`前缀。有关更多详细信息,请参见[Spring Cloud Vault Reference Guide](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication)。 - -| |如果省略了 x-config-token 头并使用服务器属性来设置身份验证,则 Config 服务器应用程序需要对 Spring Vault 有一个额外的依赖项,以启用额外的身份验证选项。
有关如何添加该依赖项,请参见[Spring Vault Reference Guide](https://docs.spring.io/spring-vault/docs/current/reference/html/#dependencies)。| -|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [多属性源](#_multiple_properties_sources) - -在使用 Vault 时,你可以为应用程序提供多个属性源。例如,假设你已将数据写入 Vault 中的以下路径: - -``` -secret/myApp,dev -secret/myApp -secret/application,dev -secret/application -``` - -写入`secret/application`的属性可用于[所有使用配置服务器的应用程序](#_vault_server)。名称为`myApp`的应用程序将具有写为`secret/myApp`和`secret/application`的任何属性。当`myApp`启用`dev`配置文件时,写到上述所有路径的属性将对它可用,并且列表中第一个路径中的属性优先于其他路径。 - -#### [通过代理访问后端](#_accessing_backends_through_a_proxy) - -配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。在`proxy.http`和`proxy.https`下的设置可以控制 Git 或 Vault 的这种行为。这些设置是每个存储库设置的,因此,如果使用[复合环境存储库](#composite-environment-repositories),则必须为组合中的每个后端单独配置代理设置。如果使用的网络需要为 HTTP 和 HTTPS URL 提供单独的代理服务器,则可以为单个后端配置 HTTP 和 HTTPS 代理设置。 - -下表描述了 HTTP 和 HTTPS 代理的代理配置属性。所有这些属性都必须以`proxy.http`或`proxy.https`为前缀。 - -| Property Name |备注| -|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **host** |代理的主机。| -| **port** |访问代理的端口。| -|**nonProxyHosts**|配置服务器应该访问代理之外的任何主机.如果同时为`proxy.http.nonProxyHosts`和`proxy.https.nonProxyHosts`提供了值,则将使用`proxy.http`值。| -| **username** |对代理进行身份验证的用户名。如果同时为`proxy.http.username`和`proxy.https.username`提供了值,则将使用`proxy.http`值。| -| **password** |用于对代理进行身份验证的密码。如果同时为`proxy.http.password`和`proxy.https.password`提供了值,则将使用`proxy.http`值。| - -以下配置使用 HTTPS 代理访问 Git 存储库。 - -``` -spring: - profiles: - active: git - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - proxy: - https: - host: my-proxy.host.io - password: myproxypassword - port: '3128' - username: myproxyusername - nonProxyHosts: example.com -``` - -#### [与所有应用程序共享配置](#_sharing_configuration_with_all_applications) - -在所有应用程序之间共享配置取决于你所采用的方法,如以下主题所述: - -* [基于文件的存储库](#spring-cloud-config-server-file-based-repositories) - -* [Vault Server](#spring-cloud-config-server-vault-server) - -##### [基于文件的存储库](#spring-cloud-config-server-file-based-repositories) - -对于基于文件的(Git、SVN 和 Native)存储库,文件名为`application*`(`application.properties’、`application.yml`、`application-*.properties`等)的资源在所有客户端应用程序之间共享。你可以使用这些文件名的资源来配置全局默认值,并在必要时让它们被特定于应用程序的文件覆盖。 - -[属性重写](#property-overrides)特性还可以用于设置全局默认值,占位符应用程序可以在本地覆盖它们。 - -| |对于“本机”配置文件(本地文件系统后端),你应该使用一个不属于服务器自身配置的显式搜索位置。
否则,默认搜索位置中的`application*`资源将被删除,因为它们是服务器的一部分。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [Vault Server](#spring-cloud-config-server-vault-server) - -当使用 Vault 作为后端时,你可以通过在`secret/application`中放置配置来与所有应用程序共享配置。例如,如果你运行下面的 Vault 命令,那么所有使用 Config 服务器的应用程序都将具有它们可用的属性`foo`和`baz`: - -``` -$ vault write secret/application foo=bar baz=bam -``` - -##### [CredHub Server](#_credhub_server) - -当使用 Credhub 作为后端时,你可以通过将配置放置在`/application/`中或将其放置在应用程序的`default`配置文件中来与所有应用程序共享配置。例如,如果你运行下面的 credhub 命令,那么所有使用 Config 服务器的应用程序都将具有它们可用的属性`shared.color1`和`shared.color2`: - -``` -credhub set --name "/application/profile/master/shared" --type=json -value: {"shared.color1": "blue", "shared.color": "red"} -``` - -``` -credhub set --name "/my-app/default/master/more-shared" --type=json -value: {"shared.word1": "hello", "shared.word2": "world"} -``` - -#### [AWS 秘密管理器](#_aws_secrets_manager) - -当使用 AWS Secrets Manager 作为后端时,你可以通过将配置放置在`/application/`中或将其放置在应用程序的`default`配置文件中来与所有应用程序共享配置。例如,如果使用以下键添加秘密,那么所有使用配置服务器的应用程序都将具有它们可用的属性`shared.foo`和`shared.bar`: - -``` -secret name = /secret/application-default/ -``` - -``` -secret value = -{ - shared.foo: foo, - shared.bar: bar -} -``` - -or - -``` -secret name = /secret/application/ -``` - -``` -secret value = -{ - shared.foo: foo, - shared.bar: bar -} -``` - -##### [AWS 参数存储](#_aws_parameter_store) - -当使用 AWS 参数存储作为后端时,你可以通过在`/application`层次结构中放置属性来与所有应用程序共享配置。 - -例如,如果使用以下名称添加参数,那么所有使用配置服务器的应用程序都将具有它们可用的属性`foo.bar`和`fred.baz`: - -``` -/config/application/foo.bar -/config/application-default/fred.baz -``` - -#### [JDBC Backend](#_jdbc_backend) - -Spring 云配置服务器支持 JDBC(关系数据库)作为配置属性的后端。你可以通过向 Classpath 中添加`spring-jdbc`并使用`jdbc`配置文件或通过添加类型`JdbcEnvironmentRepository`的 Bean 来启用此功能。如果你包括对 Classpath 的正确依赖关系(有关该依赖关系的更多详细信息,请参见用户指南),则 Spring 引导将配置数据源。 - -通过将`spring.cloud.config.server.jdbc.enabled`属性设置为`false`,可以禁用`JdbcEnvironmentRepository`的自动配置。 - -数据库需要有一个名为`PROPERTIES`的表,其中的列分别为`APPLICATION`、`PROFILE`和`LABEL`(具有通常的`Environment`含义),加上`KEY`和`VALUE`用于`Properties`样式中的键和值对。在 Java 中,所有字段都是 String 类型的,因此你可以使它们`VARCHAR`具有所需的任何长度。如果属性值来自名为`{application}-{profile}.properties`的 Spring 引导属性文件,则属性值的行为与它们的行为相同,包括所有的加密和解密,这些将作为后处理步骤应用(即,不直接在存储库实现中)。 - -#### [Redis Backend](#_redis_backend) - -Spring 云配置服务器支持 Redis 作为配置属性的后端。你可以通过向[Spring Data Redis](https://spring.io/projects/spring-data-redis)添加依赖项来启用此功能。 - -POM.xml - -``` - - - org.springframework.boot - spring-boot-starter-data-redis - - -``` - -下面的配置使用 Spring data`RedisTemplate`来访问 Redis。我们可以使用`spring.redis.*`属性来覆盖默认的连接设置。 - -``` -spring: - profiles: - active: redis - redis: - host: redis - port: 16379 -``` - -这些属性应该存储为散列中的字段。散列的名称应该与`spring.application.name`的属性或`spring.application.name`和`spring.profiles.active[n]`的连词相同。 - -``` -HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1" -``` - -在运行位于散列上方可见的命令之后,散列应该包含以下带值的键: - -``` -HGETALL sample-app -{ - "server.port": "8100", - "sample.topic.name": "test", - "test.property1": "property1" -} -``` - -| |当未指定配置文件时,将使用`default`。| -|---|----------------------------------------------------| - -#### [AWS S3 Backend](#_aws_s3_backend) - -Spring 云配置服务器支持 AWS S3 作为配置属性的后端。你可以通过向[亚马逊 S3 的 AWS Java SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3.html)添加依赖项来启用此功能。 - -POM.xml - -``` - - - com.amazonaws - aws-java-sdk-s3 - - -``` - -以下配置使用 AWS S3 客户端访问配置文件。我们可以使用`spring.cloud.config.server.awss3.*`属性来选择存储配置的桶。 - -``` -spring: - profiles: - active: awss3 - cloud: - config: - server: - awss3: - region: us-east-1 - bucket: bucket1 -``` - -也可以使用`spring.cloud.config.server.awss3.endpoint`将 AWS URL 指定为你的 S3 服务的[覆盖标准端点](https://aws.amazon.com/blogs/developer/using-new-regions-and-endpoints/)。这允许支持 S3 的测试版区域,以及其他与 S3 兼容的存储 API。 - -使用[默认的 AWS 凭据提供商链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html)找到凭据。支持版本控制和加密的桶,而无需进一步配置。 - -配置文件以`{application}-{profile}.properties`、`{application}-{profile}.yml`或`{application}-{profile}.json`的形式存储在你的 bucket 中。可以提供一个可选的标签来指定文件的目录路径。 - -| |当未指定配置文件时,将使用`default`。| -|---|----------------------------------------------------| - -#### [AWS 参数存储后端](#_aws_parameter_store_backend) - -Spring 云配置服务器支持 AWS 参数存储作为配置属性的后端。你可以通过向[面向 SSM 的 AWS Java SDK](https://github.com/aws/aws-sdk-java/tree/master/aws-java-sdk-ssm)添加依赖项来启用此功能。 - -POM.xml - -``` - - com.amazonaws - aws-java-sdk-ssm - -``` - -以下配置使用 AWS SSM 客户端访问参数。 - -``` -spring: - profiles: - active: awsparamstore - cloud: - config: - server: - awsparamstore: - region: eu-west-2 - endpoint: https://ssm.eu-west-2.amazonaws.com - origin: aws:parameter: - prefix: /config/service - profile-separator: _ - recursive: true - decrypt-values: true - max-results: 5 -``` - -下表描述了 AWS 参数存储配置属性。 - -| Property Name |Required| Default Value |备注| -|---------------------|--------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **region** | no | |AWS 参数存储客户端要使用的区域。如果没有显式设置,那么 SDK 将尝试使用[默认区域提供器链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html#default-region-provider-chain)来确定要使用的区域。| -| **endpoint** | no | |AWS SSM 客户端入口点的 URL。这可以用来为 API 请求指定一个替代端点。| -| **origin** | no |`aws:ssm:parameter:`|添加到属性源名称中以显示其来源的前缀。| -| **prefix** | no | `/config` |前缀表示从 AWS 参数存储区加载的每个属性的参数层次结构中的 L1 级别。| -|**profile-separator**| no | `-` |将附加的配置文件与上下文名称分隔开的字符串。| -| **recursive** | no | `true` |标志来指示对层次结构中所有 AWS 参数的检索。| -| **decrypt-values** | no | `true` |标志来指示对所有 AWS 参数的检索,并对其值进行解密。| -| **max-results** | no | `10` |AWS 参数存储 API 调用要返回的最大项数。| - -AWS 参数存储 API 凭据是使用[默认凭据提供器链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)确定的。已支持版本控制的参数,其默认行为是返回最新版本。 - -| |* 当没有指定应用程序时,`application`是默认值,当没有指定配置文件时,使用`default`。

*`awsparamstore.prefix`的有效值必须以前斜杠开始,然后是一个或多个有效路径段,否则为空,

*`awsparamstore.profile-separator`的有效值只能包含点,破折号和下划线。

*`awsparamstore.max-results`的有效值必须在**[1, 10]**范围内。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -#### [AWS Secrets Manager 后端](#_aws_secrets_manager_backend) - -Spring Cloud Config Server 支持[AWS 秘密管理器](https://aws.amazon.com/secrets-manager/)作为配置属性的后端。你可以通过向[用于 Secrets Manager 的 AWS Java SDK](https://github.com/aws/aws-sdk-java/tree/master/aws-java-sdk-secretsmanager)添加依赖项来启用此功能。 - -POM.xml - -``` - - com.amazonaws - aws-java-sdk-secretsmanager - -``` - -以下配置使用 AWS Secrets Manager 客户端访问机密。 - -``` -spring: - profiles: - active: awssecretsmanager - cloud: - config: - server: - aws-secretsmanager: - region: us-east-1 - endpoint: https://us-east-1.console.aws.amazon.com/ - origin: aws:secrets: - prefix: /secret/foo - profileSeparator: _ -``` - -AWS Secrets Manager API 凭据是使用[默认凭据提供器链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)确定的。 - -| |* When no application is specified `application` is the default, and when no profile is specified `default` is used.| -|---|--------------------------------------------------------------------------------------------------------------------| - -#### [CredHub Backend](#_credhub_backend) - -Spring Cloud Config Server 支持[CredHub](https://docs.cloudfoundry.org/credhub)作为配置属性的后端。你可以通过向[Spring CredHub](https://spring.io/projects/spring-credhub)添加依赖项来启用此功能。 - -POM.xml - -``` - - - org.springframework.credhub - spring-credhub-starter - - -``` - -以下配置使用 Mutual TLS 访问 credhub: - -``` -spring: - profiles: - active: credhub - cloud: - config: - server: - credhub: - url: https://credhub:8844 -``` - -这些属性应该以 JSON 的形式存储,例如: - -``` -credhub set --name "/demo-app/default/master/toggles" --type=json -value: {"toggle.button": "blue", "toggle.link": "red"} -``` - -``` -credhub set --name "/demo-app/default/master/abs" --type=json -value: {"marketing.enabled": true, "external.enabled": false} -``` - -所有名称为`spring.cloud.config.name=demo-app`的客户机应用程序都将具有以下可用属性: - -``` -{ - toggle.button: "blue", - toggle.link: "red", - marketing.enabled: true, - external.enabled: false -} -``` - -| |当未指定配置文件时,将使用`default`;当未指定标签时,将使用`master`作为默认值。
注意:添加到`application`的值将被所有应用程序共享。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [OAuth 2.0](#_oauth_2_0) - -你可以使用[OAuth 2.0](https://oauth.net/2/)作为提供者进行身份验证。 - -pom.xml - -``` - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-oauth2-client - - -``` - -以下配置使用 OAuth2.0 和 UAA 来访问 credhub: - -``` -spring: - profiles: - active: credhub - cloud: - config: - server: - credhub: - url: https://credhub:8844 - oauth2: - registration-id: credhub-client - security: - oauth2: - client: - registration: - credhub-client: - provider: uaa - client-id: credhub_config_server - client-secret: asecret - authorization-grant-type: client_credentials - provider: - uaa: - token-uri: https://uaa:8443/oauth/token -``` - -| |所使用的 UAA 客户机 ID 应有`credhub.read`作为作用域。| -|---|-----------------------------------------------------------| - -#### [复合环境存储库](#composite-environment-repositories) - -在某些场景中,你可能希望从多个环境存储库中提取配置数据。为此,你可以在配置服务器的应用程序属性或 YAML 文件中启用`composite`配置文件。例如,如果你希望从一个 Subversion 存储库以及两个 Git 存储库中提取配置数据,那么可以为配置服务器设置以下属性: - -``` -spring: - profiles: - active: composite - cloud: - config: - server: - composite: - - - type: svn - uri: file:///path/to/svn/repo - - - type: git - uri: file:///path/to/rex/git/repo - - - type: git - uri: file:///path/to/walter/git/repo -``` - -使用此配置,优先级由`composite`键下列出存储库的顺序决定。在上面的示例中,首先列出了 Subversion 存储库,因此在 Subversion 存储库中找到的值将覆盖在一个 Git 存储库中为相同属性找到的值。在`rex`Git 存储库中找到的值将被用于在`walter`Git 存储库中为相同属性找到的值之前。 - -如果只想从不同类型的存储库中提取配置数据,那么可以在配置服务器的应用程序属性或 YAML 文件中启用相应的配置文件,而不是`composite`配置文件。例如,如果希望从单个 Git 存储库和单个 HashiCorpVault 服务器中提取配置数据,则可以为配置服务器设置以下属性: - -``` -spring: - profiles: - active: git, vault - cloud: - config: - server: - git: - uri: file:///path/to/git/repo - order: 2 - vault: - host: 127.0.0.1 - port: 8200 - order: 1 -``` - -使用此配置,可以通过`order`属性来确定优先级。你可以使用`order`属性来指定所有存储库的优先级顺序。`order`属性的数值越低,它的优先级就越高。存储库的优先级顺序有助于解决包含相同属性的值的存储库之间的任何潜在冲突。 - -| |如果你的组合环境像前面的示例一样包含一个 Vault 服务器,那么你必须在向配置服务器提出的每个请求中都包含一个 Vault 令牌。见[Vault Backend](#vault-backend)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |当从环境存储库检索值时,任何类型的失败都会导致整个复合环境失败。
如果你希望在存储库失败时继续进行复合,则可以将`spring.cloud.config.server.failOnCompositeError`设置为`false`。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |在使用复合环境时,所有存储库都包含相同的标签是很重要的,
如果你的环境与前面示例中的环境类似,并且你使用`master`标签请求配置数据,但是 Subversion 存储库不包含一个名为`master`的分支,整个请求都失败了。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -##### [自定义复合环境存储库](#_custom_composite_environment_repositories) - -除了使用 Spring 云中的一个环境存储库外,还可以提供你自己的`EnvironmentRepository` Bean 以作为复合环境的一部分。要做到这一点,你的 Bean 必须实现`EnvironmentRepository`接口。如果希望在复合环境中控制自定义`EnvironmentRepository`的优先级,还应该实现`Ordered`接口并覆盖`getOrdered`方法。如果你没有实现`Ordered`接口,那么你的`EnvironmentRepository`将获得最低的优先级。 - -#### [属性重写](#property-overrides) - -配置服务器具有“重写”功能,允许操作员向所有应用程序提供配置属性。使用普通 Spring 引导挂钩的应用程序不会意外地更改重写的属性。要声明重写,请将名称-值对的映射添加到`spring.cloud.config.server.overrides`,如下例所示: - -``` -spring: - cloud: - config: - server: - overrides: - foo: bar -``` - -前面的示例使所有配置客户机的应用程序读取`foo=bar`,这与它们自己的配置无关。 - -| |配置系统不能强制应用程序以任何特定方式使用配置数据。
因此,重写是不可执行的。
但是,它们确实为 Spring 云配置客户机提供了有用的默认行为。| -|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |通常, Spring 具有`${}`的环境占位符可以通过使用反斜杠来转义(并在客户端上解析),以转义`Spring 云配置 -========== - -Spring 云配置为分布式系统中的外部化配置提供服务器端和客户端支持。有了 Config 服务器,你就有了一个中心位置来管理跨所有环境的应用程序的外部属性。客户机和服务器上的概念都映射到 Spring `Environment`和`PropertySource`的抽象,因此它们非常适合 Spring 应用程序,但可以用于运行在任何语言中的任何应用程序。当应用程序通过部署管道从开发到测试再到生产时,你可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行它们所需的一切。服务器存储后端的默认实现使用 Git,因此它很容易支持配置环境的标记版本,并且可以访问用于管理内容的各种工具。添加替代实现并将其插入 Spring 配置中是很容易的。 - -[Quick Start](#_quick_start) ----------- +## [快速启动](#_quick_start) 这个快速启动同时使用了 Spring Cloud Config 服务器的服务器和客户端。 @@ -1301,9 +68,9 @@ curl localhost:8888/foo-db.properties curl localhost:8888/master/foo-db.properties ``` -其中`application`被注入为`spring.config.name`中的`spring.config.name`(在常规 Spring 引导应用程序中通常`application`),`profile`是一个活动配置文件(或逗号分隔的属性列表),`label`是一个可选的 git 标签(默认为`master`)。 +其中`application`在`SpringApplication`中被注入为`spring.config.name`(在常规 Spring 引导应用程序中通常`application`),`profile`是一个活动配置文件(或逗号分隔的属性列表),而`label`是一个可选的 git 标签(默认为`master`)。 -Spring 云配置服务器从各种来源获取远程客户端的配置。下面的示例从 Git 存储库(必须提供)获取配置,如下面的示例所示: +Spring Cloud 配置服务器从各种来源获取远程客户端的配置。下面的示例从 Git 存储库(必须提供)获取配置,如下面的示例所示: ``` spring: @@ -1314,11 +81,11 @@ spring: uri: https://github.com/spring-cloud-samples/config-repo ``` -其他来源包括任何与 JDBC 兼容的数据库、Subversion、HashiC或pVault、Credhub 和本地文件系统。 +其他来源包括任何与 JDBC 兼容的数据库、Subversion、HashiCorpVault、Credhub 和本地文件系统。 ### [客户端使用](#_client_side_usage) -要在应用程序中使用这些特性,你可以将其构建为一个依赖于 Spring-cloud-config-client 的 Spring 引导应用程序(例如,请参见 config-client 或示例应用程序的测试用例)。添加依赖项最方便的方法是使用 Spring 引导启动器`org.springframework.cloud:spring-cloud-starter-config`。还有一个用于 Maven 用户的父 POM 和 BOM(` Spring-cloud-starter-parent`),以及用于 Gradle 和 Spring CLI 用户的 Spring IO 版本管理属性文件。下面的示例显示了典型的 Maven 配置: +要在应用程序中使用这些特性,你可以将其构建为一个依赖于 Spring-cloud-config-client 的 Spring 引导应用程序(例如,请参见 config-client 或示例应用程序的测试用例)。添加依赖项最方便的方法是使用 Spring 引导启动器`org.springframework.cloud:spring-cloud-starter-config`。还有一个用于 Maven 用户的父 POM 和 BOM(),以及用于 Gradle 和 Spring CLI 用户的 Spring IO 版本管理属性文件。下面的示例显示了典型的 Maven 配置: POM.xml @@ -1391,13 +158,13 @@ public class Application { spring.config.import=optional:configserver:http://myconfigserver.com ``` -默认情况下,如果没有设置应用程序名称,将使用`application`。要修改名称,可以将以下属性添加到`application.properties`文件中: +默认情况下,如果没有设置应用程序名称,将使用`application`。要修改名称,可以将以下属性添加到`应用程序.属性`文件中: ``` spring.application.name: myapp ``` -| |在设置属性`${spring.application.name}`时,不要在应用程序名称前加上保留的单词`application-`,以防止解决正确的属性源问题。| +| |在设置属性`${spring.application.name}`时,不要在应用程序名称前加上保留的单词`application-`,以防止解决正确属性源的问题。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 配置服务器属性在`/env`端点中显示为高优先级属性源,如下面的示例所示。 @@ -1428,13 +195,12 @@ $ curl localhost:8080/env | |属性源名称中的 URL 是 Git 存储库,而不是 Config Server URL。| |---|-------------------------------------------------------------------------------------| -| |如果使用 Spring Cloud Config Client,则需要设置`spring.config.import`属性,以便绑定到 Config Server。你可以阅读有关它的更多信息[in the Spring Cloud Config Reference Guide](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-data-import)。| +| |如果使用 Spring Cloud Config Client,则需要设置`spring.config.import`属性才能绑定到 Config Server。你可以阅读有关它的更多信息[in the Spring Cloud Config Reference Guide](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-data-import)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[Spring Cloud Config Server](#_spring_cloud_config_server) ----------- +## [Spring Cloud Config Server](#_spring_cloud_config_server) -Spring Cloud Config Server 提供了用于外部配置(名称-值对或等效的 YAML 内容)的基于 HTTP 资源的 API。通过使用`@EnableConfigServer`注释,服务器可嵌入到 Spring 引导应用程序中。因此,以下应用程序是一个配置服务器: +Spring Cloud 配置服务器提供了用于外部配置(名称-值对或等效的 YAML 内容)的基于 HTTP 资源的 API。通过使用`@EnableConfigServer`注释,服务器可嵌入到 Spring 引导应用程序中。因此,以下应用程序是一个配置服务器: configserver.java @@ -1448,7 +214,7 @@ public class ConfigServer { } ``` -像所有 Spring 启动应用程序一样,它默认情况下在 8080 端口上运行,但你可以通过各种方式将其切换到更传统的 8888 端口。最简单的方法是用`spring.config.name=configserver`启动它(在配置服务器 jar 中有一个`configserver.yml`)。另一种方法是使用自己的`application.properties`,如下例所示: +像所有 Spring 启动应用程序一样,它默认情况下在 8080 端口上运行,但你可以通过各种方式将其切换到更传统的 8888 端口。最简单的方法是用`spring.config.name=configserver`启动它(在配置服务器 jar 中有一个`configserver.yml`)。另一种方法是使用自己的`应用程序.属性`,如下例所示: application.properties @@ -1459,10 +225,10 @@ spring.cloud.config.server.git.uri: file://${user.home}/config-repo 其中`${user.home}/config-repo`是一个包含 YAML 和 Properties 文件的 Git 存储库。 -| |在 Windows 上,如果文件 URL 是绝对的,并带有驱动器前缀,则需要在文件 URL 中添加一个额外的“/”(例如,`[文件:///${user.home}/config-repo](file:///${user.home}/config-repo)`)。| +| |在 Windows 上,如果文件 URL 是绝对的,并带有驱动器前缀(例如,`[file:///${user.home}/config-repo](file:///${user.home}/config-repo)`),则需要在文件 URL 中添加一个额外的“/”。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |下面的清单显示了在前面的示例中创建 Git 存储库的方法:

``
$cd$HOME
$mkdir$HOME
$cd config-repo
$git init<132"/>$git init<133"/>$echo info.foo:bar>properties$git add-a.gt r=”135“/>$git properties-m”/>
```
$ cd $HOME
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
```| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |为你的 Git 存储库使用本地文件系统仅用于测试。
你应该在生产中使用服务器来托管你的配置存储库。| @@ -1473,7 +239,7 @@ spring.cloud.config.server.git.uri: file://${user.home}/config-repo ### [环境存储库](#_environment_repository) -你应该将配置服务器的配置数据存储在哪里?管理此行为的策略是`EnvironmentRepository`,服务于`Environment`对象。这`Environment`是从 Spring `Environment`的域的浅拷贝(包括以`propertySources`为主要特征)。`Environment`资源由三个变量参数化: +你应该将配置服务器的配置数据存储在哪里?管理这种行为的策略是`EnvironmentRepository`,它服务于`Environment`对象。这`Environment`是从 Spring `Environment`的域的浅拷贝(包括以`propertySources`为主要特征)。`Environment`资源由三个变量参数化: * `{application}`,它映射到客户端的`spring.application.name`。 @@ -1481,7 +247,7 @@ spring.cloud.config.server.git.uri: file://${user.home}/config-repo * `{label}`,这是一个服务器端特性,标记了一组“版本控制的”配置文件。 -存储库实现的行为通常类似于 Spring 引导应用程序,从等于`spring.config.name`参数的`{application}`和等于`spring.profiles.active`参数的`{profiles}`中加载配置文件。配置文件的优先规则也与常规 Spring 引导应用程序中的规则相同:活动配置文件优先于默认值,并且,如果有多个配置文件,则最后一个优先(类似于将条目添加到`Map`)。 +存储库实现的行为通常类似于 Spring 引导应用程序,从一个`spring.config.name`等于`{application}`参数和`spring.profiles.active`等于`{profiles}`参数加载配置文件。配置文件的优先规则也与常规 Spring 引导应用程序中的规则相同:活动配置文件优先于默认值,并且,如果有多个配置文件,则最后一个优先(类似于将条目添加到`Map`)。 以下示例客户机应用程序具有此引导程序配置: @@ -1493,17 +259,17 @@ spring: active: dev,mysql ``` -(与通常的 Spring 引导应用程序一样,这些属性也可以通过环境变量或命令行参数来设置)。 +(与 Spring 引导应用程序的通常情况一样,这些属性也可以通过环境变量或命令行参数来设置)。 -如果存储库是基于文件的,那么服务器将从`application.yml`(所有客户机之间共享)和(以`foo.yml`为准)创建一个“环境”。如果 YAML 文件中有指向 Spring 配置文件的文档,则应用这些文档的优先级更高(按所列配置文件的顺序排列)。如果存在特定于配置文件的 YAML(或 Properties)文件,那么这些文件的应用优先级也要高于默认值。更高的优先级表示在`Environment`中列出的`PropertySource`。(这些相同的规则也适用于独立的引导应用程序。 +如果存储库是基于文件的,那么服务器将从`应用程序.yml`(所有客户机之间共享)和`foo.yml`(以`foo.yml`优先)创建`Environment`。如果 YAML 文件中有指向 Spring 配置文件的文档,则应用这些文档的优先级更高(按所列配置文件的顺序排列)。如果存在特定于配置文件的 YAML(或 Properties)文件,那么这些文件的应用优先级也要高于默认值。更高的优先级表示在`Environment`中列出的`PropertySource`。(这些相同的规则也适用于独立的启动应用程序。 你可以将 Spring.cloud.config.server.accept-empty 设置为 false,这样,如果没有找到应用程序,服务器将返回 HTTP404 状态。默认情况下,此标志设置为 true。 -#### [Git Backend](#_git_backend) +#### [Git 后端](#_git_backend) -`EnvironmentRepository`的默认实现使用了 Git 后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在配置服务器中设置`spring.cloud.config.server.git.uri`配置属性(例如在`application.yml`中)。如果你使用`file:`前缀对它进行设置,那么它应该在本地存储库中工作,这样你就可以在没有服务器的情况下快速轻松地启动它。然而,在这种情况下,服务器直接在本地存储库上操作,而不克隆它(如果它不是裸露的,那也没关系,因为配置服务器从不对“远程”存储库进行更改)。要扩展配置服务器并使其高度可用,你需要让服务器的所有实例指向同一个存储库,这样只有共享文件系统才能工作。即使在这种情况下,对于共享文件系统存储库也最好使用`ssh:`协议,这样服务器就可以克隆它并使用本地工作副本作为缓存。 +`EnvironmentRepository`的默认实现使用了 Git 后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在配置服务器中设置`spring.cloud.config.server.git.uri`配置属性(例如在`application.yml`中)。如果你使用`file:`前缀设置它,那么它应该在本地存储库中工作,这样你就可以在没有服务器的情况下快速轻松地启动它。然而,在这种情况下,服务器直接在本地存储库上操作,而不克隆它(如果它不是裸露的,那也没关系,因为配置服务器从不对“远程”存储库进行更改)。要扩展配置服务器并使其高度可用,你需要让服务器的所有实例指向同一个存储库,这样只有共享文件系统才能工作。即使在这种情况下,对于共享文件系统存储库也最好使用`ssh:`协议,这样服务器就可以克隆它并使用本地工作副本作为缓存。 -这个存储库实现将 HTTP 资源的`{label}`参数映射到一个 Git 标签(提交 ID、分支名称或标记)。如果 Git 分支或标记名包含斜杠,那么 HTTP URL 中的标签应该使用特殊字符串`(_)`来指定(以避免与其他 URL 路径产生歧义)。例如,如果标签是`foo/bar`,替换斜杠将导致以下标签:`foo(_)bar`。特殊字符串`(_)`的包含也可以应用于`{application}`参数。如果你使用命令行客户机(如 curl),请小心 URL 中的括号——你应该用单引号(“”)将它们从 shell 中转出。 +这个存储库实现将 HTTP 资源的`{label}`参数映射到一个 Git 标签(提交 ID、分支名称或标记)。如果 Git 分支或标记名包含斜杠(`/`),那么 HTTP URL 中的标签应该使用特殊字符串`(_)`来指定(以避免与其他 URL 路径产生歧义)。例如,如果标签是`foo/bar`,替换斜杠将导致以下标签:`foo(_)bar`。特殊字符串`(_)`的包含也可以应用于`{application}`参数。如果你使用命令行客户机(如 curl),请小心 URL 中的括号——你应该用单引号(“”)将它们从 shell 中转出。 ##### [跳过 SSL 证书验证](#_skipping_ssl_certificate_validation) @@ -1546,7 +312,7 @@ spring: uri: https://github.com/myorg/{application} ``` -你还可以通过使用类似的模式(但使用“{profile}”)来支持“每个配置文件一个存储库”策略。 +你还可以使用类似的模式,但使用`{profile}`,支持“每个配置文件一个存储库”策略。 此外,使用`{application}`参数中的特殊字符串“(\_)”可以启用对多个组织的支持,如以下示例所示: @@ -1563,7 +329,7 @@ spring: ##### [模式匹配和多个存储库](#_pattern_matching_and_multiple_repositories) -Spring 云配置还包括支持在应用程序和配置文件名称上与模式匹配的更复杂的需求。模式格式是用逗号分隔的带有通配符的`{application}/{profile}`名称列表(请注意,可能需要引用以通配符开头的模式),如下例所示: +Spring Cloud 配置还包括支持在应用程序和配置文件名称上与模式匹配的更复杂的需求。模式格式是用逗号分隔的带有通配符的`{application}/{profile}`名称列表(请注意,以通配符开头的模式可能需要引用),如下例所示: ``` spring: @@ -1587,7 +353,7 @@ spring: | |“简单”示例中使用的“单行”捷径仅在要设置的唯一属性是 URI 时才能使用。
如果需要设置其他任何内容(凭据、模式等),则需要使用完整的表单。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -repo 中的`pattern`属性实际上是一个数组,因此你可以使用 YAML 数组(或`[0]`、`[1]`等属性文件中的后缀)绑定到多个模式。如果要运行带有多个配置文件的应用程序,你可能需要这样做,如以下示例所示: +repo 中的`pattern`属性实际上是一个数组,因此可以使用 YAML 数组(或`[0]`、`[1]`等属性文件中的后缀)绑定到多个模式。如果要运行带有多个配置文件的应用程序,你可能需要这样做,如以下示例所示: ``` spring: @@ -1609,7 +375,7 @@ spring: uri: https://github.com/staging/config-repo ``` -| |Spring 云猜测,包含配置文件的模式不以`*`结束,这意味着你实际上希望匹配以该模式开始的配置文件列表(因此`*/staging`是`["*/staging", "*/staging,*"]`的快捷方式,以此类推)。
例如,这是常见的,你需要在本地运行“开发”配置文件中的应用程序,还需要远程运行“云”配置文件中的应用程序。| +| |Spring Cloud 猜测,包含配置文件的模式不以`*`结束,这意味着你实际上希望匹配以该模式开始的配置文件列表(因此`*/staging`是`["*/staging", "*/staging,*"]`的快捷方式,以此类推)。
例如,这是常见的,你需要在本地运行“开发”配置文件中的应用程序,还需要远程运行“云”配置文件中的应用程序。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 每个存储库还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以指定为`search-paths`。下面的示例显示了顶层的配置文件: @@ -1653,10 +419,10 @@ spring: 在前面的示例中,服务器在接受任何请求之前,在启动时复制 Team-A 的 config-repo。在请求从存储库进行配置之前,不会克隆所有其他存储库。 -| |在 Config 服务器启动时设置要克隆的存储库,可以帮助在 Config 服务器启动时快速识别配置错误的配置源(例如无效的存储库 URI),
with`cloneOnStart`配置源未启用,配置服务器可以使用配置错误或无效的配置源成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。| +| |在配置服务器启动时,设置要在配置服务器启动时克隆的存储库,可以帮助快速识别配置错误的配置源(例如无效的存储库 URI),
with`cloneOnStart`配置源未启用,配置服务器可以使用配置错误或无效的配置源成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -##### [Authentication](#_authentication) +##### [认证](#_authentication) 要在远程存储库上使用 HTTP Basic 身份验证,请分别添加`username`和`password`属性(不在 URL 中),如以下示例所示: @@ -1671,7 +437,7 @@ spring: password: strongpassword ``` -如果你不使用 HTTPS 和用户凭据,那么当你将密钥存储在默认目录中并且 URI 指向 SSH 位置(例如)时,SSH 也应该在开箱即用的情况下工作。在`~/.ssh/known_hosts`文件中存在用于 Git 服务器的条目,并且该条目是`ssh-rsa`格式,这一点很重要。不支持其他格式(如`ecdsa-sha2-nistp256`)。为了避免意外,你应该确保 Git 服务器的`known_hosts`文件中只有一个条目,并且它与你提供给 Config 服务器的 URL 相匹配。如果在 URL 中使用主机名,则希望在`known_hosts`文件中使用该主机名(而不是 IP)。通过使用 JGIT 访问存储库,因此你在其中找到的任何文档都应该适用。HTTPS 代理设置可以设置在`~/.git/config`中,或者(以与任何其他 JVM 进程相同的方式)使用系统属性(`-dhttps.proxyhost` 和`-Dhttps.proxyPort`)。 +如果你不使用 HTTPS 和用户凭据,那么当你将密钥存储在默认目录(`~/.ssh`)中并且 URI 指向 SSH 位置(例如`[[email protected]](/cdn-cgi/l/email-protection):configuration/cloud-configuration`)时,SSH 也应该可以开箱即用。在`~/.ssh/known_hosts`文件中存在用于 Git 服务器的条目,并且该条目是`ssh-rsa`格式,这一点很重要。不支持其他格式(如`ecdsa-sha2-nistp256`)。为了避免意外,你应该确保 Git 服务器的`known_hosts`文件中只有一个条目,并且它与你提供给 Config 服务器的 URL 相匹配。如果在 URL 中使用主机名,则希望在`known_hosts`文件中使用该主机名(而不是 IP)。通过使用 JGIT 访问存储库,因此你在其中找到的任何文档都应该适用。HTTPS 代理设置可以设置在`~/.git/config`中,或者(以与任何其他 JVM 进程相同的方式)使用系统属性(`-Dhttps.proxyHost`和`-Dhttps.proxyPort`)。 | |如果你不知道你的`~/.git`目录在哪里,请使用`git config --global`来操作设置(例如,`git config --global http.sslVerify false`)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -1692,7 +458,7 @@ ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa ##### [使用 AWS codecommit 进行身份验证](#_authentication_with_aws_codecommit) -Spring 云配置服务器还支持[AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)身份验证。当从命令行使用 Git 时,AWS Codecommit 使用身份验证助手。此助手不与 JGIT 库一起使用,因此,如果 Git URI 与 AWS Codecommit 模式匹配,那么将创建用于 AWS Codecommit 的 JGit CredentialProvider。AWS codecommit URI 遵循以下模式: +Spring Cloud 配置服务器还支持[AWS Codecommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)身份验证。当从命令行使用 Git 时,AWS Codecommit 使用身份验证助手。此助手不与 JGIT 库一起使用,因此,如果 Git URI 与 AWS Codecommit 模式匹配,那么将创建用于 AWS Codecommit 的 JGit CredentialProvider。AWS codecommit URI 遵循以下模式: ``` https//git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}. @@ -1707,7 +473,7 @@ https//git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}. ##### [使用 Google Cloud Source 进行身份验证](#_authentication_with_google_cloud_source) -Spring 云配置服务器还支持针对[Google Cloud Source](https://cloud.google.com/source-repositories/)存储库进行身份验证。 +Spring Cloud 配置服务器还支持针对[Google Cloud Source](https://cloud.google.com/source-repositories/)存储库进行身份验证。 如果你的 Git URI 使用`http`或`https`协议,并且域名是`source.developers.google.com`,则将使用 Google Cloud Source 凭据提供商。Google Cloud Source Repository 的 URI 格式为`[https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}](https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO})`。要获得存储库的 URI,请单击 Google Cloud Source UI 中的“Clone”,并选择“手动生成的凭据”。不生成任何凭据,只需复制显示的 URI。 @@ -1833,9 +599,9 @@ spring: ##### [删除 Git 存储库中未跟踪的分支](#_deleting_untracked_branches_in_git_repositories) -由于 Spring Cloud Config 服务器在将分支检查到本地 repo(例如通过标签获取属性)之后具有远程 Git 存储库的克隆,因此它将永远保留该分支,或者直到下一个服务器重新启动(这将创建新的本地 repo)。因此,可能存在这样一种情况,即远程分支被删除,但其本地副本仍可用于获取。而如果 Spring Cloud Config Server Client Service 以`--spring.cloud.config.label=deletedRemoteBranch,master`开始,它将从`deletedRemoteBranch`本地分支获取属性,而不是从`master`获取属性。 +Spring Cloud Config Server 在检查分支到本地 repo(例如通过标签获取属性)之后具有远程 Git 存储库的克隆,因此它将永远保留该分支,或者直到下一个服务器重新启动(这将创建新的本地 repo)。因此,可能存在这样一种情况,即远程分支被删除,但其本地副本仍可用于获取。而如果 Spring Cloud Config Server Client Service 以`--spring.cloud.config.label=deletedRemoteBranch,master`开始,它将从`deletedRemoteBranch`本地分支获取属性,而不是从`master`获取属性。 -为了保持本地存储库分支的清理和到远程-`deleteUntrackedBranches`属性可以被设置。它将使 Spring 云配置服务器**力**从本地存储库中删除未跟踪的分支。示例: +为了保持本地存储库分支的清理和到 Remote-`deleteUntrackedBranches`属性可以被设置。它将使 Spring Cloud 配置服务器**力**从本地存储库中删除未跟踪的分支。示例: ``` spring: @@ -1854,20 +620,20 @@ spring: 你可以通过使用`spring.cloud.config.server.git.refreshRate`来控制配置服务器多久会从你的 Git 后端获取更新的配置数据。此属性的值以秒为单位指定。默认情况下,该值为 0,这意味着配置服务器将在每次请求时从 Git Repo 获取更新的配置。 -##### [Default Label](#_default_label) +##### [默认标签](#_default_label) -Git 使用的默认标签是`main`。如果你没有设置`spring.cloud.config.server.git.defaultLabel`,并且一个名为`main`的分支不存在,则默认情况下,配置服务器还将尝试检出一个名为`master`的分支。如果你想禁用回退分支行为,可以将 ` Spring.cloud.config.server.git.trymasterbranch` 设置为`false`。 +Git 使用的默认标签是`main`。如果没有设置`spring.cloud.config.server.git.defaultLabel`并且一个名为`main`的分支不存在,则默认情况下,配置服务器还将尝试检出一个名为`master`的分支。如果你想禁用回退分支行为,那么可以将`spring.cloud.config.server.git.tryMasterBranch`设置为`false`。 #### [版本控制后端文件系统的使用](#_version_control_backend_filesystem_use) -| |使用基于 VCS 的后端,文件将被签出或克隆到本地文件系统中,
默认情况下,它们被放入系统临时目录中,前缀为`config-repo-`,例如,在 Linux 上,
,可能是`/tmp/config-repo-`。
某些操作系统[定期清理](https://serverfault.com/questions/377348/when-does-tmp-get-cleared/377349#377349)临时目录。
这可能会导致意想不到的行为,例如丢失属性。,
为了避免这个问题,将`spring.cloud.config.server.git.basedir`或`spring.cloud.config.server.svn.basedir`设置为不驻留在系统临时结构中的目录,从而更改 Config 服务器使用的目录。| +| |使用基于 VCS 的后端(Git,SVN),文件会被签出或克隆到本地文件系统中,
默认情况下,它们会被放到系统临时目录中,前缀为`config-repo-`,例如,在 Linux 上,
,它可能是`/tmp/config-repo-`。
某些操作系统[定期清理](https://serverfault.com/questions/377348/when-does-tmp-get-cleared/377349#377349)临时目录。
这可能会导致意想不到的行为,例如丢失属性。,
为了避免这个问题,将`spring.cloud.config.server.git.basedir`或`spring.cloud.config.server.svn.basedir`设置为不驻留在系统临时结构中的目录,从而更改 Config 服务器使用的目录。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### [文件系统后端](#_file_system_backend) -配置服务器中还有一个“本机”配置文件,它不使用 Git,而是从本地 Classpath 或文件系统(你想用`spring.cloud.config.server.native.searchLocations`指向的任何静态 URL)加载配置文件。要使用本机配置文件,使用`spring.profiles.active=native`启动配置服务器。 +配置服务器中还有一个“原生”配置文件,它不使用 Git,而是从本地 Classpath 或文件系统(你想用`spring.cloud.config.server.native.searchLocations`指向的任何静态 URL)加载配置文件。要使用本机配置文件,使用`spring.profiles.active=native`启动配置服务器。 -| |记住对文件资源使用`file:`前缀(不带前缀的默认情况通常是 Classpath)。
与任何 Spring 引导配置一样,你可以嵌入`${}`-风格的环境占位符,但请记住,Windows 中的绝对路径需要额外的`/`(例如,`[file:///${user.home}/config-repo](file:///${user.home}/config-repo)`)。| +| |记住对文件资源使用`file:`前缀(没有前缀的默认情况通常是 Classpath)。
与任何 Spring 引导配置一样,你可以嵌入`${}`-风格的环境占位符,但请记住,Windows 中的绝对路径需要额外的`/`(例如,`[file:///${user.home}/config-repo](file:///${user.home}/config-repo)`)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |`searchLocations`的默认值与本地 Spring 引导应用程序(即`[classpath:/, classpath:/config,
file:./, file:./config]`)相同。
这不会将来自服务器的`application.properties`公开给所有客户端,因为服务器中存在的任何属性源在发送到客户端之前都会被删除。| @@ -1880,7 +646,7 @@ Git 使用的默认标签是`main`。如果你没有设置`spring.cloud.config.s 如果在搜索位置中不使用占位符,那么这个存储库还会将 HTTP 资源的`{label}`参数附加到搜索路径的后缀中,因此,属性文件是从每个搜索位置**和**一个与标签同名的子目录加载的(在 Spring 环境中,标记属性优先)。因此,不带占位符的默认行为与添加以`/{label}/`结尾的搜索位置相同。例如,`file:/tmp/config`与`file:/tmp/config,file:/tmp/config/{label}`相同。可以通过设置`spring.cloud.config.server.native.addLabelLocations=false`来禁用此行为。 -#### [Vault Backend](#vault-backend) +#### [保险库后端](#vault-backend) Spring Cloud Config Server 还支持[Vault](https://www.vaultproject.io)作为后端。 @@ -1934,7 +700,7 @@ dependencies { | |Vault0.10.0 引入了一个版本控制的键值后端(k/v 后端版本 2),该版本公开了与早期版本不同的 API,现在它需要在挂载路径和实际上下文路径之间设置`data/`,并在`data`对象中包装秘密。设置`spring.cloud.config.server.vault.kv-version=2`将考虑到这一点。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -可选地,存在对 Vault Enterprise`X-Vault-Namespace`头的支持。要将它发送到 Vault,请设置`namespace`属性。 +可选地,存在对 Vault Enterprise`X-Vault-Namespace`头的支持。要将其发送到 Vault,请设置`namespace`属性。 在配置服务器运行时,你可以向服务器发出 HTTP 请求,以便从保险库后端取回值。要做到这一点,你需要为你的保险库服务器提供一个令牌。 @@ -1980,7 +746,7 @@ $ vault kv put secret/myapp foo=myappsbar 客户机提供必要的身份验证以让 Config Server 与 Vault 对话的默认方式是设置 X-Config-Token 头。但是,你可以通过设置与 Spring Cloud Vault 相同的配置属性,省略标题并在服务器中配置身份验证。要设置的属性是`spring.cloud.config.server.vault.authentication`。应该将其设置为受支持的身份验证方法之一。你可能还需要设置特定于你使用的身份验证方法的其他属性,方法是使用与`spring.cloud.vault`相同的属性名称,而不是使用`spring.cloud.config.server.vault`前缀。有关更多详细信息,请参见[Spring Cloud Vault Reference Guide](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication)。 -| |如果省略了 x-config-token 头并使用服务器属性来设置身份验证,则 Config 服务器应用程序需要对 Spring Vault 有一个额外的依赖项,以启用额外的身份验证选项。
有关如何添加该依赖项,请参见[Spring Vault Reference Guide](https://docs.spring.io/spring-vault/docs/current/reference/html/#dependencies)。| +| |如果省略 X-Config-Token 头并使用服务器属性设置身份验证,则 Config 服务器应用程序需要对 Spring Vault 有一个额外的依赖项,以启用额外的身份验证选项。
有关如何添加该依赖项,请参见[Spring Vault Reference Guide](https://docs.spring.io/spring-vault/docs/current/reference/html/#dependencies)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### [多属性源](#_multiple_properties_sources) @@ -1998,9 +764,9 @@ secret/application #### [通过代理访问后端](#_accessing_backends_through_a_proxy) -配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。在`proxy.http`和`proxy.https`下的设置可以控制 Git 或 Vault 的这种行为。这些设置是每个存储库设置的,因此,如果使用[复合环境存储库](#composite-environment-repositories),则必须为组合中的每个后端单独配置代理设置。如果使用的网络需要为 HTTP 和 HTTPS URL 提供单独的代理服务器,则可以为单个后端配置 HTTP 和 HTTPS 代理设置。 +配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。此行为由`proxy.http`和`proxy.https`下的设置控制,用于 Git 或 Vault。这些设置是每个存储库设置的,因此,如果使用[复合环境存储库](#composite-environment-repositories),则必须为组合中的每个后端单独配置代理设置。如果使用的网络需要为 HTTP 和 HTTPS URL 提供单独的代理服务器,则可以为单个后端配置 HTTP 和 HTTPS 代理设置。 -下表描述了 HTTP 和 HTTPS 代理的代理配置属性。所有这些属性都必须以`proxy.http`或`proxy.https`为前缀。 +下表描述了 HTTP 和 HTTPS 代理的代理配置属性。所有这些属性必须以`proxy.http`或`proxy.https`为前缀。 | Property Name |备注| |-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -2036,26 +802,26 @@ spring: * [基于文件的存储库](#spring-cloud-config-server-file-based-repositories) -* [Vault Server](#spring-cloud-config-server-vault-server) +* [保险库服务器](#spring-cloud-config-server-vault-server) ##### [基于文件的存储库](#spring-cloud-config-server-file-based-repositories) -对于基于文件的(Git、SVN 和 Native)存储库,文件名为`application*`(`application.properties’、`application.yml`、`application-*.properties`等)的资源在所有客户端应用程序之间共享。你可以使用这些文件名的资源来配置全局默认值,并在必要时让它们被特定于应用程序的文件覆盖。 +对于基于文件的(Git、SVN 和 Native)存储库,文件名为`application*`(`application.properties`、`application.yml`、`application-*.properties`等)的资源在所有客户端应用程序之间共享。你可以使用这些文件名的资源来配置全局默认值,并在必要时让它们被特定于应用程序的文件覆盖。 [属性重写](#property-overrides)特性还可以用于设置全局默认值,占位符应用程序可以在本地覆盖它们。 | |对于“本机”配置文件(本地文件系统后端),你应该使用一个不属于服务器自身配置的显式搜索位置。
否则,默认搜索位置中的`application*`资源将被删除,因为它们是服务器的一部分。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -##### [Vault Server](#spring-cloud-config-server-vault-server) +##### [保险库服务器](#spring-cloud-config-server-vault-server) -当使用 Vault 作为后端时,你可以通过在`secret/application`中放置配置来与所有应用程序共享配置。例如,如果你运行下面的 Vault 命令,那么所有使用 Config 服务器的应用程序都将具有它们可用的属性`foo`和`baz`: +当使用 Vault 作为后端时,你可以通过在`secret/application`中放置配置来与所有应用程序共享配置。例如,如果你运行以下 Vault 命令,那么所有使用 Config 服务器的应用程序都将具有它们可用的属性`foo`和`baz`: ``` $ vault write secret/application foo=bar baz=bam ``` -##### [CredHub Server](#_credhub_server) +##### [CredHub 服务器](#_credhub_server) 当使用 Credhub 作为后端时,你可以通过将配置放置在`/application/`中或将其放置在应用程序的`default`配置文件中来与所有应用程序共享配置。例如,如果你运行下面的 credhub 命令,那么所有使用 Config 服务器的应用程序都将具有它们可用的属性`shared.color1`和`shared.color2`: @@ -2071,7 +837,7 @@ value: {"shared.word1": "hello", "shared.word2": "world"} #### [AWS 秘密管理器](#_aws_secrets_manager) -当使用 AWS Secrets Manager 作为后端时,你可以通过将配置放置在`/application/`中或将其放置在应用程序的`default`配置文件中来与所有应用程序共享配置。例如,如果使用以下键添加秘密,那么所有使用配置服务器的应用程序都将具有它们可用的属性`shared.foo`和`shared.bar`: +当使用 AWS Secrets Manager 作为后端时,你可以通过将配置放置在`/application/`中或将其放置在应用程序的`default`配置文件中来与所有应用程序共享配置。例如,如果你使用以下键添加秘密,那么所有使用配置服务器的应用程序都将具有它们可用的属性`shared.foo`和`shared.bar`: ``` secret name = /secret/application-default/ @@ -2110,17 +876,17 @@ secret value = /config/application-default/fred.baz ``` -#### [JDBC Backend](#_jdbc_backend) +#### [JDBC 后端](#_jdbc_backend) -Spring 云配置服务器支持 JDBC(关系数据库)作为配置属性的后端。你可以通过向 Classpath 中添加`spring-jdbc`并使用`jdbc`配置文件或通过添加类型`JdbcEnvironmentRepository`的 Bean 来启用此功能。如果你包括对 Classpath 的正确依赖关系(有关该依赖关系的更多详细信息,请参见用户指南),则 Spring 引导将配置数据源。 +Spring Cloud 配置服务器支持 JDBC(关系数据库)作为配置属性的后端。你可以通过向 Classpath 中添加`spring-jdbc`并使用`jdbc`配置文件或通过添加类型`JdbcEnvironmentRepository`的 Bean 来启用此功能。如果你包括对 Classpath 的正确依赖关系(有关此的更多详细信息,请参见用户指南),则 Spring 引导将配置数据源。 通过将`spring.cloud.config.server.jdbc.enabled`属性设置为`false`,可以禁用`JdbcEnvironmentRepository`的自动配置。 数据库需要有一个名为`PROPERTIES`的表,其中的列分别为`APPLICATION`、`PROFILE`和`LABEL`(具有通常的`Environment`含义),加上`KEY`和`VALUE`用于`Properties`样式中的键和值对。在 Java 中,所有字段都是 String 类型的,因此你可以使它们`VARCHAR`具有所需的任何长度。如果属性值来自名为`{application}-{profile}.properties`的 Spring 引导属性文件,则属性值的行为与它们的行为相同,包括所有的加密和解密,这些将作为后处理步骤应用(即,不直接在存储库实现中)。 -#### [Redis Backend](#_redis_backend) +#### [Redis 后端](#_redis_backend) -Spring 云配置服务器支持 Redis 作为配置属性的后端。你可以通过向[Spring Data Redis](https://spring.io/projects/spring-data-redis)添加依赖项来启用此功能。 +Spring Cloud Config Server 支持 Redis 作为配置属性的后端。你可以通过向[Spring Data Redis](https://spring.io/projects/spring-data-redis)添加依赖项来启用此功能。 POM.xml @@ -2164,9 +930,9 @@ HGETALL sample-app | |当未指定配置文件时,将使用`default`。| |---|----------------------------------------------------| -#### [AWS S3 Backend](#_aws_s3_backend) +#### [AWS S3 后端](#_aws_s3_backend) -Spring 云配置服务器支持 AWS S3 作为配置属性的后端。你可以通过向[亚马逊 S3 的 AWS Java SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3.html)添加依赖项来启用此功能。 +Spring Cloud 配置服务器支持 AWS S3 作为配置属性的后端。你可以通过向[亚马逊 S3 的 AWS Java SDK](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3.html)添加依赖项来启用此功能。 POM.xml @@ -2204,7 +970,7 @@ spring: #### [AWS 参数存储后端](#_aws_parameter_store_backend) -Spring 云配置服务器支持 AWS 参数存储作为配置属性的后端。你可以通过向[面向 SSM 的 AWS Java SDK](https://github.com/aws/aws-sdk-java/tree/master/aws-java-sdk-ssm)添加依赖项来启用此功能。 +Spring Cloud 配置服务器支持 AWS 参数存储作为配置属性的后端。你可以通过向[面向 SSM 的 AWS Java SDK](https://github.com/aws/aws-sdk-java/tree/master/aws-java-sdk-ssm)添加依赖项来启用此功能。 POM.xml @@ -2250,7 +1016,7 @@ spring: AWS 参数存储 API 凭据是使用[默认凭据提供器链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)确定的。已支持版本控制的参数,其默认行为是返回最新版本。 -| |* 当没有指定应用程序时,`application`是默认值,当没有指定配置文件时,使用`default`。

*`awsparamstore.prefix`的有效值必须以前斜杠开始,然后是一个或多个有效路径段,否则为空,

*`awsparamstore.profile-separator`的有效值只能包含点,破折号和下划线。

*`awsparamstore.max-results`的有效值必须在**[1, 10]**范围内。| +| |* 当没有指定应用程序`application`为默认值时,并且当没有指定配置文件时`default`被使用。

*`awsparamstore.prefix`的有效值必须从前斜杠开始,然后是一个或多个有效的路径段,否则将为空。

*`awsparamstore.profile-separator`的有效值只能包含点,破折号和下划线。

*`awsparamstore.max-results`的有效值必须在**[1, 10]**范围内。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| #### [AWS Secrets Manager 后端](#_aws_secrets_manager_backend) @@ -2285,10 +1051,10 @@ spring: AWS Secrets Manager API 凭据是使用[默认凭据提供器链](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default)确定的。 -| |* When no application is specified `application` is the default, and when no profile is specified `default` is used.| +| |* 当没有指定应用程序时`application`是默认值,当没有指定配置文件时,使用`default`。| |---|--------------------------------------------------------------------------------------------------------------------| -#### [CredHub Backend](#_credhub_backend) +#### [Credhub 后端](#_credhub_backend) Spring Cloud Config Server 支持[CredHub](https://docs.cloudfoundry.org/credhub)作为配置属性的后端。你可以通过向[Spring CredHub](https://spring.io/projects/spring-credhub)添加依赖项来启用此功能。 @@ -2388,7 +1154,7 @@ spring: token-uri: https://uaa:8443/oauth/token ``` -| |所使用的 UAA 客户机 ID 应有`credhub.read`作为作用域。| +| |使用的 UAA 客户机 ID 应该有`credhub.read`作为作用域。| |---|-----------------------------------------------------------| #### [复合环境存储库](#composite-environment-repositories) @@ -2414,7 +1180,7 @@ spring: uri: file:///path/to/walter/git/repo ``` -使用此配置,优先级由`composite`键下列出存储库的顺序决定。在上面的示例中,首先列出了 Subversion 存储库,因此在 Subversion 存储库中找到的值将覆盖在一个 Git 存储库中为相同属性找到的值。在`rex`Git 存储库中找到的值将被用于在`walter`Git 存储库中为相同属性找到的值之前。 +使用此配置,优先级由`composite`键下列出存储库的顺序决定。在上面的示例中,首先列出了 Subversion 存储库,因此在 Subversion 存储库中找到的值将覆盖在一个 Git 存储库中为相同属性找到的值。在`rex`Git 存储库中找到的值将在`walter`Git 存储库中为相同属性找到的值之前使用。 如果只想从不同类型的存储库中提取配置数据,那么可以在配置服务器的应用程序属性或 YAML 文件中启用相应的配置文件,而不是`composite`配置文件。例如,如果希望从单个 Git 存储库和单个 HashiCorpVault 服务器中提取配置数据,则可以为配置服务器设置以下属性: @@ -2436,18 +1202,18 @@ spring: 使用此配置,可以通过`order`属性来确定优先级。你可以使用`order`属性来指定所有存储库的优先级顺序。`order`属性的数值越低,它的优先级就越高。存储库的优先级顺序有助于解决包含相同属性的值的存储库之间的任何潜在冲突。 -| |如果你的组合环境像前面的示例一样包含一个 Vault 服务器,那么你必须在向配置服务器提出的每个请求中都包含一个 Vault 令牌。见[Vault Backend](#vault-backend)。| +| |如果你的组合环境像前面的示例一样包含一个 Vault 服务器,那么你必须在向配置服务器提出的每个请求中都包含一个 Vault 令牌。见[保险库后端](#vault-backend)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |当从环境存储库检索值时,任何类型的失败都会导致整个复合环境失败。
如果你希望在存储库失败时继续进行复合,则可以将`spring.cloud.config.server.failOnCompositeError`设置为`false`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在使用复合环境时,所有存储库都包含相同的标签是很重要的,
如果你的环境与前面示例中的环境类似,并且你使用`master`标签请求配置数据,但是 Subversion 存储库不包含一个名为`master`的分支,整个请求都失败了。| +| |在使用复合环境时,所有存储库都包含相同的标签是很重要的,
如果你的环境与前面的示例中的环境类似,并且你使用`master`标签请求配置数据,但是 Subversion 存储库不包含一个名为`master`的分支,整个请求都失败了。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ##### [自定义复合环境存储库](#_custom_composite_environment_repositories) -除了使用 Spring 云中的一个环境存储库外,还可以提供你自己的`EnvironmentRepository` Bean 以作为复合环境的一部分。要做到这一点,你的 Bean 必须实现`EnvironmentRepository`接口。如果希望在复合环境中控制自定义`EnvironmentRepository`的优先级,还应该实现`Ordered`接口并覆盖`getOrdered`方法。如果你没有实现`Ordered`接口,那么你的`EnvironmentRepository`将获得最低的优先级。 +除了使用 Spring Cloud 中的一个环境存储库外,还可以提供你自己的`EnvironmentRepository` Bean,作为复合环境的一部分。要做到这一点,你的 Bean 必须实现`EnvironmentRepository`接口。如果希望在复合环境中控制自定义`EnvironmentRepository`的优先级,还应该实现`Ordered`接口并覆盖`getOrdered`方法。如果你没有实现`Ordered`接口,那么你的`EnvironmentRepository`将获得最低的优先级。 #### [属性重写](#property-overrides) @@ -2464,13 +1230,13 @@ spring: 前面的示例使所有配置客户机的应用程序读取`foo=bar`,这与它们自己的配置无关。 -| |配置系统不能强制应用程序以任何特定方式使用配置数据。
因此,重写是不可执行的。
但是,它们确实为 Spring 云配置客户机提供了有用的默认行为。| +| |配置系统不能强制应用程序以任何特定方式使用配置数据。
因此,重写是不可执行的。
但是,它们确实为 Spring Cloud 配置客户机提供了有用的默认行为。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |或`{`。例如,
可解析为`bar`,除非应用程序提供自己的`app.foo`。| +| |通常, Spring 具有`${}`的环境占位符可以通过使用反斜杠(`\`)来转义(并在客户机上解析),以转义`$`或`{`。
例如,`\${app.foo:bar}`可解析为`bar`,除非应用程序提供自己的`app.foo`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |在 YAML 中,你不需要转义反斜杠本身。
但是,在属性文件中,当你在服务器上配置重写时,你确实需要转义反斜杠。| +| |在 YAML 中,不需要转义反斜杠本身。
但是,在属性文件中,在服务器上配置重写时,确实需要转义反斜杠。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 通过在远程存储库中设置`spring.cloud.config.overrideNone=true`标志(默认值为 false),你可以将客户机中所有重写的优先级更改为更像默认值,让应用程序在环境变量或系统属性中提供它们自己的值。 @@ -2501,11 +1267,11 @@ spring: 你可以以任何对你有意义的方式(从物理网络安全到 OAuth2 承载令牌)保护你的配置服务器,因为 Spring 安全性和 Spring 启动为许多安全安排提供了支持。 -要使用默认的 Spring 引导配置的 HTTP 基本安全性,在 Classpath 上包括 Spring 安全性(例如,通过`spring-boot-starter-security`)。默认的是`user`的用户名和随机生成的密码。随机密码在实践中是没有用的,因此我们建议你配置密码(通过设置`spring.security.user.password`)并对其进行加密(请参阅下面的操作说明)。 +要使用默认的 Spring 启动配置的 HTTP 基本安全性,在 Classpath 上包括 Spring 安全性(例如,通过`spring-boot-starter-security`)。默认的是`user`的用户名和随机生成的密码。随机密码在实践中是没有用的,因此我们建议你配置密码(通过设置`spring.security.user.password`)并对其进行加密(请参阅下面的操作说明)。 ### [执行器和安全性](#_actuator_and_security) -| |一些平台配置健康检查或类似的东西,并指向`/actuator/health`或其他执行器端点。如果 Actuator 不是 Config Server 的依赖项,则对`/actuator/`**would match the config server API `/{application}/{label}` possibly leaking secure information. Remember to add the `spring-boot-starter-actuator` dependency in this case and configure the users such that the user that makes calls to `/actuator/`**的请求没有访问`/{application}/{label}`上的 Config Server API 的权限。| +| |一些平台配置健康检查或类似的东西,并指向`/actuator/health`或其他执行器端点。如果致动器不是配置服务器的依赖项,则对`/actuator/`**的请求将匹配配置服务器 API`/{application}/{label}`可能泄漏安全信息。在这种情况下,请记住添加`spring-boot-starter-actuator`依赖项,并对用户进行配置,使调用`/actuator/`** 的用户无法访问`/{application}/{label}`上的配置服务器 API。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [加密和解密](#_encryption_and_decryption) @@ -2513,7 +1279,7 @@ spring: | |要使用加密和解密功能,你需要在你的 JVM 中安装全强度 JCE(默认情况下不包括它)。
你可以从 Oracle 下载“Java Cryptography Extension(JCE)Unlimited Strength Juridictory Policy Files”,并按照安装说明(基本上,你需要用下载的文件替换 JRElib/security 目录中的两个策略文件)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果远程属性源包含加密的内容(以`{cipher}`开头的值),则在通过 HTTP 发送到客户机之前对它们进行解密。这种设置的主要优点是,当属性值“处于静止状态”(例如,在 Git 存储库中)时,它们不需要是纯文本的。如果一个值不能被解密,它将从属性源中删除,并添加一个附加的属性,使用相同的键,但前缀是`invalid`和一个表示“不适用”的值(通常是``)。这在很大程度上是为了防止密码文本被用作密码而意外泄露。 +如果远程属性源包含加密的内容(以`{cipher}`开头的值),则在通过 HTTP 发送到客户机之前对它们进行解密。这种设置的主要优点是,当属性值“处于静止状态”(例如,在 Git 存储库中)时,它们不需要是纯文本的。如果一个值不能解密,则从属性源中删除它,并添加一个附加的属性,该属性使用相同的键,但前缀为`invalid`和一个表示“不适用”的值(通常是``)。这在很大程度上是为了防止密码文本被用作密码而意外泄露。 如果你为配置客户机应用程序设置了一个远程配置存储库,那么它可能包含一个`application.yml`,类似于以下内容: @@ -2535,7 +1301,7 @@ spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ ``` -你可以安全地将这个纯文本推送到共享的 Git 存储库,并且秘密密码仍然受到保护。 +你可以将这个纯文本安全地推送到一个共享的 Git 存储库,并且秘密密码仍然受到保护。 服务器还公开`/encrypt`和`/decrypt`端点(假设这些端点是安全的,并且仅由授权的代理访问)。如果编辑远程配置文件,可以使用配置服务器通过发布到`/encrypt`端点来加密值,如下例所示: @@ -2557,11 +1323,11 @@ $ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade33 mysecret ``` -在将加密值放入 YAML 或 Properties 文件之前,在提交并将其推送到远程(可能不安全)存储之前,获取加密值并添加`{cipher}`前缀。 +获取加密值,并在将其放入 YAML 或 Properties 文件之前以及提交并将其推送到远程(可能不安全)存储之前添加`{cipher}`前缀。 -`/encrypt`和`/decrypt`端点也都以`/*/{application}/{profiles}`的形式接受路径,当客户端调用主环境资源时,该路径可用于在每个应用程序(名称)和每个配置文件的基础上控制密码学。 +`/encrypt`和`/decrypt`端点也都接受`/*/{application}/{profiles}`形式的路径,当客户调用主环境资源时,可以使用该路径在每个应用程序(名称)和每个配置文件的基础上控制加密。 -| |要以这种细粒度的方式控制加密,还必须提供类型`@Bean`的`TextEncryptorLocator`,该类型根据名称和配置文件创建不同的加密器。
默认情况下提供的加密器不会这样做(所有加密都使用相同的密钥)。| +| |要以这种细粒度的方式控制加密,还必须提供类型`@Bean`的`@Bean`,该类型的`TextEncryptorLocator`根据名称和配置文件创建不同的加密器。
默认情况下提供的加密器不会这样做(所有加密都使用相同的密钥)。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| `spring`命令行客户端(安装了 Spring Cloud CLI 扩展)也可用于加密和解密,如以下示例所示: @@ -2583,7 +1349,7 @@ AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+... | |`--key`参数是强制性的(尽管有`--`前缀)。| |---|-----------------------------------------------------------------| -### [Key Management](#_key_management) +### [密钥管理](#_key_management) 配置服务器可以使用对称(共享)密钥或非对称(RSA 密钥对)密钥。非对称选择在安全性方面更好,但是使用对称密钥通常更方便,因为它是在`bootstrap.properties`中配置的单个属性值。 @@ -2633,7 +1399,7 @@ encrypt: ### [使用多个键和键旋转](#_using_multiple_keys_and_key_rotation) -除了加密属性值中的`{cipher}`前缀外,配置服务器还在(base64 编码的)密码文本开始前查找零个或更多的`{name:value}`前缀。这些密钥被传递给`TextEncryptorLocator`,它可以执行所需的任何逻辑来为密码定位`TextEncryptor`。如果你已经配置了一个密钥存储库,那么默认定位器将查找由`key`前缀提供的别名的密钥,并使用类似于以下内容的密码文本: +除了加密属性值中的`{cipher}`前缀外,配置服务器还在(base64 编码的)密码文本开始之前查找零个或更多的`{name:value}`前缀。这些密钥被传递给`TextEncryptorLocator`,它可以执行所需的任何逻辑来为密码定位`TextEncryptor`。如果你已经配置了一个密钥存储库(`encrypt.keystore.location`),则默认定位器将查找由`key`前缀提供的别名的密钥,并使用类似于以下内容的密码文本: ``` foo: @@ -2649,10 +1415,9 @@ foo: ### [服务加密的属性](#_serving_encrypted_properties) -有时,你希望客户机在本地解密配置,而不是在服务器中进行解密。在那种情况下,如果你提供`encrypt.*`配置来定位一个密钥,你仍然可以拥有`/encrypt`和`/decrypt`端点,但是你需要通过将`spring.cloud.config.server.encrypt.enabled=false`放置在`bootstrap.[yml|properties]`中来显式地关闭输出属性的解密。如果你不关心端点,那么如果你不配置键或启用的标志,那么它应该可以工作。 +有时,你希望客户机在本地解密配置,而不是在服务器中进行解密。在这种情况下,如果你提供`encrypt.*`配置来定位一个密钥,那么你仍然可以拥有`/encrypt`和`/decrypt`端点,但是你需要通过将`spring.cloud.config.server.encrypt.enabled=false`放在`bootstrap.[yml|properties]`中来显式地关闭输出属性的解密。如果你不关心端点,那么如果你不配置键或启用的标志,那么它应该可以工作。 -[提供替代格式](#_serving_alternative_formats) ----------- +## [提供替代格式](#_serving_alternative_formats) 来自环境端点的默认 JSON 格式非常适合 Spring 应用程序使用,因为它直接映射到`Environment`抽象。如果你愿意,可以通过向资源路径添加一个后缀(“.yml”、“.yaml”或“.properties”)来使用与 YAML 或 Java 属性相同的数据。这对于不关心 JSON 端点的结构或它们提供的额外元数据的应用程序来说是有用的(例如,不使用 Spring 的应用程序可能会受益于这种方法的简单性)。 @@ -2661,12 +1426,11 @@ YAML 和 Properties 表示有一个额外的标志(作为布尔查询参数提 | |在使用 YAML 或 Properties 格式时有一些限制,主要是与元数据的丢失有关,
例如,JSON 被构建为一个有序的属性源列表,其名称与源相关,
YAML 和 Properties 表单合并成一个映射,即使值的原点有多个源,并且原始源文件的名称丢失。
同样,YAML 表示也不一定是备份存储库中 YAML 源的忠实表示。它是由一个平面属性源列表构建的,并且必须对键的形式进行假设。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[提供纯文本](#_serving_plain_text) ----------- +## [提供纯文本](#_serving_plain_text) -与使用`Environment`抽象(或 YAML 或 Properties 格式的替代表示形式之一)不同,你的应用程序可能需要针对其环境定制的通用纯文本配置文件。配置服务器通过位于`/{application}/{profile}/{label}/{path}`的附加端点提供这些,其中`application`、`profile`和`label`与常规环境端点具有相同的含义,但是`path`是一个文件名的路径(例如`log.xml`)。该端点的源文件的定位方式与环境端点的定位方式相同。相同的搜索路径用于属性和 YAML 文件。然而,不是聚集所有匹配的资源,而是只返回第一个匹配的资源。 +与使用`Environment`抽象(或 YAML 或 Properties 格式的替代表示形式之一)不同,你的应用程序可能需要针对其环境定制的通用纯文本配置文件。配置服务器通过位于`/{application}/{profile}/{label}/{path}`的附加端点提供这些,其中`application`、`profile`和`label`与常规环境端点具有相同的含义,但是`path`是一个文件名的路径(例如`log.xml`)。该端点的源文件的定位方式与环境端点的定位方式相同。相同的搜索路径用于属性和 YAML 文件。然而,不是聚合所有匹配的资源,而是只返回第一个匹配的资源。 -在找到资源之后,使用有效的`Environment`对提供的应用程序名称、配置文件和标签解析正常格式的占位符。通过这种方式,资源端点与环境端点紧密集成。 +在找到资源之后,通过使用有效的`Environment`表示提供的应用程序名称、配置文件和标签,以正常格式(`${…​}`)的占位符进行解析。通过这种方式,资源端点与环境端点紧密集成。 | |与用于环境配置的源文件一样,`profile`用于解析文件名。
因此,如果你想要一个配置文件特定的文件,`/*/development/*/logback.xml`可以通过一个名为`logback-development.xml`的文件进行解析(优先于`logback.xml`)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -2674,7 +1438,7 @@ YAML 和 Properties 表示有一个额外的标志(作为布尔查询参数提 | |如果不想提供`label`并让服务器使用默认标签,则可以提供一个`useDefaultLabel`请求参数。
因此,前面的`default`配置文件示例可以是`/sample/default/nginx.conf?useDefaultLabel`。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -目前, Spring Cloud Config 可以为 Git、SVN、本机后台和 AWS S3 提供明文服务。对 Git、SVN 和本机后台的支持是相同的。AWS S3 的工作原理略有不同。以下几节展示了每一项的工作原理: +目前, Spring Cloud Config 可以为 Git、SVN、原生后台和 AWS S3 提供明文服务。对 Git、SVN 和本机后台的支持是相同的。AWS S3 的工作原理略有不同。以下几节展示了每一项的工作原理: * [Git、SVN 和本机后端](#spring-cloud-config-serving-plain-text-git-svn-native-backends) @@ -2712,7 +1476,7 @@ nginx: name: develop.com ``` -`/sample/default/master/nginx.conf`资源可能如下: +资源`/sample/default/master/nginx.conf`如下: ``` server { @@ -2732,7 +1496,7 @@ server { ### [AWS S3](#spring-cloud-config-serving-plain-text-aws-s3) -要为 AWS S3 启用纯文本服务,Config Server 应用程序需要包括对 Spring Cloud AWS 的依赖。有关如何设置该依赖项的详细信息,请参见[Spring Cloud AWS Reference Guide](https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.3.RELEASE/single/spring-cloud-aws.html#_spring_cloud_aws_maven_dependency_management)。然后需要配置 Spring 云 AWS,如[Spring Cloud AWS Reference Guide](https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.3.RELEASE/single/spring-cloud-aws.html#_configuring_credentials)中所述。 +要为 AWS S3 启用纯文本服务,Config Server 应用程序需要包括对 Spring Cloud AWS 的依赖。有关如何设置该依赖项的详细信息,请参见[Spring Cloud AWS Reference Guide](https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.3.RELEASE/single/spring-cloud-aws.html#_spring_cloud_aws_maven_dependency_management)。然后需要配置 Spring Cloud AWS,如[Spring Cloud AWS Reference Guide](https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.3.RELEASE/single/spring-cloud-aws.html#_configuring_credentials)中所述。 ### [解密纯文本](#_decrypting_plain_text) @@ -2743,8 +1507,7 @@ server { 如果启用了此功能,并且请求了不受支持的文件扩展,则文件中的任何加密值都不会被解密。 -[嵌入配置服务器](#_embedding_the_config_server) ----------- +## [嵌入配置服务器](#_embedding_the_config_server) 配置服务器作为独立应用程序运行得最好。但是,如果需要,你可以将其嵌入到另一个应用程序中。要做到这一点,请使用`@EnableConfigServer`注释。在这种情况下,一个名为`spring.cloud.config.server.bootstrap`的可选属性是有用的。它是一个标志,指示服务器是否应该从自己的远程存储库中配置自己。默认情况下,标志是关闭的,因为它可能会延迟启动。然而,当嵌入到另一个应用程序中时,以与任何其他应用程序相同的方式初始化是有意义的。当将`spring.cloud.config.server.bootstrap`设置为`true`时,还必须使用[复合环境存储库配置](#composite-environment-repositories)。例如 @@ -2763,30 +1526,28 @@ spring: bootstrap: true ``` -| |如果使用 bootstrap 标志,配置服务器需要在`bootstrap.yml`中配置其名称和存储库 URI。| +| |如果使用 Bootstrap 标志,则配置服务器需要在`bootstrap.yml`中配置其名称和存储库 URI。| |---|-------------------------------------------------------------------------------------------------------------------------| 要更改服务器端点的位置,可以(可选地)设置`spring.cloud.config.server.prefix`(例如,`/config`),以在前缀下提供资源。前缀应该以`/`开始,而不是结束。它被应用到配置服务器中的`@RequestMappings`(即在 Spring 引导`server.servletPath`和`server.contextPath`前缀下)。 如果你想直接从后端存储库(而不是从配置服务器)读取应用程序的配置,那么基本上需要一个没有端点的嵌入式配置服务器。你可以通过不使用`@EnableConfigServer`注释(set`spring.cloud.config.server.bootstrap=true`)来完全关闭端点。 -[Push Notifications and Spring Cloud Bus](#_push_notifications_and_spring_cloud_bus) ----------- +## [Push Notifications and Spring Cloud Bus](#_push_notifications_and_spring_cloud_bus) -许多源代码存储库提供商(如 GitHub、GitLab、Gitea、Gitee、GOGS 或 Bitbucket)通过 Webhook 通知你存储库中的更改。你可以通过提供者的用户界面将 Webhook 配置为一个 URL 和一组你感兴趣的事件。例如,[Github](https://developer.github.com/v3/activity/events/types/#pushevent)使用发送到 Webhook 的 post,其 JSON 主体包含提交列表,并将头设置为`push`。如果你在`spring-cloud-config-monitor`库上添加了一个依赖项,并激活了配置服务器中的 Spring 云总线,那么将启用一个`/monitor`端点。 +许多源代码存储库提供商(如 GitHub、GitLab、Gitea、Gitee、GOGS 或 Bitbucket)通过 Webhook 通知你存储库中的更改。你可以通过提供者的用户界面将 Webhook 配置为一个 URL 和一组你感兴趣的事件。例如,[Github](https://developer.github.com/v3/activity/events/types/#pushevent)使用到 Webhook 的 POST,其中的 JSON 主体包含提交列表,并将标题(`X-Github-Event`)设置为`push`。如果你在`spring-cloud-config-monitor`库上添加了一个依赖项,并激活了配置服务器中的 Spring Cloud 总线,那么将启用一个`/monitor`端点。 -当 Webhook 被激活时,配置服务器发送一个`RefreshRemoteApplicationEvent`,目标是它认为可能已经更改的应用程序。可以对变化检测制定策略。但是,默认情况下,它会查找与应用程序名称匹配的文件中的更改(例如,`foo.properties`是针对`foo`应用程序的,而`application.properties`是针对所有应用程序的)。当你想要重写该行为时使用的策略是`PropertyPathNotificationExtractor`,它接受请求头和主体作为参数,并返回已更改的文件路径列表。 +当 Webhook 被激活时,配置服务器发送一个`RefreshRemoteApplicationEvent`,目标是它认为可能已经更改的应用程序。变更检测可以被战略化。但是,默认情况下,它会查找与应用程序名称匹配的文件中的更改(例如,`foo.properties`是针对`foo`应用程序的,而`application.properties`是针对所有应用程序的)。当你想要重写该行为时使用的策略是`PropertyPathNotificationExtractor`,它接受请求头和主体作为参数,并返回已更改的文件路径列表。 -对于 GitHub、GitLab、Gitea、Gitee、Gogs 或 Bitbucket,默认配置是开箱即用的。除了来自 GitHub、GitLab、Gitee 或 BitBucket 的 JSON 通知外,你还可以通过使用`/monitor`模式中的表单编码主体参数发布到`path={application}`来触发更改通知。这样做会向匹配`{application}`模式(其中可能包含通配符)的应用程序广播。 +对于 GitHub、GitLab、Gitea、Gitee、Gogs 或 Bitbucket,默认配置是开箱即用的。除了来自 GitHub、GitLab、Gitee 或 Bitbucket 的 JSON 通知外,你还可以通过使用`/monitor`模式中的表单编码主体参数发布到`path={application}`来触发更改通知。这样做会向匹配`{application}`模式(其中可能包含通配符)的应用程序广播。 -| |只有当`spring-cloud-bus`在配置服务器和客户机应用程序中都被激活时,才会传输`RefreshRemoteApplicationEvent`。| +| |只有当`spring-cloud-bus`在配置服务器和客户端应用程序中都激活`spring-cloud-bus`时,才会传输`RefreshRemoteApplicationEvent`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------| | |默认配置还会检测本地 Git 存储库中的文件系统更改。在这种情况下,不使用 Webhook。但是,一旦编辑配置文件,就会广播刷新。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[Spring Cloud Config Client](#_spring_cloud_config_client) ----------- +## [Spring Cloud Config Client](#_spring_cloud_config_client) Spring 引导应用程序可以立即利用 Spring 配置服务器(或由应用程序开发人员提供的其他外部属性源)。它还获取了一些与`Environment`更改事件相关的其他有用特性。 @@ -2809,7 +1570,7 @@ spring.config.import=optional:configserver: ### [配置第一引导程序](#config-first-bootstrap) -要使用传统的 Bootstrap 方式连接到 Config 服务器,必须通过属性或`spring-cloud-starter-bootstrap`启动器启用 Bootstrap。该属性为`spring.cloud.bootstrap.enabled=true`。它必须设置为系统属性或环境变量。一旦启动引导程序启用,在 Classpath 上使用 Spring Cloud Config 客户机的任何应用程序都将按以下方式连接到 Config 服务器:当一个 Config 客户机启动时,它将绑定到 Config 服务器(通过`spring.cloud.config.uri`Bootstrap 配置属性)并使用远程属性源初始化 Spring `Environment`。 +要使用传统的 Bootstrap 方式连接到 Config 服务器,必须通过属性或`spring-cloud-starter-bootstrap`启动器启用 Bootstrap。该属性是`spring.cloud.bootstrap.enabled=true`。它必须设置为系统属性或环境变量。一旦启动了引导程序,在 Classpath 上使用 Spring Cloud Config 客户端的任何应用程序都将按如下方式连接到 Config 服务器:当一个 Config 客户端启动时,它将绑定到 Config 服务器(通过`spring.cloud.config.uri`Bootstrap 配置属性)并使用远程属性源初始化 Spring `Environment`。 这种行为的最终结果是,所有想要使用配置服务器的客户端应用程序都需要一个`bootstrap.yml`(或一个环境变量),其服务器地址设置为`spring.cloud.config.uri`(默认为“http://localhost:8888”)。 @@ -2818,11 +1579,11 @@ spring.config.import=optional:configserver: | |除非你使用[配置第一引导程序](#config-first-bootstrap),否则你将需要在配置属性中使用`spring.config.import`属性,并使用`optional:`前缀。
例如,`spring.config.import=optional:configserver:`。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -如果使用`DiscoveryClient`实现,例如 Spring 云 Netflix 和 Eureka 服务 Discovery 或 Spring 云 Consul,则可以将配置服务器注册到该发现服务中。 +如果使用`DiscoveryClient`实现,例如 Spring Cloud Netflix 和 Eureka 服务 Discovery 或 Spring Cloud Consul,则可以将配置服务器注册到该发现服务中。 -如果你更喜欢使用`DiscoveryClient`来定位配置服务器,那么可以通过设置`spring.cloud.config.discovery.enabled=true`(默认值为`false`)来实现。例如,对于 Spring Cloud Netflix,你需要定义 Eureka 服务器地址(例如,在`eureka.client.serviceUrl.defaultZone`中)。使用此选项的价格是在启动时进行额外的网络往返,以定位服务注册。好处是,只要发现服务是一个固定点,配置服务器就可以更改其坐标。默认的服务 ID 是`configserver`,但是你可以在客户机上通过设置`spring.cloud.config.discovery.serviceId`来更改这个 ID(在服务器上,以服务的通常方式,例如通过设置`spring.application.name`)。 +如果你更喜欢使用`DiscoveryClient`来定位配置服务器,那么可以通过设置`spring.cloud.config.discovery.enabled=true`(默认值是`false`)来实现。例如,使用 Spring Cloud Netflix,你需要定义 Eureka 服务器地址(例如,在`eureka.client.serviceUrl.defaultZone`中)。使用此选项的价格是在启动时进行额外的网络往返,以定位服务注册。好处是,只要发现服务是一个固定点,配置服务器就可以更改其坐标。默认的服务 ID 是`configserver`,但是你可以在客户机上通过设置`spring.cloud.config.discovery.serviceId`来更改这个 ID(在服务器上,以服务的通常方式,例如通过设置`spring.application.name`)。 -发现客户机实现都支持某种元数据映射(例如,对于 Eureka,我们有`eureka.instance.metadataMap`)。配置服务器的一些附加属性可能需要在其服务注册元数据中进行配置,以便客户端能够正确地连接。如果配置服务器使用 HTTP Basic 进行安全保护,则可以将凭据配置为`user`和`password`。此外,如果配置服务器具有上下文路径,则可以设置`configPath`。例如,下面的 YAML 文件是针对作为 Eureka 客户机的配置服务器的: +发现客户机实现都支持某种元数据映射(例如,对于 Eureka,我们有`eureka.instance.metadataMap`)。配置服务器的一些附加属性可能需要在其服务注册元数据中进行配置,以便客户端能够正确地连接。如果配置服务器使用 HTTP Basic 进行了安全保护,则可以将凭据配置为`user`和`password`。此外,如果配置服务器具有上下文路径,则可以设置`configPath`。例如,下面的 YAML 文件是针对作为 Eureka 客户机的配置服务器的: ``` eureka: @@ -2849,7 +1610,7 @@ eureka: 如果你希望配置服务器在应用程序启动时偶尔不可用,那么可以在出现故障后让它继续尝试。首先,需要设置`spring.cloud.config.fail-fast=true`。然后你需要将`spring-retry`和`spring-boot-starter-aop`添加到你的 Classpath。默认的行为是重试六次,初始退避间隔为 1000ms,后续退避的指数乘数为 1.1。你可以通过设置`spring.cloud.config.retry.*`配置属性来配置这些属性(以及其他属性)。 -| |要完全控制重试行为并使用遗留引导程序,请添加一个`RetryOperationsInterceptor`类型的`@Bean`,ID 为`configServerRetryInterceptor`。
Spring 重试有一个`RetryInterceptorBuilder`,支持创建一个。| +| |要完全控制重试行为并使用遗留引导程序,请添加`RetryOperationsInterceptor`类型的`@Bean`,ID 为`configServerRetryInterceptor`。
Spring 重试有一个`RetryInterceptorBuilder`支持创建一个。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ### [Config Client Retry with spring.config.import](#_config_client_retry_with_spring_config_import) @@ -2874,7 +1635,7 @@ spring.config.import=configserver:http://configserver.example.com?fail-fast=true * “label”=“master” -| |在设置属性`${spring.application.name}`时,不要在应用程序名称前加上保留的单词`application-`,以防止解决正确属性源的问题。| +| |在设置属性`${spring.application.name}`时,不要在应用程序名称前加上保留的单词`application-`,以防止解决正确的属性源问题。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 你可以通过设置`spring.cloud.config.*`(其中`*`是`name`,`profile`或`label`)来覆盖所有这些参数。`label`对于回滚到以前版本的配置非常有用。使用默认的 Config 服务器实现,它可以是 Git 标签、分支名称或提交 ID。标签也可以作为逗号分隔的列表提供。在这种情况下,将逐个尝试列表中的项目,直到成功。在处理一个特性分支时,这种行为可能是有用的。例如,你可能希望将配置标签与你的分支对齐,但将其设置为可选的(在这种情况下,使用`spring.cloud.config.label=myfeature,develop`)。 @@ -2883,13 +1644,13 @@ spring.config.import=configserver:http://configserver.example.com?fail-fast=true 为了确保在部署了多个配置服务器实例并预期一个或多个实例不时不可用时具有高可用性,你可以指定多个 URL(在`spring.cloud.config.uri`属性下作为逗号分隔的列表),或者让你的所有实例在像 Eureka 这样的服务注册中心中注册(如果使用发现优先引导模式)。请注意,这样做仅在配置服务器不运行时(即应用程序退出时)或发生连接超时时时时才能确保高可用性。例如,如果 Config 服务器返回 500(内部服务器错误)响应,或者 Config 客户机从 Config 服务器接收 401(由于错误的凭据或其他原因),Config 客户机不会尝试从其他 URL 获取属性。这类错误表示用户问题,而不是可用性问题。 -如果你在配置服务器上使用 HTTP Basic Security,则当前只有在你在`spring.cloud.config.uri`属性下指定的每个 URL 中嵌入凭据时,才可能支持 per-config Server auth 凭据。如果使用任何其他类型的安全机制,则无法(当前)支持每个配置服务器的身份验证和授权。 +如果你在配置服务器上使用 HTTP Basic Security,那么目前只有在你在`spring.cloud.config.uri`属性下指定的每个 URL 中嵌入凭据时,才可能支持 per-config Server auth 凭据。如果使用任何其他类型的安全机制,则无法(当前)支持每个配置服务器的身份验证和授权。 ### [配置超时](#_configuring_timeouts) 如果你想配置超时阈值: -* 可以使用属性`spring.cloud.config.request-read-timeout`配置读超时。 +* 可以通过使用属性`spring.cloud.config.request-read-timeout`配置读超时。 * 可以使用属性`spring.cloud.config.request-connect-timeout`配置连接超时。 @@ -2946,7 +1707,7 @@ spring: `spring.cloud.config.tls.enabled`需要为 true 才能启用配置客户端 TLS。当省略`spring.cloud.config.tls.trust-store`时,将使用一个 JVM 默认信任存储区。`spring.cloud.config.tls.key-store-type`和`spring.cloud.config.tls.trust-store-type`的默认值是 PKCS12。如果省略了密码属性,则假定密码为空。 -如果使用另一种形式的安全性,则可能需要[provide a `RestTemplate`](#custom-rest-template)到`ConfigServicePropertySourceLocator`(例如,通过在 BootStrap 上下文中抓取它并将其注入)。 +如果使用另一种形式的安全性,则可能需要[向`RestTemplate`](#custom-rest-template)提供`ConfigServicePropertySourceLocator`(例如,通过在 Bootstrap 上下文中获取它并将其注入)。 #### [健康指标](#_health_indicator_2) @@ -2976,9 +1737,9 @@ public class CustomConfigServiceBootstrapConfiguration { | |对于添加`Authorization`头的简化方法,可以使用`spring.cloud.config.headers.*`属性。| |---|------------------------------------------------------------------------------------------------------------------------------| -1. 在`resources/META-INF`中,创建一个名为 ` Spring.factories` 的文件,并指定你的自定义配置,如下例所示: +1. 在`resources/META-INF`中,创建一个名为`Spring.工厂`的文件,并指定你的自定义配置,如下例所示: -Spring.工厂 +spring.factories ``` org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration @@ -2986,7 +1747,7 @@ org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.clien #### [Vault](#_vault) -当使用 Vault 作为配置服务器的后端时,客户机需要为服务器提供一个令牌,以便从 Vault 检索值。通过在`bootstrap.yml`中设置`spring.cloud.config.token`,可以在客户端内提供这个令牌,如下例所示: +当使用 Vault 作为配置服务器的后端时,客户机需要为服务器提供一个令牌,以便从 Vault 检索值。通过在`bootstrap.yml`中设置`spring.cloud.config.token`,可以在客户端内提供该令牌,如下例所示: ``` spring: @@ -3001,7 +1762,7 @@ Vault 支持将密钥嵌套在 Vault 中存储的值中,如以下示例所示 `echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -` -此命令将 JSON 对象写入保险库。要访问 Spring 中的这些值,你将使用传统的点注释,如下面的示例所示 +此命令将 JSON 对象写入保险库。要访问 Spring 中的这些值,你将使用传统的 dot(`.`)注释,如下面的示例所示 ``` @Value("${appA.secret}") @@ -3010,3 +1771,4 @@ String name = "World"; 前面的代码将把`name`变量的值设置为`appAsecret`。 +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-consul.md b/docs/spring-cloud/spring-cloud-consul.md index 95a62a60503fcedb114159708e9a126e3a417577..be03fb78933aa09acb25ae9b010a8bf2d10fbc37 100644 --- a/docs/spring-cloud/spring-cloud-consul.md +++ b/docs/spring-cloud/spring-cloud-consul.md @@ -1,16 +1,16 @@ -Spring 云执政官 -========== +# Spring Cloud-Consul -该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 Consul 集成。通过一些简单的注释,你可以快速启用和配置应用程序内的公共模式,并使用基于 Consul 的组件构建大型分布式系统。所提供的模式包括服务发现、控制总线和配置。智能路由和客户端负载平衡、断路器是通过与其他 Spring 云项目集成来提供的。 +**3.1.0** -[](#quick-start)[1. Quick Start](#quick-start) ----------- +该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 Consul 集成。通过一些简单的注释,你可以快速启用和配置应用程序内的公共模式,并使用基于 Consul 的组件构建大型分布式系统。所提供的模式包括服务发现、控制总线和配置。智能路由和客户端负载平衡、断路器是通过与其他 Spring Cloud项目集成来提供的。 + +## [](#quick-start)[1.快速启动](#quick-start) 这一快速启动将使用 Spring Cloud Consul 进行服务发现和分布式配置。 首先,在你的机器上运行领事代理。然后,你可以访问它,并将其作为服务注册中心和配置源使用 Spring Cloud Consul。 -### [](#discovery-client-usage)[1.1.发现客户端使用情况](#discovery-client-usage) ### +### [](#discovery-client-usage)[1.1.发现客户端使用情况](#discovery-client-usage) 要在应用程序中使用这些特性,你可以将其构建为依赖于`spring-cloud-consul-core`的 Spring 引导应用程序。添加依赖项最方便的方法是使用 Spring 引导启动器:`org.springframework.cloud:spring-cloud-starter-consul-discovery`。我们建议使用依赖管理和`spring-boot-starter-parent`。下面的示例显示了典型的 Maven 配置: @@ -128,7 +128,7 @@ public String serviceUrl() { } ``` -### [](#distributed-configuration-usage)[1.2.分布式配置使用](#distributed-configuration-usage) ### +### [](#distributed-configuration-usage)[1.2.分布式配置使用](#distributed-configuration-usage) 要在应用程序中使用这些特性,你可以将其构建为依赖于`spring-cloud-consul-core`和`spring-cloud-consul-config`的 Spring 引导应用程序。添加依赖项最方便的方法是使用 Spring 引导启动器:`org.springframework.cloud:spring-cloud-starter-consul-config`。我们建议使用依赖管理和`spring-boot-starter-parent`。下面的示例显示了典型的 Maven 配置: @@ -226,34 +226,31 @@ public class Application { | |如果使用 Spring Cloud Consul Config,则需要设置`spring.config.import`属性才能绑定到 Consul。
你可以在[Spring Boot Config Data Import section](#config-data-import)中阅读有关它的更多信息。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#spring-cloud-consul-install)[2.安装领事](#spring-cloud-consul-install) ----------- +## [](#spring-cloud-consul-install)[2.安装领事](#spring-cloud-consul-install) 有关如何安装 Consul 的说明,请参见[安装文档](https://www.consul.io/intro/getting-started/install.html)。 -[](#spring-cloud-consul-agent)[3. Consul Agent](#spring-cloud-consul-agent) ----------- +## [](#spring-cloud-consul-agent)[3.领事代理人](#spring-cloud-consul-agent) -Consul 代理客户端必须可用于所有 Spring 云 Consul 应用程序。默认情况下,代理客户机应该位于`localhost:8500`。有关如何启动代理客户机以及如何连接到 Consul 代理服务器集群的详细信息,请参见[代理文档](https://consul.io/docs/agent/basics.html)。为了进行开发,在安装了 Consul 之后,可以使用以下命令启动 Consul 代理: +Consul 代理客户端必须可用于所有 Spring Cloud Consul 应用程序。默认情况下,代理客户机应该位于`localhost:8500`。有关如何启动代理客户机以及如何连接到 Consul 代理服务器集群的详细信息,请参见[代理文档](https://consul.io/docs/agent/basics.html)。为了进行开发,在安装了 Consul 之后,可以使用以下命令启动 Consul 代理: ``` ./src/main/bash/local_run_consul.sh ``` -这将在端口 8500 上以服务器模式启动代理,其 UI 位于[localhost:8500](http://localhost:8500)。 +这将在端口 8500 上以服务器模式启动一个代理,其 UI 位于[本地主机:8500](http://localhost:8500)。 -[](#spring-cloud-consul-discovery)[4.与领事的服务发现](#spring-cloud-consul-discovery) ----------- +## [](#spring-cloud-consul-discovery)[4.与领事的服务发现](#spring-cloud-consul-discovery) -服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户机或某种形式的约定可能非常困难,并且可能非常脆弱。领事通过[HTTP API](https://www.consul.io/docs/agent/http.html)和[DNS](https://www.consul.io/docs/agent/dns.html)提供服务发现服务。 Spring Cloud Consul 利用 HTTP API 进行服务注册和发现。这并不妨碍非 Spring 云应用程序利用 DNS 接口。Consul 代理服务器在[cluster](https://www.consul.io/docs/internals/architecture.html)中运行,该服务器通过[gossip protocol](https://www.consul.io/docs/internals/gossip.html)进行通信,并使用[RAFT 共识协议](https://www.consul.io/docs/internals/consensus.html)。 +服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户机或某种形式的约定可能非常困难,并且可能非常脆弱。领事通过[HTTP API](https://www.consul.io/docs/agent/http.html)和[DNS](https://www.consul.io/docs/agent/dns.html)提供服务发现服务。 Spring Cloud Consul 利用 HTTP API 进行服务注册和发现。这并不妨碍非 Spring Cloud应用程序利用 DNS 接口。Consul 代理服务器在[cluster](https://www.consul.io/docs/internals/architecture.html)中运行,该服务器通过[八卦协议](https://www.consul.io/docs/internals/gossip.html)进行通信,并使用[RAFT 共识协议](https://www.consul.io/docs/internals/consensus.html)。 -### [](#how-to-activate)[4.1.如何激活](#how-to-activate) ### +### [](#how-to-activate)[4.1.如何激活](#how-to-activate) -要激活 Consul 服务发现,请使用分组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-discovery`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring 云发布列设置构建系统的详细信息。 +要激活 Consul 服务发现,请使用分组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-discovery`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring Cloud发布列设置构建系统的详细信息。 -### [](#registering-with-consul)[4.2.向领事登记](#registering-with-consul) ### +### [](#registering-with-consul)[4.2.向领事登记](#registering-with-consul) -当客户机向 Consul 注册时,它提供有关自身的元数据,如主机和端口、ID、名称和标记。默认情况下会创建一个 http[Check](https://www.consul.io/docs/agent/checks.html),consul 每 10 秒钟就会点击`/actuator/health`端点。如果健康检查失败,服务实例将被标记为“关键”。 +当客户机向 Consul 注册时,它提供有关自身的元数据,如主机和端口、ID、名称和标记。默认情况下,创建一个 HTTP,Consul 每 10 秒钟点击端点。如果健康检查失败,服务实例将被标记为“关键”。 示例领事客户: @@ -295,7 +292,7 @@ spring: 要禁用服务注册,你可以将`spring.cloud.consul.discovery.register`设置为`false`。 -#### [](#registering-management-as-a-separate-service)[4.2.1.将管理注册为一项单独的服务](#registering-management-as-a-separate-service) #### +#### [](#registering-management-as-a-separate-service)[4.2.1.将管理注册为一项单独的服务](#registering-management-as-a-separate-service) 当管理服务器端口被设置为与应用程序端口不同的东西时,通过设置`management.server.port`属性,管理服务将被注册为独立于应用程序服务的服务。例如: @@ -374,13 +371,13 @@ spring.cloud.consul.discovery.management-suffix spring.cloud.consul.discovery.management-tags ``` -#### [](#http-health-check)[4.2.2.HTTP 健康检查](#http-health-check) #### +#### [](#http-health-check)[4.2.2.HTTP 健康检查](#http-health-check) Consul 实例的健康检查默认为“/actuator/health”,这是 Spring 引导执行器应用程序中健康端点的默认位置。如果使用非默认的上下文路径或 Servlet 路径(例如`server.servletPath=/foo`)或管理端点路径(例如`management.server.servlet.context-path=/admin`),则即使对于执行器应用程序,也需要对此进行更改。 Consul 用于检查健康端点的间隔也可以配置。“10 秒”和“1 米”分别代表 10 秒和 1 分钟。 -这个示例演示了上面的内容(有关更多选项,请参见[附录页](appendix.html)中的`spring.cloud.consul.discovery.health-check-*`属性)。 +此示例演示了上面的内容(有关更多选项,请参见[附录页](appendix.html)中的`spring.cloud.consul.discovery.health-check-*`属性)。 应用程序.yml @@ -395,9 +392,9 @@ spring: 你可以通过设置`spring.cloud.consul.discovery.register-health-check=false`完全禁用 HTTP 健康检查。 -##### [](#applying-headers)[应用头文件](#applying-headers) ##### +##### [](#applying-headers)[应用头文件](#applying-headers) -头可以应用于健康检查请求。例如,如果你试图注册一个[Spring Cloud Config](https://cloud.spring.io/spring-cloud-config/)服务器,该服务器使用[Vault Backend](https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#vault-backend): +头可以应用于健康检查请求。例如,如果你试图注册一个[Spring Cloud Config](https://cloud.spring.io/spring-cloud-config/)服务器,该服务器使用[保险库后端](https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#vault-backend): 应用程序.yml @@ -425,15 +422,15 @@ spring: - "Some other value" ``` -#### [](#actuator-health-indicators)[4.2.3.执行器健康指示器](#actuator-health-indicators) #### +#### [](#actuator-health-indicators)[4.2.3.执行器健康指示器](#actuator-health-indicators) 如果服务实例是 Spring 启动致动器应用程序,则可以提供以下致动器的健康指示器。 -##### [](#discoveryclienthealthindicator)[发现潜在的指示剂](#discoveryclienthealthindicator) ##### +##### [](#discoveryclienthealthindicator)[发现潜在的指示剂](#discoveryclienthealthindicator) 当 Consul 服务发现是活动的时,[发现客户状态指示器](https://cloud.spring.io/spring-cloud-commons/2.2.x/reference/html/#health-indicator)被配置并使致动器健康端点可用。有关配置选项,请参见[here](https://cloud.spring.io/spring-cloud-commons/2.2.x/reference/html/#health-indicator)。 -##### [](#consulhealthindicator)[健康咨询指示器](#consulhealthindicator) ##### +##### [](#consulhealthindicator)[健康咨询指示器](#consulhealthindicator) 配置了一个指示器,用于验证`ConsulClient`的健康状况。 @@ -441,12 +438,12 @@ spring: 禁用指示器集`management.health.consul.enabled=false`。 -| |当应用程序在[Bootstrap 上下文模式](https://cloud.spring.io/spring-cloud-commons/2.2.x/reference/html/#the-bootstrap-application-context)(默认值)中运行时,
此指示器被加载到 BootStrap 上下文中,并且不对 Actuator Health 端点可用。| +| |当应用程序在[Bootstrap 上下文模式](https://cloud.spring.io/spring-cloud-commons/2.2.x/reference/html/#the-bootstrap-application-context)(默认值)中运行时,
此指示器将被加载到 BootStrap 上下文中,并且不对 Actuator Health 端点可用。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#metadata)[4.2.4. Metadata](#metadata) #### +#### [](#metadata)[4.2.4.元数据](#metadata) -Consul 支持服务的元数据。 Spring 云的`ServiceInstance`具有一个`Map metadata`字段,该字段由服务`meta`字段填充。在`spring.cloud.consul.discovery.metadata`或`spring.cloud.consul.discovery.management-metadata`属性上填充`meta`字段集值。 +Consul 支持服务的元数据。 Spring Cloud的`ServiceInstance`具有一个`Map metadata`字段,该字段由服务`meta`字段填充。在`spring.cloud.consul.discovery.metadata`或`spring.cloud.consul.discovery.management-metadata`属性上填充`meta`字段集值。 应用程序.yml @@ -462,7 +459,7 @@ spring: 上述配置将导致一个服务的元字段包含`myfield→myvalue`和`anotherfield→anothervalue`。 -##### [](#generated-metadata)[生成的元数据](#generated-metadata) ##### +##### [](#generated-metadata)[生成的元数据](#generated-metadata) 领事自动注册将自动生成一些条目。 @@ -475,9 +472,9 @@ spring: | |Spring Cloud Consul 的旧版本通过解析`spring.cloud.consul.discovery.tags`属性填充了 Spring Cloud Commons 中的`ServiceInstance.getMetadata()`方法。这不再受支持,请迁移到使用`spring.cloud.consul.discovery.metadata`映射。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#making-the-consul-instance-id-unique)[4.2.5.使 Consul 实例 ID 是唯一的](#making-the-consul-instance-id-unique) #### +#### [](#making-the-consul-instance-id-unique)[4.2.5.使 Consul 实例 ID 是唯一的](#making-the-consul-instance-id-unique) -默认情况下,Consul 实例注册的 ID 等于其 Spring 应用程序上下文 ID。默认情况下, Spring 应用程序上下文 ID 是`${spring.application.name}:comma,separated,profiles:${server.port}`。对于大多数情况,这将允许在一台机器上运行一个服务的多个实例。如果需要更多的唯一性,那么使用 Spring Cloud,你可以通过在`spring.cloud.consul.discovery.instanceId`中提供唯一的标识符来覆盖这一点。例如: +默认情况下,Consul 实例注册的 ID 等于其 Spring 应用程序上下文 ID。默认情况下, Spring 应用程序上下文 ID 是`${spring.application.name}:comma,separated,profiles:${server.port}`。对于大多数情况,这将允许在一台机器上运行一个服务的多个实例。如果需要进一步的唯一性,那么使用 Spring Cloud,你可以通过在`spring.cloud.consul.discovery.instanceId`中提供唯一的标识符来覆盖这一点。例如: 应用程序.yml @@ -491,11 +488,11 @@ spring: 有了这个元数据,以及在 LocalHost 上部署的多个服务实例,随机值就会在其中发挥作用,从而使实例具有唯一性。在 CloudFoundry 中,`vcap.application.instance_id`将在 Spring 引导应用程序中自动填充,因此不需要随机值。 -### [](#looking-up-services)[4.3.查询服务](#looking-up-services) ### +### [](#looking-up-services)[4.3.查询服务](#looking-up-services) -#### [](#using-load-balancer)[4.3.1.使用负载均衡器](#using-load-balancer) #### +#### [](#using-load-balancer)[4.3.1.使用负载均衡器](#using-load-balancer) -Spring 云具有对[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(一个 REST 客户机构建器)和[Spring `RestTemplate`](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#rest-template-loadbalancer-client)的支持,用于使用逻辑服务名称/ID 而不是物理 URL 查找服务。Feign 和支持发现的 RESTTemplate 都利用[Spring Cloud LoadBalancer](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)实现客户端负载平衡。 +Spring Cloud具有对[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(一个 REST 客户机构建器)和[[ Spring `RestTemplate`](https://DOCS. Spring.io/ Spring-cloud-commons/DOCS/current/reference/html/#rest-template-loadbalancer-client)的支持,用于使用逻辑服务名称/ID 而不是物理 URL 查找服务。Feign 和支持发现的 RESTTemplate 都利用[Spring Cloud LoadBalancer](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)实现客户端负载平衡。 如果你想使用 RESTTemplate 访问服务存储,只需声明: @@ -523,9 +520,9 @@ public String getFirstProduct() { | |Spring Cloud 现在还提供对[Spring Cloud LoadBalancer](https://cloud.spring.io/spring-cloud-commons/reference/html/#_spring_resttemplate_as_a_load_balancer_client)的支持。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#using-the-discoveryclient)[4.3.2.使用 DiscoveryClient](#using-the-discoveryclient) #### +#### [](#using-the-discoveryclient)[4.3.2.使用 DiscoveryClient](#using-the-discoveryclient) -你也可以使用`org.springframework.cloud.client.discovery.DiscoveryClient`,它为非特定于 Netflix 的发现客户端提供了一个简单的 API,例如 +你也可以使用`org.springframework.cloud.client.discovery.DiscoveryClient`,它为非特定于 Netflix 的发现客户端提供了一个简单的 API,例如。 ``` @Autowired @@ -540,20 +537,19 @@ public String serviceUrl() { } ``` -### [](#consul-catalog-watch)[4.4.领事目录表](#consul-catalog-watch) ### +### [](#consul-catalog-watch)[4.4.领事目录表](#consul-catalog-watch) -领事编目表利用领事的能力[watch services](https://www.consul.io/docs/agent/watches.html#services)。Catalog Watch 进行一个阻塞的 Consul HTTP API 调用,以确定是否有任何服务发生了更改。如果有新的服务数据,则会发布心跳事件。 +领事编目表利用领事的能力[手表服务](https://www.consul.io/docs/agent/watches.html#services)。Catalog Watch 进行一个阻塞的 Consul HTTP API 调用,以确定是否有任何服务发生了更改。如果有新的服务数据,则会发布心跳事件。 要改变配置手表的频率时,调用 change`spring.cloud.consul.config.discovery.catalog-services-watch-delay`。默认值是 1000,以毫秒为单位。延迟是上一次调用结束后和下一次调用开始后的时间量。 要禁用目录手表集`spring.cloud.consul.discovery.catalogServicesWatch.enabled=false`。 -手表使用 Spring `TaskScheduler`来安排对领事的拜访。默认情况下,它是一个`ThreadPoolTaskScheduler`,其`poolSize`为 1。要更改`TaskScheduler`,请创建一个类型为`TaskScheduler`的 Bean,并以`ConsulDiscoveryClientConfiguration.CATALOG_WATCH_TASK_SCHEDULER_NAME`常数命名。 +手表使用 Spring `TaskScheduler`来安排与领事的通话。默认情况下,它是一个`ThreadPoolTaskScheduler`,其`poolSize`为 1。要更改`TaskScheduler`,请创建一个类型为`TaskScheduler`的 Bean,该类型以`ConsulDiscoveryClientConfiguration.CATALOG_WATCH_TASK_SCHEDULER_NAME`常数命名。 -[](#spring-cloud-consul-config)[5.与 Consul 的分布式配置](#spring-cloud-consul-config) ----------- +## [](#spring-cloud-consul-config)[5.与 Consul 的分布式配置](#spring-cloud-consul-config) -Consul 提供了[Key/Value Store](https://consul.io/docs/agent/http/kv.html)用于存储配置和其他元数据。 Spring Cloud Consul Config 是[配置服务器和客户端](https://github.com/spring-cloud/spring-cloud-config)的一种替代方案。在特殊的“引导”阶段,将配置加载到 Spring 环境中。默认情况下,配置存储在`/config`文件夹中。多个`PropertySource`实例是根据应用程序的名称和活动配置文件创建的,该配置文件模仿了解析属性的 Spring 云配置顺序。例如,名称为“TestApp”和配置文件为“Dev”的应用程序将创建以下属性源: +Consul 提供了[键/值存储](https://consul.io/docs/agent/http/kv.html)用于存储配置和其他元数据。 Spring Cloud Consul Config 是[配置服务器和客户端](https://github.com/spring-cloud/spring-cloud-config)的一种替代方案。在特殊的“引导”阶段,将配置加载到 Spring 环境中。默认情况下,配置存储在`/config`文件夹中。多个`PropertySource`实例是根据应用程序的名称和模拟解析属性的 Spring Cloud配置顺序的活动配置文件创建的。例如,一个名为“TestApp”、配置文件为“Dev”的应用程序将创建以下属性源: ``` config/testApp,dev/ @@ -564,13 +560,13 @@ config/application/ 最具体的属性源位于顶部,而最不具体的属性源位于底部。`config/application`文件夹中的属性适用于使用 Consul 进行配置的所有应用程序。`config/testApp`文件夹中的属性仅对名为“TestApp”的服务实例可用。 -当前在启动应用程序时读取配置。将 HTTP POST 发送到`/refresh`将导致重新加载配置。[Config Watch](#spring-cloud-consul-config-watch)还将自动检测更改并重新加载应用程序上下文。 +当前在启动应用程序时读取配置。将 HTTP POST 发送到`/refresh`将导致重新加载配置。[配置手表](#spring-cloud-consul-config-watch)还将自动检测更改并重新加载应用程序上下文。 -### [](#how-to-activate-2)[5.1.如何激活](#how-to-activate-2) ### +### [](#how-to-activate-2)[5.1.如何激活](#how-to-activate-2) -要开始使用 Consul 配置,请使用带有组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-config`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 +要开始使用 Consul 配置,请使用带有组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-config`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring Cloud发布列设置构建系统的详细信息。 -### [](#config-data-import)[5.2. Spring Boot Config Data Import](#config-data-import) ### +### [](#config-data-import)[5.2. Spring Boot Config Data Import](#config-data-import) Spring Boot2.4 引入了一种通过`spring.config.import`属性导入配置数据的新方法。这是现在从 Consul 获得配置的默认方式。 @@ -584,7 +580,7 @@ spring.config.import=optional:consul: 这将在默认位置“http://localhost:8500”连接到 Consul 代理。如果无法连接到 Consul,删除`optional:`前缀将导致 Consul Config 失败。要更改 Consul Config 的连接属性,可以设置`spring.cloud.consul.host`和`spring.cloud.consul.port`,或者将主机/端口对添加到`spring.config.import`语句中,例如,`spring.config.import=optional:consul:myhost:8500`。导入属性中的位置优先于主机和端口属性。 -Consul Config 将尝试根据`spring.cloud.consul.config.name`(默认为`spring.application.name`属性的值)和`spring.cloud.consul.config.default-context`(默认为`application`)从四个自动上下文加载值。如果你希望指定上下文,而不是使用计算的上下文,那么可以将该信息添加到`spring.config.import`语句中。 +Consul Config 将尝试基于`spring.cloud.consul.config.name`(默认为`spring.application.name`属性的值)和`spring.cloud.consul.config.default-context`(默认为`application`)从四个自动上下文加载值。如果你希望指定上下文而不是使用计算的上下文,那么可以将该信息添加到`spring.config.import`语句中。 application.properties @@ -597,7 +593,7 @@ spring.config.import=optional:consul:myhost:8500/contextone;/context/two | |通过`spring.config.import`导入 Spring 引导配置数据方法所需的`bootstrap`文件(属性或 YAML)是**不是**。| |---|--------------------------------------------------------------------------------------------------------------------------------------| -### [](#customizing)[5.3.定制](#customizing) ### +### [](#customizing)[5.3.定制](#customizing) Consul Config 可以使用以下属性进行自定义: @@ -623,7 +619,7 @@ spring: * `profileSeparator`设置用于在具有配置文件的属性源中分隔配置文件名称的分隔符的值 -### [](#spring-cloud-consul-config-watch)[5.4.配置手表](#spring-cloud-consul-config-watch) ### +### [](#spring-cloud-consul-config-watch)[5.4.配置手表](#spring-cloud-consul-config-watch) 领事配置手表利用领事的能力[观看一个键的前缀](https://www.consul.io/docs/agent/watches.html#keyprefix)。Config Watch 进行一个阻塞的 Consul HTTP API 调用,以确定当前应用程序的任何相关配置数据是否已更改。如果有新的配置数据,将发布刷新事件。这相当于调用`/refresh`执行器端点。 @@ -631,9 +627,9 @@ spring: 要禁用配置手表集`spring.cloud.consul.config.watch.enabled=false`。 -手表使用 Spring `TaskScheduler`来安排对领事的拜访。默认情况下,它是一个`ThreadPoolTaskScheduler`,其`poolSize`为 1。要更改`TaskScheduler`,请创建一个类型为`TaskScheduler`的 Bean,并以`ConsulConfigAutoConfiguration.CONFIG_WATCH_TASK_SCHEDULER_NAME`常数命名。 +手表使用 Spring `TaskScheduler`来安排对领事的拜访。默认情况下,它是一个`ThreadPoolTaskScheduler`,其`poolSize`为 1。要更改`TaskScheduler`,请创建 Bean 类型的`TaskScheduler`,该类型的名称为`ConsulConfigAutoConfiguration.CONFIG_WATCH_TASK_SCHEDULER_NAME`常数。 -### [](#spring-cloud-consul-config-format)[5.5.具有配置的 YAML 或属性](#spring-cloud-consul-config-format) ### +### [](#spring-cloud-consul-config-format)[5.5.具有配置的 YAML 或属性](#spring-cloud-consul-config-format) 以 YAML 或 Properties 格式存储一组属性可能更方便,而不是单独的键/值对。将`spring.cloud.consul.config.format`属性设置为`YAML`或`PROPERTIES`。例如,使用 YAML: @@ -648,7 +644,7 @@ spring: | |如果你已经设置了`spring.cloud.bootstrap.enabled=true`或`spring.config.use-legacy-processing=true`,或者包含了`spring-cloud-starter-bootstrap`,那么上述值将需要放置在`bootstrap.yml`中,而不是`application.yml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -YAML 必须在 consul 中设置适当的`data`键。使用键上面的默认值将看起来像: +YAML 必须设置在相应的`data`键中。使用键上面的默认值将看起来像: ``` config/testApp,dev/data @@ -661,7 +657,7 @@ config/application/data 你可以使用`spring.cloud.consul.config.data-key`更改数据键。 -### [](#spring-cloud-consul-config-git2consul)[5.6.Git2config 领事](#spring-cloud-consul-config-git2consul) ### +### [](#spring-cloud-consul-config-git2consul)[5.6.Git2config 领事](#spring-cloud-consul-config-git2consul) Git2Consul 是一个 Consul 社区项目,它将文件从 Git 存储库加载到 Consul 中的各个密钥。默认情况下,键的名称是文件的名称。YAML 和 Properties 文件分别支持`.yml`和`.properties`的文件扩展名。将`spring.cloud.consul.config.format`属性设置为`FILES`。例如: @@ -675,7 +671,7 @@ spring: format: FILES ``` -给定`/config`中的以下键,则`development`配置文件和`foo`的应用程序名称: +给定`/config`中的以下键,`development`配置文件和`foo`的应用程序名称: ``` .gitignore @@ -697,39 +693,35 @@ config/application.yml 每个键的值需要是一个格式正确的 YAML 或 Properties 文件。 -### [](#spring-cloud-consul-failfast)[5.7. Fail Fast](#spring-cloud-consul-failfast) ### +### [](#spring-cloud-consul-failfast)[5.7.快速失败](#spring-cloud-consul-failfast) 在某些情况下(如本地开发或某些测试场景),如果 Consul 不能用于配置,那么不失败可能是很方便的。设置`spring.cloud.consul.config.fail-fast=false`将导致配置模块记录警告,而不是抛出异常。这将允许应用程序继续正常启动。 | |如果你已经设置了`spring.cloud.bootstrap.enabled=true`或`spring.config.use-legacy-processing=true`,或者包含了`spring-cloud-starter-bootstrap`,那么上述值将需要放置在`bootstrap.yml`中,而不是`application.yml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#spring-cloud-consul-retry)[6. Consul Retry](#spring-cloud-consul-retry) ----------- +## [](#spring-cloud-consul-retry)[6.执政官重试](#spring-cloud-consul-retry) -如果你预计,当你的应用程序启动时,Consul 代理可能会偶尔无法使用,那么你可以在出现故障后要求它继续尝试。你需要在 Classpath 中添加 ` Spring-retry` 和`spring-boot-starter-aop`。默认的行为是重试 6 次,初始退避间隔为 1000ms,后续退避的指数乘数为 1.1。你可以使用`spring.cloud.consul.retry.*`配置属性来配置这些属性(以及其他属性)。这对 Spring 云 Consul 配置和发现注册都有效。 +如果你预计,当你的应用程序启动时,Consul Agent 可能会偶尔无法使用,那么你可以要求它在出现故障后继续尝试。你需要在 Classpath 中添加`spring-retry`和`spring-boot-starter-aop`。默认的行为是重试 6 次,初始退避间隔为 1000ms,后续退避的指数乘数为 1.1。你可以使用`spring.cloud.consul.retry.*`配置属性来配置这些属性(以及其他属性)。这对 Spring Cloud Consul Config 和 Discovery 注册都有效。 -| |若要完全控制重试,请添加一个`@Bean`的类型为“retryOperationsenterceptor”,ID 为“ConsultretryInterceptor”。 Spring
重试有一个`RetryInterceptorBuilder`,这使得很容易创建一个。| +| |若要完全控制重试,请添加`@Bean`类型的`RetryOperationsInterceptor`,ID 为“consulretryInterceptor”。 Spring
重试有一个`RetryInterceptorBuilder`,这使得很容易创建一个。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#spring-cloud-consul-bus)[7. Spring Cloud Bus with Consul](#spring-cloud-consul-bus) ----------- +## [](#spring-cloud-consul-bus)[7. Spring Cloud Bus with Consul](#spring-cloud-consul-bus) -### [](#how-to-activate-3)[7.1.如何激活](#how-to-activate-3) ### +### [](#how-to-activate-3)[7.1.如何激活](#how-to-activate-3) -要开始使用 Consul 总线,请使用分组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-bus`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布列设置构建系统的详细信息。 +要开始使用 Consul 总线,请使用分组`org.springframework.cloud`和工件 ID`spring-cloud-starter-consul-bus`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring Cloud发布列设置构建系统的详细信息。 有关可用的执行器端点和 HOWTO 发送自定义消息,请参见[Spring Cloud Bus](https://cloud.spring.io/spring-cloud-bus/)文档。 -[](#spring-cloud-consul-hystrix)[8.带 hystrix 的断路器](#spring-cloud-consul-hystrix) ----------- +## [](#spring-cloud-consul-hystrix)[8.带 hystrix 的断路器](#spring-cloud-consul-hystrix) -应用程序可以通过在 POM.xml:`spring-cloud-starter-hystrix`项目中包含此启动器来使用 Spring Cloud Netflix 项目提供的 Hystrix 断路器。Hystrix 并不依赖于 Netflix 的 Discovery 客户端。`@EnableHystrix`注释应该放在配置类(通常是主类)上。然后可以用`@HystrixCommand`注释方法来由断路器保护。有关更多详细信息,请参见[文件](https://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients)。 +应用程序可以通过在 POM.xml:`spring-cloud-starter-hystrix`项目中包含此启动器来使用 Spring Cloud Netflix 项目提供的 Hystrix 断路器。Hystrix 并不依赖于 Netflix 的 Discovery 客户端。`@EnableHystrix`注释应该放在配置类(通常是主类)上。然后可以用`@HystrixCommand`注释方法来由断路器进行保护。有关更多详细信息,请参见[文件](https://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients)。 -[](#spring-cloud-consul-turbine)[9.基于涡轮机和 consul 的 hystrix 度量聚合](#spring-cloud-consul-turbine) ----------- +## [](#spring-cloud-consul-turbine)[9.基于涡轮机和 consul 的 hystrix 度量聚合](#spring-cloud-consul-turbine) -Turbine(由 Spring Cloud Netflix 项目提供)聚合了多个实例 Hystrix Metrics 流,因此仪表板可以显示聚合视图。Turbine 使用`DiscoveryClient`接口来查找相关实例。 Spring 要使用带有云领事的涡轮机,以类似于以下示例的方式配置涡轮机应用程序: +Turbine(由 Spring Cloud Netflix 项目提供)聚合了多个实例 Hystrix Metrics 流,因此仪表板可以显示聚合视图。Turbine 使用`DiscoveryClient`接口来查找相关实例。要使用具有 Spring Cloud领事的涡轮机,以类似于以下示例的方式配置涡轮机应用程序: POM.xml @@ -757,7 +749,7 @@ turbine: appConfig: ${applications} ``` -`clusterConfig`和`appConfig`节必须匹配,因此将逗号分隔的服务 ID 列表放入一个单独的配置属性中非常有用。 +`clusterConfig`和`appConfig`节必须匹配,因此将以逗号分隔的服务 ID 列表放入单独的配置属性中非常有用。 Turbine.java @@ -771,7 +763,8 @@ public class Turbine { } ``` -[](#configuration-properties)[10.配置属性](#configuration-properties) ----------- +## [](#configuration-properties)[10.配置属性](#configuration-properties) 要查看所有 consul 相关配置属性的列表,请检查[附录页](appendix.html)。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-contract.md b/docs/spring-cloud/spring-cloud-contract.md index 396c023fba448a6d3ae0e34893edea84b22e53f8..78d084f13df3c808e12247a6242592a87c379e9a 100644 --- a/docs/spring-cloud/spring-cloud-contract.md +++ b/docs/spring-cloud/spring-cloud-contract.md @@ -1,5 +1,4 @@ -Spring 云合同参考文档 -========== +# Spring Cloud 合同参考文档 Adam Dudczak,Mathias Düsterhöft,Marcin Grzejszczak,Dennis Kieselhorst,Jakub Kubry Ski,Karol Lassak,Olga Maciaszek-Sharma,Mariusz Smyku A,DAVESyer,Jay Bryant @@ -9,9 +8,10 @@ Adam Dudczak,Mathias Düsterhöft,Marcin Grzejszczak,Dennis Kieselhorst, |----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| |[Documentation Overview](documentation-overview.html#contract-documentation)|关于文档,获得帮助,第一步,等等。| | [Getting Started](getting-started.html#getting-started) |引入 Spring Cloud Contract,开发你的第一个 Spring 基于 Cloud Contract 的应用程序| -| [Using Spring Cloud Contract](using.html#using) |Spring 云合同使用示例和工作流程。| +| [Using Spring Cloud Contract](using.html#using) |Spring Cloud合同使用示例和工作流程。| | [Spring Cloud Contract Features](project-features.html#features) |Contract DSL、消息传递、 Spring Cloud Contract Stub Runner 和 Spring Cloud Contract WiRemock。| | [Build Tools](project-features.html#features-build-tools) |Maven 插件, Gradle 插件和 Docker。| | [“How-to” Guides](howto.html#howto) |存根版本控制,契约集成,调试等。| | [Appendices](appendix.html#appendix) |属性、元数据、配置、依赖关系等等。| +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-function.md b/docs/spring-cloud/spring-cloud-function.md index a59a76ef813338119218db27a9f952d756b2d4e1..6e329e74a55f79f972ac591342222a2072cb4b71 100644 --- a/docs/spring-cloud/spring-cloud-function.md +++ b/docs/spring-cloud/spring-cloud-function.md @@ -1,5 +1,4 @@ -Spring 云功能参考文档 -========== +# Spring Cloud 功能参考文档 Mark Fisher,DAVESyer,Oleg Zhurakousky,Anshul Mehra @@ -7,16 +6,17 @@ Mark Fisher,DAVESyer,Oleg Zhurakousky,Anshul Mehra 参考文献包括以下部分: -|[Reference Guide](spring-cloud-function.html)|Spring Cloud Function Reference| +|[参考指南](spring-cloud-function.html)|Spring Cloud Function Reference| |------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------| -|[Cloud Events](https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples/function-sample-cloudevent)| Cloud Events | +|[云事件](https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples/function-sample-cloudevent)| Cloud Events | |[RSocket](https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-rsocket)| RSocket | -|[AWS Adapter](aws.html)| AWS Adapter Reference | -|[Azure Adapter](azure.html)| Azure Adapter Reference | -|[GCP Adapter](gcp.html)| GCP Adapter Reference | +|[AWS 适配器](aws.html)| AWS Adapter Reference | +|[Azure 适配器](azure.html)| Azure Adapter Reference | +|[GCP 适配器](gcp.html)| GCP Adapter Reference | 相关链接: |[Reactor](https://projectreactor.io/)|Project Reactor| |-------------------------------------|---------------| +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-gateway.md b/docs/spring-cloud/spring-cloud-gateway.md index caf87089d04347ebb80f822787325fdc3e595676..b234f8011910b01e3e864c29614744ecd5d446e8 100644 --- a/docs/spring-cloud/spring-cloud-gateway.md +++ b/docs/spring-cloud/spring-cloud-gateway.md @@ -1,53 +1,49 @@ -Spring 云网关 -========== +# Spring Cloud 网关 +**3.1.1** 该项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括: Spring 5、 Spring Boot2 和 Project Reactor。 Spring Cloud Gateway 旨在提供一种简单但有效的方法来路由到 API,并向它们提供跨领域的关注,例如:安全性、监视/度量和弹性。 -[](#gateway-starter)[1. How to Include Spring Cloud Gateway](#gateway-starter) ----------- +## [](#gateway-starter)[1. How to Include Spring Cloud Gateway](#gateway-starter) -要在项目中包含 Spring 云网关,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-gateway`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 +要在项目中包含 Spring Cloud网关,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-gateway`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring Cloud发布系列设置构建系统的详细信息。 如果包含启动器,但不希望启用网关,请设置`spring.cloud.gateway.enabled=false`。 -| |Spring 云网关是建立在[Spring Boot 2.x](https://spring.io/projects/spring-boot#learn)、[Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html)和[Project Reactor](https://projectreactor.io/docs)之上的。因此,当你使用 Spring 云网关时,许多你熟悉的同步库(例如 Spring 数据和 Spring 安全性)和模式可能不适用,如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前,先阅读他们的文档,以熟悉一些新概念。| +| |Spring Cloud网关是建立在[Spring Boot 2.x](https://spring.io/projects/spring-boot#learn),[Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html),和[项目反应堆](https://projectreactor.io/docs)之上的。因此,当你使用 Spring Cloud网关时,许多你熟悉的同步库(例如 Spring 数据和 Spring 安全性)和模式可能不适用,如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前,先阅读他们的文档,以熟悉一些新概念。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |Spring 云网关需要由 Spring 启动和 Spring WebFlux 提供的 Netty 运行时。它在传统 Servlet 容器中或构建为 WAR 时不工作。| +| |Spring Cloud网关需要由 Spring 启动和 Spring WebFlux 提供的 Netty 运行时。它在传统 Servlet 容器中或构建为 WAR 时不工作。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#glossary)[2. Glossary](#glossary) ----------- +## [](#glossary)[2.词汇表](#glossary) -* **路线**:网关的基本构件。它由一个 ID、一个目标 URI、一组谓词和一组筛选器定义。如果聚合谓词为 true,则匹配路由。 +* **路线**:网关的基本构建块。它由一个 ID、一个目标 URI、一组谓词和一组筛选器定义。如果聚合谓词为 true,则匹配路由。 -* **谓词**:这是[Java8 函数谓词](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)。输入类型为[Spring Framework `ServerWebExchange`](https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/server/ServerWebExchange.html)。这使你能够匹配 HTTP 请求中的任何内容,例如标题或参数。 +* **谓词**:这是[Java8 函数谓词](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)。输入类型是一个[ Spring Framework`ServerWebExchange`](https://DOCS. Spring.io/ Spring/DOCS/5.0.x/javadoc-api/org/springframework/web/server/serverwebexchange.html)。这使你能够匹配 HTTP 请求中的任何内容,例如标题或参数。 -* **过滤器**:这些是用特定工厂构造的[`GatewayFilter`](https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayFilter.java)的实例。在这里,你可以在发送下游请求之前或之后修改请求和响应。 +* **过滤器**:这些是[`GatewayFilter`](https://github.com/ Spring-cloud/ Spring-cloud-gateway/tree/main/ Spring-cloud-gateway-server-server/SRC/main/main/java/org/springframework/cloud/gateway/filter/geter/getter/gatewayfilter.java)的实例在这里,你可以在发送下游请求之前或之后修改请求和响应。 -[](#gateway-how-it-works)[3. How It Works](#gateway-how-it-works) ----------- +## [](#gateway-how-it-works)[3.它是如何工作的](#gateway-how-it-works) -下图提供了 Spring 云网关如何工作的高级概述: +下图提供了 Spring Cloud网关如何工作的高级概述: -![Spring Cloud Gateway Diagram](./images/spring_cloud_gateway_diagram.png) +![Spring Cloud Gateway Diagram](https://docs.spring.io/spring-cloud-gateway/docs/3.1.1/reference/html/images/spring_cloud_gateway_diagram.png) -客户端向 Spring 云网关提出请求。如果网关处理程序映射确定请求与路由匹配,则将请求发送到网关 Web 处理程序。此处理程序通过特定于该请求的筛选链来运行该请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤逻辑都会被执行。然后提出代理请求。在提出代理请求之后,将运行“POST”过滤逻辑。 +客户端向 Spring Cloud网关提出请求。如果网关处理程序映射确定请求与路由匹配,则将请求发送到网关 Web 处理程序。此处理程序通过特定于该请求的筛选链来运行该请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤逻辑都会被执行。然后提出代理请求。在提出代理请求之后,将运行“POST”过滤逻辑。 | |在没有端口的路由中定义的 URI 分别获得 HTTP 和 HTTPS URI 的默认端口号 80 和 443。| |---|----------------------------------------------------------------------------------------------------------------------| -[](#configuring-route-predicate-factories-and-gateway-filter-factories)[4.配置路由谓词工厂和网关过滤器工厂](#configuring-route-predicate-factories-and-gateway-filter-factories) ----------- +## [](#configuring-route-predicate-factories-and-gateway-filter-factories)[4.配置路由谓词工厂和网关过滤器工厂](#configuring-route-predicate-factories-and-gateway-filter-factories) 配置谓词和过滤器有两种方法:快捷方式和完全展开的参数。下面的大多数示例都使用了快捷方式。 名称和参数名称将以`code`的形式在每个部分的第一个或两个表示中列出。参数通常按快捷方式配置所需的顺序列出。 -### [](#shortcut-configuration)[4.1.快捷方式配置](#shortcut-configuration) ### +### [](#shortcut-configuration)[4.1.快捷方式配置](#shortcut-configuration) -快捷方式配置由筛选器名称识别,后面跟着一个等号,后面是用逗号分隔的参数值。 +快捷方式配置由筛选器名称识别,后面跟着一个等号(`=`),后面是用逗号分隔的参数值(`,`)。 应用程序.yml @@ -64,7 +60,7 @@ spring: 上一个示例用两个参数定义了`Cookie`路由谓词工厂,cookie 名`mycookie`和要匹配`mycookievalue`的值。 -### [](#fully-expanded-arguments)[4.2.完全展开的论证](#fully-expanded-arguments) ### +### [](#fully-expanded-arguments)[4.2.完全展开的论证](#fully-expanded-arguments) 完全展开的参数看起来更像是带有名称/值对的标准 YAML 配置。通常,会有`name`键和`args`键。`args`键是用于配置谓词或筛选器的键值对的映射。 @@ -86,14 +82,13 @@ spring: 这是上面显示的`Cookie`谓词的快捷配置的完整配置。 -[](#gateway-request-predicates-factories)[5.路线谓词工厂](#gateway-request-predicates-factories) ----------- +## [](#gateway-request-predicates-factories)[5.路线谓词工厂](#gateway-request-predicates-factories) -Spring 云网关将路由匹配为 Spring WebFlux`HandlerMapping`基础设施的一部分。 Spring 云网关包括许多内置的路由谓词工厂。所有这些谓词在 HTTP 请求的不同属性上匹配。你可以将多个路由谓词工厂与逻辑`and`语句组合在一起。 +Spring Cloud网关将路由匹配为 Spring WebFlux`HandlerMapping`基础设施的一部分。 Spring Cloud网关包括许多内置的路由谓词工厂。所有这些谓词在 HTTP 请求的不同属性上匹配。你可以将多个路由谓词工厂与逻辑`and`语句组合在一起。 -### [](#the-after-route-predicate-factory)[5.1.后路由谓词工厂](#the-after-route-predicate-factory) ### +### [](#the-after-route-predicate-factory)[5.1.后路由谓词工厂](#the-after-route-predicate-factory) -`After`路由谓词工厂接受一个参数,一个`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的 DateTime 之后发生的请求。下面的示例配置一个 after 路由谓词: +`After`路由谓词工厂接受一个参数,a`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的 DateTime 之后发生的请求。下面的示例配置一个 after 路由谓词: 示例 1.应用程序.yml @@ -110,7 +105,7 @@ spring: 这条路线符合任何请求后提出的 JAN20,2017 年 17:42 山区时间(丹佛)。 -### [](#the-before-route-predicate-factory)[5.2.前路由谓词工厂](#the-before-route-predicate-factory) ### +### [](#the-before-route-predicate-factory)[5.2.前路由谓词工厂](#the-before-route-predicate-factory) `Before`路由谓词工厂接受一个参数,a`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的`datetime`之前发生的请求。下面的示例配置一个 before 路由谓词: @@ -129,7 +124,7 @@ spring: 这条路线符合任何在 JAN20,2017 年 17:42 山区时间(丹佛)之前提出的请求。 -### [](#the-between-route-predicate-factory)[5.3.路由谓词之间的工厂](#the-between-route-predicate-factory) ### +### [](#the-between-route-predicate-factory)[5.3.路由谓词之间的工厂](#the-between-route-predicate-factory) `Between`路由谓词工厂接受两个参数,`datetime1`和`datetime2`,它们是 Java`ZonedDateTime`对象。此谓词匹配发生在`datetime1`之后和`datetime2`之前的请求。`datetime2`参数必须位于`datetime1`之后。下面的示例配置了一个 between 路由谓词: @@ -148,7 +143,7 @@ spring: 这条路线符合在 JAN20,2017 年 17:42 山区时间(丹佛)之后和 JAN21,2017 年 17:42 山区时间(丹佛)之前提出的任何请求。这对于维护窗口可能是有用的。 -### [](#the-cookie-route-predicate-factory)[5.4.cookie 路由谓词工厂](#the-cookie-route-predicate-factory) ### +### [](#the-cookie-route-predicate-factory)[5.4.cookie 路由谓词工厂](#the-cookie-route-predicate-factory) `Cookie`路由谓词工厂接受两个参数,cookie`name`和`regexp`(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。下面的示例配置了一个 Cookie 路由谓词工厂: @@ -167,7 +162,7 @@ spring: 此路由匹配具有名为`chocolate`的 cookie 的请求,其值与`ch.p`正则表达式匹配。 -### [](#the-header-route-predicate-factory)[5.5.头路由谓词工厂](#the-header-route-predicate-factory) ### +### [](#the-header-route-predicate-factory)[5.5.头路由谓词工厂](#the-header-route-predicate-factory) `Header`路由谓词工厂接受两个参数,`header`和`regexp`(这是一个 Java 正则表达式)。此谓词与具有给定名称的头匹配,其值与正则表达式匹配。下面的示例配置头路由谓词: @@ -186,7 +181,7 @@ spring: 如果请求有一个名为`X-Request-Id`的头,其值与`\d+`正则表达式匹配(即它有一个或多个数字的值),则此路由匹配。 -### [](#the-host-route-predicate-factory)[5.6.主机路由谓词工厂](#the-host-route-predicate-factory) ### +### [](#the-host-route-predicate-factory)[5.6.主机路由谓词工厂](#the-host-route-predicate-factory) `Host`路由谓词工厂接受一个参数:主机名列表`patterns`。该模式是一种 Ant 样式的模式,以`.`作为分隔符。此谓词匹配与模式匹配的`Host`头。下面的示例配置了一个主机路由谓词: @@ -207,9 +202,9 @@ URI 模板变量(如`{sub}.myhost.org`)也受到支持。 如果请求具有`Host`头,其值为`www.somehost.org`或`beta.somehost.org`或`www.anotherhost.org`,则此路由匹配。 -这个谓词提取 URI 模板变量(例如`sub`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 +这个谓词提取 URI 模板变量(例如`sub`,在前面的示例中定义)作为名称和值的映射,并将其放在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。然后这些值可供[`GatewayFilter`工厂使用](#gateway-route-filters) -### [](#the-method-route-predicate-factory)[5.7.路由谓词工厂的方法](#the-method-route-predicate-factory) ### +### [](#the-method-route-predicate-factory)[5.7.路由谓词工厂的方法](#the-method-route-predicate-factory) `Method`路由谓词工厂接受一个`methods`参数,该参数是一个或多个参数:要匹配的 HTTP 方法。下面的示例配置了一个方法路由谓词: @@ -228,7 +223,7 @@ spring: 如果请求方法是`GET`或`POST`,则此路由匹配。 -### [](#the-path-route-predicate-factory)[5.8.路径谓词工厂](#the-path-route-predicate-factory) ### +### [](#the-path-route-predicate-factory)[5.8.路径谓词工厂](#the-path-route-predicate-factory) `Path`路由谓词工厂接受两个参数: Spring `PathMatcher``patterns`的列表和一个名为`matchTrailingSlash`的可选标志(默认为`true`)。下面的示例配置了一个路径路由谓词: @@ -249,9 +244,9 @@ spring: 如果`matchTrailingSlash`被设置为`false`,那么请求路径`/red/1/`将不会被匹配。 -这个谓词提取 URI 模板变量(例如`segment`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 +这个谓词提取 URI 模板变量(例如`segment`,在前面的示例中定义)作为名称和值的映射,并将其放在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。然后这些值可供[`GatewayFilter`工厂]使用(#gateway-route-filters) -一种实用方法(称为`get`)可以使访问这些变量变得更容易。下面的示例展示了如何使用`get`方法: +可以使用一种实用方法(称为`get`)来使对这些变量的访问更容易。下面的示例展示了如何使用`get`方法: ``` Map uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); @@ -259,7 +254,7 @@ Map uriVariables = ServerWebExchangeUtils.getPathPredicateVariab String segment = uriVariables.get("segment"); ``` -### [](#the-query-route-predicate-factory)[5.9.查询路由谓词工厂](#the-query-route-predicate-factory) ### +### [](#the-query-route-predicate-factory)[5.9.查询路由谓词工厂](#the-query-route-predicate-factory) `Query`路由谓词工厂接受两个参数:一个必需的`param`和一个可选的`regexp`(这是一个 Java 正则表达式)。下面的示例配置一个查询路由谓词: @@ -293,7 +288,7 @@ spring: 如果请求包含一个`red`查询参数,其值与`gree.`regexp 匹配,则前面的路由匹配,因此`green`和`greet`将匹配。 -### [](#the-remoteaddr-route-predicate-factory)[5.10.RemoteAddr 路由谓词工厂](#the-remoteaddr-route-predicate-factory) ### +### [](#the-remoteaddr-route-predicate-factory)[5.10.RemoteAddr 路由谓词工厂](#the-remoteaddr-route-predicate-factory) `RemoteAddr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。以下示例配置了一个 RemoteAddr 路由谓词: @@ -312,17 +307,17 @@ spring: 如果请求的远程地址是`192.168.1.10`,则此路由匹配。 -#### [](#modifying-the-way-remote-addresses-are-resolved)[5.10.1.修改远程地址的解析方式](#modifying-the-way-remote-addresses-are-resolved) #### +#### [](#modifying-the-way-remote-addresses-are-resolved)[5.10.1.修改远程地址的解析方式](#modifying-the-way-remote-addresses-are-resolved) -默认情况下,RemoteAddr 路由谓词工厂使用来自传入请求的远程地址。如果 Spring 云网关位于代理层的后面,这可能与实际的客户端 IP 地址不匹配。 +默认情况下,RemoteAddr 路由谓词工厂使用来自传入请求的远程地址。如果 Spring Cloud网关位于代理层的后面,这可能与实际的客户端 IP 地址不匹配。 -你可以通过设置自定义`RemoteAddressResolver`来定制远程地址的解析方式。 Spring 云网关带有一个基于[X-forward-for 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For),`XForwardedRemoteAddressResolver`的非默认远程地址解析器。 +你可以通过设置自定义`RemoteAddressResolver`来定制远程地址的解析方式。 Spring Cloud网关带有一个基于[X-forward-for 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For),`XForwardedRemoteAddressResolver`的非默认远程地址解析器。 -`XForwardedRemoteAddressResolver`有两个静态构造函数方法,它们采用不同的方法实现安全性: +`XForwardedRemoteAddressResolver`有两种静态构造函数方法,它们采用不同的方法实现安全性: * `XForwardedRemoteAddressResolver::trustAll`返回一个`RemoteAddressResolver`,它总是使用在`X-Forwarded-For`头中找到的第一个 IP 地址。这种方法容易受到欺骗,因为恶意客户端可能会为`X-Forwarded-For`设置初始值,该初始值将被解析器接受。 -* `XForwardedRemoteAddressResolver::maxTrustedIndex`获取一个索引,该索引与在 Spring 云网关前运行的受信任基础设施的数量相关。 Spring 如果云网关例如只能通过 HAProxy 访问,那么应该使用 1 的值。如果在访问 Spring 云网关之前需要两次跳可信的基础设施,那么应该使用 2 的值。 +* `XForwardedRemoteAddressResolver::maxTrustedIndex`获取一个索引,该索引与在 Spring Cloud网关前运行的受信任基础设施的数量相关。 Spring 如果云网关例如只能通过 HAProxy 访问,那么应该使用 1 的值。如果在 Spring Cloud网关可访问之前需要两个值得信赖的基础设施跳,那么应该使用 2 的值。 考虑以下标头值: @@ -359,7 +354,7 @@ RemoteAddressResolver resolver = XForwardedRemoteAddressResolver ) ``` -### [](#the-weight-route-predicate-factory)[5.11.权重路径谓词工厂](#the-weight-route-predicate-factory) ### +### [](#the-weight-route-predicate-factory)[5.11.权重路径谓词工厂](#the-weight-route-predicate-factory) `Weight`路由谓词工厂接受两个参数:`group`和`weight`(一个 INT)。权重是按组计算的。下面的示例配置了权重路由谓词: @@ -382,7 +377,7 @@ spring: 此路线将把 80% 的流量转发给[weighthigh.org](https://weighthigh.org),并将 20% 的流量转发给[weighlow.org](https://weighlow.org)。 -### [](#the-xforwarded-remote-addr-route-predicate-factory)[5.12.XForwarded 远程 addr 路由谓词工厂](#the-xforwarded-remote-addr-route-predicate-factory) ### +### [](#the-xforwarded-remote-addr-route-predicate-factory)[5.12.XForwarded 远程 addr 路由谓词工厂](#the-xforwarded-remote-addr-route-predicate-factory) `XForwarded Remote Addr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。 @@ -407,15 +402,14 @@ spring: 如果`X-Forwarded-For`标头包含`192.168.1.10`,则此路由匹配。 -[](#gatewayfilter-factories)[6. `GatewayFilter` Factories](#gatewayfilter-factories) ----------- +## [](#gatewayfilter-factories)[6。`GatewayFilter`工厂](#GatewayFilter-工厂) -路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。 Spring 云网关包括许多内置的网关过滤工厂。 +路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。 Spring Cloud网关包括许多内置的网关过滤工厂。 | |有关如何使用以下任何过滤器的更详细示例,请查看[unit tests](https://github.com/spring-cloud/spring-cloud-gateway/tree/master/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#the-addrequestheader-gatewayfilter-factory)[6.1. The `AddRequestHeader` `GatewayFilter` Factory](#the-addrequestheader-gatewayfilter-factory) ### +### [](#the-addrequestheader-gatewayfilter-factory)[6.1。`AddRequestHeader``GatewayFilter`工厂](#the-addrequestheader-gatewayfilter-factory) `AddRequestHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddRequestHeader``GatewayFilter`: @@ -451,9 +445,9 @@ spring: - AddRequestHeader=X-Request-Red, Blue-{segment} ``` -### [](#the-addrequestparameter-gatewayfilter-factory)[6.2. The `AddRequestParameter` `GatewayFilter` Factory](#the-addrequestparameter-gatewayfilter-factory) ### +### [](#the-addrequestparameter-gatewayfilter-factory)[6.2。`AddRequestParameter``GatewayFilter`工厂](#the-addrequestParameter-gatewayfilter-factory) -`AddRequestParameter``GatewayFilter`工厂接受`name`和`value`参数。下面的示例配置`AddRequestParameter``GatewayFilter`: +`AddRequestParameter``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddRequestParameter``GatewayFilter`: 示例 16.application.yml @@ -487,7 +481,7 @@ spring: - AddRequestParameter=foo, bar-{segment} ``` -### [](#the-addresponseheader-gatewayfilter-factory)[6.3. The `AddResponseHeader` `GatewayFilter` Factory](#the-addresponseheader-gatewayfilter-factory) ### +### [](#the-addresponseheader-gatewayfilter-factory)[6.3。`AddResponseHeader``GatewayFilter`工厂](#the-addresponseHeader-gatewayfilter-factory) `AddResponseHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddResponseHeader``GatewayFilter`: @@ -506,7 +500,7 @@ spring: 这将为所有匹配的请求向下游响应的头添加`X-Response-Red:Blue`头。 -`AddResponseHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置了使用变量的`AddResponseHeader``GatewayFilter`: +`AddResponseHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddResponseHeader``GatewayFilter`: 示例 19.application.yml @@ -523,9 +517,9 @@ spring: - AddResponseHeader=foo, bar-{segment} ``` -### [](#the-deduperesponseheader-gatewayfilter-factory)[6.4. The `DedupeResponseHeader` `GatewayFilter` Factory](#the-deduperesponseheader-gatewayfilter-factory) ### +### [](#the-deduperesponseheader-gatewayfilter-factory)[6.4。`DedupeResponseHeader``GatewayFilter`工厂] -DedupeResponseHeader 网关过滤器工厂接受一个`name`参数和一个可选的`strategy`参数。`name`可以包含一个以空格分隔的标题名称列表。以下示例配置`DedupeResponseHeader``GatewayFilter`: +DedupeResponseHeader GatewayFilter 工厂接受一个`name`参数和一个可选的`strategy`参数。`name`可以包含一个以空格分隔的标题名称列表。下面的示例配置`DedupeResponseHeader``GatewayFilter`: 示例 20.application.yml @@ -542,13 +536,13 @@ spring: 在网关 CORS 逻辑和下游逻辑都添加响应头的情况下,这将删除重复的`Access-Control-Allow-Credentials`和`Access-Control-Allow-Origin`响应头的值。 -`DedupeResponseHeader`过滤器还接受一个可选的`strategy`参数。接受的值是`RETAIN_FIRST`(默认)、`RETAIN_LAST`和`RETAIN_UNIQUE`。 +`DedupeResponseHeader`过滤器还接受一个可选的`strategy`参数。可接受的值是`RETAIN_FIRST`(默认)、`RETAIN_LAST`和`RETAIN_UNIQUE`。 -### [](#spring-cloud-circuitbreaker-filter-factory)[6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) ### +### [](#spring-cloud-circuitbreaker-filter-factory)[6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) -Spring 云断路器网关过滤器工厂使用 Spring 云断路器 API 将网关路由封装在断路器中。 Spring Cloud Circuitbreaker 支持可与 Spring Cloud Gateway 一起使用的多个库。 Spring 云支持开箱即用的弹性 4J。 +Spring Cloud断路器网关过滤器工厂使用 Spring Cloud断路器 API 将网关路由封装在断路器中。 Spring Cloud Circuitbreaker 支持可与 Spring Cloud Gateway 一起使用的多个库。 Spring Cloud支持开箱即用的弹性 4J。 -要启用 Spring 云电路断路器过滤器,你需要在 Classpath 上放置`spring-cloud-starter-circuitbreaker-reactor-resilience4j`。下面的示例配置 Spring 云电路断路器`GatewayFilter`: +要启用 Spring Cloud电路断路器过滤器,你需要在 Classpath 上放置`spring-cloud-starter-circuitbreaker-reactor-resilience4j`。以下示例配置了 Spring Cloud电路断路器`GatewayFilter`: 示例 21.application.yml @@ -567,7 +561,7 @@ spring: * [复原力 4J 文档](https://cloud.spring.io/spring-cloud-circuitbreaker/reference/html/spring-cloud-circuitbreaker.html) -Spring 云电路断路器过滤器还可以接受可选的`fallbackUri`参数。目前,只支持`forward:`模式 URI。如果回退被调用,请求将被转发到与 URI 匹配的控制器。下面的示例配置了这种回退: +Spring Cloud电路断路器过滤器还可以接受可选的`fallbackUri`参数。目前,只支持`forward:`模式 URI。如果回退被调用,请求将被转发到与 URI 匹配的控制器。下面的示例配置了这种回退: 示例 22.application.yml @@ -590,7 +584,7 @@ spring: 下面的列表在 Java 中做了相同的事情: -例 23。application.java +例 23。应用程序.java ``` @Bean @@ -603,7 +597,7 @@ public RouteLocator routes(RouteLocatorBuilder builder) { } ``` -当调用断路器回退时,此示例转发到`/inCaseofFailureUseThis`URI。请注意,此示例还演示了(可选的) Spring 云负载平衡器负载平衡(由目标 URI 上的`lb`前缀定义)。 +当调用断路器回退时,此示例转发到`/inCaseofFailureUseThis`URI。请注意,此示例还演示了(可选的) Spring Cloud负载平衡器负载平衡(由目标 URI 上的`lb`前缀定义)。 主要的场景是使用`fallbackUri`在网关应用程序中定义内部控制器或处理程序。但是,你也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示: @@ -635,7 +629,7 @@ spring: 对于外部控制器/处理程序场景,可以添加带有异常详细信息的头。你可以在[FallbackHeaders GatewayFilter 工厂部分](#fallback-headers)中找到有关这样做的更多信息。 -#### [](#circuit-breaker-status-codes)[6.5.1.按状态码切断断路器](#circuit-breaker-status-codes) #### +#### [](#circuit-breaker-status-codes)[6.5.1.按状态码切断断路器](#circuit-breaker-status-codes) 在某些情况下,你可能希望基于从其封装的路由返回的状态码来跳闸断路器。断路器配置对象获取一系列状态代码,如果返回这些代码,将导致断路器跳闸。在设置要跳闸的状态码时,可以使用带有状态码值的整数,也可以使用`HttpStatus`枚举的字符串表示。 @@ -673,7 +667,7 @@ public RouteLocator routes(RouteLocatorBuilder builder) { } ``` -### [](#fallback-headers)[6.6. The `FallbackHeaders` `GatewayFilter` Factory](#fallback-headers) ### +### [](#fallback-headers)[6.6。`FallbackHeaders``GatewayFilter`工厂](#fallback-headers) `FallbackHeaders`工厂允许你在转发到外部应用程序中的`fallbackUri`的请求的标题中添加 Spring Cloud Circuitbreaker 执行异常详细信息,如下所示: @@ -703,23 +697,23 @@ spring: executionExceptionTypeHeaderName: Test-Header ``` -在本例中,在运行断路器时发生执行异常后,请求被转发到在`localhost:9994`上运行的应用程序中的`fallback`端点或处理程序。带有异常类型、消息和(如果可用的话)根原因异常类型和消息的头将由`FallbackHeaders`过滤器添加到该请求中。 +在此示例中,在运行断路器时发生执行异常之后,请求被转发到在`localhost:9994`上运行的应用程序中的`fallback`端点或处理程序。带有异常类型、消息和(如果可用的话)根原因异常类型和消息的头将由`FallbackHeaders`过滤器添加到该请求中。 你可以通过设置以下参数的值(以它们的默认值显示)来覆盖配置中的头的名称: -* `executionExceptionTypeHeaderName`(`“execution-exception-type”`) +* `executionExceptionTypeHeaderName`(`"Execution-Exception-Type"`) -* `executionExceptionMessageHeaderName`(`“execution-exception-message”`) +* `executionExceptionMessageHeaderName`(`"Execution-Exception-Message"`) -* `rootCauseExceptionTypeHeaderName`(`“root-cause-exception-type”`) +* `rootCauseExceptionTypeHeaderName`(`"Root-Cause-Exception-Type"`) -* `rootCauseExceptionMessageHeaderName`(`“root-cause-exception-message”`) +* `rootCauseExceptionMessageHeaderName`(`"Root-Cause-Exception-Message"`) 有关断路器和网关的更多信息,请参见[Spring Cloud CircuitBreaker Factory section](#spring-cloud-circuitbreaker-filter-factory)。 -### [](#the-maprequestheader-gatewayfilter-factory)[6.7. The `MapRequestHeader` `GatewayFilter` Factory](#the-maprequestheader-gatewayfilter-factory) ### +### [](#the-maprequestheader-gatewayfilter-factory)[6.7。`MapRequestHeader``GatewayFilter`工厂](#the-maprequestheader-gatewayfilter-factory) -`MapRequestHeader``GatewayFilter`工厂接受`fromHeader`和`toHeader`参数。它将创建一个新的命名头,并从传入的 HTTP 请求中从现有的命名头中提取该值。如果输入标头不存在,则过滤器不会产生任何影响。如果新的命名标头已经存在,那么它的值将被新的值扩充。以下示例配置`MapRequestHeader`: +`MapRequestHeader``GatewayFilter`工厂接受`fromHeader`和`toHeader`参数。它创建一个新的命名头(`toHeader`),并从传入的 HTTP 请求中从现有的命名头(`fromHeader`)中提取该值。如果输入标头不存在,则过滤器不会产生任何影响。如果新的命名标头已经存在,那么它的值将被新的值扩充。以下示例配置`MapRequestHeader`: 示例 28.application.yml @@ -736,9 +730,9 @@ spring: 这会将`X-Request-Red:`头添加到下游请求,并从传入的 HTTP 请求的`Blue`头更新其值。 -### [](#the-prefixpath-gatewayfilter-factory)[6.8. The `PrefixPath` `GatewayFilter` Factory](#the-prefixpath-gatewayfilter-factory) ### +### [](#the-prefixpath-gatewayfilter-factory)[6.8。`PrefixPath``GatewayFilter`工厂](#the-prefixpath-gatewayfilter-factory) -`PrefixPath``GatewayFilter`工厂接受一个`prefix`参数。下面的示例配置`PrefixPath``GatewayFilter`: +`PrefixPath``GatewayFilter`工厂接受一个`prefix`参数。以下示例配置`PrefixPath``GatewayFilter`: 示例 29.application.yml @@ -755,9 +749,9 @@ spring: 这将在所有匹配请求的路径前缀`/mypath`。因此,对`/hello`的请求将被发送到`/mypath/hello`。 -### [](#the-preservehostheader-gatewayfilter-factory)[6.9. The `PreserveHostHeader` `GatewayFilter` Factory](#the-preservehostheader-gatewayfilter-factory) ### +### [](#the-preservehostheader-gatewayfilter-factory)[6.9。`PreserveHostHeader``GatewayFilter`工厂](#the-preserveHostheader-gatewayfilter-factory) -`PreserveHostHeader``GatewayFilter`工厂没有参数。此筛选器设置一个请求属性,由路由筛选器检查该属性,以确定是否应发送原始的主机头,而不是由 HTTP 客户机确定的主机头。以下示例配置`PreserveHostHeader``GatewayFilter`: +`PreserveHostHeader``GatewayFilter`工厂没有参数。此筛选器设置一个请求属性,路由筛选器将检查该属性以确定是否应发送原始的主机头,而不是由 HTTP 客户机确定的主机头。以下示例配置`PreserveHostHeader``GatewayFilter`: 示例 30.application.yml @@ -772,13 +766,13 @@ spring: - PreserveHostHeader ``` -### [](#the-requestratelimiter-gatewayfilter-factory)[6.10. The `RequestRateLimiter` `GatewayFilter` Factory](#the-requestratelimiter-gatewayfilter-factory) ### +### [](#the-requestratelimiter-gatewayfilter-factory)[6.10。`RequestRateLimiter``GatewayFilter`工厂](#the-requestratelimiter-gatewayfilter-factory) -`RequestRateLimiter``GatewayFilter`工厂使用`RateLimiter`实现来确定是否允许当前请求继续执行。如果不是,则返回`HTTP 429 - Too Many Requests`(默认情况下)的状态。 +`RequestRateLimiter``GatewayFilter`工厂使用`RateLimiter`实现来确定是否允许当前请求继续进行。如果不是,则返回`HTTP 429 - Too Many Requests`(默认情况下)的状态。 -这个过滤器接受一个可选的`keyResolver`参数和特定于速率限制器的参数(将在本节后面描述)。 +该过滤器接受一个可选的`keyResolver`参数和特定于速率限制器的参数(将在本节后面描述)。 -`keyResolver`是实现`KeyResolver`接口的 Bean。在配置中,使用 spel 按名称引用 Bean。`#{@mykeyresolver}` 是引用名为`myKeyResolver`的 Bean 的 spel 表达式。下面的清单显示了`KeyResolver`接口: +`keyResolver`是实现`KeyResolver`接口的 Bean。在配置中,使用 spel 通过名称引用 Bean。`#{@myKeyResolver}`是一个 spel 表达式,它引用名为`myKeyResolver`的 Bean。下面的清单显示了`KeyResolver`接口: 例 31。keyresolver.java @@ -792,12 +786,12 @@ public interface KeyResolver { `KeyResolver`的默认实现是`PrincipalNameKeyResolver`,它从`ServerWebExchange`检索`Principal`并调用`Principal.getName()`。 -默认情况下,如果`KeyResolver`没有找到密钥,请求将被拒绝。你可以通过设置`spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key`(`true’或`false`)和`spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code`属性来调整此行为。 +默认情况下,如果`KeyResolver`没有找到密钥,请求将被拒绝。你可以通过设置`spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key`(`true`或`false`)和`spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code`属性来调整此行为。 -| |`RequestRateLimiter`不能使用“shortcut”符号进行配置。下面的示例是*无效*:

示例 32.application.properties

```
# 无效的快捷方式配置
Spring.cloud.gateway.routes[0].filters[0]=requestrateLimiter=2,2,#{@userkeyresolever=“426”/>```| +| |`RequestRateLimiter`不能使用“shortcut”符号进行配置。下面的示例是*无效*:

示例 32.application.properties

```
# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
```| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#the-redis-ratelimiter)[6.10.1. The Redis `RateLimiter`](#the-redis-ratelimiter) #### +#### [](#the-redis-ratelimiter)[6.1 0.1。Redis`RateLimiter`](#the-redis-ratelimiter) Redis 实现基于在[Stripe](https://stripe.com/blog/rate-limiters)上完成的工作。它需要使用`spring-boot-starter-data-redis-reactive` Spring 引导启动器。 @@ -809,7 +803,7 @@ Redis 实现基于在[Stripe](https://stripe.com/blog/rate-limiters)上完成的 `redis-rate-limiter.requestedTokens`属性是一个请求需要多少令牌。这是每个请求从 bucket 中获取的令牌的数量,默认为`1`。 -通过在`replenishRate`和`burstCapacity`中设置相同的值,可以实现稳定的速率。可以通过将`burstCapacity`设置为高于`replenishRate`来允许临时突发。在这种情况下,速率限制器需要允许在两次突发之间有一段时间(根据`replenishRate`),因为连续两次突发将导致丢弃请求(`HTTP429-太多请求’)。下面的清单配置了`redis-rate-limiter`: +通过在`replenishRate`和`burstCapacity`中设置相同的值,可以实现稳定的速率。可以通过将`burstCapacity`设置为高于`replenishRate`来允许临时突发。在这种情况下,速率限制器需要在两次突发之间允许一段时间(根据`replenishRate`),因为连续两次突发将导致丢弃请求(`HTTP 429 - Too Many Requests`)。下面的列表配置了`redis-rate-limiter`: 速率限制`1 request/s`通过将`replenishRate`设置为所需的请求数,`requestedTokens`设置为秒内的时间跨度,`burstCapacity`设置为`replenishRate`和`requestedTokens`的乘积,例如,设置`replenishRate=1`,`requestedTokens=60`和`burstCapacity=60`将导致`1 request/min`的限制。 @@ -843,7 +837,7 @@ KeyResolver userKeyResolver() { 这定义了每个用户 10 个的请求速率限制。允许突发 20 个请求,但在接下来的一秒钟内,只有 10 个请求可用。`KeyResolver`是一个获得`user`请求参数的简单参数(请注意,这不推荐用于生产)。 -还可以将速率限制器定义为实现`RateLimiter`接口的 Bean。在配置中,你可以使用 spel 按名称引用 Bean。`#{@myratelimiter}` 是一个 spel 表达式,它引用名为`myRateLimiter`的 Bean。下面的清单定义了一个速率限制器,该限制器使用上一个清单中定义的`KeyResolver`: +还可以将速率限制器定义为实现`RateLimiter`接口的 Bean。在配置中,可以使用 spel 按名称引用 Bean。`#{@myRateLimiter}`是一个 spel 表达式,它引用名为`myRateLimiter`的 Bean。下面的清单定义了一个速率限制器,该限制器使用上一个清单中定义的`KeyResolver`: 示例 35.application.yml @@ -861,7 +855,7 @@ spring: key-resolver: "#{@userKeyResolver}" ``` -### [](#the-redirectto-gatewayfilter-factory)[6.11. The `RedirectTo` `GatewayFilter` Factory](#the-redirectto-gatewayfilter-factory) ### +### [](#the-redirectto-gatewayfilter-factory)[6.11。`RedirectTo``GatewayFilter`工厂](#the-redirectto-gatewayfilter-factory) `RedirectTo``GatewayFilter`工厂接受两个参数,`status`和`url`。`status`参数应该是 300 系列重定向 HTTP 代码,例如 301。`url`参数应该是一个有效的 URL。这是`Location`标头的值。对于相对重定向,应该使用`uri: no://op`作为路由定义的 URI。下面的列表配置了`RedirectTo``GatewayFilter`: @@ -880,7 +874,7 @@ spring: 这将发送带有`Location:https://acme.org`头的状态 302 来执行重定向。 -### [](#the-removerequestheader-gatewayfilter-factory)[6.12. The `RemoveRequestHeader` GatewayFilter Factory](#the-removerequestheader-gatewayfilter-factory) ### +### [](#the-removerequestheader-gatewayfilter-factory)[6.12。The`RemoveRequestHeader`GatewayFilter Factory] `RemoveRequestHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveRequestHeader``GatewayFilter`: @@ -899,7 +893,7 @@ spring: 这将在向下游发送`X-Request-Foo`头之前删除它。 -### [](#removeresponseheader-gatewayfilter-factory)[6.13. `RemoveResponseHeader` `GatewayFilter` Factory](#removeresponseheader-gatewayfilter-factory) ### +### [](#removeresponseheader-gatewayfilter-factory)[6.13。`RemoveResponseHeader``GatewayFilter`工厂] `RemoveResponseHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveResponseHeader``GatewayFilter`: @@ -920,7 +914,7 @@ spring: 要删除任何类型的敏感报头,你应该为你可能想要删除的任何路由配置此筛选器。此外,你可以使用`spring.cloud.gateway.default-filters`配置该过滤器一次,并将其应用于所有路由。 -### [](#the-removerequestparameter-gatewayfilter-factory)[6.14. The `RemoveRequestParameter` `GatewayFilter` Factory](#the-removerequestparameter-gatewayfilter-factory) ### +### [](#the-removerequestparameter-gatewayfilter-factory)[6.14。`RemoveRequestParameter``GatewayFilter`工厂](#the-removeRequestParameter-gatewayfilter-factory) `RemoveRequestParameter``GatewayFilter`工厂接受一个`name`参数。它是要删除的查询参数的名称。下面的示例配置`RemoveRequestParameter``GatewayFilter`: @@ -939,7 +933,7 @@ spring: 这将在向下游发送`red`参数之前删除该参数。 -### [](#the-rewritepath-gatewayfilter-factory)[6.15. The `RewritePath` `GatewayFilter` Factory](#the-rewritepath-gatewayfilter-factory) ### +### [](#the-rewritepath-gatewayfilter-factory)[6.15。`RewritePath``GatewayFilter`工厂](#the-rewritePath-gatewayfilter-factory) `RewritePath``GatewayFilter`工厂接受一个路径`regexp`参数和一个`replacement`参数。这使用 Java 正则表达式以灵活的方式重写请求路径。下面的列表配置了`RewritePath``GatewayFilter`: @@ -958,2941 +952,11 @@ spring: - RewritePath=/red/?(?.*), /$\{segment} ``` -对于`/red/blue`的请求路径,在发出下游请求之前,将路径设置为`/blue`。注意,由于 YAML 规范,`Spring 云网关 -========== +对于`/red/blue`的请求路径,在发出下游请求之前,将路径设置为`/blue`。注意,由于 YAML 规范,`$`应该替换为`$\`。 +### [](#rewritelocationresponseheader-gatewayfilter-factory)[6.16。`RewriteLocationResponseHeader``GatewayFilter`工厂] -该项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括: Spring 5、 Spring Boot2 和 Project Reactor。 Spring Cloud Gateway 旨在提供一种简单但有效的方法来路由到 API,并向它们提供跨领域的关注,例如:安全性、监视/度量和弹性。 - -[](#gateway-starter)[1. How to Include Spring Cloud Gateway](#gateway-starter) ----------- - -要在项目中包含 Spring 云网关,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-gateway`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 - -如果包含启动器,但不希望启用网关,请设置`spring.cloud.gateway.enabled=false`。 - -| |Spring 云网关是建立在[Spring Boot 2.x](https://spring.io/projects/spring-boot#learn)、[Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html)和[Project Reactor](https://projectreactor.io/docs)之上的。因此,当你使用 Spring 云网关时,许多你熟悉的同步库(例如 Spring 数据和 Spring 安全性)和模式可能不适用,如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前,先阅读他们的文档,以熟悉一些新概念。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |Spring 云网关需要由 Spring 启动和 Spring WebFlux 提供的 Netty 运行时。它在传统 Servlet 容器中或构建为 WAR 时不工作。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -[](#glossary)[2. Glossary](#glossary) ----------- - -* **路线**:网关的基本构件。它由一个 ID、一个目标 URI、一组谓词和一组筛选器定义。如果聚合谓词为 true,则匹配路由。 - -* **谓词**:这是[Java8 函数谓词](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)。输入类型为[Spring Framework `ServerWebExchange`](https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/server/ServerWebExchange.html)。这使你能够匹配 HTTP 请求中的任何内容,例如标题或参数。 - -* **过滤器**:这些是用特定工厂构造的[`GatewayFilter`](https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayFilter.java)的实例。在这里,你可以在发送下游请求之前或之后修改请求和响应。 - -[](#gateway-how-it-works)[3. How It Works](#gateway-how-it-works) ----------- - -下图提供了 Spring 云网关如何工作的高级概述: - -![Spring Cloud Gateway Diagram](./images/spring_cloud_gateway_diagram.png) - -客户端向 Spring 云网关提出请求。如果网关处理程序映射确定请求与路由匹配,则将请求发送到网关 Web 处理程序。此处理程序通过特定于该请求的筛选链来运行该请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤逻辑都会被执行。然后提出代理请求。在提出代理请求之后,将运行“POST”过滤逻辑。 - -| |在没有端口的路由中定义的 URI 分别获得 HTTP 和 HTTPS URI 的默认端口号 80 和 443。| -|---|----------------------------------------------------------------------------------------------------------------------| - -[](#configuring-route-predicate-factories-and-gateway-filter-factories)[4.配置路由谓词工厂和网关过滤器工厂](#configuring-route-predicate-factories-and-gateway-filter-factories) ----------- - -配置谓词和过滤器有两种方法:快捷方式和完全展开的参数。下面的大多数示例都使用了快捷方式。 - -名称和参数名称将以`code`的形式在每个部分的第一个或两个表示中列出。参数通常按快捷方式配置所需的顺序列出。 - -### [](#shortcut-configuration)[4.1.快捷方式配置](#shortcut-configuration) ### - -快捷方式配置由筛选器名称识别,后面跟着一个等号,后面是用逗号分隔的参数值。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - Cookie=mycookie,mycookievalue -``` - -上一个示例用两个参数定义了`Cookie`路由谓词工厂,cookie 名`mycookie`和要匹配`mycookievalue`的值。 - -### [](#fully-expanded-arguments)[4.2.完全展开的论证](#fully-expanded-arguments) ### - -完全展开的参数看起来更像是带有名称/值对的标准 YAML 配置。通常,会有`name`键和`args`键。`args`键是用于配置谓词或筛选器的键值对的映射。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - name: Cookie - args: - name: mycookie - regexp: mycookievalue -``` - -这是上面显示的`Cookie`谓词的快捷配置的完整配置。 - -[](#gateway-request-predicates-factories)[5.路线谓词工厂](#gateway-request-predicates-factories) ----------- - -Spring 云网关将路由匹配为 Spring WebFlux`HandlerMapping`基础设施的一部分。 Spring 云网关包括许多内置的路由谓词工厂。所有这些谓词在 HTTP 请求的不同属性上匹配。你可以将多个路由谓词工厂与逻辑`and`语句组合在一起。 - -### [](#the-after-route-predicate-factory)[5.1.后路由谓词工厂](#the-after-route-predicate-factory) ### - -`After`路由谓词工厂接受一个参数,一个`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的 DateTime 之后发生的请求。下面的示例配置一个 after 路由谓词: - -示例 1.应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - After=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何请求后提出的 JAN20,2017 年 17:42 山区时间(丹佛)。 - -### [](#the-before-route-predicate-factory)[5.2.前路由谓词工厂](#the-before-route-predicate-factory) ### - -`Before`路由谓词工厂接受一个参数,a`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的`datetime`之前发生的请求。下面的示例配置一个 before 路由谓词: - -示例 2.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: before_route - uri: https://example.org - predicates: - - Before=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何在 JAN20,2017 年 17:42 山区时间(丹佛)之前提出的请求。 - -### [](#the-between-route-predicate-factory)[5.3.路由谓词之间的工厂](#the-between-route-predicate-factory) ### - -`Between`路由谓词工厂接受两个参数,`datetime1`和`datetime2`,它们是 Java`ZonedDateTime`对象。此谓词匹配发生在`datetime1`之后和`datetime2`之前的请求。`datetime2`参数必须位于`datetime1`之后。下面的示例配置了一个 between 路由谓词: - -示例 3.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: between_route - uri: https://example.org - predicates: - - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合在 JAN20,2017 年 17:42 山区时间(丹佛)之后和 JAN21,2017 年 17:42 山区时间(丹佛)之前提出的任何请求。这对于维护窗口可能是有用的。 - -### [](#the-cookie-route-predicate-factory)[5.4.cookie 路由谓词工厂](#the-cookie-route-predicate-factory) ### - -`Cookie`路由谓词工厂接受两个参数,cookie`name`和`regexp`(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。下面的示例配置了一个 Cookie 路由谓词工厂: - -示例 4.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: cookie_route - uri: https://example.org - predicates: - - Cookie=chocolate, ch.p -``` - -此路由匹配具有名为`chocolate`的 cookie 的请求,其值与`ch.p`正则表达式匹配。 - -### [](#the-header-route-predicate-factory)[5.5.头路由谓词工厂](#the-header-route-predicate-factory) ### - -`Header`路由谓词工厂接受两个参数,`header`和`regexp`(这是一个 Java 正则表达式)。此谓词与具有给定名称的头匹配,其值与正则表达式匹配。下面的示例配置头路由谓词: - -示例 5.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: header_route - uri: https://example.org - predicates: - - Header=X-Request-Id, \d+ -``` - -如果请求有一个名为`X-Request-Id`的头,其值与`\d+`正则表达式匹配(即它有一个或多个数字的值),则此路由匹配。 - -### [](#the-host-route-predicate-factory)[5.6.主机路由谓词工厂](#the-host-route-predicate-factory) ### - -`Host`路由谓词工厂接受一个参数:主机名列表`patterns`。该模式是一种 Ant 样式的模式,以`.`作为分隔符。此谓词匹配与模式匹配的`Host`头。下面的示例配置了一个主机路由谓词: - -示例 6.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: host_route - uri: https://example.org - predicates: - - Host=**.somehost.org,**.anotherhost.org -``` - -URI 模板变量(如`{sub}.myhost.org`)也受到支持。 - -如果请求具有`Host`头,其值为`www.somehost.org`或`beta.somehost.org`或`www.anotherhost.org`,则此路由匹配。 - -这个谓词提取 URI 模板变量(例如`sub`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -### [](#the-method-route-predicate-factory)[5.7.路由谓词工厂的方法](#the-method-route-predicate-factory) ### - -`Method`路由谓词工厂接受一个`methods`参数,该参数是一个或多个参数:要匹配的 HTTP 方法。下面的示例配置了一个方法路由谓词: - -示例 7.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: method_route - uri: https://example.org - predicates: - - Method=GET,POST -``` - -如果请求方法是`GET`或`POST`,则此路由匹配。 - -### [](#the-path-route-predicate-factory)[5.8.路径谓词工厂](#the-path-route-predicate-factory) ### - -`Path`路由谓词工厂接受两个参数: Spring `PathMatcher``patterns`的列表和一个名为`matchTrailingSlash`的可选标志(默认为`true`)。下面的示例配置了一个路径路由谓词: - -示例 8.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: path_route - uri: https://example.org - predicates: - - Path=/red/{segment},/blue/{segment} -``` - -如果请求路径是:例如:`/red/1`或`/red/1/`或`/red/blue`或`/blue/green`,则此路由匹配。 - -如果`matchTrailingSlash`被设置为`false`,那么请求路径`/red/1/`将不会被匹配。 - -这个谓词提取 URI 模板变量(例如`segment`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -一种实用方法(称为`get`)可以使访问这些变量变得更容易。下面的示例展示了如何使用`get`方法: - -``` -Map uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); - -String segment = uriVariables.get("segment"); -``` - -### [](#the-query-route-predicate-factory)[5.9.查询路由谓词工厂](#the-query-route-predicate-factory) ### - -`Query`路由谓词工厂接受两个参数:一个必需的`param`和一个可选的`regexp`(这是一个 Java 正则表达式)。下面的示例配置一个查询路由谓词: - -示例 9.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=green -``` - -如果请求包含`green`查询参数,则前面的路由匹配。 - -application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=red, gree. -``` - -如果请求包含一个`red`查询参数,其值与`gree.`regexp 匹配,则前面的路由匹配,因此`green`和`greet`将匹配。 - -### [](#the-remoteaddr-route-predicate-factory)[5.10.RemoteAddr 路由谓词工厂](#the-remoteaddr-route-predicate-factory) ### - -`RemoteAddr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。以下示例配置了一个 RemoteAddr 路由谓词: - -示例 10.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: remoteaddr_route - uri: https://example.org - predicates: - - RemoteAddr=192.168.1.1/24 -``` - -如果请求的远程地址是`192.168.1.10`,则此路由匹配。 - -#### [](#modifying-the-way-remote-addresses-are-resolved)[5.10.1.修改远程地址的解析方式](#modifying-the-way-remote-addresses-are-resolved) #### - -默认情况下,RemoteAddr 路由谓词工厂使用来自传入请求的远程地址。如果 Spring 云网关位于代理层的后面,这可能与实际的客户端 IP 地址不匹配。 - -你可以通过设置自定义`RemoteAddressResolver`来定制远程地址的解析方式。 Spring 云网关带有一个基于[X-forward-for 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For),`XForwardedRemoteAddressResolver`的非默认远程地址解析器。 - -`XForwardedRemoteAddressResolver`有两个静态构造函数方法,它们采用不同的方法实现安全性: - -* `XForwardedRemoteAddressResolver::trustAll`返回一个`RemoteAddressResolver`,它总是使用在`X-Forwarded-For`头中找到的第一个 IP 地址。这种方法容易受到欺骗,因为恶意客户端可能会为`X-Forwarded-For`设置初始值,该初始值将被解析器接受。 - -* `XForwardedRemoteAddressResolver::maxTrustedIndex`获取一个索引,该索引与在 Spring 云网关前运行的受信任基础设施的数量相关。 Spring 如果云网关例如只能通过 HAProxy 访问,那么应该使用 1 的值。如果在访问 Spring 云网关之前需要两次跳可信的基础设施,那么应该使用 2 的值。 - -考虑以下标头值: - -``` -X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3 -``` - -以下`maxTrustedIndex`值产生以下远程地址: - -| `maxTrustedIndex` |结果| -|------------------------|-----------------------------------------------------------| -|[`Integer.MIN_VALUE`,0] |(无效,`IllegalArgumentException`在初始化期间)| -| 1 | 0.0.0.3 | -| 2 | 0.0.0.2 | -| 3 | 0.0.0.1 | -|[4, `Integer.MAX_VALUE`]| 0.0.0.1 | - -下面的示例展示了如何使用 Java 实现相同的配置: - -例 11。gatewayconfig.java - -``` -RemoteAddressResolver resolver = XForwardedRemoteAddressResolver - .maxTrustedIndex(1); - -... - -.route("direct-route", - r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24") - .uri("https://downstream1") -.route("proxied-route", - r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24") - .uri("https://downstream2") -) -``` - -### [](#the-weight-route-predicate-factory)[5.11.权重路径谓词工厂](#the-weight-route-predicate-factory) ### - -`Weight`路由谓词工厂接受两个参数:`group`和`weight`(一个 INT)。权重是按组计算的。下面的示例配置了权重路由谓词: - -示例 12.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: weight_high - uri: https://weighthigh.org - predicates: - - Weight=group1, 8 - - id: weight_low - uri: https://weightlow.org - predicates: - - Weight=group1, 2 -``` - -此路线将把 80% 的流量转发给[weighthigh.org](https://weighthigh.org),并将 20% 的流量转发给[weighlow.org](https://weighlow.org)。 - -### [](#the-xforwarded-remote-addr-route-predicate-factory)[5.12.XForwarded 远程 addr 路由谓词工厂](#the-xforwarded-remote-addr-route-predicate-factory) ### - -`XForwarded Remote Addr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。 - -此路由谓词允许基于`X-Forwarded-For`HTTP 报头对请求进行过滤。 - -这可以用于反向代理,例如负载均衡器或 Web 应用程序防火墙,在这些代理中,只有当请求来自由这些反向代理使用的受信任的 IP 地址列表时,才允许请求。 - -下面的示例配置了一个 XForWardeDremoteaddr 路由谓词: - -示例 13.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: xforwarded_remoteaddr_route - uri: https://example.org - predicates: - - XForwardedRemoteAddr=192.168.1.1/24 -``` - -如果`X-Forwarded-For`标头包含`192.168.1.10`,则此路由匹配。 - -[](#gatewayfilter-factories)[6. `GatewayFilter` Factories](#gatewayfilter-factories) ----------- - -路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。 Spring 云网关包括许多内置的网关过滤工厂。 - -| |有关如何使用以下任何过滤器的更详细示例,请查看[unit tests](https://github.com/spring-cloud/spring-cloud-gateway/tree/master/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -### [](#the-addrequestheader-gatewayfilter-factory)[6.1. The `AddRequestHeader` `GatewayFilter` Factory](#the-addrequestheader-gatewayfilter-factory) ### - -`AddRequestHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddRequestHeader``GatewayFilter`: - -示例 14.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - filters: - - AddRequestHeader=X-Request-red, blue -``` - -对于所有匹配的请求,此清单将`X-Request-red:blue`头添加到下游请求的头。 - -`AddRequestHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestHeader``GatewayFilter`: - -示例 15.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - predicates: - - Path=/red/{segment} - filters: - - AddRequestHeader=X-Request-Red, Blue-{segment} -``` - -### [](#the-addrequestparameter-gatewayfilter-factory)[6.2. The `AddRequestParameter` `GatewayFilter` Factory](#the-addrequestparameter-gatewayfilter-factory) ### - -`AddRequestParameter``GatewayFilter`工厂接受`name`和`value`参数。下面的示例配置`AddRequestParameter``GatewayFilter`: - -示例 16.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - filters: - - AddRequestParameter=red, blue -``` - -这将为所有匹配的请求将`red=blue`添加到下游请求的查询字符串中。 - -`AddRequestParameter`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestParameter``GatewayFilter`: - -示例 17.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddRequestParameter=foo, bar-{segment} -``` - -### [](#the-addresponseheader-gatewayfilter-factory)[6.3. The `AddResponseHeader` `GatewayFilter` Factory](#the-addresponseheader-gatewayfilter-factory) ### - -`AddResponseHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddResponseHeader``GatewayFilter`: - -示例 18.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - filters: - - AddResponseHeader=X-Response-Red, Blue -``` - -这将为所有匹配的请求向下游响应的头添加`X-Response-Red:Blue`头。 - -`AddResponseHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置了使用变量的`AddResponseHeader``GatewayFilter`: - -示例 19.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddResponseHeader=foo, bar-{segment} -``` - -### [](#the-deduperesponseheader-gatewayfilter-factory)[6.4. The `DedupeResponseHeader` `GatewayFilter` Factory](#the-deduperesponseheader-gatewayfilter-factory) ### - -DedupeResponseHeader 网关过滤器工厂接受一个`name`参数和一个可选的`strategy`参数。`name`可以包含一个以空格分隔的标题名称列表。以下示例配置`DedupeResponseHeader``GatewayFilter`: - -示例 20.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: dedupe_response_header_route - uri: https://example.org - filters: - - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin -``` - -在网关 CORS 逻辑和下游逻辑都添加响应头的情况下,这将删除重复的`Access-Control-Allow-Credentials`和`Access-Control-Allow-Origin`响应头的值。 - -`DedupeResponseHeader`过滤器还接受一个可选的`strategy`参数。接受的值是`RETAIN_FIRST`(默认)、`RETAIN_LAST`和`RETAIN_UNIQUE`。 - -### [](#spring-cloud-circuitbreaker-filter-factory)[6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) ### - -Spring 云断路器网关过滤器工厂使用 Spring 云断路器 API 将网关路由封装在断路器中。 Spring Cloud Circuitbreaker 支持可与 Spring Cloud Gateway 一起使用的多个库。 Spring 云支持开箱即用的弹性 4J。 - -要启用 Spring 云电路断路器过滤器,你需要在 Classpath 上放置`spring-cloud-starter-circuitbreaker-reactor-resilience4j`。下面的示例配置 Spring 云电路断路器`GatewayFilter`: - -示例 21.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: https://example.org - filters: - - CircuitBreaker=myCircuitBreaker -``` - -要配置断路器,请参阅你正在使用的底层断路器实现的配置。 - -* [复原力 4J 文档](https://cloud.spring.io/spring-cloud-circuitbreaker/reference/html/spring-cloud-circuitbreaker.html) - -Spring 云电路断路器过滤器还可以接受可选的`fallbackUri`参数。目前,只支持`forward:`模式 URI。如果回退被调用,请求将被转发到与 URI 匹配的控制器。下面的示例配置了这种回退: - -示例 22.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint -``` - -下面的列表在 Java 中做了相同的事情: - -例 23。application.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -当调用断路器回退时,此示例转发到`/inCaseofFailureUseThis`URI。请注意,此示例还演示了(可选的) Spring 云负载平衡器负载平衡(由目标 URI 上的`lb`前缀定义)。 - -主要的场景是使用`fallbackUri`在网关应用程序中定义内部控制器或处理程序。但是,你也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示: - -示例 24.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback -``` - -在此示例中,网关应用程序中没有`fallback`端点或处理程序。然而,在另一个应用程序中有一个,注册在`[localhost:9994](http://localhost:9994)`下。 - -在请求被转发到 Fallback 的情况下, Spring Cloud Circuitbreaker 网关过滤器还提供了导致它的`Throwable`。它被添加到`ServerWebExchange`中,作为`ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR`属性,该属性可以在处理网关应用程序内的回退时使用。 - -对于外部控制器/处理程序场景,可以添加带有异常详细信息的头。你可以在[FallbackHeaders GatewayFilter 工厂部分](#fallback-headers)中找到有关这样做的更多信息。 - -#### [](#circuit-breaker-status-codes)[6.5.1.按状态码切断断路器](#circuit-breaker-status-codes) #### - -在某些情况下,你可能希望基于从其封装的路由返回的状态码来跳闸断路器。断路器配置对象获取一系列状态代码,如果返回这些代码,将导致断路器跳闸。在设置要跳闸的状态码时,可以使用带有状态码值的整数,也可以使用`HttpStatus`枚举的字符串表示。 - -示例 25.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - statusCodes: - - 500 - - "NOT_FOUND" -``` - -例 26。应用程序.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis").addStatusCode("INTERNAL_SERVER_ERROR")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -### [](#fallback-headers)[6.6. The `FallbackHeaders` `GatewayFilter` Factory](#fallback-headers) ### - -`FallbackHeaders`工厂允许你在转发到外部应用程序中的`fallbackUri`的请求的标题中添加 Spring Cloud Circuitbreaker 执行异常详细信息,如下所示: - -示例 27.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback - filters: - - name: FallbackHeaders - args: - executionExceptionTypeHeaderName: Test-Header -``` - -在本例中,在运行断路器时发生执行异常后,请求被转发到在`localhost:9994`上运行的应用程序中的`fallback`端点或处理程序。带有异常类型、消息和(如果可用的话)根原因异常类型和消息的头将由`FallbackHeaders`过滤器添加到该请求中。 - -你可以通过设置以下参数的值(以它们的默认值显示)来覆盖配置中的头的名称: - -* `executionExceptionTypeHeaderName`(`“execution-exception-type”`) - -* `executionExceptionMessageHeaderName`(`“execution-exception-message”`) - -* `rootCauseExceptionTypeHeaderName`(`“root-cause-exception-type”`) - -* `rootCauseExceptionMessageHeaderName`(`“root-cause-exception-message”`) - -有关断路器和网关的更多信息,请参见[Spring Cloud CircuitBreaker Factory section](#spring-cloud-circuitbreaker-filter-factory)。 - -### [](#the-maprequestheader-gatewayfilter-factory)[6.7. The `MapRequestHeader` `GatewayFilter` Factory](#the-maprequestheader-gatewayfilter-factory) ### - -`MapRequestHeader``GatewayFilter`工厂接受`fromHeader`和`toHeader`参数。它将创建一个新的命名头,并从传入的 HTTP 请求中从现有的命名头中提取该值。如果输入标头不存在,则过滤器不会产生任何影响。如果新的命名标头已经存在,那么它的值将被新的值扩充。以下示例配置`MapRequestHeader`: - -示例 28.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: map_request_header_route - uri: https://example.org - filters: - - MapRequestHeader=Blue, X-Request-Red -``` - -这会将`X-Request-Red:`头添加到下游请求,并从传入的 HTTP 请求的`Blue`头更新其值。 - -### [](#the-prefixpath-gatewayfilter-factory)[6.8. The `PrefixPath` `GatewayFilter` Factory](#the-prefixpath-gatewayfilter-factory) ### - -`PrefixPath``GatewayFilter`工厂接受一个`prefix`参数。下面的示例配置`PrefixPath``GatewayFilter`: - -示例 29.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - PrefixPath=/mypath -``` - -这将在所有匹配请求的路径前缀`/mypath`。因此,对`/hello`的请求将被发送到`/mypath/hello`。 - -### [](#the-preservehostheader-gatewayfilter-factory)[6.9. The `PreserveHostHeader` `GatewayFilter` Factory](#the-preservehostheader-gatewayfilter-factory) ### - -`PreserveHostHeader``GatewayFilter`工厂没有参数。此筛选器设置一个请求属性,由路由筛选器检查该属性,以确定是否应发送原始的主机头,而不是由 HTTP 客户机确定的主机头。以下示例配置`PreserveHostHeader``GatewayFilter`: - -示例 30.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: preserve_host_route - uri: https://example.org - filters: - - PreserveHostHeader -``` - -### [](#the-requestratelimiter-gatewayfilter-factory)[6.10. The `RequestRateLimiter` `GatewayFilter` Factory](#the-requestratelimiter-gatewayfilter-factory) ### - -`RequestRateLimiter``GatewayFilter`工厂使用`RateLimiter`实现来确定是否允许当前请求继续执行。如果不是,则返回`HTTP 429 - Too Many Requests`(默认情况下)的状态。 - -这个过滤器接受一个可选的`keyResolver`参数和特定于速率限制器的参数(将在本节后面描述)。 - -`keyResolver`是实现`KeyResolver`接口的 Bean。在配置中,使用 spel 按名称引用 Bean。`#{@mykeyresolver}` 是引用名为`myKeyResolver`的 Bean 的 spel 表达式。下面的清单显示了`KeyResolver`接口: - -例 31。keyresolver.java - -``` -public interface KeyResolver { - Mono resolve(ServerWebExchange exchange); -} -``` - -`KeyResolver`接口让可插入策略派生限制请求的键。在未来的里程碑版本中,将会有一些`KeyResolver`实现。 - -`KeyResolver`的默认实现是`PrincipalNameKeyResolver`,它从`ServerWebExchange`检索`Principal`并调用`Principal.getName()`。 - -默认情况下,如果`KeyResolver`没有找到密钥,请求将被拒绝。你可以通过设置`spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key`(`true’或`false`)和`spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code`属性来调整此行为。 - -| |`RequestRateLimiter`不能使用“shortcut”符号进行配置。下面的示例是*无效*:

示例 32.application.properties

```
# 无效的快捷方式配置
Spring.cloud.gateway.routes[0].filters[0]=requestrateLimiter=2,2,#{@userkeyresolever=“426”/>```| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -#### [](#the-redis-ratelimiter)[6.10.1. The Redis `RateLimiter`](#the-redis-ratelimiter) #### - -Redis 实现基于在[Stripe](https://stripe.com/blog/rate-limiters)上完成的工作。它需要使用`spring-boot-starter-data-redis-reactive` Spring 引导启动器。 - -使用的算法是[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 - -`redis-rate-limiter.replenishRate`属性是你希望用户在不删除任何请求的情况下每秒可以执行多少个请求。这是令牌桶被填满的速率。 - -`redis-rate-limiter.burstCapacity`属性是用户在一秒钟内被允许执行的最大请求数。这是令牌桶可以容纳的令牌数量。将此值设置为零将阻止所有请求。 - -`redis-rate-limiter.requestedTokens`属性是一个请求需要多少令牌。这是每个请求从 bucket 中获取的令牌的数量,默认为`1`。 - -通过在`replenishRate`和`burstCapacity`中设置相同的值,可以实现稳定的速率。可以通过将`burstCapacity`设置为高于`replenishRate`来允许临时突发。在这种情况下,速率限制器需要允许在两次突发之间有一段时间(根据`replenishRate`),因为连续两次突发将导致丢弃请求(`HTTP429-太多请求’)。下面的清单配置了`redis-rate-limiter`: - -速率限制`1 request/s`通过将`replenishRate`设置为所需的请求数,`requestedTokens`设置为秒内的时间跨度,`burstCapacity`设置为`replenishRate`和`requestedTokens`的乘积,例如,设置`replenishRate=1`,`requestedTokens=60`和`burstCapacity=60`将导致`1 request/min`的限制。 - -示例 33.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - redis-rate-limiter.replenishRate: 10 - redis-rate-limiter.burstCapacity: 20 - redis-rate-limiter.requestedTokens: 1 -``` - -下面的示例在 Java 中配置一个 keyresolver: - -例 34。config.java - -``` -@Bean -KeyResolver userKeyResolver() { - return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); -} -``` - -这定义了每个用户 10 个的请求速率限制。允许突发 20 个请求,但在接下来的一秒钟内,只有 10 个请求可用。`KeyResolver`是一个获得`user`请求参数的简单参数(请注意,这不推荐用于生产)。 - -还可以将速率限制器定义为实现`RateLimiter`接口的 Bean。在配置中,你可以使用 spel 按名称引用 Bean。`#{@myratelimiter}` 是一个 spel 表达式,它引用名为`myRateLimiter`的 Bean。下面的清单定义了一个速率限制器,该限制器使用上一个清单中定义的`KeyResolver`: - -示例 35.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - rate-limiter: "#{@myRateLimiter}" - key-resolver: "#{@userKeyResolver}" -``` - -### [](#the-redirectto-gatewayfilter-factory)[6.11. The `RedirectTo` `GatewayFilter` Factory](#the-redirectto-gatewayfilter-factory) ### - -`RedirectTo``GatewayFilter`工厂接受两个参数,`status`和`url`。`status`参数应该是 300 系列重定向 HTTP 代码,例如 301。`url`参数应该是一个有效的 URL。这是`Location`标头的值。对于相对重定向,应该使用`uri: no://op`作为路由定义的 URI。下面的列表配置了`RedirectTo``GatewayFilter`: - -示例 36.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - RedirectTo=302, https://acme.org -``` - -这将发送带有`Location:https://acme.org`头的状态 302 来执行重定向。 - -### [](#the-removerequestheader-gatewayfilter-factory)[6.12. The `RemoveRequestHeader` GatewayFilter Factory](#the-removerequestheader-gatewayfilter-factory) ### - -`RemoveRequestHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveRequestHeader``GatewayFilter`: - -示例 37.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestheader_route - uri: https://example.org - filters: - - RemoveRequestHeader=X-Request-Foo -``` - -这将在向下游发送`X-Request-Foo`头之前删除它。 - -### [](#removeresponseheader-gatewayfilter-factory)[6.13. `RemoveResponseHeader` `GatewayFilter` Factory](#removeresponseheader-gatewayfilter-factory) ### - -`RemoveResponseHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveResponseHeader``GatewayFilter`: - -示例 38.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removeresponseheader_route - uri: https://example.org - filters: - - RemoveResponseHeader=X-Response-Foo -``` - -这将在响应返回到网关客户机之前从响应中删除`X-Response-Foo`头。 - -要删除任何类型的敏感报头,你应该为你可能想要删除的任何路由配置此筛选器。此外,你可以使用`spring.cloud.gateway.default-filters`配置该过滤器一次,并将其应用于所有路由。 - -### [](#the-removerequestparameter-gatewayfilter-factory)[6.14. The `RemoveRequestParameter` `GatewayFilter` Factory](#the-removerequestparameter-gatewayfilter-factory) ### - -`RemoveRequestParameter``GatewayFilter`工厂接受一个`name`参数。它是要删除的查询参数的名称。下面的示例配置`RemoveRequestParameter``GatewayFilter`: - -示例 39.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestparameter_route - uri: https://example.org - filters: - - RemoveRequestParameter=red -``` - -这将在向下游发送`red`参数之前删除该参数。 - -### [](#the-rewritepath-gatewayfilter-factory)[6.15. The `RewritePath` `GatewayFilter` Factory](#the-rewritepath-gatewayfilter-factory) ### - -`RewritePath``GatewayFilter`工厂接受一个路径`regexp`参数和一个`replacement`参数。这使用 Java 正则表达式以灵活的方式重写请求路径。下面的列表配置了`RewritePath``GatewayFilter`: - -示例 40.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: rewritepath_route - uri: https://example.org - predicates: - - Path=/red/** - filters: - - RewritePath=/red/?(?.*), /$\{segment} -``` - -应该替换为`$\`。 - -### [](#rewritelocationresponseheader-gatewayfilter-factory)[6.16. `RewriteLocationResponseHeader` `GatewayFilter` Factory](#rewritelocationresponseheader-gatewayfilter-factory) ### - -`RewriteLocationResponseHeader``GatewayFilter`工厂修改`Location`响应头的值,通常是为了去掉后台特定的细节。它需要`stripVersionMode`,`locationHeaderName`,`hostValue`和`protocolsRegex`参数。下面的列表配置了`RewriteLocationResponseHeader``GatewayFilter`: - -示例 41.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: rewritelocationresponseheader_route - uri: http://example.org - filters: - - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, , -``` - -例如,对于`POST [api.example.com/some/object/name](https://api.example.com/some/object/name)`的请求,`Location`的响应头值`[object-service.prod.example.net/v2/some/object/id](https://object-service.prod.example.net/v2/some/object/id)`被重写为`[api.example.com/some/object/id](https://api.example.com/some/object/id)`。 - -`stripVersionMode`参数有以下可能的值:`NEVER_STRIP`,`AS_IN_REQUEST`(默认),和`ALWAYS_STRIP`。 - -* `NEVER_STRIP`:即使原始请求路径不包含版本,也不会剥离版本。 - -* `AS_IN_REQUEST`只有当原始请求路径不包含版本时,才会剥离版本。 - -* `ALWAYS_STRIP`版本总是被剥离,即使原始请求路径包含版本。 - -如果提供了`hostValue`参数,则用于替换响应`host:port`头的`host:port`部分。如果没有提供,则使用`Host`请求头的值。 - -参数`protocolsRegex`必须是一个有效的 regex`String`,协议名称与该 regex 匹配。如果不匹配,过滤器就不会做任何事情。默认值为`http|https|ftp|ftps`。 - -### [](#the-rewriteresponseheader-gatewayfilter-factory)[6.17. The `RewriteResponseHeader` `GatewayFilter` Factory](#the-rewriteresponseheader-gatewayfilter-factory) ### - -`RewriteResponseHeader``GatewayFilter`工厂接受`name`、`regexp`和`replacement`参数。它使用 Java 正则表达式以一种灵活的方式重写响应头值。下面的示例配置`RewriteResponseHeader``GatewayFilter`: - -示例 42.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: rewriteresponseheader_route - uri: https://example.org - filters: - - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=*** -``` - -对于标头值`/42?user=ford&password=omg!what&flag=true`,在发出下游请求后将其设置为`/42?user=ford&password=***&flag=true`。由于 YAML 规范,你必须使用`$\`表示`Spring 云网关 -========== - - -该项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括: Spring 5、 Spring Boot2 和 Project Reactor。 Spring Cloud Gateway 旨在提供一种简单但有效的方法来路由到 API,并向它们提供跨领域的关注,例如:安全性、监视/度量和弹性。 - -[](#gateway-starter)[1. How to Include Spring Cloud Gateway](#gateway-starter) ----------- - -要在项目中包含 Spring 云网关,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-gateway`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 - -如果包含启动器,但不希望启用网关,请设置`spring.cloud.gateway.enabled=false`。 - -| |Spring 云网关是建立在[Spring Boot 2.x](https://spring.io/projects/spring-boot#learn)、[Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html)和[Project Reactor](https://projectreactor.io/docs)之上的。因此,当你使用 Spring 云网关时,许多你熟悉的同步库(例如 Spring 数据和 Spring 安全性)和模式可能不适用,如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前,先阅读他们的文档,以熟悉一些新概念。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |Spring 云网关需要由 Spring 启动和 Spring WebFlux 提供的 Netty 运行时。它在传统 Servlet 容器中或构建为 WAR 时不工作。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -[](#glossary)[2. Glossary](#glossary) ----------- - -* **路线**:网关的基本构件。它由一个 ID、一个目标 URI、一组谓词和一组筛选器定义。如果聚合谓词为 true,则匹配路由。 - -* **谓词**:这是[Java8 函数谓词](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)。输入类型为[Spring Framework `ServerWebExchange`](https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/server/ServerWebExchange.html)。这使你能够匹配 HTTP 请求中的任何内容,例如标题或参数。 - -* **过滤器**:这些是用特定工厂构造的[`GatewayFilter`](https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayFilter.java)的实例。在这里,你可以在发送下游请求之前或之后修改请求和响应。 - -[](#gateway-how-it-works)[3. How It Works](#gateway-how-it-works) ----------- - -下图提供了 Spring 云网关如何工作的高级概述: - -![Spring Cloud Gateway Diagram](./images/spring_cloud_gateway_diagram.png) - -客户端向 Spring 云网关提出请求。如果网关处理程序映射确定请求与路由匹配,则将请求发送到网关 Web 处理程序。此处理程序通过特定于该请求的筛选链来运行该请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤逻辑都会被执行。然后提出代理请求。在提出代理请求之后,将运行“POST”过滤逻辑。 - -| |在没有端口的路由中定义的 URI 分别获得 HTTP 和 HTTPS URI 的默认端口号 80 和 443。| -|---|----------------------------------------------------------------------------------------------------------------------| - -[](#configuring-route-predicate-factories-and-gateway-filter-factories)[4.配置路由谓词工厂和网关过滤器工厂](#configuring-route-predicate-factories-and-gateway-filter-factories) ----------- - -配置谓词和过滤器有两种方法:快捷方式和完全展开的参数。下面的大多数示例都使用了快捷方式。 - -名称和参数名称将以`code`的形式在每个部分的第一个或两个表示中列出。参数通常按快捷方式配置所需的顺序列出。 - -### [](#shortcut-configuration)[4.1.快捷方式配置](#shortcut-configuration) ### - -快捷方式配置由筛选器名称识别,后面跟着一个等号,后面是用逗号分隔的参数值。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - Cookie=mycookie,mycookievalue -``` - -上一个示例用两个参数定义了`Cookie`路由谓词工厂,cookie 名`mycookie`和要匹配`mycookievalue`的值。 - -### [](#fully-expanded-arguments)[4.2.完全展开的论证](#fully-expanded-arguments) ### - -完全展开的参数看起来更像是带有名称/值对的标准 YAML 配置。通常,会有`name`键和`args`键。`args`键是用于配置谓词或筛选器的键值对的映射。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - name: Cookie - args: - name: mycookie - regexp: mycookievalue -``` - -这是上面显示的`Cookie`谓词的快捷配置的完整配置。 - -[](#gateway-request-predicates-factories)[5.路线谓词工厂](#gateway-request-predicates-factories) ----------- - -Spring 云网关将路由匹配为 Spring WebFlux`HandlerMapping`基础设施的一部分。 Spring 云网关包括许多内置的路由谓词工厂。所有这些谓词在 HTTP 请求的不同属性上匹配。你可以将多个路由谓词工厂与逻辑`and`语句组合在一起。 - -### [](#the-after-route-predicate-factory)[5.1.后路由谓词工厂](#the-after-route-predicate-factory) ### - -`After`路由谓词工厂接受一个参数,一个`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的 DateTime 之后发生的请求。下面的示例配置一个 after 路由谓词: - -示例 1.应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - After=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何请求后提出的 JAN20,2017 年 17:42 山区时间(丹佛)。 - -### [](#the-before-route-predicate-factory)[5.2.前路由谓词工厂](#the-before-route-predicate-factory) ### - -`Before`路由谓词工厂接受一个参数,a`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的`datetime`之前发生的请求。下面的示例配置一个 before 路由谓词: - -示例 2.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: before_route - uri: https://example.org - predicates: - - Before=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何在 JAN20,2017 年 17:42 山区时间(丹佛)之前提出的请求。 - -### [](#the-between-route-predicate-factory)[5.3.路由谓词之间的工厂](#the-between-route-predicate-factory) ### - -`Between`路由谓词工厂接受两个参数,`datetime1`和`datetime2`,它们是 Java`ZonedDateTime`对象。此谓词匹配发生在`datetime1`之后和`datetime2`之前的请求。`datetime2`参数必须位于`datetime1`之后。下面的示例配置了一个 between 路由谓词: - -示例 3.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: between_route - uri: https://example.org - predicates: - - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合在 JAN20,2017 年 17:42 山区时间(丹佛)之后和 JAN21,2017 年 17:42 山区时间(丹佛)之前提出的任何请求。这对于维护窗口可能是有用的。 - -### [](#the-cookie-route-predicate-factory)[5.4.cookie 路由谓词工厂](#the-cookie-route-predicate-factory) ### - -`Cookie`路由谓词工厂接受两个参数,cookie`name`和`regexp`(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。下面的示例配置了一个 Cookie 路由谓词工厂: - -示例 4.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: cookie_route - uri: https://example.org - predicates: - - Cookie=chocolate, ch.p -``` - -此路由匹配具有名为`chocolate`的 cookie 的请求,其值与`ch.p`正则表达式匹配。 - -### [](#the-header-route-predicate-factory)[5.5.头路由谓词工厂](#the-header-route-predicate-factory) ### - -`Header`路由谓词工厂接受两个参数,`header`和`regexp`(这是一个 Java 正则表达式)。此谓词与具有给定名称的头匹配,其值与正则表达式匹配。下面的示例配置头路由谓词: - -示例 5.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: header_route - uri: https://example.org - predicates: - - Header=X-Request-Id, \d+ -``` - -如果请求有一个名为`X-Request-Id`的头,其值与`\d+`正则表达式匹配(即它有一个或多个数字的值),则此路由匹配。 - -### [](#the-host-route-predicate-factory)[5.6.主机路由谓词工厂](#the-host-route-predicate-factory) ### - -`Host`路由谓词工厂接受一个参数:主机名列表`patterns`。该模式是一种 Ant 样式的模式,以`.`作为分隔符。此谓词匹配与模式匹配的`Host`头。下面的示例配置了一个主机路由谓词: - -示例 6.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: host_route - uri: https://example.org - predicates: - - Host=**.somehost.org,**.anotherhost.org -``` - -URI 模板变量(如`{sub}.myhost.org`)也受到支持。 - -如果请求具有`Host`头,其值为`www.somehost.org`或`beta.somehost.org`或`www.anotherhost.org`,则此路由匹配。 - -这个谓词提取 URI 模板变量(例如`sub`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -### [](#the-method-route-predicate-factory)[5.7.路由谓词工厂的方法](#the-method-route-predicate-factory) ### - -`Method`路由谓词工厂接受一个`methods`参数,该参数是一个或多个参数:要匹配的 HTTP 方法。下面的示例配置了一个方法路由谓词: - -示例 7.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: method_route - uri: https://example.org - predicates: - - Method=GET,POST -``` - -如果请求方法是`GET`或`POST`,则此路由匹配。 - -### [](#the-path-route-predicate-factory)[5.8.路径谓词工厂](#the-path-route-predicate-factory) ### - -`Path`路由谓词工厂接受两个参数: Spring `PathMatcher``patterns`的列表和一个名为`matchTrailingSlash`的可选标志(默认为`true`)。下面的示例配置了一个路径路由谓词: - -示例 8.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: path_route - uri: https://example.org - predicates: - - Path=/red/{segment},/blue/{segment} -``` - -如果请求路径是:例如:`/red/1`或`/red/1/`或`/red/blue`或`/blue/green`,则此路由匹配。 - -如果`matchTrailingSlash`被设置为`false`,那么请求路径`/red/1/`将不会被匹配。 - -这个谓词提取 URI 模板变量(例如`segment`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -一种实用方法(称为`get`)可以使访问这些变量变得更容易。下面的示例展示了如何使用`get`方法: - -``` -Map uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); - -String segment = uriVariables.get("segment"); -``` - -### [](#the-query-route-predicate-factory)[5.9.查询路由谓词工厂](#the-query-route-predicate-factory) ### - -`Query`路由谓词工厂接受两个参数:一个必需的`param`和一个可选的`regexp`(这是一个 Java 正则表达式)。下面的示例配置一个查询路由谓词: - -示例 9.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=green -``` - -如果请求包含`green`查询参数,则前面的路由匹配。 - -application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=red, gree. -``` - -如果请求包含一个`red`查询参数,其值与`gree.`regexp 匹配,则前面的路由匹配,因此`green`和`greet`将匹配。 - -### [](#the-remoteaddr-route-predicate-factory)[5.10.RemoteAddr 路由谓词工厂](#the-remoteaddr-route-predicate-factory) ### - -`RemoteAddr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。以下示例配置了一个 RemoteAddr 路由谓词: - -示例 10.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: remoteaddr_route - uri: https://example.org - predicates: - - RemoteAddr=192.168.1.1/24 -``` - -如果请求的远程地址是`192.168.1.10`,则此路由匹配。 - -#### [](#modifying-the-way-remote-addresses-are-resolved)[5.10.1.修改远程地址的解析方式](#modifying-the-way-remote-addresses-are-resolved) #### - -默认情况下,RemoteAddr 路由谓词工厂使用来自传入请求的远程地址。如果 Spring 云网关位于代理层的后面,这可能与实际的客户端 IP 地址不匹配。 - -你可以通过设置自定义`RemoteAddressResolver`来定制远程地址的解析方式。 Spring 云网关带有一个基于[X-forward-for 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For),`XForwardedRemoteAddressResolver`的非默认远程地址解析器。 - -`XForwardedRemoteAddressResolver`有两个静态构造函数方法,它们采用不同的方法实现安全性: - -* `XForwardedRemoteAddressResolver::trustAll`返回一个`RemoteAddressResolver`,它总是使用在`X-Forwarded-For`头中找到的第一个 IP 地址。这种方法容易受到欺骗,因为恶意客户端可能会为`X-Forwarded-For`设置初始值,该初始值将被解析器接受。 - -* `XForwardedRemoteAddressResolver::maxTrustedIndex`获取一个索引,该索引与在 Spring 云网关前运行的受信任基础设施的数量相关。 Spring 如果云网关例如只能通过 HAProxy 访问,那么应该使用 1 的值。如果在访问 Spring 云网关之前需要两次跳可信的基础设施,那么应该使用 2 的值。 - -考虑以下标头值: - -``` -X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3 -``` - -以下`maxTrustedIndex`值产生以下远程地址: - -| `maxTrustedIndex` |结果| -|------------------------|-----------------------------------------------------------| -|[`Integer.MIN_VALUE`,0] |(无效,`IllegalArgumentException`在初始化期间)| -| 1 | 0.0.0.3 | -| 2 | 0.0.0.2 | -| 3 | 0.0.0.1 | -|[4, `Integer.MAX_VALUE`]| 0.0.0.1 | - -下面的示例展示了如何使用 Java 实现相同的配置: - -例 11。gatewayconfig.java - -``` -RemoteAddressResolver resolver = XForwardedRemoteAddressResolver - .maxTrustedIndex(1); - -... - -.route("direct-route", - r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24") - .uri("https://downstream1") -.route("proxied-route", - r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24") - .uri("https://downstream2") -) -``` - -### [](#the-weight-route-predicate-factory)[5.11.权重路径谓词工厂](#the-weight-route-predicate-factory) ### - -`Weight`路由谓词工厂接受两个参数:`group`和`weight`(一个 INT)。权重是按组计算的。下面的示例配置了权重路由谓词: - -示例 12.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: weight_high - uri: https://weighthigh.org - predicates: - - Weight=group1, 8 - - id: weight_low - uri: https://weightlow.org - predicates: - - Weight=group1, 2 -``` - -此路线将把 80% 的流量转发给[weighthigh.org](https://weighthigh.org),并将 20% 的流量转发给[weighlow.org](https://weighlow.org)。 - -### [](#the-xforwarded-remote-addr-route-predicate-factory)[5.12.XForwarded 远程 addr 路由谓词工厂](#the-xforwarded-remote-addr-route-predicate-factory) ### - -`XForwarded Remote Addr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。 - -此路由谓词允许基于`X-Forwarded-For`HTTP 报头对请求进行过滤。 - -这可以用于反向代理,例如负载均衡器或 Web 应用程序防火墙,在这些代理中,只有当请求来自由这些反向代理使用的受信任的 IP 地址列表时,才允许请求。 - -下面的示例配置了一个 XForWardeDremoteaddr 路由谓词: - -示例 13.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: xforwarded_remoteaddr_route - uri: https://example.org - predicates: - - XForwardedRemoteAddr=192.168.1.1/24 -``` - -如果`X-Forwarded-For`标头包含`192.168.1.10`,则此路由匹配。 - -[](#gatewayfilter-factories)[6. `GatewayFilter` Factories](#gatewayfilter-factories) ----------- - -路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。 Spring 云网关包括许多内置的网关过滤工厂。 - -| |有关如何使用以下任何过滤器的更详细示例,请查看[unit tests](https://github.com/spring-cloud/spring-cloud-gateway/tree/master/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -### [](#the-addrequestheader-gatewayfilter-factory)[6.1. The `AddRequestHeader` `GatewayFilter` Factory](#the-addrequestheader-gatewayfilter-factory) ### - -`AddRequestHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddRequestHeader``GatewayFilter`: - -示例 14.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - filters: - - AddRequestHeader=X-Request-red, blue -``` - -对于所有匹配的请求,此清单将`X-Request-red:blue`头添加到下游请求的头。 - -`AddRequestHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestHeader``GatewayFilter`: - -示例 15.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - predicates: - - Path=/red/{segment} - filters: - - AddRequestHeader=X-Request-Red, Blue-{segment} -``` - -### [](#the-addrequestparameter-gatewayfilter-factory)[6.2. The `AddRequestParameter` `GatewayFilter` Factory](#the-addrequestparameter-gatewayfilter-factory) ### - -`AddRequestParameter``GatewayFilter`工厂接受`name`和`value`参数。下面的示例配置`AddRequestParameter``GatewayFilter`: - -示例 16.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - filters: - - AddRequestParameter=red, blue -``` - -这将为所有匹配的请求将`red=blue`添加到下游请求的查询字符串中。 - -`AddRequestParameter`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestParameter``GatewayFilter`: - -示例 17.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddRequestParameter=foo, bar-{segment} -``` - -### [](#the-addresponseheader-gatewayfilter-factory)[6.3. The `AddResponseHeader` `GatewayFilter` Factory](#the-addresponseheader-gatewayfilter-factory) ### - -`AddResponseHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddResponseHeader``GatewayFilter`: - -示例 18.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - filters: - - AddResponseHeader=X-Response-Red, Blue -``` - -这将为所有匹配的请求向下游响应的头添加`X-Response-Red:Blue`头。 - -`AddResponseHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置了使用变量的`AddResponseHeader``GatewayFilter`: - -示例 19.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddResponseHeader=foo, bar-{segment} -``` - -### [](#the-deduperesponseheader-gatewayfilter-factory)[6.4. The `DedupeResponseHeader` `GatewayFilter` Factory](#the-deduperesponseheader-gatewayfilter-factory) ### - -DedupeResponseHeader 网关过滤器工厂接受一个`name`参数和一个可选的`strategy`参数。`name`可以包含一个以空格分隔的标题名称列表。以下示例配置`DedupeResponseHeader``GatewayFilter`: - -示例 20.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: dedupe_response_header_route - uri: https://example.org - filters: - - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin -``` - -在网关 CORS 逻辑和下游逻辑都添加响应头的情况下,这将删除重复的`Access-Control-Allow-Credentials`和`Access-Control-Allow-Origin`响应头的值。 - -`DedupeResponseHeader`过滤器还接受一个可选的`strategy`参数。接受的值是`RETAIN_FIRST`(默认)、`RETAIN_LAST`和`RETAIN_UNIQUE`。 - -### [](#spring-cloud-circuitbreaker-filter-factory)[6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) ### - -Spring 云断路器网关过滤器工厂使用 Spring 云断路器 API 将网关路由封装在断路器中。 Spring Cloud Circuitbreaker 支持可与 Spring Cloud Gateway 一起使用的多个库。 Spring 云支持开箱即用的弹性 4J。 - -要启用 Spring 云电路断路器过滤器,你需要在 Classpath 上放置`spring-cloud-starter-circuitbreaker-reactor-resilience4j`。下面的示例配置 Spring 云电路断路器`GatewayFilter`: - -示例 21.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: https://example.org - filters: - - CircuitBreaker=myCircuitBreaker -``` - -要配置断路器,请参阅你正在使用的底层断路器实现的配置。 - -* [复原力 4J 文档](https://cloud.spring.io/spring-cloud-circuitbreaker/reference/html/spring-cloud-circuitbreaker.html) - -Spring 云电路断路器过滤器还可以接受可选的`fallbackUri`参数。目前,只支持`forward:`模式 URI。如果回退被调用,请求将被转发到与 URI 匹配的控制器。下面的示例配置了这种回退: - -示例 22.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint -``` - -下面的列表在 Java 中做了相同的事情: - -例 23。application.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -当调用断路器回退时,此示例转发到`/inCaseofFailureUseThis`URI。请注意,此示例还演示了(可选的) Spring 云负载平衡器负载平衡(由目标 URI 上的`lb`前缀定义)。 - -主要的场景是使用`fallbackUri`在网关应用程序中定义内部控制器或处理程序。但是,你也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示: - -示例 24.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback -``` - -在此示例中,网关应用程序中没有`fallback`端点或处理程序。然而,在另一个应用程序中有一个,注册在`[localhost:9994](http://localhost:9994)`下。 - -在请求被转发到 Fallback 的情况下, Spring Cloud Circuitbreaker 网关过滤器还提供了导致它的`Throwable`。它被添加到`ServerWebExchange`中,作为`ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR`属性,该属性可以在处理网关应用程序内的回退时使用。 - -对于外部控制器/处理程序场景,可以添加带有异常详细信息的头。你可以在[FallbackHeaders GatewayFilter 工厂部分](#fallback-headers)中找到有关这样做的更多信息。 - -#### [](#circuit-breaker-status-codes)[6.5.1.按状态码切断断路器](#circuit-breaker-status-codes) #### - -在某些情况下,你可能希望基于从其封装的路由返回的状态码来跳闸断路器。断路器配置对象获取一系列状态代码,如果返回这些代码,将导致断路器跳闸。在设置要跳闸的状态码时,可以使用带有状态码值的整数,也可以使用`HttpStatus`枚举的字符串表示。 - -示例 25.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - statusCodes: - - 500 - - "NOT_FOUND" -``` - -例 26。应用程序.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis").addStatusCode("INTERNAL_SERVER_ERROR")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -### [](#fallback-headers)[6.6. The `FallbackHeaders` `GatewayFilter` Factory](#fallback-headers) ### - -`FallbackHeaders`工厂允许你在转发到外部应用程序中的`fallbackUri`的请求的标题中添加 Spring Cloud Circuitbreaker 执行异常详细信息,如下所示: - -示例 27.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback - filters: - - name: FallbackHeaders - args: - executionExceptionTypeHeaderName: Test-Header -``` - -在本例中,在运行断路器时发生执行异常后,请求被转发到在`localhost:9994`上运行的应用程序中的`fallback`端点或处理程序。带有异常类型、消息和(如果可用的话)根原因异常类型和消息的头将由`FallbackHeaders`过滤器添加到该请求中。 - -你可以通过设置以下参数的值(以它们的默认值显示)来覆盖配置中的头的名称: - -* `executionExceptionTypeHeaderName`(`“execution-exception-type”`) - -* `executionExceptionMessageHeaderName`(`“execution-exception-message”`) - -* `rootCauseExceptionTypeHeaderName`(`“root-cause-exception-type”`) - -* `rootCauseExceptionMessageHeaderName`(`“root-cause-exception-message”`) - -有关断路器和网关的更多信息,请参见[Spring Cloud CircuitBreaker Factory section](#spring-cloud-circuitbreaker-filter-factory)。 - -### [](#the-maprequestheader-gatewayfilter-factory)[6.7. The `MapRequestHeader` `GatewayFilter` Factory](#the-maprequestheader-gatewayfilter-factory) ### - -`MapRequestHeader``GatewayFilter`工厂接受`fromHeader`和`toHeader`参数。它将创建一个新的命名头,并从传入的 HTTP 请求中从现有的命名头中提取该值。如果输入标头不存在,则过滤器不会产生任何影响。如果新的命名标头已经存在,那么它的值将被新的值扩充。以下示例配置`MapRequestHeader`: - -示例 28.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: map_request_header_route - uri: https://example.org - filters: - - MapRequestHeader=Blue, X-Request-Red -``` - -这会将`X-Request-Red:`头添加到下游请求,并从传入的 HTTP 请求的`Blue`头更新其值。 - -### [](#the-prefixpath-gatewayfilter-factory)[6.8. The `PrefixPath` `GatewayFilter` Factory](#the-prefixpath-gatewayfilter-factory) ### - -`PrefixPath``GatewayFilter`工厂接受一个`prefix`参数。下面的示例配置`PrefixPath``GatewayFilter`: - -示例 29.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - PrefixPath=/mypath -``` - -这将在所有匹配请求的路径前缀`/mypath`。因此,对`/hello`的请求将被发送到`/mypath/hello`。 - -### [](#the-preservehostheader-gatewayfilter-factory)[6.9. The `PreserveHostHeader` `GatewayFilter` Factory](#the-preservehostheader-gatewayfilter-factory) ### - -`PreserveHostHeader``GatewayFilter`工厂没有参数。此筛选器设置一个请求属性,由路由筛选器检查该属性,以确定是否应发送原始的主机头,而不是由 HTTP 客户机确定的主机头。以下示例配置`PreserveHostHeader``GatewayFilter`: - -示例 30.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: preserve_host_route - uri: https://example.org - filters: - - PreserveHostHeader -``` - -### [](#the-requestratelimiter-gatewayfilter-factory)[6.10. The `RequestRateLimiter` `GatewayFilter` Factory](#the-requestratelimiter-gatewayfilter-factory) ### - -`RequestRateLimiter``GatewayFilter`工厂使用`RateLimiter`实现来确定是否允许当前请求继续执行。如果不是,则返回`HTTP 429 - Too Many Requests`(默认情况下)的状态。 - -这个过滤器接受一个可选的`keyResolver`参数和特定于速率限制器的参数(将在本节后面描述)。 - -`keyResolver`是实现`KeyResolver`接口的 Bean。在配置中,使用 spel 按名称引用 Bean。`#{@mykeyresolver}` 是引用名为`myKeyResolver`的 Bean 的 spel 表达式。下面的清单显示了`KeyResolver`接口: - -例 31。keyresolver.java - -``` -public interface KeyResolver { - Mono resolve(ServerWebExchange exchange); -} -``` - -`KeyResolver`接口让可插入策略派生限制请求的键。在未来的里程碑版本中,将会有一些`KeyResolver`实现。 - -`KeyResolver`的默认实现是`PrincipalNameKeyResolver`,它从`ServerWebExchange`检索`Principal`并调用`Principal.getName()`。 - -默认情况下,如果`KeyResolver`没有找到密钥,请求将被拒绝。你可以通过设置`spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key`(`true’或`false`)和`spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code`属性来调整此行为。 - -| |`RequestRateLimiter`不能使用“shortcut”符号进行配置。下面的示例是*无效*:

示例 32.application.properties

```
# 无效的快捷方式配置
Spring.cloud.gateway.routes[0].filters[0]=requestrateLimiter=2,2,#{@userkeyresolever=“426”/>```| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -#### [](#the-redis-ratelimiter)[6.10.1. The Redis `RateLimiter`](#the-redis-ratelimiter) #### - -Redis 实现基于在[Stripe](https://stripe.com/blog/rate-limiters)上完成的工作。它需要使用`spring-boot-starter-data-redis-reactive` Spring 引导启动器。 - -使用的算法是[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 - -`redis-rate-limiter.replenishRate`属性是你希望用户在不删除任何请求的情况下每秒可以执行多少个请求。这是令牌桶被填满的速率。 - -`redis-rate-limiter.burstCapacity`属性是用户在一秒钟内被允许执行的最大请求数。这是令牌桶可以容纳的令牌数量。将此值设置为零将阻止所有请求。 - -`redis-rate-limiter.requestedTokens`属性是一个请求需要多少令牌。这是每个请求从 bucket 中获取的令牌的数量,默认为`1`。 - -通过在`replenishRate`和`burstCapacity`中设置相同的值,可以实现稳定的速率。可以通过将`burstCapacity`设置为高于`replenishRate`来允许临时突发。在这种情况下,速率限制器需要允许在两次突发之间有一段时间(根据`replenishRate`),因为连续两次突发将导致丢弃请求(`HTTP429-太多请求’)。下面的清单配置了`redis-rate-limiter`: - -速率限制`1 request/s`通过将`replenishRate`设置为所需的请求数,`requestedTokens`设置为秒内的时间跨度,`burstCapacity`设置为`replenishRate`和`requestedTokens`的乘积,例如,设置`replenishRate=1`,`requestedTokens=60`和`burstCapacity=60`将导致`1 request/min`的限制。 - -示例 33.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - redis-rate-limiter.replenishRate: 10 - redis-rate-limiter.burstCapacity: 20 - redis-rate-limiter.requestedTokens: 1 -``` - -下面的示例在 Java 中配置一个 keyresolver: - -例 34。config.java - -``` -@Bean -KeyResolver userKeyResolver() { - return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); -} -``` - -这定义了每个用户 10 个的请求速率限制。允许突发 20 个请求,但在接下来的一秒钟内,只有 10 个请求可用。`KeyResolver`是一个获得`user`请求参数的简单参数(请注意,这不推荐用于生产)。 - -还可以将速率限制器定义为实现`RateLimiter`接口的 Bean。在配置中,你可以使用 spel 按名称引用 Bean。`#{@myratelimiter}` 是一个 spel 表达式,它引用名为`myRateLimiter`的 Bean。下面的清单定义了一个速率限制器,该限制器使用上一个清单中定义的`KeyResolver`: - -示例 35.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - rate-limiter: "#{@myRateLimiter}" - key-resolver: "#{@userKeyResolver}" -``` - -### [](#the-redirectto-gatewayfilter-factory)[6.11. The `RedirectTo` `GatewayFilter` Factory](#the-redirectto-gatewayfilter-factory) ### - -`RedirectTo``GatewayFilter`工厂接受两个参数,`status`和`url`。`status`参数应该是 300 系列重定向 HTTP 代码,例如 301。`url`参数应该是一个有效的 URL。这是`Location`标头的值。对于相对重定向,应该使用`uri: no://op`作为路由定义的 URI。下面的列表配置了`RedirectTo``GatewayFilter`: - -示例 36.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - RedirectTo=302, https://acme.org -``` - -这将发送带有`Location:https://acme.org`头的状态 302 来执行重定向。 - -### [](#the-removerequestheader-gatewayfilter-factory)[6.12. The `RemoveRequestHeader` GatewayFilter Factory](#the-removerequestheader-gatewayfilter-factory) ### - -`RemoveRequestHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveRequestHeader``GatewayFilter`: - -示例 37.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestheader_route - uri: https://example.org - filters: - - RemoveRequestHeader=X-Request-Foo -``` - -这将在向下游发送`X-Request-Foo`头之前删除它。 - -### [](#removeresponseheader-gatewayfilter-factory)[6.13. `RemoveResponseHeader` `GatewayFilter` Factory](#removeresponseheader-gatewayfilter-factory) ### - -`RemoveResponseHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveResponseHeader``GatewayFilter`: - -示例 38.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removeresponseheader_route - uri: https://example.org - filters: - - RemoveResponseHeader=X-Response-Foo -``` - -这将在响应返回到网关客户机之前从响应中删除`X-Response-Foo`头。 - -要删除任何类型的敏感报头,你应该为你可能想要删除的任何路由配置此筛选器。此外,你可以使用`spring.cloud.gateway.default-filters`配置该过滤器一次,并将其应用于所有路由。 - -### [](#the-removerequestparameter-gatewayfilter-factory)[6.14. The `RemoveRequestParameter` `GatewayFilter` Factory](#the-removerequestparameter-gatewayfilter-factory) ### - -`RemoveRequestParameter``GatewayFilter`工厂接受一个`name`参数。它是要删除的查询参数的名称。下面的示例配置`RemoveRequestParameter``GatewayFilter`: - -示例 39.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestparameter_route - uri: https://example.org - filters: - - RemoveRequestParameter=red -``` - -这将在向下游发送`red`参数之前删除该参数。 - -### [](#the-rewritepath-gatewayfilter-factory)[6.15. The `RewritePath` `GatewayFilter` Factory](#the-rewritepath-gatewayfilter-factory) ### - -`RewritePath``GatewayFilter`工厂接受一个路径`regexp`参数和一个`replacement`参数。这使用 Java 正则表达式以灵活的方式重写请求路径。下面的列表配置了`RewritePath``GatewayFilter`: - -示例 40.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: rewritepath_route - uri: https://example.org - predicates: - - Path=/red/** - filters: - - RewritePath=/red/?(?.*), /$\{segment} -``` - -对于`/red/blue`的请求路径,在发出下游请求之前,将路径设置为`/blue`。注意,由于 YAML 规范,`Spring 云网关 -========== - - -该项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括: Spring 5、 Spring Boot2 和 Project Reactor。 Spring Cloud Gateway 旨在提供一种简单但有效的方法来路由到 API,并向它们提供跨领域的关注,例如:安全性、监视/度量和弹性。 - -[](#gateway-starter)[1. How to Include Spring Cloud Gateway](#gateway-starter) ----------- - -要在项目中包含 Spring 云网关,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-gateway`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 - -如果包含启动器,但不希望启用网关,请设置`spring.cloud.gateway.enabled=false`。 - -| |Spring 云网关是建立在[Spring Boot 2.x](https://spring.io/projects/spring-boot#learn)、[Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html)和[Project Reactor](https://projectreactor.io/docs)之上的。因此,当你使用 Spring 云网关时,许多你熟悉的同步库(例如 Spring 数据和 Spring 安全性)和模式可能不适用,如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前,先阅读他们的文档,以熟悉一些新概念。| -|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -| |Spring 云网关需要由 Spring 启动和 Spring WebFlux 提供的 Netty 运行时。它在传统 Servlet 容器中或构建为 WAR 时不工作。| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -[](#glossary)[2. Glossary](#glossary) ----------- - -* **路线**:网关的基本构件。它由一个 ID、一个目标 URI、一组谓词和一组筛选器定义。如果聚合谓词为 true,则匹配路由。 - -* **谓词**:这是[Java8 函数谓词](https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)。输入类型为[Spring Framework `ServerWebExchange`](https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/server/ServerWebExchange.html)。这使你能够匹配 HTTP 请求中的任何内容,例如标题或参数。 - -* **过滤器**:这些是用特定工厂构造的[`GatewayFilter`](https://github.com/spring-cloud/spring-cloud-gateway/tree/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/GatewayFilter.java)的实例。在这里,你可以在发送下游请求之前或之后修改请求和响应。 - -[](#gateway-how-it-works)[3. How It Works](#gateway-how-it-works) ----------- - -下图提供了 Spring 云网关如何工作的高级概述: - -![Spring Cloud Gateway Diagram](./images/spring_cloud_gateway_diagram.png) - -客户端向 Spring 云网关提出请求。如果网关处理程序映射确定请求与路由匹配,则将请求发送到网关 Web 处理程序。此处理程序通过特定于该请求的筛选链来运行该请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤逻辑都会被执行。然后提出代理请求。在提出代理请求之后,将运行“POST”过滤逻辑。 - -| |在没有端口的路由中定义的 URI 分别获得 HTTP 和 HTTPS URI 的默认端口号 80 和 443。| -|---|----------------------------------------------------------------------------------------------------------------------| - -[](#configuring-route-predicate-factories-and-gateway-filter-factories)[4.配置路由谓词工厂和网关过滤器工厂](#configuring-route-predicate-factories-and-gateway-filter-factories) ----------- - -配置谓词和过滤器有两种方法:快捷方式和完全展开的参数。下面的大多数示例都使用了快捷方式。 - -名称和参数名称将以`code`的形式在每个部分的第一个或两个表示中列出。参数通常按快捷方式配置所需的顺序列出。 - -### [](#shortcut-configuration)[4.1.快捷方式配置](#shortcut-configuration) ### - -快捷方式配置由筛选器名称识别,后面跟着一个等号,后面是用逗号分隔的参数值。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - Cookie=mycookie,mycookievalue -``` - -上一个示例用两个参数定义了`Cookie`路由谓词工厂,cookie 名`mycookie`和要匹配`mycookievalue`的值。 - -### [](#fully-expanded-arguments)[4.2.完全展开的论证](#fully-expanded-arguments) ### - -完全展开的参数看起来更像是带有名称/值对的标准 YAML 配置。通常,会有`name`键和`args`键。`args`键是用于配置谓词或筛选器的键值对的映射。 - -应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - name: Cookie - args: - name: mycookie - regexp: mycookievalue -``` - -这是上面显示的`Cookie`谓词的快捷配置的完整配置。 - -[](#gateway-request-predicates-factories)[5.路线谓词工厂](#gateway-request-predicates-factories) ----------- - -Spring 云网关将路由匹配为 Spring WebFlux`HandlerMapping`基础设施的一部分。 Spring 云网关包括许多内置的路由谓词工厂。所有这些谓词在 HTTP 请求的不同属性上匹配。你可以将多个路由谓词工厂与逻辑`and`语句组合在一起。 - -### [](#the-after-route-predicate-factory)[5.1.后路由谓词工厂](#the-after-route-predicate-factory) ### - -`After`路由谓词工厂接受一个参数,一个`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的 DateTime 之后发生的请求。下面的示例配置一个 after 路由谓词: - -示例 1.应用程序.yml - -``` -spring: - cloud: - gateway: - routes: - - id: after_route - uri: https://example.org - predicates: - - After=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何请求后提出的 JAN20,2017 年 17:42 山区时间(丹佛)。 - -### [](#the-before-route-predicate-factory)[5.2.前路由谓词工厂](#the-before-route-predicate-factory) ### - -`Before`路由谓词工厂接受一个参数,a`datetime`(这是一个 Java`ZonedDateTime`)。此谓词匹配在指定的`datetime`之前发生的请求。下面的示例配置一个 before 路由谓词: - -示例 2.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: before_route - uri: https://example.org - predicates: - - Before=2017-01-20T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合任何在 JAN20,2017 年 17:42 山区时间(丹佛)之前提出的请求。 - -### [](#the-between-route-predicate-factory)[5.3.路由谓词之间的工厂](#the-between-route-predicate-factory) ### - -`Between`路由谓词工厂接受两个参数,`datetime1`和`datetime2`,它们是 Java`ZonedDateTime`对象。此谓词匹配发生在`datetime1`之后和`datetime2`之前的请求。`datetime2`参数必须位于`datetime1`之后。下面的示例配置了一个 between 路由谓词: - -示例 3.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: between_route - uri: https://example.org - predicates: - - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] -``` - -这条路线符合在 JAN20,2017 年 17:42 山区时间(丹佛)之后和 JAN21,2017 年 17:42 山区时间(丹佛)之前提出的任何请求。这对于维护窗口可能是有用的。 - -### [](#the-cookie-route-predicate-factory)[5.4.cookie 路由谓词工厂](#the-cookie-route-predicate-factory) ### - -`Cookie`路由谓词工厂接受两个参数,cookie`name`和`regexp`(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。下面的示例配置了一个 Cookie 路由谓词工厂: - -示例 4.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: cookie_route - uri: https://example.org - predicates: - - Cookie=chocolate, ch.p -``` - -此路由匹配具有名为`chocolate`的 cookie 的请求,其值与`ch.p`正则表达式匹配。 - -### [](#the-header-route-predicate-factory)[5.5.头路由谓词工厂](#the-header-route-predicate-factory) ### - -`Header`路由谓词工厂接受两个参数,`header`和`regexp`(这是一个 Java 正则表达式)。此谓词与具有给定名称的头匹配,其值与正则表达式匹配。下面的示例配置头路由谓词: - -示例 5.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: header_route - uri: https://example.org - predicates: - - Header=X-Request-Id, \d+ -``` - -如果请求有一个名为`X-Request-Id`的头,其值与`\d+`正则表达式匹配(即它有一个或多个数字的值),则此路由匹配。 - -### [](#the-host-route-predicate-factory)[5.6.主机路由谓词工厂](#the-host-route-predicate-factory) ### - -`Host`路由谓词工厂接受一个参数:主机名列表`patterns`。该模式是一种 Ant 样式的模式,以`.`作为分隔符。此谓词匹配与模式匹配的`Host`头。下面的示例配置了一个主机路由谓词: - -示例 6.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: host_route - uri: https://example.org - predicates: - - Host=**.somehost.org,**.anotherhost.org -``` - -URI 模板变量(如`{sub}.myhost.org`)也受到支持。 - -如果请求具有`Host`头,其值为`www.somehost.org`或`beta.somehost.org`或`www.anotherhost.org`,则此路由匹配。 - -这个谓词提取 URI 模板变量(例如`sub`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -### [](#the-method-route-predicate-factory)[5.7.路由谓词工厂的方法](#the-method-route-predicate-factory) ### - -`Method`路由谓词工厂接受一个`methods`参数,该参数是一个或多个参数:要匹配的 HTTP 方法。下面的示例配置了一个方法路由谓词: - -示例 7.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: method_route - uri: https://example.org - predicates: - - Method=GET,POST -``` - -如果请求方法是`GET`或`POST`,则此路由匹配。 - -### [](#the-path-route-predicate-factory)[5.8.路径谓词工厂](#the-path-route-predicate-factory) ### - -`Path`路由谓词工厂接受两个参数: Spring `PathMatcher``patterns`的列表和一个名为`matchTrailingSlash`的可选标志(默认为`true`)。下面的示例配置了一个路径路由谓词: - -示例 8.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: path_route - uri: https://example.org - predicates: - - Path=/red/{segment},/blue/{segment} -``` - -如果请求路径是:例如:`/red/1`或`/red/1/`或`/red/blue`或`/blue/green`,则此路由匹配。 - -如果`matchTrailingSlash`被设置为`false`,那么请求路径`/red/1/`将不会被匹配。 - -这个谓词提取 URI 模板变量(例如`segment`,在前面的示例中定义)作为名称和值的映射,并将其放置在`ServerWebExchange.getAttributes()`中,并在`ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE`中定义一个键。这些值可由[“GatewayFilter”工厂](#gateway-route-filters)使用 - -一种实用方法(称为`get`)可以使访问这些变量变得更容易。下面的示例展示了如何使用`get`方法: - -``` -Map uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange); - -String segment = uriVariables.get("segment"); -``` - -### [](#the-query-route-predicate-factory)[5.9.查询路由谓词工厂](#the-query-route-predicate-factory) ### - -`Query`路由谓词工厂接受两个参数:一个必需的`param`和一个可选的`regexp`(这是一个 Java 正则表达式)。下面的示例配置一个查询路由谓词: - -示例 9.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=green -``` - -如果请求包含`green`查询参数,则前面的路由匹配。 - -application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: query_route - uri: https://example.org - predicates: - - Query=red, gree. -``` - -如果请求包含一个`red`查询参数,其值与`gree.`regexp 匹配,则前面的路由匹配,因此`green`和`greet`将匹配。 - -### [](#the-remoteaddr-route-predicate-factory)[5.10.RemoteAddr 路由谓词工厂](#the-remoteaddr-route-predicate-factory) ### - -`RemoteAddr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。以下示例配置了一个 RemoteAddr 路由谓词: - -示例 10.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: remoteaddr_route - uri: https://example.org - predicates: - - RemoteAddr=192.168.1.1/24 -``` - -如果请求的远程地址是`192.168.1.10`,则此路由匹配。 - -#### [](#modifying-the-way-remote-addresses-are-resolved)[5.10.1.修改远程地址的解析方式](#modifying-the-way-remote-addresses-are-resolved) #### - -默认情况下,RemoteAddr 路由谓词工厂使用来自传入请求的远程地址。如果 Spring 云网关位于代理层的后面,这可能与实际的客户端 IP 地址不匹配。 - -你可以通过设置自定义`RemoteAddressResolver`来定制远程地址的解析方式。 Spring 云网关带有一个基于[X-forward-for 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For),`XForwardedRemoteAddressResolver`的非默认远程地址解析器。 - -`XForwardedRemoteAddressResolver`有两个静态构造函数方法,它们采用不同的方法实现安全性: - -* `XForwardedRemoteAddressResolver::trustAll`返回一个`RemoteAddressResolver`,它总是使用在`X-Forwarded-For`头中找到的第一个 IP 地址。这种方法容易受到欺骗,因为恶意客户端可能会为`X-Forwarded-For`设置初始值,该初始值将被解析器接受。 - -* `XForwardedRemoteAddressResolver::maxTrustedIndex`获取一个索引,该索引与在 Spring 云网关前运行的受信任基础设施的数量相关。 Spring 如果云网关例如只能通过 HAProxy 访问,那么应该使用 1 的值。如果在访问 Spring 云网关之前需要两次跳可信的基础设施,那么应该使用 2 的值。 - -考虑以下标头值: - -``` -X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3 -``` - -以下`maxTrustedIndex`值产生以下远程地址: - -| `maxTrustedIndex` |结果| -|------------------------|-----------------------------------------------------------| -|[`Integer.MIN_VALUE`,0] |(无效,`IllegalArgumentException`在初始化期间)| -| 1 | 0.0.0.3 | -| 2 | 0.0.0.2 | -| 3 | 0.0.0.1 | -|[4, `Integer.MAX_VALUE`]| 0.0.0.1 | - -下面的示例展示了如何使用 Java 实现相同的配置: - -例 11。gatewayconfig.java - -``` -RemoteAddressResolver resolver = XForwardedRemoteAddressResolver - .maxTrustedIndex(1); - -... - -.route("direct-route", - r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24") - .uri("https://downstream1") -.route("proxied-route", - r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24") - .uri("https://downstream2") -) -``` - -### [](#the-weight-route-predicate-factory)[5.11.权重路径谓词工厂](#the-weight-route-predicate-factory) ### - -`Weight`路由谓词工厂接受两个参数:`group`和`weight`(一个 INT)。权重是按组计算的。下面的示例配置了权重路由谓词: - -示例 12.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: weight_high - uri: https://weighthigh.org - predicates: - - Weight=group1, 8 - - id: weight_low - uri: https://weightlow.org - predicates: - - Weight=group1, 2 -``` - -此路线将把 80% 的流量转发给[weighthigh.org](https://weighthigh.org),并将 20% 的流量转发给[weighlow.org](https://weighlow.org)。 - -### [](#the-xforwarded-remote-addr-route-predicate-factory)[5.12.XForwarded 远程 addr 路由谓词工厂](#the-xforwarded-remote-addr-route-predicate-factory) ### - -`XForwarded Remote Addr`路由谓词工厂接受一个`sources`的列表(最小大小为 1),这些字符串是 CIDR 表示法(IPv4 或 IPv6)字符串,例如`192.168.0.1/16`(其中`192.168.0.1`是一个 IP 地址,`16`是一个子网掩码)。 - -此路由谓词允许基于`X-Forwarded-For`HTTP 报头对请求进行过滤。 - -这可以用于反向代理,例如负载均衡器或 Web 应用程序防火墙,在这些代理中,只有当请求来自由这些反向代理使用的受信任的 IP 地址列表时,才允许请求。 - -下面的示例配置了一个 XForWardeDremoteaddr 路由谓词: - -示例 13.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: xforwarded_remoteaddr_route - uri: https://example.org - predicates: - - XForwardedRemoteAddr=192.168.1.1/24 -``` - -如果`X-Forwarded-For`标头包含`192.168.1.10`,则此路由匹配。 - -[](#gatewayfilter-factories)[6. `GatewayFilter` Factories](#gatewayfilter-factories) ----------- - -路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。 Spring 云网关包括许多内置的网关过滤工厂。 - -| |有关如何使用以下任何过滤器的更详细示例,请查看[unit tests](https://github.com/spring-cloud/spring-cloud-gateway/tree/master/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory)。| -|---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -### [](#the-addrequestheader-gatewayfilter-factory)[6.1. The `AddRequestHeader` `GatewayFilter` Factory](#the-addrequestheader-gatewayfilter-factory) ### - -`AddRequestHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddRequestHeader``GatewayFilter`: - -示例 14.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - filters: - - AddRequestHeader=X-Request-red, blue -``` - -对于所有匹配的请求,此清单将`X-Request-red:blue`头添加到下游请求的头。 - -`AddRequestHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestHeader``GatewayFilter`: - -示例 15.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_header_route - uri: https://example.org - predicates: - - Path=/red/{segment} - filters: - - AddRequestHeader=X-Request-Red, Blue-{segment} -``` - -### [](#the-addrequestparameter-gatewayfilter-factory)[6.2. The `AddRequestParameter` `GatewayFilter` Factory](#the-addrequestparameter-gatewayfilter-factory) ### - -`AddRequestParameter``GatewayFilter`工厂接受`name`和`value`参数。下面的示例配置`AddRequestParameter``GatewayFilter`: - -示例 16.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - filters: - - AddRequestParameter=red, blue -``` - -这将为所有匹配的请求将`red=blue`添加到下游请求的查询字符串中。 - -`AddRequestParameter`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`AddRequestParameter``GatewayFilter`: - -示例 17.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_request_parameter_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddRequestParameter=foo, bar-{segment} -``` - -### [](#the-addresponseheader-gatewayfilter-factory)[6.3. The `AddResponseHeader` `GatewayFilter` Factory](#the-addresponseheader-gatewayfilter-factory) ### - -`AddResponseHeader``GatewayFilter`工厂接受一个`name`和`value`参数。以下示例配置`AddResponseHeader``GatewayFilter`: - -示例 18.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - filters: - - AddResponseHeader=X-Response-Red, Blue -``` - -这将为所有匹配的请求向下游响应的头添加`X-Response-Red:Blue`头。 - -`AddResponseHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置了使用变量的`AddResponseHeader``GatewayFilter`: - -示例 19.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: add_response_header_route - uri: https://example.org - predicates: - - Host: {segment}.myhost.org - filters: - - AddResponseHeader=foo, bar-{segment} -``` - -### [](#the-deduperesponseheader-gatewayfilter-factory)[6.4. The `DedupeResponseHeader` `GatewayFilter` Factory](#the-deduperesponseheader-gatewayfilter-factory) ### - -DedupeResponseHeader 网关过滤器工厂接受一个`name`参数和一个可选的`strategy`参数。`name`可以包含一个以空格分隔的标题名称列表。以下示例配置`DedupeResponseHeader``GatewayFilter`: - -示例 20.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: dedupe_response_header_route - uri: https://example.org - filters: - - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin -``` - -在网关 CORS 逻辑和下游逻辑都添加响应头的情况下,这将删除重复的`Access-Control-Allow-Credentials`和`Access-Control-Allow-Origin`响应头的值。 - -`DedupeResponseHeader`过滤器还接受一个可选的`strategy`参数。接受的值是`RETAIN_FIRST`(默认)、`RETAIN_LAST`和`RETAIN_UNIQUE`。 - -### [](#spring-cloud-circuitbreaker-filter-factory)[6.5. Spring Cloud CircuitBreaker GatewayFilter Factory](#spring-cloud-circuitbreaker-filter-factory) ### - -Spring 云断路器网关过滤器工厂使用 Spring 云断路器 API 将网关路由封装在断路器中。 Spring Cloud Circuitbreaker 支持可与 Spring Cloud Gateway 一起使用的多个库。 Spring 云支持开箱即用的弹性 4J。 - -要启用 Spring 云电路断路器过滤器,你需要在 Classpath 上放置`spring-cloud-starter-circuitbreaker-reactor-resilience4j`。下面的示例配置 Spring 云电路断路器`GatewayFilter`: - -示例 21.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: https://example.org - filters: - - CircuitBreaker=myCircuitBreaker -``` - -要配置断路器,请参阅你正在使用的底层断路器实现的配置。 - -* [复原力 4J 文档](https://cloud.spring.io/spring-cloud-circuitbreaker/reference/html/spring-cloud-circuitbreaker.html) - -Spring 云电路断路器过滤器还可以接受可选的`fallbackUri`参数。目前,只支持`forward:`模式 URI。如果回退被调用,请求将被转发到与 URI 匹配的控制器。下面的示例配置了这种回退: - -示例 22.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint -``` - -下面的列表在 Java 中做了相同的事情: - -例 23。application.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -当调用断路器回退时,此示例转发到`/inCaseofFailureUseThis`URI。请注意,此示例还演示了(可选的) Spring 云负载平衡器负载平衡(由目标 URI 上的`lb`前缀定义)。 - -主要的场景是使用`fallbackUri`在网关应用程序中定义内部控制器或处理程序。但是,你也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示: - -示例 24.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback -``` - -在此示例中,网关应用程序中没有`fallback`端点或处理程序。然而,在另一个应用程序中有一个,注册在`[localhost:9994](http://localhost:9994)`下。 - -在请求被转发到 Fallback 的情况下, Spring Cloud Circuitbreaker 网关过滤器还提供了导致它的`Throwable`。它被添加到`ServerWebExchange`中,作为`ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR`属性,该属性可以在处理网关应用程序内的回退时使用。 - -对于外部控制器/处理程序场景,可以添加带有异常详细信息的头。你可以在[FallbackHeaders GatewayFilter 工厂部分](#fallback-headers)中找到有关这样做的更多信息。 - -#### [](#circuit-breaker-status-codes)[6.5.1.按状态码切断断路器](#circuit-breaker-status-codes) #### - -在某些情况下,你可能希望基于从其封装的路由返回的状态码来跳闸断路器。断路器配置对象获取一系列状态代码,如果返回这些代码,将导致断路器跳闸。在设置要跳闸的状态码时,可以使用带有状态码值的整数,也可以使用`HttpStatus`枚举的字符串表示。 - -示例 25.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: circuitbreaker_route - uri: lb://backing-service:8088 - predicates: - - Path=/consumingServiceEndpoint - filters: - - name: CircuitBreaker - args: - name: myCircuitBreaker - fallbackUri: forward:/inCaseOfFailureUseThis - statusCodes: - - 500 - - "NOT_FOUND" -``` - -例 26。应用程序.java - -``` -@Bean -public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint") - .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis").addStatusCode("INTERNAL_SERVER_ERROR")) - .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") - .build(); -} -``` - -### [](#fallback-headers)[6.6. The `FallbackHeaders` `GatewayFilter` Factory](#fallback-headers) ### - -`FallbackHeaders`工厂允许你在转发到外部应用程序中的`fallbackUri`的请求的标题中添加 Spring Cloud Circuitbreaker 执行异常详细信息,如下所示: - -示例 27.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: ingredients - uri: lb://ingredients - predicates: - - Path=//ingredients/** - filters: - - name: CircuitBreaker - args: - name: fetchIngredients - fallbackUri: forward:/fallback - - id: ingredients-fallback - uri: http://localhost:9994 - predicates: - - Path=/fallback - filters: - - name: FallbackHeaders - args: - executionExceptionTypeHeaderName: Test-Header -``` - -在本例中,在运行断路器时发生执行异常后,请求被转发到在`localhost:9994`上运行的应用程序中的`fallback`端点或处理程序。带有异常类型、消息和(如果可用的话)根原因异常类型和消息的头将由`FallbackHeaders`过滤器添加到该请求中。 - -你可以通过设置以下参数的值(以它们的默认值显示)来覆盖配置中的头的名称: - -* `executionExceptionTypeHeaderName`(`“execution-exception-type”`) - -* `executionExceptionMessageHeaderName`(`“execution-exception-message”`) - -* `rootCauseExceptionTypeHeaderName`(`“root-cause-exception-type”`) - -* `rootCauseExceptionMessageHeaderName`(`“root-cause-exception-message”`) - -有关断路器和网关的更多信息,请参见[Spring Cloud CircuitBreaker Factory section](#spring-cloud-circuitbreaker-filter-factory)。 - -### [](#the-maprequestheader-gatewayfilter-factory)[6.7. The `MapRequestHeader` `GatewayFilter` Factory](#the-maprequestheader-gatewayfilter-factory) ### - -`MapRequestHeader``GatewayFilter`工厂接受`fromHeader`和`toHeader`参数。它将创建一个新的命名头,并从传入的 HTTP 请求中从现有的命名头中提取该值。如果输入标头不存在,则过滤器不会产生任何影响。如果新的命名标头已经存在,那么它的值将被新的值扩充。以下示例配置`MapRequestHeader`: - -示例 28.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: map_request_header_route - uri: https://example.org - filters: - - MapRequestHeader=Blue, X-Request-Red -``` - -这会将`X-Request-Red:`头添加到下游请求,并从传入的 HTTP 请求的`Blue`头更新其值。 - -### [](#the-prefixpath-gatewayfilter-factory)[6.8. The `PrefixPath` `GatewayFilter` Factory](#the-prefixpath-gatewayfilter-factory) ### - -`PrefixPath``GatewayFilter`工厂接受一个`prefix`参数。下面的示例配置`PrefixPath``GatewayFilter`: - -示例 29.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - PrefixPath=/mypath -``` - -这将在所有匹配请求的路径前缀`/mypath`。因此,对`/hello`的请求将被发送到`/mypath/hello`。 - -### [](#the-preservehostheader-gatewayfilter-factory)[6.9. The `PreserveHostHeader` `GatewayFilter` Factory](#the-preservehostheader-gatewayfilter-factory) ### - -`PreserveHostHeader``GatewayFilter`工厂没有参数。此筛选器设置一个请求属性,由路由筛选器检查该属性,以确定是否应发送原始的主机头,而不是由 HTTP 客户机确定的主机头。以下示例配置`PreserveHostHeader``GatewayFilter`: - -示例 30.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: preserve_host_route - uri: https://example.org - filters: - - PreserveHostHeader -``` - -### [](#the-requestratelimiter-gatewayfilter-factory)[6.10. The `RequestRateLimiter` `GatewayFilter` Factory](#the-requestratelimiter-gatewayfilter-factory) ### - -`RequestRateLimiter``GatewayFilter`工厂使用`RateLimiter`实现来确定是否允许当前请求继续执行。如果不是,则返回`HTTP 429 - Too Many Requests`(默认情况下)的状态。 - -这个过滤器接受一个可选的`keyResolver`参数和特定于速率限制器的参数(将在本节后面描述)。 - -`keyResolver`是实现`KeyResolver`接口的 Bean。在配置中,使用 spel 按名称引用 Bean。`#{@mykeyresolver}` 是引用名为`myKeyResolver`的 Bean 的 spel 表达式。下面的清单显示了`KeyResolver`接口: - -例 31。keyresolver.java - -``` -public interface KeyResolver { - Mono resolve(ServerWebExchange exchange); -} -``` - -`KeyResolver`接口让可插入策略派生限制请求的键。在未来的里程碑版本中,将会有一些`KeyResolver`实现。 - -`KeyResolver`的默认实现是`PrincipalNameKeyResolver`,它从`ServerWebExchange`检索`Principal`并调用`Principal.getName()`。 - -默认情况下,如果`KeyResolver`没有找到密钥,请求将被拒绝。你可以通过设置`spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key`(`true’或`false`)和`spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code`属性来调整此行为。 - -| |`RequestRateLimiter`不能使用“shortcut”符号进行配置。下面的示例是*无效*:

示例 32.application.properties

```
# 无效的快捷方式配置
Spring.cloud.gateway.routes[0].filters[0]=requestrateLimiter=2,2,#{@userkeyresolever=“426”/>```| -|---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - -#### [](#the-redis-ratelimiter)[6.10.1. The Redis `RateLimiter`](#the-redis-ratelimiter) #### - -Redis 实现基于在[Stripe](https://stripe.com/blog/rate-limiters)上完成的工作。它需要使用`spring-boot-starter-data-redis-reactive` Spring 引导启动器。 - -使用的算法是[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 - -`redis-rate-limiter.replenishRate`属性是你希望用户在不删除任何请求的情况下每秒可以执行多少个请求。这是令牌桶被填满的速率。 - -`redis-rate-limiter.burstCapacity`属性是用户在一秒钟内被允许执行的最大请求数。这是令牌桶可以容纳的令牌数量。将此值设置为零将阻止所有请求。 - -`redis-rate-limiter.requestedTokens`属性是一个请求需要多少令牌。这是每个请求从 bucket 中获取的令牌的数量,默认为`1`。 - -通过在`replenishRate`和`burstCapacity`中设置相同的值,可以实现稳定的速率。可以通过将`burstCapacity`设置为高于`replenishRate`来允许临时突发。在这种情况下,速率限制器需要允许在两次突发之间有一段时间(根据`replenishRate`),因为连续两次突发将导致丢弃请求(`HTTP429-太多请求’)。下面的清单配置了`redis-rate-limiter`: - -速率限制`1 request/s`通过将`replenishRate`设置为所需的请求数,`requestedTokens`设置为秒内的时间跨度,`burstCapacity`设置为`replenishRate`和`requestedTokens`的乘积,例如,设置`replenishRate=1`,`requestedTokens=60`和`burstCapacity=60`将导致`1 request/min`的限制。 - -示例 33.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - redis-rate-limiter.replenishRate: 10 - redis-rate-limiter.burstCapacity: 20 - redis-rate-limiter.requestedTokens: 1 -``` - -下面的示例在 Java 中配置一个 keyresolver: - -例 34。config.java - -``` -@Bean -KeyResolver userKeyResolver() { - return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); -} -``` - -这定义了每个用户 10 个的请求速率限制。允许突发 20 个请求,但在接下来的一秒钟内,只有 10 个请求可用。`KeyResolver`是一个获得`user`请求参数的简单参数(请注意,这不推荐用于生产)。 - -还可以将速率限制器定义为实现`RateLimiter`接口的 Bean。在配置中,你可以使用 spel 按名称引用 Bean。`#{@myratelimiter}` 是一个 spel 表达式,它引用名为`myRateLimiter`的 Bean。下面的清单定义了一个速率限制器,该限制器使用上一个清单中定义的`KeyResolver`: - -示例 35.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: requestratelimiter_route - uri: https://example.org - filters: - - name: RequestRateLimiter - args: - rate-limiter: "#{@myRateLimiter}" - key-resolver: "#{@userKeyResolver}" -``` - -### [](#the-redirectto-gatewayfilter-factory)[6.11. The `RedirectTo` `GatewayFilter` Factory](#the-redirectto-gatewayfilter-factory) ### - -`RedirectTo``GatewayFilter`工厂接受两个参数,`status`和`url`。`status`参数应该是 300 系列重定向 HTTP 代码,例如 301。`url`参数应该是一个有效的 URL。这是`Location`标头的值。对于相对重定向,应该使用`uri: no://op`作为路由定义的 URI。下面的列表配置了`RedirectTo``GatewayFilter`: - -示例 36.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: prefixpath_route - uri: https://example.org - filters: - - RedirectTo=302, https://acme.org -``` - -这将发送带有`Location:https://acme.org`头的状态 302 来执行重定向。 - -### [](#the-removerequestheader-gatewayfilter-factory)[6.12. The `RemoveRequestHeader` GatewayFilter Factory](#the-removerequestheader-gatewayfilter-factory) ### - -`RemoveRequestHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveRequestHeader``GatewayFilter`: - -示例 37.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestheader_route - uri: https://example.org - filters: - - RemoveRequestHeader=X-Request-Foo -``` - -这将在向下游发送`X-Request-Foo`头之前删除它。 - -### [](#removeresponseheader-gatewayfilter-factory)[6.13. `RemoveResponseHeader` `GatewayFilter` Factory](#removeresponseheader-gatewayfilter-factory) ### - -`RemoveResponseHeader``GatewayFilter`工厂接受一个`name`参数。它是要删除的标头的名称。下面的列表配置了`RemoveResponseHeader``GatewayFilter`: - -示例 38.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removeresponseheader_route - uri: https://example.org - filters: - - RemoveResponseHeader=X-Response-Foo -``` - -这将在响应返回到网关客户机之前从响应中删除`X-Response-Foo`头。 - -要删除任何类型的敏感报头,你应该为你可能想要删除的任何路由配置此筛选器。此外,你可以使用`spring.cloud.gateway.default-filters`配置该过滤器一次,并将其应用于所有路由。 - -### [](#the-removerequestparameter-gatewayfilter-factory)[6.14. The `RemoveRequestParameter` `GatewayFilter` Factory](#the-removerequestparameter-gatewayfilter-factory) ### - -`RemoveRequestParameter``GatewayFilter`工厂接受一个`name`参数。它是要删除的查询参数的名称。下面的示例配置`RemoveRequestParameter``GatewayFilter`: - -示例 39.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: removerequestparameter_route - uri: https://example.org - filters: - - RemoveRequestParameter=red -``` - -这将在向下游发送`red`参数之前删除该参数。 - -### [](#the-rewritepath-gatewayfilter-factory)[6.15. The `RewritePath` `GatewayFilter` Factory](#the-rewritepath-gatewayfilter-factory) ### - -`RewritePath``GatewayFilter`工厂接受一个路径`regexp`参数和一个`replacement`参数。这使用 Java 正则表达式以灵活的方式重写请求路径。下面的列表配置了`RewritePath``GatewayFilter`: - -示例 40.application.yml - -``` -spring: - cloud: - gateway: - routes: - - id: rewritepath_route - uri: https://example.org - predicates: - - Path=/red/** - filters: - - RewritePath=/red/?(?.*), /$\{segment} -``` - -应该替换为`$\`。 - -### [](#rewritelocationresponseheader-gatewayfilter-factory)[6.16. `RewriteLocationResponseHeader` `GatewayFilter` Factory](#rewritelocationresponseheader-gatewayfilter-factory) ### - -`RewriteLocationResponseHeader``GatewayFilter`工厂修改`Location`响应头的值,通常是为了去掉后台特定的细节。它需要`stripVersionMode`,`locationHeaderName`,`hostValue`和`protocolsRegex`参数。下面的列表配置了`RewriteLocationResponseHeader``GatewayFilter`: +`RewriteLocationResponseHeader``GatewayFilter`工厂修改`Location`响应头的值,通常是为了去掉后台特定的细节。它需要`stripVersionMode`、`locationHeaderName`、`hostValue`和`protocolsRegex`参数。下面的列表配置了`RewriteLocationResponseHeader``GatewayFilter`: 示例 41.application.yml @@ -3909,21 +973,21 @@ spring: 例如,对于`POST [api.example.com/some/object/name](https://api.example.com/some/object/name)`的请求,`Location`的响应头值`[object-service.prod.example.net/v2/some/object/id](https://object-service.prod.example.net/v2/some/object/id)`被重写为`[api.example.com/some/object/id](https://api.example.com/some/object/id)`。 -`stripVersionMode`参数有以下可能的值:`NEVER_STRIP`,`AS_IN_REQUEST`(默认),和`ALWAYS_STRIP`。 +`stripVersionMode`参数具有以下可能的值:`NEVER_STRIP`、`AS_IN_REQUEST`(默认)和`ALWAYS_STRIP`。 * `NEVER_STRIP`:即使原始请求路径不包含版本,也不会剥离版本。 * `AS_IN_REQUEST`只有当原始请求路径不包含版本时,才会剥离版本。 -* `ALWAYS_STRIP`版本总是被剥离,即使原始请求路径包含版本。 +* `ALWAYS_STRIP`即使原始请求路径包含版本,版本也总是被剥离。 如果提供了`hostValue`参数,则用于替换响应`host:port`头的`host:port`部分。如果没有提供,则使用`Host`请求头的值。 参数`protocolsRegex`必须是一个有效的 regex`String`,协议名称与该 regex 匹配。如果不匹配,过滤器就不会做任何事情。默认值为`http|https|ftp|ftps`。 -### [](#the-rewriteresponseheader-gatewayfilter-factory)[6.17. The `RewriteResponseHeader` `GatewayFilter` Factory](#the-rewriteresponseheader-gatewayfilter-factory) ### +### [](#the-rewriteresponseheader-gatewayfilter-factory)[6.17。`RewriteResponseHeader``GatewayFilter`工厂](#the-rewriteResponseHeader-gatewayfilter-factory) -`RewriteResponseHeader``GatewayFilter`工厂接受`name`、`regexp`和`replacement`参数。它使用 Java 正则表达式以一种灵活的方式重写响应头值。下面的示例配置`RewriteResponseHeader``GatewayFilter`: +`RewriteResponseHeader``GatewayFilter`工厂接受`name`、`regexp`和`replacement`参数。它使用 Java 正则表达式以一种灵活的方式重写响应头值。以下示例配置`RewriteResponseHeader``GatewayFilter`: 示例 42.application.yml @@ -3938,9 +1002,9 @@ spring: - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=*** ``` -。 +对于标头值`/42?user=ford&password=omg!what&flag=true`,在发出下游请求后将其设置为`/42?user=ford&password=***&flag=true`。由于 YAML 规范,你必须使用`$\`表示`$`。 -### [](#the-savesession-gatewayfilter-factory)[6.18. The `SaveSession` `GatewayFilter` Factory](#the-savesession-gatewayfilter-factory) ### +### [](#the-savesession-gatewayfilter-factory)[6.18。`SaveSession``GatewayFilter`工厂](#the-savesession-gatewayfilter-factory) `SaveSession``GatewayFilter`工厂强制执行`WebSession::save`操作*在此之前*向下游转发呼叫。这在使用带有惰性数据存储的[Spring Session](https://projects.spring.io/spring-session/)之类的东西时特别有用,并且需要确保在进行转发调用之前保存了会话状态。以下示例配置`SaveSession``GatewayFilter`: @@ -3959,11 +1023,11 @@ spring: - SaveSession ``` -如果你将[Spring Security](https://projects.spring.io/spring-security/)与 Spring 会话集成,并希望确保已将安全细节转发到远程进程,这是非常关键的。 +如果将[Spring Security](https://projects.spring.io/spring-security/)与 Spring 会话集成,并希望确保已将安全细节转发到远程进程,这是至关重要的。 -### [](#the-secureheaders-gatewayfilter-factory)[6.19. The `SecureHeaders` `GatewayFilter` Factory](#the-secureheaders-gatewayfilter-factory) ### +### [](#the-secureheaders-gatewayfilter-factory)[6.19。`SecureHeaders``GatewayFilter`工厂](#the-secureheaders-gatewayfilter-factory) -`SecureHeaders``GatewayFilter`工厂根据[this blog post](https://blog.appcanary.com/2017/http-security-headers.html)中提出的建议,向响应添加了许多标题。 +`SecureHeaders``GatewayFilter`工厂根据[这篇博文](https://blog.appcanary.com/2017/http-security-headers.html)中提出的建议,向响应添加了许多标题。 添加了以下标题(以其默认值显示): @@ -4010,9 +1074,9 @@ spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transp | |需要使用安全报头的小写字母全名来禁用它。| |---|-----------------------------------------------------------------------------| -### [](#the-setpath-gatewayfilter-factory)[6.20. The `SetPath` `GatewayFilter` Factory](#the-setpath-gatewayfilter-factory) ### +### [](#the-setpath-gatewayfilter-factory)[6.20。`SetPath``GatewayFilter`工厂](#the-setpath-gatewayfilter-factory) -`SetPath``GatewayFilter`工厂接受一个路径`template`参数。它提供了一种简单的方法,通过允许模板化的路径段来操作请求路径。这使用了 Spring Framework 中的 URI 模板。允许多个匹配段。以下示例配置`SetPath``GatewayFilter`: +`SetPath``GatewayFilter`工厂接受一个路径`template`参数。它提供了一种简单的方法,通过允许模板化的路径段来操作请求路径。这使用了 Spring Framework 中的 URI 模板。允许多个匹配段。下面的示例配置`SetPath``GatewayFilter`: 示例 44.application.yml @@ -4031,7 +1095,7 @@ spring: 对于`/red/blue`的请求路径,在发出下游请求之前,将路径设置为`/blue`。 -### [](#the-setrequestheader-gatewayfilter-factory)[6.21. The `SetRequestHeader` `GatewayFilter` Factory](#the-setrequestheader-gatewayfilter-factory) ### +### [](#the-setrequestheader-gatewayfilter-factory)[6.21。`SetRequestHeader``GatewayFilter`工厂](#the-setrequestheader-gatewayfilter-factory) `SetRequestHeader``GatewayFilter`工厂接受`name`和`value`参数。下面的列表配置了`SetRequestHeader``GatewayFilter`: @@ -4048,9 +1112,9 @@ spring: - SetRequestHeader=X-Request-Red, Blue ``` -这个`GatewayFilter`用给定的名称替换(而不是添加)所有的头。因此,如果下游服务器用`X-Request-Red:1234`响应,这将被替换为`X-Request-Red:Blue`,这是下游服务将接收的内容。 +这个`GatewayFilter`用给定的名称替换(而不是添加)所有的标题。因此,如果下游服务器用`X-Request-Red:1234`响应,这将被替换为`X-Request-Red:Blue`,这是下游服务将接收的内容。 -`SetRequestHeader`知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。下面的示例配置使用变量的`SetRequestHeader``GatewayFilter`: +`SetRequestHeader`知道用于匹配路径或主机的 URI 变量。可以在值中使用 URI 变量,并在运行时对其进行扩展。下面的示例配置了使用变量的`SetRequestHeader``GatewayFilter`: 示例 46.application.yml @@ -4067,7 +1131,7 @@ spring: - SetRequestHeader=foo, bar-{segment} ``` -### [](#the-setresponseheader-gatewayfilter-factory)[6.22. The `SetResponseHeader` `GatewayFilter` Factory](#the-setresponseheader-gatewayfilter-factory) ### +### [](#the-setresponseheader-gatewayfilter-factory)[6.22。`SetResponseHeader``GatewayFilter`工厂](#the-setResponseHeader-gatewayfilter-factory) `SetResponseHeader``GatewayFilter`工厂接受`name`和`value`参数。下面的列表配置了`SetResponseHeader``GatewayFilter`: @@ -4103,9 +1167,9 @@ spring: - SetResponseHeader=foo, bar-{segment} ``` -### [](#the-setstatus-gatewayfilter-factory)[6.23. The `SetStatus` `GatewayFilter` Factory](#the-setstatus-gatewayfilter-factory) ### +### [](#the-setstatus-gatewayfilter-factory)[6.23。`SetStatus``GatewayFilter`工厂](#the-setstatus-gatewayfilter-factory) -`SetStatus``GatewayFilter`工厂只接受一个参数,`status`。它必须是有效的 Spring `HttpStatus`。它可以是整数值`404`或枚举的字符串表示:`NOT_FOUND`。下面的列表配置了`SetStatus``GatewayFilter`: +`SetStatus``GatewayFilter`工厂只接受一个参数,`status`。它必须是有效的 Spring `HttpStatus`。它可以是整数值`404`,也可以是枚举的字符串表示:`NOT_FOUND`。下面的列表配置了`SetStatus``GatewayFilter`: 示例 49.application.yml @@ -4138,7 +1202,7 @@ spring: original-status-header-name: original-http-status ``` -### [](#the-stripprefix-gatewayfilter-factory)[6.24. The `StripPrefix` `GatewayFilter` Factory](#the-stripprefix-gatewayfilter-factory) ### +### [](#the-stripprefix-gatewayfilter-factory)[6.24。`StripPrefix``GatewayFilter`工厂](#the-stripprefix-gatewayfilter-factory) `StripPrefix``GatewayFilter`工厂接受一个参数,`parts`。`parts`参数指示在向下游发送请求之前要从请求中剥离的路径中的部件数量。下面的列表配置了`StripPrefix``GatewayFilter`: @@ -4159,7 +1223,7 @@ spring: 当通过网关向`/name/blue/red`发出请求时,向`nameservice`发出的请求看起来像`[nameservice/red](https://nameservice/red)`。 -### [](#the-retry-gatewayfilter-factory)[6.25. The Retry `GatewayFilter` Factory](#the-retry-gatewayfilter-factory) ### +### [](#the-retry-gatewayfilter-factory)[6.25。重试`GatewayFilter`工厂](#the-retry-gatewayfilter-factory) `Retry``GatewayFilter`工厂支持以下参数: @@ -4173,7 +1237,7 @@ spring: * `exceptions`:应该重试的抛出的异常列表。 -* `backoff`:为重试配置的指数退避。在回退间隔`firstBackoff * (factor ^ n)`之后执行重试,其中`n`是迭代。如果`maxBackoff`已配置,则应用的最大退避限制为`maxBackoff`。如果`basedOnPreviousValue`为真,则按`prevBackoff * factor`计算退避。 +* `backoff`:为重试配置的指数退避。在回退间隔`firstBackoff * (factor ^ n)`之后执行重试,其中`n`是迭代。如果配置了`maxBackoff`,则应用的最大退避限制为`maxBackoff`。如果`basedOnPreviousValue`为真,则按`prevBackoff * factor`计算退避。 如果启用,以下默认值将配置为`Retry`过滤器: @@ -4187,7 +1251,7 @@ spring: * `backoff`:禁用 -下面的列表配置了重试`GatewayFilter`: +下面的清单配置了重试`GatewayFilter`: 示例 52.application.yml @@ -4213,13 +1277,13 @@ spring: basedOnPreviousValue: false ``` -| |当使用带有`forward:`前缀 URL 的重试筛选器时,目标端点应该仔细地编写,以便在发生错误的情况下,它不会执行任何可能导致将响应发送到客户机并提交的操作,例如,
,如果目标端点是带注释的控制器,则目标控制器方法不应该返回带有错误状态码的`ResponseEntity`,而是应该抛出
,或者发出错误信号(例如,通过`Mono.error(ex)`返回值),重试筛选器可以配置为通过重试来处理该筛选器。| +| |当使用带有`forward:`前缀 URL 的重试筛选器时,目标端点应该仔细地编写,以便在发生错误的情况下,它不会执行任何可能导致将响应发送到客户机并提交的操作,例如,
,如果目标端点是带注释的控制器,则目标控制器方法不应返回带有错误状态码的`ResponseEntity`,而是应该抛出
或发出错误信号(例如,通过`Mono.error(ex)`返回值),重试筛选器可以配置为通过重试来处理该筛选器。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |当在带有主体的任何 HTTP 方法中使用 Retry 过滤器时,主体将被缓存,网关将成为内存约束。主体缓存在由`ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR`定义的请求属性中。对象的类型是`org.springframework.core.io.buffer.DataBuffer`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -简化的“shortcut”符号可以添加一个`status`和`method`。 +一个简化的“shortcut”符号可以添加一个`status`和`method`。 以下两个例子是等价的: @@ -4250,9 +1314,9 @@ spring: - Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false ``` -### [](#the-requestsize-gatewayfilter-factory)[6.26. The `RequestSize` `GatewayFilter` Factory](#the-requestsize-gatewayfilter-factory) ### +### [](#the-requestsize-gatewayfilter-factory)[6.26。`RequestSize``GatewayFilter`工厂](#the-requestsize-gatewayfilter-factory) -当请求大小大于允许的限制时,`RequestSize``GatewayFilter`工厂可以限制请求到达下游服务。过滤器接受`maxSize`参数。`maxSize`是`DataSize`类型,因此值可以定义为一个数字,后面跟着一个可选的`DataUnit`后缀,例如“KB”或“MB”。对于字节,默认值为“B”。它是以字节为单位定义的请求的允许大小限制。下面的列表配置了`RequestSize``GatewayFilter`: +当请求大小大于允许的限制时,`RequestSize`工厂可以限制请求到达下游服务。过滤器接受`maxSize`参数。`maxSize`是`DataSize`类型,因此值可以定义为一个数字,后面跟着一个可选的`DataUnit`后缀,例如“KB”或“MB”。对于字节,默认值为“B”。它是以字节为单位定义的请求的允许大小限制。下面的列表配置了`RequestSize``GatewayFilter`: 示例 54.application.yml @@ -4280,7 +1344,7 @@ errorMessage : Request size is larger than permissible limit. Request size is 6. | |如果在路由定义中没有作为筛选参数提供,则默认的请求大小设置为 5MB。| |---|--------------------------------------------------------------------------------------------------------| -### [](#the-setrequesthostheader-gatewayfilter-factory)[6.27. The `SetRequestHostHeader` `GatewayFilter` Factory](#the-setrequesthostheader-gatewayfilter-factory) ### +### [](#the-setrequesthostheader-gatewayfilter-factory)[6.27。`SetRequestHostHeader``GatewayFilter`工厂](#the-setrequesthostheader-gatewayfilter-factory) 在某些情况下,主机标题可能需要被重写。在这种情况下,`SetRequestHostHeader``GatewayFilter`工厂可以用指定的 vaue 替换现有的主机报头。过滤器接受`host`参数。下面的列表配置了`SetRequestHostHeader``GatewayFilter`: @@ -4303,7 +1367,7 @@ spring: `SetRequestHostHeader``GatewayFilter`工厂将主机报头的值替换为`example.org`。 -### [](#modify-a-request-body-gatewayfilter-factory)[6.28. Modify a Request Body `GatewayFilter` Factory](#modify-a-request-body-gatewayfilter-factory) ### +### [](#modify-a-request-body-gatewayfilter-factory)[6.28。修改请求主体`GatewayFilter`工厂](#modify-a-request-body-gatewayfilter-factory) 你可以使用`ModifyRequestBody`过滤器过滤器来修改请求主体,然后再由网关向下游发送。 @@ -4342,10 +1406,10 @@ static class Hello { } ``` -| |如果请求没有正文,则将传递`RewriteFilter`。应该返回`Mono.empty()`以分配请求中缺少的主体。| +| |如果请求没有正文,`RewriteFilter`将被传递`null`。应该返回`Mono.empty()`以分配请求中缺少的主体。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#modify-a-response-body-gatewayfilter-factory)[6.29. Modify a Response Body `GatewayFilter` Factory](#modify-a-response-body-gatewayfilter-factory) ### +### [](#modify-a-response-body-gatewayfilter-factory)[6.29。修改响应主体`GatewayFilter`工厂](#modify-a-response-body-gatewayfilter-factory) 你可以使用`ModifyResponseBody`过滤器来修改响应主体,然后再将其发送回客户机。 @@ -4366,14 +1430,14 @@ public RouteLocator routes(RouteLocatorBuilder builder) { } ``` -| |如果响应没有主体,那么`RewriteFilter`将被传递`null`。应该返回`Mono.empty()`,以便在响应中分配一个缺少的主体。| +| |如果响应没有主体,则将传递`RewriteFilter`。应该返回`Mono.empty()`,以便在响应中分配一个缺少的主体。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#token-relay-gatewayfilter-factory)[6.30. Token Relay `GatewayFilter` Factory](#token-relay-gatewayfilter-factory) ### +### [](#token-relay-gatewayfilter-factory)[6.30。令牌中继`GatewayFilter`工厂](# 令牌-中继-网关过滤器-工厂) 令牌中继是 OAuth2 使用者充当客户端并将传入的令牌转发给传出的资源请求的一种方式。使用者可以是纯客户机(如 SSO 应用程序)或资源服务器。 -Spring 云网关可以将 OAuth2 访问令牌转发到其代理的服务的下游。要将此功能添加到 Gateway,你需要添加“TokenRelayGatewayFilterFactory”,如下所示: +Spring Cloud网关可以将 OAuth2 访问令牌转发到其代理的服务的下游。要将此功能添加到 Gateway,你需要添加`TokenRelayGatewayFilterFactory`,如下所示: app.java @@ -4405,15 +1469,15 @@ spring: - TokenRelay= ``` -并且它将(除了登录用户并获取令牌之外)向下游传递身份验证令牌到服务(在这种情况下是 `/resource`)。 +并且它将(除了登录用户并获取令牌之外)向下游传递身份验证令牌到服务(在这种情况下`/resource`)。 -要为 Spring 云网关启用此功能,请添加以下依赖项 +要为 Spring Cloud网关启用此功能,请添加以下依赖项 * `org.springframework.boot:spring-boot-starter-oauth2-client` 它是如何工作的?{githubmaster}/SRC/main/java/org/springframework/cloud/gateway/security/tokenrelaygatewayfilterfactory.java[filter]从当前经过身份验证的用户中提取一个访问令牌,并将其放在下游请求的请求头中。 -有关完整的工作示例,请参见[this project](https://github.com/spring-cloud-samples/sample-gateway-oauth2login)。 +有关完整的工作示例,请参见[这个项目](https://github.com/spring-cloud-samples/sample-gateway-oauth2login)。 | |只有设置了适当的`spring.security.oauth2.client.*`属性才会创建`TokenRelayGatewayFilterFactory` Bean,这将触发创建`ReactiveClientRegistrationRepository` Bean。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -4421,7 +1485,7 @@ spring: | |`TokenRelayGatewayFilterFactory`使用的`ReactiveOAuth2AuthorizedClientService`的默认实现使用内存中的数据存储。如果需要更健壮的解决方案,则需要提供自己的实现`ReactiveOAuth2AuthorizedClientService`。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#the-cacherequestbody-gatewayfilter-factory)[6.31. The `CacheRequestBody` `GatewayFilter` Factory](#the-cacherequestbody-gatewayfilter-factory) ### +### [](#the-cacherequestbody-gatewayfilter-factory)[6.31。`CacheRequestBody``GatewayFilter`工厂](#the-cacheRequestBody-gatewayfilter-factory) 由于请求体流只能被读取一次,所以需要对请求体流进行缓存。你可以使用`CacheRequestBody`过滤器来缓存请求主体,然后再将其发送到下游,并从 exchagne 属性获取主体。 @@ -4460,9 +1524,9 @@ spring: | |此过滤器仅适用于 HTTP 请求(包括 HTTPS)。| |---|-----------------------------------------------------------| -### [](#default-filters)[6.32.默认过滤器](#default-filters) ### +### [](#default-filters)[6.32.默认过滤器](#default-filters) -要添加筛选器并将其应用到所有路由,你可以使用`spring.cloud.gateway.default-filters`。此属性接受一个过滤器列表。下面的清单定义了一组默认筛选器: +要添加筛选器并将其应用到所有路由,你可以使用`spring.cloud.gateway.default-filters`。此属性接受一个过滤器列表。以下清单定义了一组默认筛选器: 示例 57.application.yml @@ -4475,19 +1539,18 @@ spring: - PrefixPath=/httpbin ``` -[](#global-filters)[7.全局过滤器](#global-filters) ----------- +## [](#global-filters)[7.全局过滤器](#global-filters) `GlobalFilter`接口具有与`GatewayFilter`相同的签名。这些是有条件地应用于所有路由的特殊过滤器。 | |该接口及其使用情况可能会在未来的里程碑版本中发生更改。| |---|--------------------------------------------------------------------------------| -### [](#gateway-combined-global-filter-and-gatewayfilter-ordering)[7.1. Combined Global Filter and `GatewayFilter` Ordering](#gateway-combined-global-filter-and-gatewayfilter-ordering) ### +### [](#gateway-combined-global-filter-and-gatewayfilter-ordering)[7.1。组合全局过滤器和`GatewayFilter`排序](#gateway-combined-global-filter-and-gatewayfilter-order) 当请求与路由匹配时,过滤 Web 处理程序将`GlobalFilter`的所有实例和`GatewayFilter`的所有特定于路由的实例添加到筛选链中。这个组合的过滤器链通过`org.springframework.core.Ordered`接口进行排序,你可以通过实现`getOrder()`方法来设置该接口。 -Spring 由于云网关对用于过滤器逻辑执行的“pre”和“post”阶段进行了区分(参见[How it Works](#gateway-how-it-works)),优先级最高的过滤器是“pre”阶段中的第一个,“post”阶段中的最后一个。 +Spring 由于云网关对于过滤器逻辑执行区分了“pre”和“post”阶段(参见[它是如何工作的](#gateway-how-it-works)),优先级最高的过滤器是“pre”阶段的第一个,“post”阶段的最后一个。 下面的清单配置了一个过滤器链: @@ -4514,13 +1577,13 @@ public class CustomGlobalFilter implements GlobalFilter, Ordered { } ``` -### [](#forward-routing-filter)[7.2.前向路由滤波器](#forward-routing-filter) ### +### [](#forward-routing-filter)[7.2.前向路由滤波器](#forward-routing-filter) `ForwardRoutingFilter`在 exchange 属性`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`中查找 URI。如果 URL 具有`forward`方案(例如`forward:///localendpoint`),则它使用 Spring `DispatcherHandler`来处理请求。请求 URL 的路径部分被转发 URL 中的路径覆盖。未修改的原始 URL 被追加到`ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR`属性中的列表中。 -### [](#reactive-loadbalancer-client-filter)[7.3. The `ReactiveLoadBalancerClientFilter`](#reactive-loadbalancer-client-filter) ### +### [](#reactive-loadbalancer-client-filter)[7.3。`ReactiveLoadBalancerClientFilter`](#ractive-loadbalancer-client-filter) -`ReactiveLoadBalancerClientFilter`在名为`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`的 exchange 属性中查找 URI。如果 URL 具有`lb`方案(例如`lb://myservice`),则它使用 Spring cloud`ReactorLoadBalancer`将名称(本例中的 `myservice’)解析为实际的主机和端口,并替换相同属性中的 URI。未修改的原始 URL 被追加到`ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR`属性中的列表中。过滤器还查看`ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR`属性,以查看它是否等于`lb`。如果是这样,也适用同样的规则。下面的列表配置了`ReactiveLoadBalancerClientFilter`: +`ReactiveLoadBalancerClientFilter`在名为`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`的 exchange 属性中查找 URI。如果 URL 具有`lb`方案(例如`lb://myservice`),则它使用 Spring Cloud`ReactorLoadBalancer`将名称(在本例中为`myservice`)解析为实际的主机和端口,并替换相同属性中的 URI。未修改的原始 URL 被追加到`ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR`属性中的列表中。过滤器还查看`ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR`属性,以查看它是否等于`lb`。如果是这样,也适用同样的规则。下面的清单配置了`ReactiveLoadBalancerClientFilter`: 示例 59.application.yml @@ -4538,27 +1601,27 @@ spring: | |默认情况下,当`ReactorLoadBalancer`无法找到服务实例时,将返回一个`503`。
通过设置`spring.cloud.gateway.loadbalancer.use404=true`,你可以将网关配置为返回一个`404`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |从`ReactiveLoadBalancerClientFilter`返回的`isSecure`值的`ServiceInstance`覆盖了
向网关提出的请求中指定的方案。
例如,如果请求通过`HTTPS`进入网关,但`ServiceInstance`表示它不安全,下游请求是在`HTTP`上提出的。
相反的情况也可以适用。
但是,如果`GATEWAY_SCHEME_PREFIX_ATTR`在网关配置中为该路由指定了前缀,则从路由 URL 中得到的方案将覆盖`ServiceInstance`配置。| +| |从`ReactiveLoadBalancerClientFilter`返回的`isSecure`值的`ServiceInstance`覆盖了
向网关提出的请求中指定的方案。
例如,如果请求通过`HTTPS`进入网关,但`ServiceInstance`表明它是不安全的,下游请求是在`HTTP`上提出的。
相反的情况也可以适用。
但是,如果`GATEWAY_SCHEME_PREFIX_ATTR`是在网关配置中为该路由指定的,则前缀被剥离,并且从路由 URL 中得到的方案覆盖了`ServiceInstance`配置。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |网关支持所有的负载平衡器功能。你可以在[Spring Cloud Commons documentation](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)中阅读有关它们的更多信息。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#the-netty-routing-filter)[7.4.Netty 路由过滤器](#the-netty-routing-filter) ### +### [](#the-netty-routing-filter)[7.4.Netty 路由过滤器](#the-netty-routing-filter) 如果`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`Exchange 属性中的 URL 具有`http`或`https`方案,则运行 Netty 路由过滤器。它使用 netty`HttpClient`发出下游代理请求。将响应放入`ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR`exchange 属性中,以便在以后的筛选器中使用。(还有一个实验性的`WebClientHttpRoutingFilter`,它执行相同的功能,但不需要 netty。 -### [](#the-netty-write-response-filter)[7.5.Netty 写响应过滤器](#the-netty-write-response-filter) ### +### [](#the-netty-write-response-filter)[7.5.Netty 写响应过滤器](#the-netty-write-response-filter) -如果`ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR`exchange 属性中有一个 netty`HttpClientResponse`,则运行`NettyWriteResponseFilter`。它在所有其他过滤器完成并将代理响应写回网关客户机响应之后运行。(还有一个实验性的`WebClientWriteResponseFilter`,它执行相同的功能,但不需要 netty。 +如果`ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR`exchange 属性中有一个 netty`HttpClientResponse`,则运行`NettyWriteResponseFilter`。它在所有其他过滤器完成并将代理响应写回网关客户机响应后运行。(还有一个实验性的`WebClientWriteResponseFilter`,它执行相同的功能,但不需要 netty。 -### [](#the-routetorequesturl-filter)[7.6. The `RouteToRequestUrl` Filter](#the-routetorequesturl-filter) ### +### [](#the-routetorequesturl-filter)[7.6。`RouteToRequestUrl`过滤器] 如果在`ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR`exchange 属性中有一个`Route`对象,则运行`RouteToRequestUrlFilter`。它根据请求 URI 创建一个新的 URI,但使用`Route`对象的 URI 属性进行更新。新的 URI 放在`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`exchange 属性中。 如果 URI 有一个方案前缀,例如`lb:ws://serviceid`,则将从 URI 中剥离`lb`方案,并将其放置在`ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR`中,以便稍后在筛选链中使用。 -### [](#the-websocket-routing-filter)[7.7. The Websocket Routing Filter](#the-websocket-routing-filter) ### +### [](#the-websocket-routing-filter)[7.7. The Websocket Routing Filter](#the-websocket-routing-filter) 如果位于`ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR`Exchange 属性中的 URL 具有`ws`或`wss`方案,则运行 WebSocket 路由过滤器。它使用 Spring WebSocket 基础设施向下游转发 WebSocket 请求。 @@ -4588,9 +1651,9 @@ spring: - Path=/websocket/** ``` -### [](#the-gateway-metrics-filter)[7.8.网关指标过滤器](#the-gateway-metrics-filter) ### +### [](#the-gateway-metrics-filter)[7.8.网关指标过滤器](#the-gateway-metrics-filter) -要启用网关度量,可以添加 Spring-boot-starter-actuator 作为项目依赖项。然后,默认情况下,只要属性`spring.cloud.gateway.metrics.enabled`未设置为`false`,网关指标过滤器就会运行。该过滤器添加了一个名为`spring.cloud.gateway.requests`的计时器度量,并带有以下标记: +要启用网关度量,可以添加 Spring-boot-starter-actuator 作为项目依赖项。然后,默认情况下,只要属性`spring.cloud.gateway.metrics.enabled`未设置为`false`,网关指标过滤器就会运行。此过滤器添加了一个名为`spring.cloud.gateway.requests`的计时器度量,并带有以下标记: * `routeId`:路径 ID。 @@ -4608,29 +1671,28 @@ spring: * `path`:请求的路径。 -然后可以从`/actuator/metrics/spring.cloud.gateway.requests`中获取这些指标,并且可以轻松地与 Prometheus 集成以创建[Grafana](images/gateway-grafana-dashboard.jpeg)[dashboard](gateway-grafana-dashboard.json)。 +然后可以从`/actuator/metrics/spring.cloud.gateway.requests`中获取这些指标,并且可以轻松地与 Prometheus 集成以创建[Grafana](https://docs.spring.io/spring-cloud-gateway/docs/3.1.1/reference/html/images/gateway-grafana-dashboard.jpeg)[dashboard](gateway-grafana-dashboard.json)。 | |要启用 Prometheus 端点,请添加`micrometer-registry-prometheus`作为项目依赖项。| |---|------------------------------------------------------------------------------------------------| -### [](#marking-an-exchange-as-routed)[7.9.将交易所标记为路由](#marking-an-exchange-as-routed) ### +### [](#marking-an-exchange-as-routed)[7.9.将交易所标记为路由](#marking-an-exchange-as-routed) -在网关路由了`ServerWebExchange`之后,它通过在 exchange 属性中添加`gatewayAlreadyRouted`将该 exchange 标记为“路由”。一旦一个请求被标记为路由,其他路由过滤器将不会再次路由该请求,基本上跳过该过滤器。有一些方便的方法,你可以使用它来标记一个交换为路由,或者检查一个交换是否已经被路由。 +在网关路由了`ServerWebExchange`之后,它通过在 exchange 属性中添加`gatewayAlreadyRouted`,将该 exchange 标记为“路由”。一旦一个请求被标记为路由,其他路由过滤器将不会再次路由该请求,基本上跳过了该过滤器。有一些方便的方法,你可以使用它来标记一个交换为路由,或者检查一个交换是否已经被路由。 * `ServerWebExchangeUtils.isAlreadyRouted`接受一个`ServerWebExchange`对象,并检查它是否已被“路由”。 * `ServerWebExchangeUtils.setAlreadyRouted`接受一个`ServerWebExchange`对象,并将其标记为“路由”。 -[](#httpheadersfilters)[8.HttpHeadersFilters](#httpheadersfilters) ----------- +## [](#httpheadersfilters)[8.HttpHeadersFilters](#httpheadersfilters) HttpHeadersFilters 在向下游发送请求之前应用于请求,例如在`NettyRoutingFilter`中。 -### [](#forwarded-headers-filter)[8.1.转发头过滤器](#forwarded-headers-filter) ### +### [](#forwarded-headers-filter)[8.1.转发头过滤器](#forwarded-headers-filter) `Forwarded`headers filter 创建一个`Forwarded`header 以发送到下游服务。它将当前请求的`Host`头、方案和端口添加到任何现有的`Forwarded`头。 -### [](#removehopbyhop-headers-filter)[8.2.RemoveHopbyHop Headers 过滤器](#removehopbyhop-headers-filter) ### +### [](#removehopbyhop-headers-filter)[8.2.RemoveHopbyHop Headers 过滤器](#removehopbyhop-headers-filter) `RemoveHopByHop`headers 过滤器从转发的请求中删除 header。被删除的头的默认列表来自[IETF](https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#section-7.1.3)。 @@ -4654,7 +1716,7 @@ HttpHeadersFilters 在向下游发送请求之前应用于请求,例如在`Net 要更改这一点,请将`spring.cloud.gateway.filter.remove-hop-by-hop.headers`属性设置为要删除的头名称列表。 -### [](#xforwarded-headers-filter)[8.3.XForwarded Headers 过滤器](#xforwarded-headers-filter) ### +### [](#xforwarded-headers-filter)[8.3.XForwarded Headers 过滤器](#xforwarded-headers-filter) `XForwarded`headers filter 创建了各种`X-Forwarded-*`headers 以发送到下游服务。它使用`Host`报头、方案、端口和当前请求的路径来创建各种报头。 @@ -4682,8 +1744,7 @@ HttpHeadersFilters 在向下游发送请求之前应用于请求,例如在`Net * `spring.cloud.gateway.x-forwarded.prefix-append` -[](#tls-and-ssl)[9. TLS and SSL](#tls-and-ssl) ----------- +## [](#tls-and-ssl)[9.TLS 和 SSL](#tls-and-ssl) 网关可以通过遵循通常的 Spring 服务器配置来监听 HTTPS 上的请求。下面的示例展示了如何做到这一点: @@ -4727,9 +1788,9 @@ spring: - cert2.pem ``` -如果 Spring 云网关没有提供受信任的证书,则使用默认的信任存储区(你可以通过设置`javax.net.ssl.trustStore`系统属性来覆盖该存储区)。 +如果 Spring Cloud网关没有提供受信任的证书,则使用默认的信任存储区(你可以通过设置`javax.net.ssl.trustStore`系统属性来覆盖该存储区)。 -### [](#tls-handshake)[9.1.TLS 握手](#tls-handshake) ### +### [](#tls-handshake)[9.1.TLS 握手](#tls-handshake) 网关维护一个用于路由到后端的客户机池。当通过 HTTPS 进行通信时,客户机发起 TLS 握手。与此握手相关的超时次数很多。你可以配置这些超时可以配置(默认显示)如下: @@ -4746,10 +1807,9 @@ spring: close-notify-read-timeout-millis: 0 ``` -[](#configuration)[10.配置](#configuration) ----------- +## [](#configuration)[10.配置](#configuration) -Spring 云网关的配置由`RouteDefinitionLocator`实例的集合驱动。下面的清单显示了`RouteDefinitionLocator`接口的定义: +Spring Cloud网关的配置由`RouteDefinitionLocator`实例的集合驱动。下面的清单显示了`RouteDefinitionLocator`接口的定义: 例 65。RouteDefinitionLocator.java @@ -4761,7 +1821,7 @@ public interface RouteDefinitionLocator { 默认情况下,`PropertiesRouteDefinitionLocator`通过使用 Spring boot 的`@ConfigurationProperties`机制加载属性。 -前面的配置示例都使用了一个快捷方式,它使用位置参数而不是命名参数。以下两个例子是等价的: +较早的配置示例都使用快捷方式表示,它使用位置参数而不是命名参数。以下两个例子是等价的: 示例 66.application.yml @@ -4784,12 +1844,11 @@ spring: 对于网关的某些用法,属性是足够的,但是一些生产用例受益于从外部源(例如数据库)加载配置。未来的里程碑版本将具有基于 Spring 数据存储库的`RouteDefinitionLocator`实现,例如 Redis、MongoDB 和 Cassandra。 -### [](#routedefinition-metrics)[10.1.路由定义度量](#routedefinition-metrics) ### +### [](#routedefinition-metrics)[10.1.路由定义度量](#routedefinition-metrics) -要启用`RouteDefinition`度量,请添加 Spring-boot-starter-actuator 作为项目依赖项。然后,默认情况下,只要将属性`spring.cloud.gateway.metrics.enabled`设置为`true`,度量就可用。将添加一个名为`spring.cloud.gateway.routes.count`的规范度量,其值是`RouteDefinitions`的数量。该指标将从`/actuator/metrics/spring.cloud.gateway.routes.count`开始提供。 +要启用`RouteDefinition`指标,请添加 Spring-boot-starter-actuator 作为项目依赖项。然后,默认情况下,只要将属性`spring.cloud.gateway.metrics.enabled`设置为`true`,这些指标就可用。将添加一个名为`spring.cloud.gateway.routes.count`的规范度量,其值是`RouteDefinitions`的数量。该指标将从`/actuator/metrics/spring.cloud.gateway.routes.count`开始提供。 -[](#route-metadata-configuration)[11.路由元数据配置](#route-metadata-configuration) ----------- +## [](#route-metadata-configuration)[11.路由元数据配置](#route-metadata-configuration) 你可以通过使用元数据为每个路由配置附加参数,如下所示: @@ -4819,12 +1878,11 @@ route.getMetadata(); route.getMetadata(someKey); ``` -[](#http-timeouts-configuration)[12.HTTP 超时配置](#http-timeouts-configuration) ----------- +## [](#http-timeouts-configuration)[12.HTTP 超时配置](#http-timeouts-configuration) 可以为所有路由配置 HTTP 超时(响应和连接),并为每个特定的路由重写。 -### [](#global-timeouts)[12.1.全球超时](#global-timeouts) ### +### [](#global-timeouts)[12.1.全球超时](#global-timeouts) 要配置全局 HTTP 超时:`connect-timeout`必须以毫秒为单位指定。`response-timeout`必须指定为 java.time.duration @@ -4839,9 +1897,9 @@ spring: response-timeout: 5s ``` -### [](#per-route-timeouts)[12.2.每条路线超时](#per-route-timeouts) ### +### [](#per-route-timeouts)[12.2.每条路线超时](#per-route-timeouts) -要配置每个路由超时:`connect-timeout`必须以毫秒为单位指定。`response-timeout`必须以毫秒为单位指定。 +要配置每路由超时:`connect-timeout`必须以毫秒为单位指定。`response-timeout`必须以毫秒为单位指定。 通过配置进行每路由 HTTP 超时配置 @@ -4890,7 +1948,7 @@ import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPO response-timeout: -1 ``` -### [](#fluent-java-routes-api)[12.3.Fluent Java Routes API](#fluent-java-routes-api) ### +### [](#fluent-java-routes-api)[12.3.Fluent Java Routes API](#fluent-java-routes-api) 为了允许在 Java 中进行简单的配置,`RouteLocatorBuilder` Bean 包含了一个 Fluent API。下面的清单展示了它的工作原理: @@ -4927,13 +1985,13 @@ public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGate 这种样式还允许更多的自定义谓词断言。由`RouteDefinitionLocator`bean 定义的谓词使用逻辑`and`进行组合。通过使用 Fluent Java API,你可以在`Predicate`类上使用`and()`、`or()`和`negate()`运算符。 -### [](#the-discoveryclient-route-definition-locator)[12.4. The `DiscoveryClient` Route Definition Locator](#the-discoveryclient-route-definition-locator) ### +### [12.4。路由定义定位器](#the-discoveryclient-route-definition-locator) -你可以将网关配置为基于在`DiscoveryClient`兼容的服务注册中心注册的服务创建路由。 +你可以将网关配置为基于在`DiscoveryClient`兼容服务注册中心注册的服务创建路由。 -要启用此功能,请设置`spring.cloud.gateway.discovery.locator.enabled=true`,并确保在 Classpath 上启用了`DiscoveryClient`实现(例如 Netflix Eureka、Consul 或 ZooKeeper)。 +要启用此功能,请设置`spring.cloud.gateway.discovery.locator.enabled=true`,并确保在 Classpath 上启用了实现(例如 Netflix Eureka、Consul 或 ZooKeeper)。 -#### [](#configuring-predicates-and-filters-for-discoveryclient-routes)[12.4.1. Configuring Predicates and Filters For `DiscoveryClient` Routes](#configuring-predicates-and-filters-for-discoveryclient-routes) #### +#### [](#configuring-predicates-and-filters-for-discoveryclient-routes)[12.4.1。为`DiscoveryClient`路由配置谓词和筛选器](#configuring-predicates-and-filters-for-discoveryclient-route) 默认情况下,网关为使用`DiscoveryClient`创建的路由定义一个谓词和过滤器。 @@ -4957,12 +2015,11 @@ spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'" ``` -[](#reactor-netty-access-logs)[13.反应堆网络访问日志](#reactor-netty-access-logs) ----------- +## [](#reactor-netty-access-logs)[13.反应堆网络访问日志](#reactor-netty-access-logs) 要启用反应堆网络访问日志,请设置`-Dreactor.netty.http.server.accessLogEnabled=true`。 -| |它必须是一个 Java 系统属性,而不是 Spring 引导属性。| +| |它必须是一个 Java 系统属性,而不是一个 Spring 引导属性。| |---|--------------------------------------------------------------| 你可以将日志系统配置为具有一个单独的访问日志文件。下面的示例创建了一个注销配置: @@ -4985,10 +2042,9 @@ spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remain ``` -[](#cors-configuration)[14.CORS 配置](#cors-configuration) ----------- +## [](#cors-configuration)[14.CORS 配置](#cors-configuration) -你可以配置网关来控制 CORS 行为。“全局”CORS 配置是 URL 模式到[Spring Framework `CorsConfiguration`](https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html)的映射。以下示例配置 CORS: +你可以配置网关来控制 CORS 行为。“全局”CORS 配置是 URL 模式到[[ Spring Framework`CorsConfiguration`](https://DOCS. Spring.io/ Spring/DOCS/5.0.x/javadoc-api/org/springframework/web/cors/corsconfiguration.html)的映射。以下示例配置 CORS: 示例 71.application.yml @@ -5006,12 +2062,11 @@ spring: 在前面的示例中,对于所有 GET 请求的路径,允许从源自`docs.spring.io`的请求发出 CORS 请求。 -要为某些网关路由谓词不处理的请求提供相同的 CORS 配置,请将`spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping`属性设置为`true`。当你尝试支持 CORS 的 Preflight 请求,而你的路由谓词不求值到`true`时,这是有用的,因为 HTTP 方法是`options`。 +要为某些网关路由谓词不处理的请求提供相同的 CORS 配置,请将`spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping`属性设置为`spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping`。当你试图支持 CORS 的 Preflight 请求,而你的路由谓词不求值到`true`时,这是有用的,因为 HTTP 方法是`options`。 -[](#actuator-api)[15.执行机构 API](#actuator-api) ----------- +## [](#actuator-api)[15.执行机构 API](#actuator-api) -执行器端点`/gateway`允许你监视 Spring 云网关应用程序并与之交互。要实现远程访问,端点必须是应用程序属性中的[enabled](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints-enabling-endpoints)和[通过 HTTP 或 JMX 公开](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints-exposing-endpoints)。下面的清单展示了如何做到这一点: +执行器端点允许你监视 Spring Cloud网关应用程序并与之交互。要实现远程访问,端点必须是应用程序属性中的[enabled](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints-enabling-endpoints)和[通过 HTTP 或 JMX 公开](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints-exposing-endpoints)。下面的清单展示了如何做到这一点: 示例 72.application.properties @@ -5020,9 +2075,9 @@ management.endpoint.gateway.enabled=true # default value management.endpoints.web.exposure.include=gateway ``` -### [](#verbose-actuator-format)[15.1.详细执行器格式](#verbose-actuator-format) ### +### [](#verbose-actuator-format)[15.1.详细执行器格式](#verbose-actuator-format) -一种新的、更详细的格式已添加到 Spring Cloud Gateway 中。它为每条路由添加了更多细节,允许你查看与每条路由相关的谓词和筛选器,以及可用的任何配置。以下示例配置`/actuator/gateway/routes`: +Spring Cloud网关中添加了一种新的、更详细的格式。它为每条路由添加了更多细节,允许你查看与每条路由相关的谓词和筛选器,以及可用的任何配置。以下示例配置`/actuator/gateway/routes`: ``` [ @@ -5050,17 +2105,17 @@ spring.cloud.gateway.actuator.verbose.enabled=false 在将来的版本中,这将默认为`true`。 -### [](#retrieving-route-filters)[15.2.检索路由过滤器](#retrieving-route-filters) ### +### [](#retrieving-route-filters)[15.2.检索路由过滤器](#retrieving-route-filters) 本节详细介绍了如何检索路由过滤器,包括: -* [Global Filters](#gateway-global-filters) +* [全局过滤器](#gateway-global-filters) * [[gateway-route-filters]](#gateway-route-filters) -#### [](#gateway-global-filters)[15.2.1.全局过滤器](#gateway-global-filters) #### +#### [](#gateway-global-filters)[15.2.1.全局过滤器](#gateway-global-filters) -要检索应用于所有路由的[global filters](#global-filters),请对`GET`请求`/actuator/gateway/globalfilters`。由此产生的反应类似于以下情况: +要检索应用于所有路由的`GET`,请对`/actuator/gateway/globalfilters`发出`GET`请求。由此产生的反应类似于以下情况: ``` { @@ -5075,11 +2130,11 @@ spring.cloud.gateway.actuator.verbose.enabled=false } ``` -响应包含已到位的全局过滤器的详细信息。对于每个全局过滤器,有一个字符串表示过滤器对象(例如,`org.spring[[email protected]](/cdn-cgi/l/email-protection)77856cc5`)和相应的`get()`在过滤器链中。} +响应包含已到位的全局过滤器的详细信息。对于每个全局过滤器,有一个字符串表示过滤器对象(例如,`org.spring[[email protected]](/cdn-cgi/l/email-protection)77856cc5`)和相应的[order](#gateway-combined-global-filter-and-gatewayfilter-ordering)在过滤器链中。} -#### [](#gateway-route-filters)[15.2.2.路由过滤器](#gateway-route-filters) #### +#### [](#gateway-route-filters)[15.2.2.路由过滤器](#gateway-route-filters) -要检索应用于路由的[“GatewayFilter”工厂](#gatewayfilter-factories),请对`GET`请求`/actuator/gateway/routefilters`。由此产生的反应类似于以下情况: +要检索应用于路由的[`GatewayFilter`工厂](#gatewayfilter-factories),对`GET`请求`/actuator/gateway/routefilters`。由此产生的反应类似于以下情况: ``` { @@ -5089,13 +2144,13 @@ spring.cloud.gateway.actuator.verbose.enabled=false } ``` -响应包含应用于任何特定路径的`GatewayFilter`工厂的详细信息。对于每个工厂,都有一个对应对象的字符串表示(例如,`[[[email protected]](/cdn-cgi/l/email-protection) configClass = Object]`)。请注意,`null`值是由于端点控制器的实现不完整造成的,因为它试图设置过滤器链中对象的顺序,这不适用于`GatewayFilter`工厂对象。 +响应包含应用于任何特定路径的`GatewayFilter`工厂的详细信息。对于每个工厂,都有一个对应对象的字符串表示(例如,`GatewayFilter`)。请注意,`null`值是由于端点控制器的实现不完整造成的,因为它试图设置过滤器链中对象的顺序,这不适用于`GatewayFilter`工厂对象。 -### [](#refreshing-the-route-cache)[15.3.刷新路径缓存](#refreshing-the-route-cache) ### +### [](#refreshing-the-route-cache)[15.3.刷新路径缓存](#refreshing-the-route-cache) 要清除路由缓存,请对`POST`请求`/actuator/gateway/refresh`。该请求返回一个没有响应体的 200。 -### [](#retrieving-the-routes-defined-in-the-gateway)[15.4.检索在网关中定义的路由](#retrieving-the-routes-defined-in-the-gateway) ### +### [](#retrieving-the-routes-defined-in-the-gateway)[15.4.检索在网关中定义的路由](#retrieving-the-routes-defined-in-the-gateway) 要检索在网关中定义的路由,请对`GET`请求`/actuator/gateway/routes`。由此产生的反应类似于以下情况: @@ -5126,10 +2181,10 @@ spring.cloud.gateway.actuator.verbose.enabled=false |------------------------|------|-------------------------------------------------------------------------------| | `route_id` |String|路线 ID。| |`route_object.predicate`|Object|路线谓词。| -| `route_object.filters` |Array |将[“GatewayFilter”工厂](#gatewayfilter-factories)应用于该路线。| +| `route_object.filters` |Array |[`GatewayFilter`工厂](#gatewayfilter-factories)应用于该路由。| | `order` |Number|路线顺序。| -### [](#gateway-retrieving-information-about-a-particular-route)[15.5.检索有关特定路线的信息](#gateway-retrieving-information-about-a-particular-route) ### +### [](#gateway-retrieving-information-about-a-particular-route)[15.5.检索有关特定路线的信息](#gateway-retrieving-information-about-a-particular-route) 要检索有关单个路由的信息,请对`GET`请求`/actuator/gateway/routes/{id}`(例如,`/actuator/gateway/routes/first_route`)。由此产生的反应类似于以下情况: @@ -5156,15 +2211,15 @@ spring.cloud.gateway.actuator.verbose.enabled=false | `uri` |String|路线的目的地 URI。| | `order` |Number|路线顺序。| -### [](#creating-and-deleting-a-particular-route)[15.6.创建和删除特定的路由](#creating-and-deleting-a-particular-route) ### +### [](#creating-and-deleting-a-particular-route)[15.6.创建和删除特定的路由](#creating-and-deleting-a-particular-route) -要创建路由,请使用指定路由字段的 JSON 主体对`POST`请求`/gateway/routes/{id_route_to_create}`(参见)。 +要创建一个路由,使用指定路由字段的 JSON 主体对`POST`请求`/gateway/routes/{id_route_to_create}`(参见[检索有关特定路线的信息](#gateway-retrieving-information-about-a-particular-route))。 要删除一个路由,请对`DELETE`请求`/gateway/routes/{id_route_to_delete}`。 -### [](#recap-the-list-of-all-endpoints)[15.7.回顾:所有端点的列表](#recap-the-list-of-all-endpoints) ### +### [](#recap-the-list-of-all-endpoints)[15.7.回顾:所有端点的列表](#recap-the-list-of-all-endpoints) -下面的 FolloiWNG 表总结了 Spring 云网关执行器端点(请注意,每个端点都以`/actuator/gateway`作为基本路径): +下面的 FolloiWNG 表总结了 Spring Cloud网关执行器端点(请注意,每个端点都以`/actuator/gateway`作为基本路径): | ID |HTTP Method|说明| |---------------|-----------|-----------------------------------------------------------------------------| @@ -5176,18 +2231,17 @@ spring.cloud.gateway.actuator.verbose.enabled=false | `routes/{id}` | POST |为网关添加了一条新的路径。| | `routes/{id}` | DELETE |从网关删除现有的路由。| -### [](#sharing-routes-between-multiple-gateway-instances)[15.8.在多个网关实例之间共享路由](#sharing-routes-between-multiple-gateway-instances) ### +### [](#sharing-routes-between-multiple-gateway-instances)[15.8.在多个网关实例之间共享路由](#sharing-routes-between-multiple-gateway-instances) -Spring 云网关提供了两种`RouteDefinitionRepository`实现方式。第一个是“InmemoryRouteDefinitionRepository”,它只存在于一个网关实例的内存中。这种类型的存储库不适合跨多个网关实例填充路由。 +Spring Cloud网关提供了两种`RouteDefinitionRepository`实现方式。第一个是`InMemoryRouteDefinitionRepository`,它只存在于一个网关实例的内存中。这种类型的存储库不适合跨多个网关实例填充路由。 -为了跨 Spring 个云网关实例的集群共享路由,可以使用`RedisRouteDefinitionRepository`。要启用这种存储库,以下属性必须设置为 true:`spring.cloud.gateway.redis-route-definition-repository.enabled`同样,对于 RedisrateLimiter 过滤器工厂,它需要使用 Spring-boot-starter-data-redis-active Spring boot starter。 +为了跨 Spring Cloud网关实例的集群共享路由,可以使用`RedisRouteDefinitionRepository`。要启用这种存储库,以下属性必须设置为 true:`spring.cloud.gateway.redis-route-definition-repository.enabled`同样,对于 RedisrateLimiter 过滤器工厂,它需要使用 Spring-boot-starter-data-redis-active Spring boot starter。 -[](#troubleshooting)[16.故障排除](#troubleshooting) ----------- +## [](#troubleshooting)[16.故障排除](#troubleshooting) -本节介绍了使用 Spring 云网关时可能出现的常见问题。 +本节介绍了在使用 Spring Cloud网关时可能出现的常见问题。 -### [](#log-levels)[16.1.日志级别](#log-levels) ### +### [](#log-levels)[16.1.日志级别](#log-levels) 以下记录器可能在`DEBUG`和`TRACE`级别包含有价值的故障排除信息: @@ -5203,16 +2257,15 @@ Spring 云网关提供了两种`RouteDefinitionRepository`实现方式。第一 * `redisratelimiter` -### [](#wiretap)[16.2. Wiretap](#wiretap) ### +### [](#wiretap)[16.2.窃听](#wiretap) -反应堆网络`HttpClient`和`HttpServer`可以启用窃听功能。当与将`reactor.netty`日志级别设置为`DEBUG`或`HttpServer`相结合时,它启用了对信息的日志记录,例如通过连接发送和接收的标题和主体。要启用窃听,请分别为`HttpServer`和设置`spring.cloud.gateway.httpclient.wiretap=true`。 +反应堆网络`HttpClient`和`HttpServer`可以启用窃听功能。当与将`reactor.netty`日志级别设置为`DEBUG`或`TRACE`相结合时,它可以记录信息,例如通过连接发送和接收的标题和主体。要启用窃听,分别为`HttpServer`和`HttpClient`设置`spring.cloud.gateway.httpclient.wiretap=true`。 -[](#developer-guide)[17.开发者指南](#developer-guide) ----------- +## [](#developer-guide)[17.开发者指南](#developer-guide) 这些是编写网关的一些自定义组件的基本指南。 -### [](#writing-custom-route-predicate-factories)[17.1.编写自定义路由谓词工厂](#writing-custom-route-predicate-factories) ### +### [](#writing-custom-route-predicate-factories)[17.1.编写自定义路由谓词工厂](#writing-custom-route-predicate-factories) 为了编写路由谓词,你需要将`RoutePredicateFactory`实现为 Bean。有一个名为`AbstractRoutePredicateFactory`的抽象类,你可以对其进行扩展。 @@ -5245,7 +2298,7 @@ public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory约定,该语法可能会在未来的版本中删除。请更新过滤器
名称以使其兼容。| +| |可以创建一个没有`GatewayFilterFactory`后缀的网关过滤器,例如`class AnotherThing`。在配置文件中,这个过滤器可以被
引用为`AnotherThing`。这是**不是**所支持的命名
约定,该语法可能会在将来的版本中删除。请更新过滤器[](#building-a-simple-gateway-by-using-spring-mvc-or-webflux)名称以使其兼容。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#writing-custom-global-filters)[17.3.编写自定义全局过滤器](#writing-custom-global-filters) ### +### [](#writing-custom-global-filters)[17.3.编写自定义全局过滤器](#writing-custom-global-filters) -要编写自定义的全局过滤器,你必须将[](#writing-custom-global-filters)接口实现为 Bean。这将过滤器应用于所有请求。 +要编写自定义的全局过滤器,你必须将`class AnotherThing`接口实现为 Bean。这将过滤器应用于所有请求。 以下示例分别展示了如何设置全局 pre 和 post 过滤器: @@ -5349,13 +2402,12 @@ public GlobalFilter customGlobalPostFilter() { } ``` -[](#building-a-simple-gateway-by-using-spring-mvc-or-webflux)[18. Building a Simple Gateway by Using Spring MVC or Webflux](#building-a-simple-gateway-by-using-spring-mvc-or-webflux) ----------- +## [](#building-a-simple-gateway-by-using-spring-mvc-or-webflux)[18. Building a Simple Gateway by Using Spring MVC or Webflux](#building-a-simple-gateway-by-using-spring-mvc-or-webflux) | |下面描述了一种替代样式的网关。以前的文件都不适用于下面的内容。| |---|--------------------------------------------------------------------------------------------------------------| -Spring 云网关提供了一种名为`ProxyExchange`的实用工具对象。你可以在常规的 Spring Web 处理程序中使用它作为方法参数。它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。对于 MVC,它还支持通过`forward()`方法转发到本地处理程序。要使用`ProxyExchange`,在 Classpath 中包含正确的模块(`spring-cloud-gateway-mvc`或`spring-cloud-gateway-webflux`)。 +Spring Cloud网关提供了一种名为`ProxyExchange`的实用对象。你可以在常规的 Spring Web 处理程序中使用它作为方法参数。它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。对于 MVC,它还支持通过`forward()`方法转发到本地处理程序。要使用`ProxyExchange`,在 Classpath 中包含正确的模块(`spring-cloud-gateway-mvc`或`spring-cloud-gateway-webflux`)。 下面的 MVC 示例将请求代理到`/test`下游的远程服务器: @@ -5403,17 +2455,16 @@ public ResponseEntity proxyPath(ProxyExchange proxy) throws Exception } ``` -Spring MVC 和 WebFlux 的所有特性都可用于网关处理程序方法。因此,例如,你可以插入请求头和查询参数,并且可以通过映射注释中的声明来约束传入的请求。有关这些特性的更多详细信息,请参见 Spring MVC 中`@RequestMapping`的文档。 +Spring MVC 和 WebFlux 的所有特性都可用于网关处理程序方法。因此,例如,你可以插入请求头和查询参数,并且可以通过映射注释中的声明来约束传入的请求。有关这些特性的更多详细信息,请参见 Spring MVC 中`ProxyExchange`的文档。 -你可以使用`ProxyExchange`上的`header()`方法向下游响应添加标题。 +可以使用`ProxyExchange`上的`header()`方法向下游响应添加标题。 -你还可以通过向`get()`方法(和其他方法)添加一个映射器来操作响应头(以及响应中喜欢的任何其他方法)。映射器是一个`ResponseEntity`,它接收传入的`ResponseEntity`并将其转换为传出的。 +你还可以通过向`get()`方法(和其他方法)添加一个映射器来操作响应头(以及响应中喜欢的任何其他方法)。映射器是一个`Function`,它接收传入的`ResponseEntity`并将其转换为传出的。 -为“敏感”头(默认情况下,`cookie`和`authorization`)和“代理”头(x-forwarded-*`)提供了一流的支持。 +为“敏感”头(默认情况下,`cookie`和`authorization`)和“代理”头(`x-forwarded-*`)提供了一流的支持。 -[](#configuration-properties)[19.配置属性](#configuration-properties) ----------- +## [](#configuration-properties)[19.配置属性](#configuration-properties) -要查看所有 Spring 云网关相关配置属性的列表,请参见[the appendix](appendix.html)。 +要查看所有 Spring Cloud网关相关配置属性的列表,请参见[附录](appendix.html)。 -如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’’’’),’documents’,’’’.’’’’’’’’’’,’’’ \ No newline at end of file +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-kubernetes.md b/docs/spring-cloud/spring-cloud-kubernetes.md index c31943e0e54a0329b0766c44adbb93aba968ecc5..180c78e746fdc32617031d131d1ca9dd3778c68c 100644 --- a/docs/spring-cloud/spring-cloud-kubernetes.md +++ b/docs/spring-cloud/spring-cloud-kubernetes.md @@ -1,29 +1,24 @@ -Spring 云 Kubernetes -========== - +# Spring Cloud Kubernetes 本参考指南介绍了如何使用 Spring Cloud Kubernetes。 -[](#why-do-you-need-spring-cloud-kubernetes)[1. Why do you need Spring Cloud Kubernetes?](#why-do-you-need-spring-cloud-kubernetes) ----------- +## [](#why-do-you-need-spring-cloud-kubernetes)[1. Why do you need Spring Cloud Kubernetes?](#why-do-you-need-spring-cloud-kubernetes) -Spring Cloud Kubernetes 提供了众所周知的 Spring 云接口的实现,允许开发人员在 Kubernetes 上构建和运行 Spring 云应用程序。虽然这个项目在构建云原生应用程序时可能对你很有用,但在 Kubernetes 上部署 Spring 启动应用程序也不是必需的。如果你刚刚开始在 Kubernetes 上运行你的启动应用程序,你只需要一个基本的启动应用程序和 Kubernetes 本身就可以完成很多事情。要了解更多信息,你可以从阅读[Spring Boot reference documentation for deploying to Kubernetes ](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#cloud-deployment-kubernetes)开始,还可以阅读研讨会材料[Spring 和 Kubernetes](https://hackmd.io/@ryanjbaxter/spring-on-k8s-workshop)。 +Spring Cloud Kubernetes 提供了众所周知的 Spring Cloud接口的实现,允许开发人员在 Kubernetes 上构建和运行 Spring Cloud应用程序。虽然这个项目在构建云原生应用程序时可能对你很有用,但在 Kubernetes 上部署 Spring 启动应用程序也不是必需的。如果你刚刚开始在 Kubernetes 上运行你的启动应用程序,你只需要一个基本的启动应用程序和 Kubernetes 本身就可以完成很多事情。要了解更多信息,你可以从阅读[Spring Boot reference documentation for deploying to Kubernetes ](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#cloud-deployment-kubernetes)开始,还可以阅读研讨会材料[Spring and Kubernetes](https://hackmd.io/@ryanjbaxter/spring-on-k8s-workshop)。 -[](#starters)[2. Starters](#starters) ----------- +## [](#starters)[2.初学者](#starters) -启动器是可以包含在应用程序中的方便的依赖关系描述符。包括一个启动器,以获得依赖关系和 Spring 引导自动配置的功能集.以`spring-cloud-starter-kubernetes-fabric8`开头的启动器使用[Fabric8Kubernetes Java 客户端](https://github.com/fabric8io/kubernetes-client)提供实现。以“ Spring-cloud-starter-kubernetes-client”开头的启动器使用[Kubernetes Java 客户端](https://github.com/kubernetes-client/java)提供实现。 +启动器是可以包含在应用程序中的方便的依赖关系描述符。包括一个启动器,以获得依赖关系和 Spring 一个功能集的启动自动配置。以`spring-cloud-starter-kubernetes-fabric8`开头的启动器使用[Fabric8Kubernetes Java 客户端](https://github.com/fabric8io/kubernetes-client)提供实现。以`spring-cloud-starter-kubernetes-client`开头的启动器使用[Kubernetes Java 客户端](https://github.com/kubernetes-client/java)提供实现。 |起动器| Features | |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -|fabric8dependency

``
org.springframework.cloud
Spring-cloud-starter-kubernetes-gt8<>
<><89"/><90"/"><<<<<resolves service names to Kubernetes Services. | -|fabric8dependency

``
org.springframework.cloud<111"/>
Spring-cloud-starter-kubernetes-gt-fabric8-config<114"/>
<><><115r="117"/><<<"><“>”>“client=”client=“><<119"><<<<<|Load application properties from Kubernetes[ConfigMaps](#configmap-propertysource) and [Secrets](#secrets-propertysource).[Reload](#propertysource-reload) application properties when a ConfigMap or
Secret changes.| -|fabric8dependency


org.springframework.cloud
<<145"/><”><<<“>”><<<<“><<<<<| All Spring Cloud Kubernetes features. | +|Fabric8dependency

```

org.springframework.cloud
spring-cloud-starter-kubernetes-fabric8

```

Kubernetes client dependency

```

org.springframework.cloud
spring-cloud-starter-kubernetes-client

```| [Discovery Client](#discoveryclient-for-kubernetes) implementation that
resolves service names to Kubernetes Services. | +|Fabric8dependency

```

org.springframework.cloud
Spring-cloud-starter-kubernetes-fabric8-config

```

Kubernetes client dependency

```

org.springframework.cloud
spring-cloud-starter-kubernetes-client-config

```|Load application properties from Kubernetes[ConfigMaps](#configmap-propertysource) and [Secrets](#secrets-propertysource).[Reload](#propertysource-reload) application properties when a ConfigMap or
Secret changes.| +|Fabric8dependency

```

org.springframework.cloud
spring-cloud-starter-kubernetes-fabric8-all

```

Kubernetes client dependency

```

org.springframework.cloud
spring-cloud-starter-kubernetes-client-all

```| All Spring Cloud Kubernetes features. | -[](#discoveryclient-for-kubernetes)[3.Kubernetes 的发现](#discoveryclient-for-kubernetes) ----------- +## [](#discoveryclient-for-kubernetes)[3.Kubernetes 的发现](#discoveryclient-for-kubernetes) -此项目为[Kubernetes](https://kubernetes.io)提供了[发现客户端](https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java)的实现。这个客户机允许你按名称查询 Kubernetes 端点(参见[services](https://kubernetes.io/docs/user-guide/services/))。Kubernetes API 服务器通常将服务公开为表示`http`和`https`地址的端点集合,客户端可以从以 POD 形式运行的 Spring 启动应用程序访问这些端点。 +该项目为[Kubernetes](https://kubernetes.io)提供了[发现客户端](https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java)的实现。这个客户机允许你按名称查询 Kubernetes 端点(参见[services](https://kubernetes.io/docs/user-guide/services/))。Kubernetes API 服务器通常将服务公开为表示`http`和`https`地址的端点集合,客户端可以从 Spring 以 POD 形式运行的启动应用程序访问这些端点。 这是通过在项目中添加以下依赖项而免费获得的: @@ -36,7 +31,7 @@ Spring Cloud Kubernetes 提供了众所周知的 Spring 云接口的实现,允
``` -| |`spring-cloud-starter-kubernetes-discoveryclient`被设计为与[Spring Cloud Kubernetes DiscoveryServer](#spring-cloud-kubernetes-discoveryserver)一起使用。| +| |`spring-cloud-starter-kubernetes-discoveryclient`是设计用于[Spring Cloud Kubernetes DiscoveryServer](#spring-cloud-kubernetes-discoveryserver)的。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| Fabric8Kubernetes 客户端 @@ -76,7 +71,7 @@ public class Application { private DiscoveryClient discoveryClient; ``` -通过在`application.properties`中设置以下属性,可以从所有名称空间中选择启用`DiscoveryClient`: +通过在`application.properties`中设置以下属性,你可以从所有名称空间中选择启用`DiscoveryClient`: ``` spring.cloud.kubernetes.discovery.all-namespaces=true @@ -93,7 +88,7 @@ spring.cloud.kubernetes.discovery.include-not-ready-addresses=true 如果你的服务公开了多个端口,那么你将需要指定`DiscoveryClient`应该使用哪个端口。`DiscoveryClient`将使用以下逻辑选择端口。 -1. 如果服务有一个标签`primary-port-name`,那么它将使用在标签的值中指定名称的端口。 +1. 如果服务有一个标签`primary-port-name`,它将使用在标签的值中指定名称的端口。 2. 如果不存在标签,则将使用`spring.cloud.kubernetes.discovery.primary-port-name`中指定的端口号。 @@ -119,14 +114,13 @@ Spring 一些云组件使用`DiscoveryClient`以便获得有关本地服务实 | |`spring.application.name`对于在 Kubernetes 中为应用程序注册的名称没有任何效力| |---|-----------------------------------------------------------------------------------------------------------| -Spring Cloud Kubernetes 还可以监视 Kubernetes 服务目录中的更改,并相应地更新 `DiscoveryClient’实现。为了启用此功能,你需要在应用程序中的配置类中添加“@enablescheduling”。 +Spring Cloud Kubernetes 还可以观察 Kubernetes 服务目录的变化并相应地更新`DiscoveryClient`实现。为了启用此功能,你需要在应用程序中的配置类上添加`@EnableScheduling`。 -[](#kubernetes-native-service-discovery)[4.Kubernetes 原生服务发现](#kubernetes-native-service-discovery) ----------- +## [](#kubernetes-native-service-discovery)[4.Kubernetes 原生服务发现](#kubernetes-native-service-discovery) Kubernetes 本身能够(服务器端)发现服务(参见:[Kubernetes.io/DOCS/概念/服务-网络/服务/# 发现-服务](https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services))。使用本机 Kubernetes 服务发现可以确保与其他工具的兼容性,例如 Istio([istio.io](https://istio.io)),这是一种能够实现负载平衡、断路器、故障转移等功能的服务网格。 -然后,调用方服务只需要引用在特定的 Kubernetes 集群中可解析的名称。一个简单的实现可以使用一个 Spring `RestTemplate`,它引用一个完全限定的域名,例如`[{service-name}.{namespace}.svc.{cluster}.local:{service-port}](https://{service-name}.{namespace}.svc.{cluster}.local:{service-port})`。 +调用方服务只需要引用特定 Kubernetes 集群中可解析的名称。一个简单的实现可以使用一个 Spring `RestTemplate`,它引用一个完全限定的域名,例如`[{service-name}.{namespace}.svc.{cluster}.local:{service-port}](https://{service-name}.{namespace}.svc.{cluster}.local:{service-port})`。 此外,你可以将 Hystrix 用于: @@ -134,16 +128,15 @@ Kubernetes 本身能够(服务器端)发现服务(参见:[Kubernetes.io/ * 回退功能,通过使用`@HystrixCommand(fallbackMethod=`注释相应的方法 -[](#kubernetes-propertysource-implementations)[5.Kubernetes PropertySource 实现](#kubernetes-propertysource-implementations) ----------- +## [](#kubernetes-propertysource-implementations)[5.Kubernetes PropertySource 实现](#kubernetes-propertysource-implementations) 配置 Spring 启动应用程序的最常见方法是创建`application.properties`或`application.yaml`或`application-profile.properties`或`application-profile.yaml`文件,该文件包含为应用程序或 Spring 启动程序提供定制值的键值对。你可以通过指定系统属性或环境变量来覆盖这些属性。 -### [](#configmap-propertysource)[5.1. Using a `ConfigMap` `PropertySource`](#configmap-propertysource) ### +### [](#configmap-propertysource)[5.1。使用`ConfigMap``PropertySource`](#configmap-propertysource) -Kubernetes 提供了一个名为[`ConfigMap`](https://kubernetes.io/docs/user-guide/configmap/)的资源,以外部化以键值对的形式传递给应用程序的参数,或嵌入`application.properties`或`application.yaml`文件。[Spring Cloud Kubernetes Config](https://github.com/spring-cloud/spring-cloud-kubernetes/tree/master/spring-cloud-kubernetes-fabric8-config)项目使 Kubernetes`ConfigMap`实例在应用程序引导过程中可用,并在观察到的`ConfigMap`实例上检测到更改时触发 bean 或 Spring 上下文的热重载。 +Kubernetes 提供了一个名为[`ConfigMap`]的资源(https://kubernetes.io/DOCS/user-guide/configmap/),以外部化以键值对的形式传递给应用程序的参数,或嵌入`application.properties`或`application.yaml`文件。[Spring Cloud Kubernetes Config](https://github.com/spring-cloud/spring-cloud-kubernetes/tree/master/spring-cloud-kubernetes-fabric8-config)项目使 Kubernetes`ConfigMap`实例在应用程序引导过程中可用,并在观察到的`ConfigMap`实例上检测到更改时触发 bean 或 Spring 上下文的热重载。 -默认的行为是基于一个 Kubernetes`Fabric8ConfigMapPropertySource`创建一个`Fabric8ConfigMapPropertySource`,它具有一个`metadata.name`值,该值要么是你的 Spring 应用程序的名称(由其`spring.application.name`属性定义),要么是在“bootstrap.properties”文件中定义的自定义名称,位于以下键:`spring.cloud.kubernetes.config.name`下。 +默认的行为是基于 Kubernetes 创建`Fabric8ConfigMapPropertySource`它具有一个`metadata.name`值,该值既是你的 Spring 应用程序的名称(由其`spring.application.name`属性定义),也是在`bootstrap.properties`文件中定义的自定义名称,该文件位于以下键下:`spring.cloud.kubernetes.config.name`。 然而,在可以使用多个`ConfigMap`实例的情况下,可以进行更高级的配置。`spring.cloud.kubernetes.config.sources`列表使这成为可能。例如,你可以定义以下`ConfigMap`实例: @@ -166,17 +159,17 @@ spring: name: c3 ``` -在前面的示例中,如果没有设置`spring.cloud.kubernetes.config.namespace`,则将在应用程序运行的名称空间中查找名为`ConfigMap`的`ConfigMap`。请参阅[名称空间解析](#namespace-resolution),以更好地了解如何解析应用程序的名称空间。 +在前面的示例中,如果没有设置`spring.cloud.kubernetes.config.namespace`,则将在应用程序运行的名称空间中查找名为`ConfigMap`的`c1`。请参阅[名称空间解析](#namespace-resolution),以更好地了解如何解析应用程序的名称空间。 找到的任何匹配的`ConfigMap`将按以下方式进行处理: * 应用单独的配置属性。 -* 将任何名为`application.yaml`的属性的内容应用为`yaml`。 +* 将名为`yaml`的任何属性的内容应用为`application.yaml`。 * 将任何名为`application.properties`的属性的内容作为属性文件应用。 -上述流的一个例外是,当`ConfigMap`包含一个**单身**键时,该键指示该文件是 YAML 或 Properties 文件。在这种情况下,键的名称不必是`application.yaml`或 `application.properties’(它可以是任何东西),并且正确地处理了该属性的值。这个特性促进了`ConfigMap`是通过使用如下内容创建的用例: +上述流的一个例外是,当`ConfigMap`包含一个**单身**键时,该键指示该文件是 YAML 或 Properties 文件。在这种情况下,键的名称不必是`application.yaml`或`application.properties`(它可以是任何东西),并且该属性的值被正确地处理。这个特性促进了`ConfigMap`是通过使用如下内容创建的用例: ``` kubectl create configmap game-config --from-file=/path/to/app-config.yaml @@ -230,7 +223,7 @@ data: max:16 ``` -你还可以根据读取`ConfigMap`时合并在一起的活动配置文件来不同地配置 Spring 引导应用程序。可以通过使用“application.properties”或`application.yaml`属性为不同的配置文件提供不同的属性值,指定配置文件特定的值,每个值都在各自的文档中(由`---`序列指示),如下所示: +你还可以根据读取`ConfigMap`时合并在一起的活动配置文件来不同地配置 Spring 引导应用程序。你可以通过使用`application.properties`或`application.yaml`属性为不同的配置文件提供不同的属性值,并在各自的文档中指定配置文件特定的值(由`---`序列指示),如下所示: ``` kind: ConfigMap @@ -502,17 +495,17 @@ spring: | |如果使用`spring.cloud.kubernetes.config.paths`或`spring.cloud.kubernetes.secrets.path`,则自动重新加载
功能将无法工作。你需要向`/actuator/refresh`端点或
重新启动/重新部署应用程序发出`POST`请求。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -在某些情况下,你的应用程序可能无法使用 Kubernetes API 加载某些`ConfigMaps`。如果在这种情况下希望你的应用程序在启动过程中失败,可以设置 ` Spring.cloud.kubernetes.config.fail-fast=true`,以使应用程序启动过程中出现异常失败。 +在某些情况下,你的应用程序可能无法使用 Kubernetes API 加载某些`ConfigMaps`。如果在这种情况下希望你的应用程序在启动过程中失败,则可以设置`spring.cloud.kubernetes.config.fail-fast=true`,以使应用程序启动过程中出现异常。 -你还可以使你的应用程序在出现故障时重试加载`ConfigMap`属性源。首先,需要设置`spring.cloud.kubernetes.config.fail-fast=true`。然后你需要在 Classpath 中添加`spring-retry`和`spring-boot-starter-aop`。你可以通过设置“ Spring.cloud.kubernetes.config.retry.*”属性来配置重试属性,如最大尝试次数、退避选项(如初始间隔、乘数、最大间隔)。 +你还可以使你的应用程序在出现故障时重试加载`ConfigMap`属性源。首先,需要设置`spring.cloud.kubernetes.config.fail-fast=true`。然后,你需要在 Classpath 中添加`spring-retry`和`spring-boot-starter-aop`。你可以通过设置`spring.cloud.kubernetes.config.retry.*`属性来配置重试属性,如最大尝试次数、退避选项(如初始间隔、乘法器、最大间隔)。 -| |如果由于某种原因在 Classpath 上已经有`spring-retry`和`spring-boot-starter-aop`
并且希望启用 fail-fast,但是不希望被启用重试;你可以通过设置`spring.cloud.kubernetes.config.retry.enabled=false`来禁用的重试。| +| |如果由于某种原因在 Classpath 上已经有`spring-retry`和`spring-boot-starter-aop`
并且希望启用 fail-fast,但是不希望被启用重试;你可以通过设置`ConfigMap`来禁用`PropertySources`的重试。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Name | Type | Default |说明| |-------------------------------------------------------|---------|----------------------------|-----------------------------------------------------------------------------------------------------| | `spring.cloud.kubernetes.config.enabled` |`Boolean`| `true` |启用配置图`PropertySource`| -| `spring.cloud.kubernetes.config.name` |`String` |`${spring.application.name}`|设置`ConfigMap`的名称以查找| +| `spring.cloud.kubernetes.config.name` |`String` |`${spring.application.name}`|设置`ConfigMap`的名称以进行查找| | `spring.cloud.kubernetes.config.namespace` |`String` | Client namespace |设置要查找的 Kubernetes 名称空间| | `spring.cloud.kubernetes.config.paths` | `List` | `null` |设置安装`ConfigMap`实例的路径| | `spring.cloud.kubernetes.config.enableApi` |`Boolean`| `true` |通过 API 启用或禁用使用`ConfigMap`实例| @@ -523,11 +516,11 @@ spring: | `spring.cloud.kubernetes.config.retry.max-interval` | `Long` | `2000` |退场的最大间隔。| | `spring.cloud.kubernetes.config.retry.multiplier` |`Double` | `1.1` |下一个区间的乘数。| -### [](#secrets-propertysource)[5.2.秘密 PropertySource](#secrets-propertysource) ### +### [](#secrets-propertysource)[5.2.秘密 PropertySource](#secrets-propertysource) Kubernetes 有[Secrets](https://kubernetes.io/docs/concepts/configuration/secret/)的概念,用于存储诸如密码、OAuth 令牌等敏感数据。该项目提供了与`Secrets`的集成,以使 Spring 引导应用程序能够访问秘密。你可以通过设置`spring.cloud.kubernetes.secrets.enabled`属性显式地启用或禁用此功能。 -启用后,`Fabric8SecretsPropertySource`将从以下来源查找`Secrets`的 Kubernetes: +启用后,`Fabric8SecretsPropertySource`将从以下来源查找`Secrets`的 kubernetes: 1. 从秘密挂载中递归地读取 @@ -537,7 +530,7 @@ Kubernetes 有[Secrets](https://kubernetes.io/docs/concepts/configuration/secret **注:** -默认情况下,出于安全原因,通过 API(以上第 2 点和第 3 点)**未启用**消耗秘密。Secrets 上的权限“List”允许客户端检查指定名称空间中的 Secrets 值。此外,我们建议容器通过安装的卷共享秘密。 +默认情况下,出于安全原因,通过 API(以上第 2 点和第 3 点)**未启用**消耗秘密。Secrets 上的权限“列表”允许客户端检查指定名称空间中的 Secrets 值。此外,我们建议容器通过安装的卷共享秘密。 如果你允许通过 API 使用机密,我们建议你使用授权策略(例如 RBAC)来限制对机密的访问。有关通过 API 使用秘密时的风险和最佳实践的更多信息,请参阅[this doc](https://kubernetes.io/docs/concepts/configuration/secret/#best-practices)。 @@ -641,13 +634,13 @@ spring: name: s3 ``` -在前面的示例中,如果没有设置`spring.cloud.kubernetes.secrets.namespace`,则将在应用程序运行的名称空间中查找名为`Secret`的`s1`。请参阅[名称空间分辨率](#namespace-resolution),以更好地了解如何解析应用程序的名称空间。 +在前面的示例中,如果没有设置`spring.cloud.kubernetes.secrets.namespace`,则将在应用程序运行的名称空间中查找名为`Secret`的`Secret`。请参阅[名称空间分辨率](#namespace-resolution),以更好地了解如何解析应用程序的名称空间。 -[Similar to the `ConfigMaps`](#config-map-fail-fast);如果你希望你的应用程序在无法加载`Secrets`属性源时无法启动,则可以设置`spring.cloud.kubernetes.secrets.fail-fast=true`。 +[类似于`ConfigMaps`](#config-map-fail-fast);如果你希望你的应用程序在无法加载`Secrets`属性源时启动失败,则可以设置`spring.cloud.kubernetes.secrets.fail-fast=true`。 -也可以为`Secret`属性源[like the `ConfigMaps`](#config-map-retry)启用重试。与`ConfigMap`属性源一样,首先需要设置`spring.cloud.kubernetes.secrets.fail-fast=true`。然后你需要在 Classpath 中添加`spring-retry`和`spring-boot-starter-aop`。可以通过设置`spring.cloud.kubernetes.secrets.retry.*`属性来配置`Secret`属性源的重试行为。 +也可以为`Secret`属性源[比如`ConfigMaps`]启用重试(#config-map-retry)。与`ConfigMap`属性源一样,首先需要设置`spring.cloud.kubernetes.secrets.fail-fast=true`。然后,你需要在 Classpath 中添加`spring-retry`和`spring-boot-starter-aop`。通过设置`spring.cloud.kubernetes.secrets.retry.*`属性,可以配置`Secret`属性源的重试行为。 -| |如果在 Classpath 上已经有`spring-retry`和`spring-boot-starter-aop`由于某种原因
并希望启用 fail-fast,但不希望被启用重试;你可以通过设置`spring.cloud.kubernetes.secrets.retry.enabled=false`来禁用`PropertySources`的重试。| +| |如果由于某种原因在 Classpath 上已经有`spring-retry`和`spring-boot-starter-aop`
并且希望启用 fail-fast,但是不希望被启用重试;你可以通过设置`spring.cloud.kubernetes.secrets.retry.enabled=false`来禁用`PropertySources`的重试。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Name | Type | Default |说明| @@ -675,7 +668,7 @@ spring: 你可以在[spring-boot-camel-config](https://github.com/fabric8-quickstarts/spring-boot-camel-config)找到一个使用秘密的应用程序示例(尽管它尚未更新为使用新的`spring-cloud-kubernetes`项目) -### [](#namespace-resolution)[5.3.名称空间解析](#namespace-resolution) ### +### [](#namespace-resolution)[5.3.名称空间解析](#namespace-resolution) 查找应用程序名称空间是在尽力而为的基础上进行的。为了找到它,我们迭代了一些步骤。最简单也是最常见的一种方法是在适当的配置中指定它,例如: @@ -710,18 +703,18 @@ spring: 未能从上述步骤中找到名称空间将导致引发异常。 -### [](#propertysource-reload)[5.4. `PropertySource` Reload](#propertysource-reload) ### +### [](#propertysource-reload)[5.4。`PropertySource`重新加载](#PropertySource-Reload) -| |该功能在 2020.0 版本中已被弃用。请参阅
的[Spring Cloud Kubernetes Configuration Watcher](#spring-cloud-kubernetes-configuration-watcher)控制器,以获得与
相同的功能的替代方式。| +| |该功能在 2020.0 版本中已被弃用。请参阅
的[Spring Cloud Kubernetes Configuration Watcher](#spring-cloud-kubernetes-configuration-watcher)控制器以替代
的方式实现相同的功能。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -一些应用程序可能需要检测外部属性源上的更改,并更新其内部状态以反映新的配置。 Spring Cloud Kubernetes 的重新加载特性能够在相关的`ConfigMap`或 `secret’发生变化时触发应用程序重新加载。 +一些应用程序可能需要检测外部属性源上的更改,并更新其内部状态以反映新的配置。 Spring Cloud Kubernetes 的重新加载功能能够在相关的`ConfigMap`或`Secret`发生变化时触发应用程序重新加载。 默认情况下,此功能将被禁用。你可以通过使用`spring.cloud.kubernetes.reload.enabled=true`配置属性(例如,在`application.properties`文件中)来启用它。 支持以下级别的重新加载(通过设置`spring.cloud.kubernetes.reload.strategy`属性): -* `refresh`(缺省):只有注解为`@ConfigurationProperties`或`@RefreshScope`的配置 bean 才会重新加载。这个重新加载级别利用了 Spring 云上下文的刷新特性。 +* `refresh`(缺省):只有注解为`@ConfigurationProperties`或`@RefreshScope`的配置 bean 才会重新加载。这个重新加载级别利用了 Spring Cloud上下文的刷新功能。 * `restart_context`:整个 Spring `ApplicationContext`被优雅地重新启动。使用新配置重新创建 bean。为了使 Restart 上下文功能正常工作,你必须启用并公开 Restart Actuator 端点 @@ -736,9 +729,9 @@ management: include: restart ``` -* `shutdown`:关闭 Spring `ApplicationContext`以激活容器的重新启动。使用此级别时,请确保所有非守护进程线程的生命周期都绑定到`ApplicationContext`,并且配置了复制控制器或复制集来重新启动 POD。 +* `shutdown`:关闭 Spring `ApplicationContext`以激活容器的重新启动。使用此级别时,请确保所有非守护进程线程的生命周期都绑定到`ApplicationContext`,并且配置了一个复制控制器或复制集来重新启动 POD。 -假设使用默认设置(“刷新”模式)启用了 Reload 功能,那么在配置映射发生更改时将刷新以下 Bean: +假设使用默认设置(`refresh`模式)启用了 Reload 功能,则在配置映射发生更改时将刷新以下 Bean: ``` @Configuration @@ -752,7 +745,7 @@ public class MyConfig { } ``` -为了看到更改有效地发生,你可以创建另一个定期打印消息的 Bean,如下所示 +为了确保更改有效地发生,你可以创建另一个定期打印消息的 Bean,如下所示 ``` @Component @@ -780,44 +773,42 @@ data: bean.message=Hello World! ``` -与 POD 相关的`ConfigMap`中名为`bean.message`的属性的任何更改都会反映在输出中。更一般地说,与前缀为`@ConfigurationProperties`注释的`prefix`字段所定义的值的属性相关的更改将被检测并反映在应用程序中。[Associating a `ConfigMap` with a pod](#configmap-propertysource)在本章的前面进行了解释。 +在与 POD 相关的`ConfigMap`中,对名为`bean.message`的属性的任何更改都会反映在输出中。更一般地说,检测并在应用程序中反映了与以`@ConfigurationProperties`注释的`prefix`字段定义的值为前缀的属性相关的更改。[将`ConfigMap`与 pod 关联](#configmap-propertysource)在本章的前面进行了解释。 -完整示例可在[`spring-cloud-kubernetes-reload-example`](https://github.com/spring-cloud/spring-cloud-kubernetes/tree/main/spring-cloud-kubernetes-examples/kubernetes-reload-example)中找到。 +完整示例可在[`spring-cloud-kubernetes-reload-example`](https://github.com/ Spring-cloud/ Spring-cloud-kubernetes/tree/main/ Spring-cloud-kubernetes-examples/kubernetes-reload-example)中找到。 -Reload 功能支持两种操作模式:\* 事件(默认):通过使用 Kubernetes API(Web 套接字)监视配置映射或秘密中的更改。任何事件都会产生对配置的重新检查,如果发生更改,还会产生重新加载。为了监听配置映射更改,服务帐户上的`view`角色是必需的。机密需要更高级别的角色(例如`edit`)(默认情况下,机密不受监视)。\* 轮询:周期性地从配置映射和秘密中重新创建配置,以查看它是否已更改。可以使用`spring.cloud.kubernetes.reload.period`属性配置轮询周期,默认设置为 15 秒。它需要与受监视的属性源具有相同的角色。这意味着,例如,在文件挂载的秘密源上使用轮询不需要特定的特权。 +Reload 功能支持两种操作模式:\* 事件(默认):通过使用 Kubernetes API(Web 套接字)监视配置映射或秘密中的更改。任何事件都会产生对配置的重新检查,如果发生更改,还会产生重新加载。为了监听配置映射更改,服务帐户上的`view`角色是必需的。机密需要更高级别的角色(例如`edit`)(默认情况下,机密不受监视)。\* 轮询:周期性地从配置映射和秘密中重新创建配置,以查看它是否已更改。可以使用`spring.cloud.kubernetes.reload.period`属性配置轮询周期,默认设置为 15 秒。它需要与受监视的属性源具有相同的角色。这意味着,例如,在文件挂载的秘密源上使用轮询不需要特定的权限。 | Name | Type | Default |说明| |-------------------------------------------------------|----------|---------|--------------------------------------------------------------------------------------| | `spring.cloud.kubernetes.reload.enabled` |`Boolean` | `false` |启用对属性源和配置重新加载的监视| |`spring.cloud.kubernetes.reload.monitoring-config-maps`|`Boolean` | `true` |允许监视配置映射中的更改| | `spring.cloud.kubernetes.reload.monitoring-secrets` |`Boolean` | `false` |允许监视机密的更改| -| `spring.cloud.kubernetes.reload.strategy` | `Enum` |`refresh`|触发重新加载时使用的策略(`refresh’,`restart_context`,或`shutdown`)| -| `spring.cloud.kubernetes.reload.mode` | `Enum` | `event` |指定如何侦听属性源中的更改(`event’或`polling`)| +| `spring.cloud.kubernetes.reload.strategy` | `Enum` |`refresh`|在启动重新加载时使用的策略(`refresh`,`restart_context`,或`shutdown`)| +| `spring.cloud.kubernetes.reload.mode` | `Enum` | `event` |指定如何侦听属性源中的更改(`event`或`polling`)| | `spring.cloud.kubernetes.reload.period` |`Duration`| `15s` |使用`polling`策略时验证更改的周期| 注意:\* 你不应该在配置映射或秘密中使用`spring.cloud.kubernetes.reload`下的属性。在运行时更改这些属性可能会导致意想不到的结果。\* 当你使用`refresh`级别时,删除属性或整个配置映射不会恢复 bean 的原始状态。 -[](#kubernetes-ecosystem-awareness)[6.Kubernetes 生态系统意识](#kubernetes-ecosystem-awareness) ----------- +## [](#kubernetes-ecosystem-awareness)[6.Kubernetes 生态系统意识](#kubernetes-ecosystem-awareness) -无论你的应用程序是否在 Kubernetes 内部运行,本指南前面描述的所有功能都同样有效。这对于开发和故障排除非常有帮助。从开发的角度来看,这允许你启动 Spring 引导应用程序,并调试该项目中的一个模块。你不需要在 Kubernetes 中部署它,因为项目的代码依赖于[Fabric8Kubernetes Java 客户端](https://github.com/fabric8io/kubernetes-client),这是一种 Fluent DSL,可以通过使用`http`协议与 Kubernetes 服务器的 REST API 进行通信。 +无论你的应用程序是否在 Kubernetes 内部运行,本指南前面描述的所有功能都同样有效。这对于开发和故障排除非常有帮助。从开发的角度来看,这允许你启动 Spring 引导应用程序,并调试该项目的一个模块。你不需要在 Kubernetes 中部署它,因为项目的代码依赖于[Fabric8Kubernetes Java 客户端](https://github.com/fabric8io/kubernetes-client),这是一种 Fluent DSL,可以通过使用`http`协议与 Kubernetes 服务器的 REST API 进行通信。 -要禁用与 Kubernetes 的集成,你可以将`spring.cloud.kubernetes.enabled`设置为`false`。请注意,当`spring-cloud-kubernetes-config`在 Classpath 上时,` Spring.cloud.kubernetes.enabled` 应设置在`bootstrap.{properties|yml}`(或配置文件指定的一个)中,否则应设置在`application.{properties|yml}`(或配置文件指定的一个)中。由于我们在`spring-cloud-kubernetes-config`中设置特定的`EnvironmentPostProcessor`的方式,你还需要通过系统属性(或环境变量)禁用该处理器,例如,你可以通过`-DSPRING_CLOUD_KUBERNETES_ENABLED=false`启动应用程序(任何形式的放松绑定也可以工作)。还要注意这些属性:`spring.cloud.kubernetes.config.enabled`和`spring.cloud.kubernetes.secrets.enabled`仅在`bootstrap.{properties|yml}`中设置时生效 +要禁用与 Kubernetes 的集成,你可以将`spring.cloud.kubernetes.enabled`设置为`false`。请注意,当`spring-cloud-kubernetes-config`在 Classpath 上时,`spring.cloud.kubernetes.enabled`应设置在`bootstrap.{properties|yml}`(或配置文件指定的一个)中,否则应设置在`application.{properties|yml}`(或配置文件指定的一个)中。由于我们在`spring-cloud-kubernetes-config`中设置特定的`EnvironmentPostProcessor`的方式,你还需要通过系统属性(或环境变量)禁用该处理器,例如,你可以通过`-DSPRING_CLOUD_KUBERNETES_ENABLED=false`启动应用程序(任何形式的放松绑定也可以工作)。还要注意这些属性:`spring.cloud.kubernetes.config.enabled`和`spring.cloud.kubernetes.secrets.enabled`仅在`bootstrap.{properties|yml}`中设置时才生效 -### [](#kubernetes-profile-autoconfiguration)[6.1.Kubernetes 配置文件自动配置](#kubernetes-profile-autoconfiguration) ### +### [](#kubernetes-profile-autoconfiguration)[6.1.Kubernetes 配置文件自动配置](#kubernetes-profile-autoconfiguration) -当应用程序在 Kubernetes 中作为 POD 运行时,一个名为`kubernetes`的 Spring 配置文件会自动被激活。这允许你定制配置,以定义在 Spring 引导应用程序部署在 Kubernetes 平台中时应用的 bean(例如,不同的开发和生产配置)。 +当应用程序在 Kubernetes 中作为 POD 运行时,一个名为`kubernetes`的 Spring 配置文件会自动被激活。这使你可以定制配置,以定义在 Spring 引导应用程序部署在 Kubernetes 平台中时应用的 bean(例如,不同的开发和生产配置)。 -### [](#istio-awareness)[6.2.Istio 意识](#istio-awareness) ### +### [](#istio-awareness)[6.2.Istio 意识](#istio-awareness) 当在应用程序 Classpath 中包含`spring-cloud-kubernetes-fabric8-istio`模块时,将向应用程序添加一个新的配置文件,前提是该应用程序在安装了[Istio](https://istio.io)的 Kubernetes 集群中运行。然后可以在 bean 和`@Configuration`类中使用 Spring `@Profile("istio")`注释。 -Istio 感知模块使用`me.snowdrop:istio-client`与 Istio API 进行交互,让我们发现交通规则、断路器等等,使得我们的 Spring 引导应用程序很容易消耗这些数据来根据环境动态配置自己。 +Istio Awareness 模块使用`me.snowdrop:istio-client`与 Istio API 进行交互,让我们发现交通规则、断路器等等,使我们的 Spring 引导应用程序很容易使用这些数据来根据环境动态配置自己。 -[](#pod-health-indicator)[7.POD 健康指示器](#pod-health-indicator) ----------- +## [](#pod-health-indicator)[7.POD 健康指示器](#pod-health-indicator) -Spring 引导使用[` 健康指示器 `](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/HealthEndpoint.java)公开有关应用程序健康状况的信息。这使得它对于向用户公开与健康相关的信息非常有用,并且非常适合作为[准备状态调查](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)使用。 +Spring Boot 使用[`HealthIndicator`](https://github.com/ Spring-projects/ Spring-boot/blob/master/ Spring-boot-project/ Spring-boot-actuator/SRC/main/java/org/springframework/boot/actuate/health/healthendpoint.java)来公开有关应用程序健康的信息。这使得它对于向用户公开与健康相关的信息非常有用,并且非常适合作为[准备状态调查](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)使用。 Kubernetes 健康指示器(它是核心模块的一部分)公开了以下信息: @@ -827,19 +818,17 @@ Kubernetes 健康指示器(它是核心模块的一部分)公开了以下信 你可以通过在`application.[properties | yaml]`中将`management.health.kubernetes.enabled`设置为`false`来禁用此`HealthContributor`。 -[](#info-contributor)[8.信息贡献者](#info-contributor) ----------- +## [](#info-contributor)[8.信息贡献者](#info-contributor) Spring Cloud Kubernetes 包括一个`InfoContributor`,它将 POD 信息添加到 Spring Boot 的`/info`Acturator 端点。 你可以通过在`application.[properties | yaml]`中将`management.info.kubernetes.enabled`设置为`false`来禁用此`InfoContributor`。 -[](#leader-election)[9.领导人选举](#leader-election) ----------- +## [](#leader-election)[9.领导人选举](#leader-election) -Spring 云 Kubernetes 领导人选举机制使用 Kubernetes 配置图实现 Spring 集成的领导人选举 API。 +Spring Cloud Kubernetes 领导人选举机制使用 Kubernetes 配置图实现 Spring 集成的领导人选举 API。 -多个应用程序实例竞争领导权,但领导权只授予一个实例。当授予领导力时,领导者应用程序将接收带有领导力`OnGrantedEvent`的`Context`应用程序事件。应用程序会定期尝试获得领导力,并将领导力授予第一个呼叫者。领导者将一直是领导者,直到被从集群中移除,或者交出领导者。当领导层被撤职时,前一位领导人将收到`OnRevokedEvent`应用程序事件。删除后,集群中的任何实例都可能成为新的领导者,包括旧的领导者。 +多个应用程序实例竞争领导权,但领导权将只授予一个。当授予领导权时,领导者应用程序将接收带有领导权`OnGrantedEvent`的`OnGrantedEvent`应用程序事件。应用程序会定期尝试获得领导力,并将领导力授予第一个呼叫者。领导者将一直是领导者,直到被从集群中移除,或者交出领导者。当领导层被撤职时,前一位领导人将收到`OnRevokedEvent`应用程序事件。删除后,集群中的任何实例都可能成为新的领导者,包括旧的领导者。 要将它包含在项目中,请添加以下依赖项。 @@ -858,8 +847,7 @@ Fabric8Leader 实现 spring.cloud.kubernetes.leader.config-map-name=leader ``` -[](#loadbalancer-for-kubernetes)[10.Kubernetes 负载平衡器](#loadbalancer-for-kubernetes) ----------- +## [](#loadbalancer-for-kubernetes)[10.Kubernetes 负载平衡器](#loadbalancer-for-kubernetes) Spring 该项目包括用于基于 Kubernetes 端点的负载平衡的云负载平衡器和提供基于 Kubernetes 服务的负载平衡器的实现。要将它包含到项目中,请添加以下依赖项。 @@ -895,10 +883,9 @@ spring.cloud.kubernetes.discovery.all-namespaces=true 如果需要通过 HTTPS 访问服务,则需要在服务定义中添加名称`secured`和值`true`的标签或注释,然后负载均衡器将使用 HTTPS 向服务发出请求。 -[](#security-configurations-inside-kubernetes)[11.Kubernetes 内部的安全配置](#security-configurations-inside-kubernetes) ----------- +## [](#security-configurations-inside-kubernetes)[11.Kubernetes 内部的安全配置](#security-configurations-inside-kubernetes) -### [](#namespace)[11.1. Namespace](#namespace) ### +### [](#namespace)[11.1.名称空间](#namespace) 这个项目中提供的大多数组件都需要知道名称空间。对于 Kubernetes(1.3+),命名空间作为服务帐户秘密的一部分提供给 POD,并由客户端自动检测。对于早期版本,需要将其指定为 POD 的环境变量。实现这一点的快速方法如下: @@ -910,7 +897,7 @@ spring.cloud.kubernetes.discovery.all-namespaces=true fieldPath: "metadata.namespace" ``` -### [](#service-account)[11.2.服务帐户](#service-account) ### +### [](#service-account)[11.2.服务帐户](#service-account) 对于支持集群中更细粒度的基于角色的访问的 Kubernetes 发行版,你需要确保使用`spring-cloud-kubernetes`运行的 POD 能够访问 Kubernetes API。对于分配给部署或 POD 的任何服务帐户,你需要确保它们具有正确的角色。 @@ -919,7 +906,7 @@ spring.cloud.kubernetes.discovery.all-namespaces=true |依赖性| Resources | |----------------------------------------------|-------------------------| |Spring-cloud-starter-kubernetes-fabric8|pods, services, endpoints| -|Spring-cloud-starter-kubernetes-fabric8-config| configmaps, secrets | +|spring-cloud-starter-kubernetes-fabric8-config| configmaps, secrets | |Spring-cloud-starter-kubernetes-client|pods, services, endpoints| |Spring-cloud-starter-kubernetes-client-config| configmaps, secrets | @@ -955,29 +942,27 @@ roleRef: apiGroup: "" ``` -[](#service-registry-implementation)[12.服务注册中心实现](#service-registry-implementation) ----------- +## [](#service-registry-implementation)[12.服务注册中心实现](#service-registry-implementation) 在 Kubernetes 服务注册是由平台控制的情况下,应用程序本身并不像在其他平台中那样控制注册。因此,使用`spring.cloud.service-registry.auto-registration.enabled`或设置`@EnableDiscoveryClient(autoRegister=false)`将不会在 Spring Cloud Kubernetes 中产生任何影响。 -[](#spring-cloud-kubernetes-configuration-watcher)[13. Spring Cloud Kubernetes Configuration Watcher](#spring-cloud-kubernetes-configuration-watcher) ----------- +## [](#spring-cloud-kubernetes-configuration-watcher)[13. Spring Cloud Kubernetes Configuration Watcher](#spring-cloud-kubernetes-configuration-watcher) Kubernetes 提供了在应用程序的容器中[将配置图或秘密挂载为卷](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#add-configmap-data-to-a-volume)的功能。当配置图或秘密的内容发生变化时,[安装的卷将会随着这些变化而更新。](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#mounted-configmaps-are-updated-automatically)。 -然而, Spring 启动不会自动更新这些更改,除非重新启动应用程序。 Spring 云提供了在不重新启动应用程序的情况下刷新应用程序上下文的能力,方法是通过点击执行器端点`/refresh`或通过使用 Spring 云总线发布`RefreshRemoteApplicationEvent`。 +然而, Spring 启动不会自动更新这些更改,除非重新启动应用程序。 Spring Cloud提供了在不重新启动应用程序的情况下刷新应用程序上下文的能力,而无需通过点击执行器端点`/refresh`或通过使用 Spring Cloud总线发布`RefreshRemoteApplicationEvent`。 -要实现在 Kubernetes 上运行的 Spring 云应用程序的这种配置刷新,你可以将 Spring Cloud Kubernetes Configuration Watcher 控制器部署到你的 Kubernetes 集群中。 +要实现在 Kubernetes 上运行的 Spring Cloud应用程序的这种配置刷新,你可以将 Spring Cloud Kubernetes 配置观察控制器部署到你的 Kubernetes 集群中。 该应用程序作为容器发布,并在[Docker Hub](https://hub.docker.com/r/springcloud/spring-cloud-kubernetes-configuration-watcher)上可用。 -Spring 云 Kubernetes 配置观察者可以通过两种方式向应用程序发送刷新通知。 +Spring Cloud Kubernetes 配置观察者可以通过两种方式向应用程序发送刷新通知。 1. 在 HTTP 上,在这种情况下,被通知的应用程序必须将`/refresh`执行器端点公开并可从集群内访问 2. Spring 使用云总线,在这种情况下,你将需要部署到你的 Custer 的消息代理,以便应用程序使用。 -### [](#deployment-yaml)[13.1.部署 YAML](#deployment-yaml) ### +### [](#deployment-yaml)[13.1.部署 YAML](#deployment-yaml) 下面是一个示例部署 YAML,你可以使用它将 Kubernetes 配置监视器部署到 Kubernetes。 @@ -1060,21 +1045,21 @@ items: Spring Cloud Kubernetes 配置要想正常工作,服务帐户和相关的角色绑定是很重要的。控制器需要访问来读取关于 Kubernetes 集群中的配置映射、POD、服务、端点和秘密的数据。 -### [](#monitoring-configmaps-and-secrets)[13.2.监视配置图和秘密](#monitoring-configmaps-and-secrets) ### +### [](#monitoring-configmaps-and-secrets)[13.2.监视配置图和秘密](#monitoring-configmaps-and-secrets) Spring Cloud Kubernetes Configuration Watcher 将对带有值`true`的标签的`spring.cloud.kubernetes.config`的配置映射中的更改或带有值`true`的标签的`spring.cloud.kubernetes.secret`的任何秘密做出反应。如果配置图或秘密没有这些标签中的任何一个,或者这些标签的值不是`true`,那么任何更改都将被忽略。 -Spring Cloud Kubernetes Configmaps 上的配置观察者所寻找的标签和秘密可以分别通过设置 ` Spring.cloud.Kubernetes.configlabel` 和`spring.cloud.kubernetes.configuration.watcher.secretLabel`来更改。 +Spring Cloud Kubernetes 配置观察者在配置地图上寻找的标签和秘密可以通过分别设置`spring.cloud.kubernetes.configuration.watcher.configLabel`和`spring.cloud.kubernetes.configuration.watcher.secretLabel`来进行更改。 如果对具有有效标签的配置图或秘密进行了更改,则 Spring Cloud Kubernetes 配置观察者将获取配置图或秘密的名称,并向具有该名称的应用程序发送通知。 -### [](#http-implementation)[13.3.HTTP 实现](#http-implementation) ### +### [](#http-implementation)[13.3.HTTP 实现](#http-implementation) -默认情况下使用的是 HTTP 实现。当使用 Spring Cloud Kubernetes 配置监视器并发生对配置图或秘密的更改时,则 HTTP 实现将使用 Spring Cloud Kubernetes 发现客户端来获取与配置图或秘密的名称相匹配的应用程序的所有实例并向应用程序的执行器“/refresh”端点发送 HTTP POST 请求。默认情况下,它将使用在发现客户端中注册的端口向`/actuator/refresh`发送 POST 请求。 +默认情况下使用的是 HTTP 实现。当使用 Spring Cloud Kubernetes 配置监视器并且发生对配置图或秘密的更改时,那么 HTTP 实现将使用 Spring Cloud Kubernetes 发现客户端来获取与配置图或秘密的名称相匹配的应用程序的所有实例并向应用程序的执行器`/refresh`端点发送 HTTP POST 请求。默认情况下,它将使用在发现客户端中注册的端口向`/actuator/refresh`发送 POST 请求。 -#### [](#non-default-management-port-and-actuator-path)[13.3.1.非默认管理端口和执行器路径](#non-default-management-port-and-actuator-path) #### +#### [](#non-default-management-port-and-actuator-path)[13.3.1.非默认管理端口和执行器路径](#non-default-management-port-and-actuator-path) -如果应用程序正在使用非默认的执行器路径和/或使用用于管理端点的不同端口,则用于应用程序的 Kubernetes 服务可以添加一个名为`boot.spring.io/actuator`的注释,并将其值设置为应用程序使用的路径和端口。例如 +如果应用程序使用非默认的执行器路径和/或为管理端点使用不同的端口,则用于应用程序的 Kubernetes 服务可以添加一个名为`boot.spring.io/actuator`的注释,并将其值设置为应用程序使用的路径和端口。例如 ``` apiVersion: v1 @@ -1094,15 +1079,15 @@ spec: app: config-map-demo ``` -你可以选择配置执行器路径和/或管理端口的另一种方式是通过设置 ` Spring.cloud.kubernetes.configuration.watcher.actuatorpath` 和`spring.cloud.kubernetes.configuration.watcher.actuatorPort`。 +可以选择配置执行器路径和/或管理端口的另一种方式是通过设置`spring.cloud.kubernetes.configuration.watcher.actuatorPath`和`spring.cloud.kubernetes.configuration.watcher.actuatorPort`。 -### [](#messaging-implementation)[13.4.消息传递实现](#messaging-implementation) ### +### [](#messaging-implementation)[13.4.消息传递实现](#messaging-implementation) 当 Spring Cloud Kubernetes Configuration Watcher 应用程序部署到 Kubernetes 时,可以通过将配置文件设置为或来启用消息传递实现。 -### [](#configuring-rabbitmq)[13.5.配置 RabbitMQ](#configuring-rabbitmq) ### +### [](#configuring-rabbitmq)[13.5.配置 RabbitMQ](#configuring-rabbitmq) -当`bus-amqp`配置文件被启用时,你将需要配置 Spring RabbitMQ 以将其指向你想要使用的 RabbitMQ 实例的位置,以及进行身份验证所需的任何凭据。这可以通过设置标准 Spring RabbitMQ 属性来完成,例如 +当启用`bus-amqp`配置文件时,你将需要配置 Spring RabbitMQ,将其指向你想要使用的 RabbitMQ 实例的位置,以及进行身份验证所需的任何凭据。这可以通过设置标准 Spring RabbitMQ 属性来完成,例如 ``` spring: @@ -1112,7 +1097,7 @@ spring: host: rabbitmq ``` -### [](#configuring-kafka)[13.6.配置 Kafka](#configuring-kafka) ### +### [](#configuring-kafka)[13.6.配置 Kafka](#configuring-kafka) 启用`bus-kafka`配置文件后,你将需要配置 Spring Kafka,将其指向你想要使用的 Kafka 代理实例的位置。这可以通过设置标准 Spring Kafka 属性来完成,例如 @@ -1123,37 +1108,36 @@ spring: bootstrap-servers: localhost:9092 ``` -[](#spring-cloud-kubernetes-configserver)[14. Spring Cloud Kubernetes Config Server](#spring-cloud-kubernetes-configserver) ----------- +## [](#spring-cloud-kubernetes-configserver)[14. Spring Cloud Kubernetes Config Server](#spring-cloud-kubernetes-configserver) -Spring Cloud Kubernetes Config 服务器基于[Spring Cloud Config Server](https://spring.io/projects/spring-cloud-config),并为 Kubernetes[Config Maps](https://kubernetes.io/docs/concepts/configuration/configmap/)和[Secrets](https://kubernetes.io/docs/concepts/configuration/secret/)添加了[环境存储库](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_environment_repository)。 +Spring Cloud Kubernetes Config 服务器基于[Spring Cloud Config Server](https://spring.io/projects/spring-cloud-config),并为 Kubernetes[配置映射](https://kubernetes.io/docs/concepts/configuration/configmap/)和[Secrets](https://kubernetes.io/docs/concepts/configuration/secret/)添加了[环境存储库](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_environment_repository)。 这是一个完全可选的组件。然而,它允许你继续利用你在 Kubernetes 上运行的应用程序来利用可能存储在现有环境存储库(Git、SVN、Vault 等)中的配置。 -默认映像位于[Docker Hub](https://hub.docker.com/r/springcloud/spring-cloud-kubernetes-configserver)上,这将允许你轻松地在 Kubernetes 上部署配置服务器,而无需自己构建代码和映像。但是,如果你需要自定义配置服务器行为,你可以轻松地从 Github 上的源代码构建自己的映像并使用它。 +默认映像位于[Docker Hub](https://hub.docker.com/r/springcloud/spring-cloud-kubernetes-configserver)上,这将允许你轻松地获得部署在 Kubernetes 上的配置服务器,而无需自己构建代码和映像。但是,如果你需要自定义配置服务器行为,你可以轻松地从 Github 上的源代码构建自己的映像并使用它。 -### [](#configuration)[14.1.配置](#configuration) ### +### [](#configuration)[14.1.配置](#configuration) -#### [](#enabling-the-kubernetes-environment-repository)[14.1.1.启用 Kubernetes 环境存储库](#enabling-the-kubernetes-environment-repository) #### +#### [](#enabling-the-kubernetes-environment-repository)[14.1.1.启用 Kubernetes 环境存储库](#enabling-the-kubernetes-environment-repository) 要启用 Kubernetes 环境存储库,`kubernetes`配置文件必须包含在活动配置文件列表中。你也可以激活其他配置文件来使用其他环境存储库实现。 -#### [](#config-map-and-secret-propertysources)[14.1.2.配置映射和秘密 PropertySources](#config-map-and-secret-propertysources) #### +#### [](#config-map-and-secret-propertysources)[14.1.2.配置映射和秘密 PropertySources](#config-map-and-secret-propertysources) 默认情况下,将只获取配置映射数据。要启用秘密,还需要设置`spring.cloud.kubernetes.secrets.enableApi=true`。你可以通过设置`spring.cloud.kubernetes.config.enableApi=false`来禁用配置映射`PropertySource`。 -#### [](#fetching-config-map-and-secret-data-from-additional-namespaces)[14.1.3.从其他名称空间获取配置映射和秘密数据](#fetching-config-map-and-secret-data-from-additional-namespaces) #### +#### [](#fetching-config-map-and-secret-data-from-additional-namespaces)[14.1.3.从其他名称空间获取配置映射和秘密数据](#fetching-config-map-and-secret-data-from-additional-namespaces) 默认情况下,Kubernetes 环境存储库将仅从部署它的名称空间获取配置映射和秘密。如果希望包括来自其他名称空间的数据,则可以将`spring.cloud.kubernetes.configserver.config-map-namespaces`和/或`spring.cloud.kubernetes.configserver.secrets-namespaces`设置为以逗号分隔的名称空间值列表。 | |如果你设置`spring.cloud.kubernetes.configserver.config-map-namespaces`和/或`spring.cloud.kubernetes.configserver.secrets-namespaces`,则需要包括部署配置服务器的名称空间,以便继续从该名称空间获取配置映射和秘密数据。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#kubernetes-access-controls)[14.1.4.Kubernetes 访问控制](#kubernetes-access-controls) #### +#### [](#kubernetes-access-controls)[14.1.4.Kubernetes 访问控制](#kubernetes-access-controls) Kubernetes 配置服务器使用 Kubernetes API 服务器获取配置映射和秘密数据。为了做到这一点,它需要`get`和`list`配置映射和秘密(取决于你启用/禁用的内容)。 -### [](#deployment-yaml-2)[14.2.部署 YAML](#deployment-yaml-2) ### +### [](#deployment-yaml-2)[14.2.部署 YAML](#deployment-yaml-2) 下面是一个示例部署、服务和权限配置,你可以使用它将基本配置服务器部署到 Kubernetes。 @@ -1237,22 +1221,21 @@ items: - containerPort: 8888 ``` -[](#spring-cloud-kubernetes-discoveryserver)[15. Spring Cloud Kubernetes Discovery Server](#spring-cloud-kubernetes-discoveryserver) ----------- +## [](#spring-cloud-kubernetes-discoveryserver)[15. Spring Cloud Kubernetes Discovery Server](#spring-cloud-kubernetes-discoveryserver) -Spring 云 Kubernetes 发现服务器提供了应用程序可以用来收集关于 Kubernetes 集群中可用的服务的信息的 HTTP 端点。 Spring 云 Kubernetes 发现服务器可以由使用`spring-cloud-starter-kubernetes-discoveryclient`的应用程序使用,以向由该启动器提供的`DiscoveryClient`实现提供数据。 +Spring Cloud Kubernetes 发现服务器提供了应用程序可以用来收集关于 Kubernetes 集群中可用的服务的信息的 HTTP 端点。 Spring Cloud Kubernetes 发现服务器可以由使用`spring-cloud-starter-kubernetes-discoveryclient`的应用程序使用,以向由该启动器提供的`DiscoveryClient`实现提供数据。 -### [](#permissions)[15.1.权限](#permissions) ### +### [](#permissions)[15.1.权限](#permissions) -Spring 云发现服务器使用 Kubernetes API 服务器来获取有关服务和端点重排的数据,因此它需要列表、监视和获得使用这些端点的权限。有关如何在 Kubernetes 上配置服务帐户的示例,请参见下面的示例 Kubernetes Deployment YAML。 +Spring Cloud发现服务器使用 Kubernetes API 服务器来获取有关服务和端点重排的数据,因此它需要列表、监视和获得使用这些端点的权限。有关如何在 Kubernetes 上配置服务帐户的示例,请参见下面的示例 Kubernetes Deployment YAML。 -### [](#endpoints)[15.2. Endpoints](#endpoints) ### +### [](#endpoints)[15.2.端点](#endpoints) 服务器公开了三个端点。 -#### [](#apps)[15.2.1. `/apps`](#apps) #### +#### [](#apps)[15.2.1。`/apps`] -发送到`/apps`的`GET`请求将返回可用服务的 JSON 数组。每个项都包含 Kubernetes 服务的名称和服务实例信息。下面是一个示例响应。 +发送到`GET`的`/apps`请求将返回可用服务的 JSON 数组。每个项都包含 Kubernetes 服务的名称和服务实例信息。下面是一个示例响应。 ``` [ @@ -1299,9 +1282,9 @@ Spring 云发现服务器使用 Kubernetes API 服务器来获取有关服务和 ] ``` -#### [](#appname)[15.2.2. `/app/{name}`](#appname) #### +#### [](#appname)[15.2.2。`/app/{name}`] -可以使用对`/app/{name}`的`GET`请求来获取给定服务的所有实例的实例数据。下面是当`GET`请求被发送到`/app/kubernetes`时的示例响应。 +可以使用对`/app/{name}`的`GET`请求来获取给定服务的所有实例的实例数据。下面是对`GET`请求进行`/app/kubernetes`时的示例响应。 ``` [ @@ -1323,7 +1306,7 @@ Spring 云发现服务器使用 Kubernetes API 服务器来获取有关服务和 ] ``` -#### [](#appnameinstanceid)[15.2.3. `/app/{name}/{instanceid}`](#appnameinstanceid) #### +#### [](#appnameinstanceid)[15.2.3。`/app/{name}/{instanceid}`] 向`/app/{name}/{instanceid}`发出的`GET`请求将返回给定服务的特定实例的实例数据。下面是当`GET`请求被发送到`/app/kubernetes/1234`时的示例响应。 @@ -1345,9 +1328,9 @@ Spring 云发现服务器使用 Kubernetes API 服务器来获取有关服务和 } ``` -### [](#deployment-yaml-3)[15.3.部署 YAML](#deployment-yaml-3) ### +### [](#deployment-yaml-3)[15.3.部署 YAML](#deployment-yaml-3) -Spring 云发现服务器的图像托管在[Docker Hub](https://hub.docker.com/r/springcloud/spring-cloud-kubernetes-discoveryserver)上。 +Spring Cloud发现服务器的图像托管在[Docker Hub](https://hub.docker.com/r/springcloud/spring-cloud-kubernetes-discoveryserver)上。 下面是一个示例部署 YAML,你可以使用它将 Kubernetes 配置监视器部署到 Kubernetes。 @@ -1428,12 +1411,11 @@ items: - containerPort: 8761 ``` -[](#examples)[16. Examples](#examples) ----------- +## [](#examples)[16.例子](#examples) Spring Cloud Kubernetes 试图通过遵循 Spring Cloud 接口使你的应用程序使用 Kubernetes 原生服务变得透明。 -在应用程序中,需要将`spring-cloud-kubernetes-discovery`依赖项添加到 Classpath 中,并删除包含`DiscoveryClient`实现的任何其他依赖项(即 Eureka 发现客户机)。这同样适用于`PropertySourceLocator`,其中你需要向 Classpath 中添加`spring-cloud-kubernetes-config`,并删除包含`PropertySourceLocator`实现(即配置服务器客户端)的任何其他依赖项。 +在应用程序中,需要将`spring-cloud-kubernetes-discovery`依赖项添加到 Classpath 中,并删除包含`DiscoveryClient`实现(即 Eureka 发现客户机)的任何其他依赖项。这同样适用于`PropertySourceLocator`,其中你需要将`spring-cloud-kubernetes-config`添加到 Classpath 中,并删除包含`PropertySourceLocator`实现(即配置服务器客户端)的任何其他依赖项。 下面的项目重点介绍了这些依赖关系的用法,并演示了如何从任何 Spring 启动应用程序中使用这些库: @@ -1445,14 +1427,13 @@ Spring Cloud Kubernetes 试图通过遵循 Spring Cloud 接口使你的应用程 * [Boss](https://github.com/salaboy/spring-cloud-k8s-boss) -* Spring Cloud Kubernetes 完整示例:[Springone 站台售票服务](https://github.com/salaboy/s1p_docs) +* Spring Cloud Kubernetes 全例:[Springone 站台售票服务](https://github.com/salaboy/s1p_docs) * [Spring Cloud Gateway with Spring Cloud Kubernetes Discovery and Config](https://github.com/salaboy/s1p_gateway) * [Spring Boot Admin with Spring Cloud Kubernetes Discovery and Config](https://github.com/salaboy/showcase-admin-tool) -[](#other-resources)[17.其他资源](#other-resources) ----------- +## [](#other-resources)[17.其他资源](#other-resources) 本节列出了其他资源,例如关于 Spring Cloud Kubernetes 的演示文稿(幻灯片)和视频。 @@ -1460,21 +1441,19 @@ Spring Cloud Kubernetes 试图通过遵循 Spring Cloud 接口使你的应用程 * [Spring Cloud, Docker, Kubernetes → London Java Community July 2018](https://salaboy.com/2018/07/18/ljc-july-18-spring-cloud-docker-k8s/) -请随时通过 pull 请求提交其他资源到[this repository](https://github.com/spring-cloud/spring-cloud-kubernetes)。 +请随时通过 pull 请求提交其他资源到[这个存储库](https://github.com/spring-cloud/spring-cloud-kubernetes)。 -[](#configuration-properties)[18.配置属性](#configuration-properties) ----------- +## [](#configuration-properties)[18.配置属性](#configuration-properties) 要查看所有 Kubernetes 相关配置属性的列表,请检查[附录页](appendix.html)。 -[](#building)[19. Building](#building) ----------- +## [](#building)[19.建筑物](#building) -### [](#basic-compile-and-test)[19.1.基本编译和测试](#basic-compile-and-test) ### +### [](#basic-compile-and-test)[19.1.基本编译和测试](#basic-compile-and-test) 要构建源代码,你需要安装 JDK17。 -Spring Cloud 在大多数与构建相关的活动中使用 Maven,你应该能够通过克隆感兴趣的项目并键入来很快地启动它。 +Spring Cloud 在大多数与构建相关的活动中使用 Maven,你应该能够通过克隆感兴趣的项目并键入来很快地开始工作。 ``` $ ./mvnw install @@ -1483,31 +1462,31 @@ $ ./mvnw install | |你也可以自己安装 Maven(\>=3.3.3),并在下面的示例中运行`mvn`命令
来代替`./mvnw`。如果你这样做,那么如果你的本地 Maven 设置不
包含 Spring 预发布工件的存储库声明,那么你可能还需要添加`-P spring`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |请注意,你可能需要通过使用
设置一个`MAVEN_OPTS`的环境变量来增加 Maven 可用的
内存量`-Xmx512m -XX:MaxPermSize=128m`这样的值。我们试图在
的`.mvn`配置中涵盖这一点,因此,如果你发现必须这样做才能使
构建成功,请举出一张票来将设置添加到
源代码控制中。| +| |请注意,你可能需要通过将
环境变量设置为`-Xmx512m -XX:MaxPermSize=128m`,从而增加 Maven 可用的
内存量。我们试图在
`.mvn`配置中覆盖此内容,因此,如果你发现必须这样做才能使
构建成功,请提出一张票据,以将设置添加到
源代码控制中。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 需要中间件(即 Redis)进行测试的项目通常需要安装并运行[Docker]([WWW.docker.com/get-started](https://www.docker.com/get-started))的本地实例。 -### [](#documentation)[19.2.文件](#documentation) ### +### [](#documentation)[19.2.文件](#documentation) -Spring-cloud-build 模块有一个“DOCS”配置文件,如果将其打开,将尝试从 `SRC/Main/ASCIIDoc’构建 ASCIIDoc 源。作为该过程的一部分,它将寻找一个“readme.ADOC”,并通过加载所有包含来处理它,但不是解析或呈现它,只是将其复制到`${main.basedir}`(默认为`$/tmp/releaser-1645122597379-0/spring-cloud-kubernetes/docs`,即项目的根)。如果 README 中有任何更改,那么在构建 Maven 之后,它将在正确的位置显示为经过修改的文件。只要承诺并推动改变就行了。 +Spring-cloud-build 模块有一个“DOCS”配置文件,如果你将其打开,它将尝试从`src/main/asciidoc`构建 ASCIIDoc 源。作为该过程的一部分,它将寻找`README.adoc`,并通过加载所有的包含来处理它,但不是解析或呈现它,只是将其复制到`${main.basedir}`(默认为`$/tmp/releaser-1645122597379-0/spring-cloud-kubernetes/docs`,即项目的根)。如果 README 中有任何更改,那么在构建 Maven 之后,它将在正确的位置显示为经过修改的文件。只要承诺并推动改变就行了。 -### [](#working-with-the-code)[19.3.使用代码](#working-with-the-code) ### +### [](#working-with-the-code)[19.3.使用代码](#working-with-the-code) 如果你没有 IDE 偏好,我们建议你在使用代码时使用[Spring Tools Suite](https://www.springsource.com/developer/sts)或[Eclipse](https://eclipse.org)。我们使用[m2eclipse](https://eclipse.org/m2e/)Eclipse 插件来提供 Maven 支持。其他 IDE 和工具也应该在没有问题的情况下工作,只要它们使用 Maven 3.3.3 或更好。 -#### [](#activate-the-spring-maven-profile)[19.3.1. Activate the Spring Maven profile](#activate-the-spring-maven-profile) #### +#### [](#activate-the-spring-maven-profile)[19.3.1. Activate the Spring Maven profile](#activate-the-spring-maven-profile) -Spring 云项目需要激活“ Spring” Maven 配置文件以解析 Spring 里程碑和快照存储库。使用你首选的 IDE 将此配置文件设置为活动的,否则你可能会遇到构建错误。 +Spring Cloud项目需要激活“ Spring” Maven 配置文件以解析 Spring 里程碑和快照存储库。使用你首选的 IDE 将此配置文件设置为活动的,否则你可能会遇到构建错误。 -#### [](#importing-into-eclipse-with-m2eclipse)[19.3.2.用 M2Eclipse 导入到 Eclipse 中](#importing-into-eclipse-with-m2eclipse) #### +#### [](#importing-into-eclipse-with-m2eclipse)[19.3.2.用 M2Eclipse 导入到 Eclipse 中](#importing-into-eclipse-with-m2eclipse) 在使用 Eclipse 时,我们推荐[m2eclipse](https://eclipse.org/m2e/)Eclipse 插件。如果你还没有安装 M2Eclipse,它可以从“Eclipse 市场”获得。 -| |较早版本的 M2E 不支持 Maven 3.3,因此,一旦
项目导入到 Eclipse 中,你还需要告诉
M2Eclipse 为项目使用正确的配置文件。如果你
在项目中看到与 POM 相关的许多不同错误,请检查
是否有最新的安装。如果你不能升级 M2E,
将“ Spring”配置文件添加到你的`settings.xml`。或者,你可以
将存储库设置从父
POM 的“ Spring”配置文件复制到你的`settings.xml`中。| +| |较早版本的 M2E 不支持 Maven 3.3,因此,一旦
项目导入到 Eclipse 中,你还需要告诉
M2Eclipse 为项目使用正确的配置文件。如果你
在项目中看到许多与 POM 相关的错误,请检查
是否有最新的安装。如果你不能升级 M2E,
将“ Spring”配置文件添加到你的`settings.xml`。或者,你可以
将存储库设置从父
POM 的“ Spring”配置文件复制到你的`settings.xml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#importing-into-eclipse-without-m2eclipse)[19.3.3.在没有 M2Eclipse 的情况下导入 Eclipse](#importing-into-eclipse-without-m2eclipse) #### +#### [](#importing-into-eclipse-without-m2eclipse)[19.3.3.在没有 M2Eclipse 的情况下导入 Eclipse](#importing-into-eclipse-without-m2eclipse) 如果不喜欢使用 M2Eclipse,可以使用以下命令生成 Eclipse 项目元数据: @@ -1517,26 +1496,25 @@ $ ./mvnw eclipse:eclipse 可以通过从`file`菜单中选择`import existing projects`来导入生成的 Eclipse 项目。 -[](#contributing)[20.贡献](#contributing) ----------- +## [](#contributing)[20.贡献](#contributing) -Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,并遵循非常标准的 GitHub 开发流程,使用 GitHub Tracker 处理问题并将拉请求合并到 Master 中。如果你想贡献一些微不足道的东西,请不要犹豫,但要遵循下面的指导方针。 +Spring Cloud是在非限制性的 Apache2.0 许可下发布的,并遵循非常标准的 GitHub 开发过程,使用 GitHub Tracker 处理问题并将拉请求合并到 Master 中。如果你想贡献一些微不足道的东西,请不要犹豫,但要遵循下面的指导方针。 -### [](#sign-the-contributor-license-agreement)[20.1.签署贡献者许可协议](#sign-the-contributor-license-agreement) ### +### [](#sign-the-contributor-license-agreement)[20.1.签署贡献者许可协议](#sign-the-contributor-license-agreement) 在我们接受一个重要的补丁或拉请求之前,我们需要你签署[贡献者许可协议](https://cla.pivotal.io/sign/spring)。签署贡献者协议并不会授予任何人对主库的提交权限,但这确实意味着我们可以接受你的贡献,并且如果我们接受了,你将获得作者信用。活跃的贡献者可能会被要求加入核心团队,并被赋予合并拉请求的能力。 -### [](#code-of-conduct)[20.2.行为守则](#code-of-conduct) ### +### [](#code-of-conduct)[20.2.行为守则](#code-of-conduct) -此项目遵守贡献者契约[code of conduct](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#473437352e29206a242823226a28216a242829232243073372e312833262b692e28)。 +此项目遵守贡献者契约[行为守则](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc)。通过参与,你将被期望坚持这一准则。请向[[电子邮件保护]]报告不可接受的行为(/cdn-cgi/l/email-protection#D4A7A4A6BDBAB3F9B7BBB0B1F9BBB2F9B7BBBAB0A1B7A7A7A7A9A094A4BDA2BBA0B5B8FABDBB)。 -### [](#code-conventions-and-housekeeping)[20.3.守则惯例和内部管理](#code-conventions-and-housekeeping) ### +### [](#code-conventions-and-housekeeping)[20.3.守则惯例和内部管理](#code-conventions-and-housekeeping) 这些都不是拉请求所必需的,但它们都会有所帮助。它们也可以在原始的拉请求之后但在合并之前添加。 -* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目中的 `eclipse-code-formatter.xml’文件导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 +* 使用 Spring 框架代码格式约定。如果使用 Eclipse,则可以使用`eclipse-code-formatter.xml`文件从[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml)项目导入格式化设置。如果使用 IntelliJ,可以使用[Eclipse 代码格式化插件](https://plugins.jetbrains.com/plugin/6546)导入相同的文件。 -* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个“@author”标记来标识你,并且最好至少有一个段落来说明这个类的目的。 +* 确保所有新的`.java`文件都有一个简单的 Javadoc 类注释,其中至少有一个`@author`标记来标识你,并且最好至少有一个段落来说明类的用途。 * 将 ASF 许可标头注释添加到所有新的`.java`文件(从项目中的现有文件复制) @@ -1550,9 +1528,9 @@ Spring Cloud 是在非限制性的 Apache2.0 许可下发布的,并遵循非 * 在编写提交消息时,请遵循[这些约定](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),如果你正在修复现有的问题,请在提交消息的末尾添加`Fixes gh-XXXX`(其中 xxxx 是问题编号)。 -### [](#checkstyle)[20.4.checkstyle](#checkstyle) ### +### [](#checkstyle)[20.4.checkstyle](#checkstyle) -Spring 云构建附带一组 checkstyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: +Spring Cloud构建附带一组 CheckStyle 规则。你可以在`spring-cloud-build-tools`模块中找到它们。该模块下最值得注意的文件是: Spring-云构建工具/ @@ -1571,7 +1549,7 @@ Spring-云构建工具/ |**2**|文件头设置| |**3**|默认抑制规则| -#### [](#checkstyle-configuration)[20.4.1.checkstyle 配置](#checkstyle-configuration) #### +#### [](#checkstyle-configuration)[20.4.1.checkstyle 配置](#checkstyle-configuration) checkstyle 规则是**默认禁用**。要将 checkstyle 添加到项目中,只需定义以下属性和插件。 @@ -1616,7 +1594,7 @@ POM.xml |**4**|添加 Spring Java 格式插件,该插件将重新格式化你的代码,以传递大多数 CheckStyle 格式设置规则| |**5**|将 CheckStyle 插件添加到构建和报告阶段| -如果你需要抑制一些规则(例如,行长需要更长),那么你就可以在`${project.root}/src/checkstyle/checkstyle-suppressions.xml`下定义一个带有抑制的文件。示例: +如果你需要抑制一些规则(例如行长需要更长),那么在`${project.root}/src/checkstyle/checkstyle-suppressions.xml`下定义一个文件就足够了。示例: projectRoot/SRC/checkstyle/checkstyle-suppresions.xml @@ -1638,13 +1616,13 @@ $ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/ $ touch .springformat ``` -### [](#ide-setup)[20.5. IDE setup](#ide-setup) ### +### [](#ide-setup)[20.5.IDE 设置](#ide-setup) -#### [](#intellij-idea)[20.5.1.Intellij 思想](#intellij-idea) #### +#### [](#intellij-idea)[20.5.1.Intellij 思想](#intellij-idea) 为了设置 IntelliJ,你应该导入我们的编码约定、检查配置文件并设置 CheckStyle 插件。以下文件可以在[Spring Cloud Build](https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools)项目中找到。 -Spring-云构建工具/ +Spring-Cloud-Build-Tools/ ``` └── src @@ -1684,22 +1662,22 @@ checkstyle ![Checkstyle](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/docs/src/main/asciidoc/images/intellij-checkstyle.png) -转到`File``Settings``Other settings``Checkstyle`。点击`Configuration file`区域中的`+`图标。在这里,你必须定义应该从哪里选择 CheckStyle 规则。在上面的图片中,我们从克隆的 Spring 云构建存储库中选择了规则。但是,你可以指向 Spring Cloud Build 的 GitHub 存储库(例如`checkstyle.xml`:`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml)`)。我们需要提供以下变量: +转到`File``Settings``Other settings``Checkstyle`。点击`Configuration file`部分中的`+`图标。在这里,你必须定义应该从哪里选择 CheckStyle 规则。在上面的图片中,我们从克隆的 Spring Cloud构建存储库中选择了规则。但是,你可以指向 Spring Cloud Build 的 GitHub 存储库(例如`checkstyle.xml`:`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml)`)。我们需要提供以下变量: * `checkstyle.header.file`-请将其指向 Spring Cloud Build 的`spring-cloud-build-tools/src/main/resources/checkstyle-header.txt`文件,可以在你的克隆 repo 中,也可以通过`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt)`URL。 -* `checkstyle.suppressions.file`-默认抑制。请将它指向 Spring Cloud Build 的`spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml`文件,或者在你的克隆 repo 中,或者通过`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml)`URL。 +* `checkstyle.suppressions.file`-默认抑制。请将它指向 Spring Cloud build 的`spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml`文件,或者在你的克隆 repo 中,或者通过`[raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml)`URL。 * `checkstyle.additional.suppressions.file`-此变量对应于本地项目中的抑制。例如,你正在处理`spring-cloud-contract`。然后指向`project-root/src/checkstyle/checkstyle-suppressions.xml`文件夹。`spring-cloud-contract`的例子是:`/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`。 | |请记住将`Scan Scope`设置为`All sources`,因为我们为生产和测试源应用了 checkstyle 规则。| |---|------------------------------------------------------------------------------------------------------------------| -### [](#duplicate-finder)[20.6.重复查找器](#duplicate-finder) ### +### [](#duplicate-finder)[20.6.重复查找器](#duplicate-finder) -Spring 云构建带来了`basepom:duplicate-finder-maven-plugin`,这使得能够在 Java Classpath 上标记重复的和冲突的类和资源。 +Spring Cloud构建带来了`basepom:duplicate-finder-maven-plugin`,这使得能够在 Java Classpath 上标记重复的和冲突的类和资源。 -#### [](#duplicate-finder-configuration)[20.6.1.重复查找器配置](#duplicate-finder-configuration) #### +#### [](#duplicate-finder-configuration)[20.6.1.重复查找器配置](#duplicate-finder-configuration) 重复查找器是**默认启用**,将在 Maven 构建的`verify`阶段运行,但是只有在项目的`duplicate-finder-maven-plugin`部分中添加`duplicate-finder-maven-plugin`,它才会在项目中生效。 @@ -1741,3 +1719,5 @@ POM.xml ``` + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-netflix.md b/docs/spring-cloud/spring-cloud-netflix.md index ed0e2afb70d4792742ae70d9b9fe007a4fd859e2..68d8ba16eceee5f72616fa48ce573d4f15d4ae75 100644 --- a/docs/spring-cloud/spring-cloud-netflix.md +++ b/docs/spring-cloud/spring-cloud-netflix.md @@ -1,18 +1,18 @@ -Spring 云 Netflix -========== +# Spring Cloud Netflix + +**3.1.1** 该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 Netflix OSS 集成。通过一些简单的注释,你可以快速启用和配置应用程序中的常见模式,并使用经过战斗测试的 Netflix 组件构建大型分布式系统。提供的模式包括服务发现。 -[](#service-discovery-eureka-clients)[1.服务发现:尤里卡客户](#service-discovery-eureka-clients) ----------- +## [](#service-discovery-eureka-clients)[1.服务发现:尤里卡客户](#service-discovery-eureka-clients) 服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户机或某种形式的约定可能很难做到,并且可能很脆弱。Eureka 是 Netflix 的服务发现服务器和客户端。可以将服务器配置和部署为高度可用,每个服务器都将有关已注册服务的状态复制到其他服务器。 -### [](#netflix-eureka-client-starter)[1.1.如何包含 Eureka 客户端](#netflix-eureka-client-starter) ### +### [](#netflix-eureka-client-starter)[1.1.如何包含 Eureka 客户端](#netflix-eureka-client-starter) -要在项目中包含 Eureka 客户机,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-netflix-eureka-client`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 +要在项目中包含 Eureka 客户机,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-netflix-eureka-client`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring Cloud发布系列设置构建系统的详细信息。 -### [](#registering-with-eureka)[1.2.在尤里卡注册](#registering-with-eureka) ### +### [](#registering-with-eureka)[1.2.在尤里卡注册](#registering-with-eureka) 当客户机向 Eureka 注册时,它会提供有关自身的元数据——例如主机、端口、健康指示器 URL、主页和其他详细信息。Eureka 从属于某个服务的每个实例接收心跳消息。如果心跳在可配置的时间表上失败,那么实例通常会从注册表中删除。 @@ -48,22 +48,22 @@ eureka: 在前面的示例中,`defaultZone`是一个 magic string fallback 值,它为不表示偏好的任何客户机提供服务 URL(换句话说,它是一个有用的默认值)。 -| |`defaultZone`属性是区分大小写的,并且需要大小写,因为`serviceUrl`属性是`Map`。因此,`defaultZone`属性并不遵循正常的 Spring boot snake-case 约定`default-zone`。| +| |`defaultZone`属性是区分大小写的,并且需要大小写,因为`serviceUrl`属性是`Map`。因此,`defaultZone`属性不遵循正常的 Spring 引导 snake-case 约定`default-zone`。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 默认的应用程序名称(即服务 ID)、虚拟主机和非安全端口(取自`Environment`)分别为`${spring.application.name}`、`${spring.application.name}`和`${server.port}`。 -在 Classpath 上有`spring-cloud-starter-netflix-eureka-client`使应用程序既成为一个 Eureka“实例”(即它自己注册),又成为一个“客户端”(它可以查询注册中心以找到其他服务)。实例行为是由`eureka.instance.*`配置键驱动的,但是如果你确保你的应用程序的值为`spring.application.name`(这是 Eureka 服务 ID 或 VIP 的默认值),那么默认值就可以了。 +在 Classpath 上有`spring-cloud-starter-netflix-eureka-client`使应用程序既成为一个 Eureka“实例”(即它自己注册),也成为一个“客户端”(它可以查询注册中心以找到其他服务)。实例行为是由`eureka.instance.*`配置键驱动的,但是如果你确保应用程序的值为`spring.application.name`(这是 Eureka 服务 ID 或 VIP 的默认值),那么默认值就可以了。 有关可配置选项的更多详细信息,请参见[Eurekainstanconfigbean](https://github.com/spring-cloud/spring-cloud-netflix/tree/main/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java)和[EurekaclientConfigBean](https://github.com/spring-cloud/spring-cloud-netflix/tree/main/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java)。 -要禁用 Eureka 发现客户端,可以将`eureka.client.enabled`设置为`false`。当`spring.cloud.discovery.enabled`设置为`false`时,Eureka 发现客户端也将被禁用。 +要禁用 Eureka 发现客户端,可以将`eureka.client.enabled`设置为`false`。当`spring.cloud.discovery.enabled`被设置为`false`时,Eureka 发现客户端也将被禁用。 -### [](#authenticating-with-the-eureka-server)[1.3.使用 Eureka 服务器进行身份验证](#authenticating-with-the-eureka-server) ### +### [](#authenticating-with-the-eureka-server)[1.3.使用 Eureka 服务器进行身份验证](#authenticating-with-the-eureka-server) 如果`eureka.client.serviceUrl.defaultZone`URL 中有一个内嵌凭据(curl 样式,如下所示:`[user:[email protected]:8761/eureka](https://user:password@localhost:8761/eureka)`),则 HTTP Basic 身份验证将自动添加到 Eureka 客户机。对于更复杂的需求,可以创建`@Bean`类型的`DiscoveryClientOptionalArgs`,并将`ClientFilter`实例注入其中,所有这些都应用于从客户机到服务器的调用。 -当 Eureka 服务器需要客户端证书进行身份验证时,可以通过属性配置客户端证书和信任存储区,如以下示例所示: +当 Eureka 服务器需要客户端证书来进行身份验证时,可以通过属性来配置客户端证书和信任存储区,如以下示例所示: 应用程序.yml @@ -88,9 +88,9 @@ eureka: 如果你想定制 Eureka HTTP 客户端使用的 RESTTemplate,那么你可能想要创建`EurekaClientHttpRequestFactorySupplier`的 Bean,并为生成`ClientHttpRequestFactory`实例提供你自己的逻辑。 -### [](#status-page-and-health-indicator)[1.4.状态页和健康指标](#status-page-and-health-indicator) ### +### [](#status-page-and-health-indicator)[1.4.状态页和健康指标](#status-page-and-health-indicator) -Eureka 实例的状态页和健康指示器分别默认为`/info`和`/health`,这是 Spring 引导执行器应用程序中有用端点的默认位置。你需要更改这些,即使对于执行器应用程序,如果你使用非默认的上下文路径或 Servlet 路径(例如`server.servletPath=/custom`),也需要进行更改。下面的示例显示了这两个设置的默认值: +Eureka 实例的状态页和健康指示器分别默认为`/info`和`/health`,这是 Spring 引导执行器应用程序中有用端点的默认位置。你需要更改这些,即使对于执行器应用程序,如果你使用非默认的上下文路径或 Servlet 路径(例如`server.servletPath=/custom`),也需要更改这些内容。下面的示例显示了这两个设置的默认值: 应用程序.yml @@ -106,7 +106,7 @@ eureka: | |在 Dalston 中,当更改
管理上下文路径时,还需要设置状态和健康检查 URL。这一要求从 Edgware 开始就被删除了。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#registering-a-secure-application)[1.5.注册安全应用程序](#registering-a-secure-application) ### +### [](#registering-a-secure-application)[1.5.注册安全应用程序](#registering-a-secure-application) 如果你的应用程序希望通过 HTTPS 进行联系,则可以在`EurekaInstanceConfigBean`中设置两个标志: @@ -130,12 +130,12 @@ eureka: (请注意,`${eureka.hostname}`是一个本机占位符,仅在 Eureka 的后续版本中可用。你也可以使用 Spring 占位符实现同样的功能——例如,通过使用`${eureka.instance.hostName}`。 -| |如果你的应用程序运行在代理之后,并且 SSL 终止在代理中(例如,如果你在 Cloud Foundry 或其他平台即服务中运行),然后,你需要确保代理“转发”头文件被应用程序拦截并处理。
如果嵌入在 Spring 启动应用程序中的 Tomcat 容器对“X-forwarded-\\**”头文件有明确的配置,这种情况会自动发生。
应用程序向自身呈现的链接是错误的(错误的主机,Port 或 Protocol)是你错误配置的标志。| +| |如果你的应用程序运行在代理之后,并且 SSL 终止在代理中(例如,如果你在 Cloud Foundry 或其他平台即服务中运行),然后,你需要确保代理“转发”头文件被应用程序拦截并处理。
如果嵌入在 Spring 启动应用程序中的 Tomcat 容器对“X-forwarded-\\*”头文件有明确的配置,则会自动发生这种情况。
应用程序向自身呈现的链接是错误的(错误的主机,Port 或 Protocol)是你错误配置的标志。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#eurekas-health-checks)[1.6.尤里卡的健康检查](#eurekas-health-checks) ### +### [](#eurekas-health-checks)[1.6.尤里卡的健康检查](#eurekas-health-checks) -默认情况下,Eureka 使用客户端心跳来确定客户端是否启动。除非另有指定,否则发现客户端不会根据 Spring 引导执行器传播应用程序的当前健康检查状态。因此,在成功注册之后,Eureka 总是宣布该应用程序处于“启动”状态。可以通过启用 Eureka 健康检查来改变此行为,从而将应用程序状态传播到 Eureka。因此,其他所有应用程序都不会将通信量发送到其他“向上”状态的应用程序。下面的示例展示了如何为客户机启用健康检查: +默认情况下,Eureka 使用客户端心跳来确定客户端是否启动。除非另有指定,否则发现客户端不会根据 Spring 引导执行器传播应用程序的当前健康检查状态。因此,在成功注册之后,Eureka 总是宣布该应用程序处于“启动”状态。可以通过启用 Eureka 健康检查来改变此行为,从而将应用程序状态传播到 Eureka。因此,其他所有应用程序都不会将流量发送到其他“向上”状态的应用程序。下面的示例展示了如何为客户机启用健康检查: 应用程序.yml @@ -151,11 +151,11 @@ eureka: 如果你需要对健康检查进行更多的控制,请考虑实现你自己的`com.netflix.appinfo.HealthCheckHandler`。 -### [](#eureka-metadata-for-instances-and-clients)[1.7.用于实例和客户机的 Eureka 元数据](#eureka-metadata-for-instances-and-clients) ### +### [](#eureka-metadata-for-instances-and-clients)[1.7.用于实例和客户机的 Eureka 元数据](#eureka-metadata-for-instances-and-clients) 值得花一些时间来了解 Eureka 元数据是如何工作的,这样你就可以以一种在你的平台中有意义的方式使用它。对于诸如主机名、IP 地址、端口号、状态页和健康检查等信息,有标准的元数据。它们发布在服务注册中心中,并由客户机使用,以一种简单的方式与服务联系。可以在`eureka.instance.metadataMap`中将其他元数据添加到实例注册中,并且可以在远程客户端中访问此元数据。通常,附加的元数据不会改变客户机的行为,除非使客户机意识到元数据的含义。有几个特殊情况(在本文后面描述),其中 Spring Cloud 已经为元数据映射分配了含义。 -#### [](#using-eureka-on-cloud-foundry)[1.7.1.在 Cloud Foundry 上使用 Eureka](#using-eureka-on-cloud-foundry) #### +#### [](#using-eureka-on-cloud-foundry)[1.7.1.在 Cloud Foundry 上使用 Eureka](#using-eureka-on-cloud-foundry) Cloud Foundry 有一个全球路由器,因此同一应用程序的所有实例都具有相同的主机名(具有类似架构的其他 PaaS 解决方案具有相同的安排)。这不一定是使用 Eureka 的障碍。但是,如果你使用路由器(根据你的平台设置方式,推荐甚至强制使用),则需要显式地设置主机名和端口号(安全或非安全),以便它们使用路由器。你可能还希望使用实例元数据,以便能够区分客户机上的实例(例如,在自定义负载均衡器中)。默认情况下,`eureka.instance.instanceId`是`vcap.application.instance_id`,如下例所示: @@ -170,7 +170,7 @@ eureka: 根据在 Cloud Foundry 实例中设置安全规则的方式,你可能能够注册并使用主机 VM 的 IP 地址进行直接的服务到服务调用。此功能在 Pivotal Web 服务上还不可用([PWS](https://run.pivotal.io))。 -#### [](#using-eureka-on-aws)[1.7.2.在 AWS 上使用 Eureka](#using-eureka-on-aws) #### +#### [](#using-eureka-on-aws)[1.7.2.在 AWS 上使用 Eureka](#using-eureka-on-aws) 如果计划将应用程序部署到 AWS 云中,那么必须将 Eureka 实例配置为 AWS 感知的。你可以通过如下方式定制[Eurekainstanconfigbean](https://github.com/spring-cloud/spring-cloud-netflix/tree/main/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java)来实现此目的: @@ -185,7 +185,7 @@ public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) { } ``` -#### [](#changing-the-eureka-instance-id)[1.7.3.更改 Eureka 实例 ID](#changing-the-eureka-instance-id) #### +#### [](#changing-the-eureka-instance-id)[1.7.3.更改 Eureka 实例 ID](#changing-the-eureka-instance-id) 一个普通的 Netflix Eureka 实例注册的 ID 等于其主机名(也就是说,每个主机只有一个服务)。 Spring Cloud Eureka 提供了一个合理的默认值,其定义如下: @@ -203,11 +203,11 @@ eureka: instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} ``` -使用前面示例中显示的元数据和在 LocalHost 上部署的多个服务实例,将在其中插入随机值,以使实例具有唯一性。在 Cloud Foundry 中,`vcap.application.instance_id`在 Spring 引导应用程序中自动填充,因此不需要随机值。 +使用前面示例中显示的元数据和在 LocalHost 上部署的多个服务实例,将在其中插入随机值,以使实例是唯一的。在 Cloud Foundry 中,`vcap.application.instance_id`在 Spring 引导应用程序中自动填充,因此不需要随机值。 -### [](#using-the-eurekaclient)[1.8.使用 Eurekaclient](#using-the-eurekaclient) ### +### [](#using-the-eurekaclient)[1.8.使用 Eurekaclient](#using-the-eurekaclient) -一旦你有了一个作为发现客户机的应用程序,你就可以使用它从[Eureka Server](#spring-cloud-eureka-server)中发现服务实例。这样做的一种方法是使用本机`com.netflix.discovery.EurekaClient`(而不是 Spring 云`DiscoveryClient`),如以下示例所示: +一旦你拥有了一个作为发现客户机的应用程序,就可以使用它从[尤里卡服务器](#spring-cloud-eureka-server)中发现服务实例。这样做的一种方法是使用本机`com.netflix.discovery.EurekaClient`(而不是 Spring Cloud`DiscoveryClient`),如以下示例所示: ``` @Autowired @@ -219,10 +219,10 @@ public String serviceUrl() { } ``` -| |不要在`@PostConstruct`方法或`@Scheduled`方法(或尚未启动`ApplicationContext`的任何地方)中使用`EurekaClient`。
它是在`SmartLifecycle`(与`phase=0`一起)中初始化的,因此,最早可以依赖它的是在另一个具有更高相位的`SmartLifecycle`中。| +| |不要在`@PostConstruct`方法或`@Scheduled`方法(或尚未启动`ApplicationContext`的任何地方)中使用`EurekaClient`。
它是在`SmartLifecycle`中初始化的(带有`phase=0`),因此,最早可以依赖它的是在另一个具有更高相位的`SmartLifecycle`中。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#eurekaclient-with-jersey)[1.8.1.穿着球衣的 Eurekaclient](#eurekaclient-with-jersey) #### +#### [](#eurekaclient-with-jersey)[1.8.1.穿着球衣的 Eurekaclient](#eurekaclient-with-jersey) 默认情况下,Eurekaclient 使用 Spring 的`RestTemplate`进行 HTTP 通信。如果希望使用 Jersey,则需要将 Jersey 依赖项添加到 Classpath 中。下面的示例显示了你需要添加的依赖关系: @@ -241,11 +241,11 @@ public String serviceUrl() {
``` -### [](#alternatives-to-the-native-netflix-eurekaclient)[1.9.原生 Netflix Eurekaclient 的替代品](#alternatives-to-the-native-netflix-eurekaclient) ### +### [](#alternatives-to-the-native-netflix-eurekaclient)[1.9.原生 Netflix Eurekaclient 的替代品](#alternatives-to-the-native-netflix-eurekaclient) -你不需要使用原始的 Netflix`EurekaClient`。而且,通常在某种包装纸后面使用它会更方便。 Spring 云通过逻辑 Eureka 服务标识符(VIPS)而不是物理 URL 支持(一个 REST 客户机构建器)和。 +你不需要使用原始的 Netflix`EurekaClient`。而且,通常在某种包装纸后面使用它会更方便。 Spring Cloud通过逻辑 Eureka 服务标识符(VIPS)而不是物理 URL 支持(REST 客户端构建器)和[[[ Spring ](# Spring-cloud-ribbon)。 -你也可以使用`org.springframework.cloud.client.discovery.DiscoveryClient`,它为 Discovery 客户机提供了一个简单的 API(不特定于 Netflix),如以下示例所示: +你也可以使用`org.springframework.cloud.client.discovery.DiscoveryClient`,它为 Discovery 客户端提供了一个简单的 API(不特定于 Netflix),如以下示例所示: ``` @Autowired @@ -260,11 +260,11 @@ public String serviceUrl() { } ``` -### [](#why-is-it-so-slow-to-register-a-service)[1.10.为什么注册服务这么慢?](#why-is-it-so-slow-to-register-a-service) ### +### [](#why-is-it-so-slow-to-register-a-service)[1.10.为什么注册服务这么慢?](#why-is-it-so-slow-to-register-a-service) 作为一个实例,注册中心还需要一个周期性的心跳(通过客户机的`serviceUrl`),默认持续时间为 30 秒。在实例、服务器和客户机的本地缓存中都有相同的元数据(因此可能需要 3 次心跳)之前,客户端无法发现服务。你可以通过设置`eureka.instance.leaseRenewalIntervalInSeconds`来更改句号。将它设置为小于 30 的值可以加快客户连接到其他服务的过程。在生产中,最好坚持使用默认值,因为服务器中的内部计算对租赁续约期进行了假设。 -### [](#zones)[1.11. Zones](#zones) ### +### [](#zones)[1.11.区域](#zones) 如果你已经将 Eureka 客户机部署到多个区域,那么你可能希望这些客户机在尝试另一个区域中的服务之前,先在同一个区域中使用服务。要设置它,你需要正确配置你的 Eureka 客户机。 @@ -286,26 +286,25 @@ eureka.instance.metadataMap.zone = zone2 eureka.client.preferSameZoneEureka = true ``` -### [](#refreshing-eureka-clients)[1.12.刷新 Eureka 客户端](#refreshing-eureka-clients) ### +### [](#refreshing-eureka-clients)[1.12.刷新 Eureka 客户端](#refreshing-eureka-clients) 默认情况下,`EurekaClient` Bean 是可刷新的,这意味着可以更改和刷新 Eureka 客户机属性。当刷新发生时,客户端将从 Eureka 服务器上被取消注册,并且可能会有一个短暂的时刻,其中给定服务的所有实例都不可用。避免这种情况发生的一种方法是禁用刷新 Eureka 客户机的功能。要执行此设置`eureka.client.refresh.enable=false`。 -### [](#using-eureka-with-spring-cloud-loadbalancer)[1.13. Using Eureka with Spring Cloud LoadBalancer](#using-eureka-with-spring-cloud-loadbalancer) ### +### [](#using-eureka-with-spring-cloud-loadbalancer)[1.13. Using Eureka with Spring Cloud LoadBalancer](#using-eureka-with-spring-cloud-loadbalancer) -我们为 Spring Cloud LoadBalancer`ZonePreferenceServiceInstanceListSupplier`提供支持。来自 Eureka 实例元数据的`zone`值用于设置`spring-cloud-loadbalancer-zone`属性的值,该属性用于按区域筛选服务实例。 +我们为 Spring Cloud LoadBalancer`ZonePreferenceServiceInstanceListSupplier`提供支持。来自 Eureka 实例元数据(`eureka.instance.metadataMap.zone`)的`zone`值用于设置`spring-cloud-loadbalancer-zone`属性的值,该属性用于按区域筛选服务实例。 如果缺少此项,并且如果`spring.cloud.loadbalancer.eureka.approximateZoneFromHostname`标志设置为`true`,则可以使用来自服务器主机名的域名作为该区域的代理。 如果没有其他区域数据源,则根据客户机配置(而不是实例配置)进行猜测。我们使用`eureka.client.availabilityZones`,这是从区域名称到区域列表的映射,并为实例自己的区域(即`eureka.client.region`,默认为“US-East-1”,以兼容原生 Netflix)拉出第一个区域。 -[](#spring-cloud-eureka-server)[2.服务发现:Eureka 服务器](#spring-cloud-eureka-server) ----------- +## [](#spring-cloud-eureka-server)[2.服务发现:Eureka 服务器](#spring-cloud-eureka-server) 本节介绍如何设置 Eureka 服务器。 -### [](#netflix-eureka-server-starter)[2.1.如何包含 Eureka 服务器](#netflix-eureka-server-starter) ### +### [](#netflix-eureka-server-starter)[2.1.如何包含 Eureka 服务器](#netflix-eureka-server-starter) -要在项目中包含 Eureka 服务器,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-netflix-eureka-server`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring 云发布列设置构建系统的详细信息。 +要在项目中包含 Eureka 服务器,请使用组 ID 为`org.springframework.cloud`和工件 ID 为`spring-cloud-starter-netflix-eureka-server`的 starter。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/)以获取有关使用当前 Spring Cloud发布列设置构建系统的详细信息。 | |如果你的项目已经使用 ThymeLeaf 作为其模板引擎,那么 Eureka 服务器的 Freemarker 模板可能无法正确加载。在这种情况下,需要手动配置模板加载器:| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -319,7 +318,7 @@ spring: prefer-file-system-access: false ``` -### [](#spring-cloud-running-eureka-server)[2.2.如何运行 Eureka 服务器](#spring-cloud-running-eureka-server) ### +### [](#spring-cloud-running-eureka-server)[2.2.如何运行 Eureka 服务器](#spring-cloud-running-eureka-server) 下面的示例展示了一个最小的 Eureka 服务器: @@ -337,20 +336,20 @@ public class Application { 该服务器有一个主页,在`/eureka/*`下具有正常 Eureka 功能的 UI 和 HTTP API 端点。 -以下链接有一些 Eureka 背景读数:[flux capacitor](https://github.com/cfregly/fluxcapacitor/wiki/NetflixOSS-FAQ#eureka-service-discovery-load-balancer)和[谷歌小组讨论](https://groups.google.com/forum/?fromgroups#!topic/eureka_netflix/g3p2r7gHnN0)。 +以下链接有一些 Eureka 背景读数:[磁通电容器](https://github.com/cfregly/fluxcapacitor/wiki/NetflixOSS-FAQ#eureka-service-discovery-load-balancer)和[谷歌小组讨论](https://groups.google.com/forum/?fromgroups#!topic/eureka_netflix/g3p2r7gHnN0)。 -| |由于 Gradle 的依赖关系解析规则和缺乏父 BOM 功能,依赖于`spring-cloud-starter-netflix-eureka-server`可能会导致应用程序启动失败。
来解决此问题,添加 Spring 引导 Gradle 插件并导入 Spring Cloud Starter 父 bom 如下:

build. Gradle

``
buildscript{
依赖关系{<
Classpath(“org.springframework.: Spring-boot- Gradle-plugin:<< Spring-gt-gt-DOCS-version r=”177“/><>r=”>“>”><<<<<<178">r=”/>">>>>>><<| +| |由于 Gradle 的依赖关系解析规则和缺乏父 BOM 功能,依赖于`spring-cloud-starter-netflix-eureka-server`可能会导致应用程序启动失败。
要解决此问题,请添加 Spring boot Gradle 插件并按以下方式导入 Spring Cloud启动父 BOM:

build. Gradle

```
buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:{spring-boot-docs-version}")
}
}

apply plugin: "spring-boot"

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:{spring-cloud-version}"
}
}
```| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#spring-cloud-eureka-server-zones-and-regions)[2.3.高可用性、区域和区域](#spring-cloud-eureka-server-zones-and-regions) ### +### [](#spring-cloud-eureka-server-zones-and-regions)[2.3.高可用性、区域和区域](#spring-cloud-eureka-server-zones-and-regions) Eureka 服务器没有后端存储,但是注册表中的服务实例都必须发送心跳以保持其注册的最新状态(因此可以在内存中完成)。客户机还具有 Eureka 注册的内存缓存(因此,对于服务的每一个请求,客户机都不需要访问注册表)。 默认情况下,每个 Eureka 服务器也是一个 Eureka 客户机,并且需要(至少一个)服务 URL 来定位对等方。如果你不提供它,那么该服务就会运行并正常工作,但是它会在你的日志中充满大量关于无法向对等方注册的噪音。 -### [](#spring-cloud-eureka-server-standalone-mode)[2.4.独立模式](#spring-cloud-eureka-server-standalone-mode) ### +### [](#spring-cloud-eureka-server-standalone-mode)[2.4.独立模式](#spring-cloud-eureka-server-standalone-mode) -这两个缓存(客户机和服务器)和心跳的组合使独立的 Eureka 服务器能够相当好地抵御故障,只要有某种监视器或弹性运行时(例如 Cloud Foundry)来保持它的活力。在独立模式下,你可能更喜欢关闭客户端行为,这样它就不会继续尝试而无法与其对等方联系。下面的示例展示了如何关闭客户端行为: +这两个缓存(客户机和服务器)和心跳的结合,使得独立的 Eureka 服务器能够很好地抵御故障,只要有某种监视器或弹性运行时(例如 Cloud Foundry)来保持它的活力。在独立模式下,你可能更喜欢关闭客户端行为,这样它就不会继续尝试而无法与其对等方联系。下面的示例展示了如何关闭客户端行为: application.yml(独立的 Eureka 服务器) @@ -370,7 +369,7 @@ eureka: 请注意,`serviceUrl`指向与本地实例相同的主机。 -### [](#spring-cloud-eureka-server-peer-awareness)[2.5.同伴意识](#spring-cloud-eureka-server-peer-awareness) ### +### [](#spring-cloud-eureka-server-peer-awareness)[2.5.同伴意识](#spring-cloud-eureka-server-peer-awareness) 通过运行多个实例并要求它们彼此注册,可以使 Eureka 更具弹性和可用性。实际上,这是默认的行为,因此要使其工作,你所需要做的就是向对等方添加一个有效的`serviceUrl`,如下面的示例所示: @@ -398,9 +397,9 @@ eureka: defaultZone: https://peer1/eureka/ ``` -在前面的示例中,我们有一个 YAML 文件,通过在不同的 Spring 配置文件中运行它,可以使用该文件在两台主机(`Peer1’和)上运行相同的服务器。通过操纵`/etc/hosts`来解析主机名,你可以使用此配置来测试单个主机上的对等感知(在生产中这样做没有太大价值)。实际上,如果你在知道自己的主机名的机器上运行`eureka.instance.hostname`,则不需要`eureka.instance.hostname`(默认情况下,通过使用`java.net.InetAddress`查找)。 +在前面的示例中,我们有一个 YAML 文件,通过在不同的 Spring 配置文件中运行它,可以使用该文件在两个主机上运行相同的服务器(`peer1`和`peer2`)。通过操纵`/etc/hosts`来解析主机名,你可以使用此配置来测试单个主机上的对等感知(在生产中这样做没有太大价值)。实际上,如果你在知道自己的主机名的机器上运行`eureka.instance.hostname`,则不需要`eureka.instance.hostname`(默认情况下,通过使用`java.net.InetAddress`来查找它)。 -你可以向系统中添加多个对等节点,并且,只要它们都通过至少一个边缘彼此连接,它们就会在它们之间同步注册。如果对等点在物理上是分开的(在一个数据中心内部或多个数据中心之间),那么原则上,系统可以经受住“分裂大脑”式的故障。你可以将多个对等节点添加到系统中,并且只要它们都直接连接到彼此,它们就会在它们之间同步注册。 +你可以向系统中添加多个对等节点,并且,只要它们都通过至少一个边缘彼此连接,它们就会在它们之间同步注册。如果对等点在物理上是分开的(在一个数据中心内部或多个数据中心之间),那么原则上,系统可以经受住“分裂大脑”式的故障。你可以向系统中添加多个对等节点,并且只要它们都直接相互连接,它们就会在它们之间同步注册。 应用程序.yml(三个对等的 Eureka 服务器) @@ -432,16 +431,16 @@ eureka: hostname: peer3 ``` -### [](#spring-cloud-eureka-server-prefer-ip-address)[2.6.何时选择 IP 地址](#spring-cloud-eureka-server-prefer-ip-address) ### +### [](#spring-cloud-eureka-server-prefer-ip-address)[2.6.何时选择 IP 地址](#spring-cloud-eureka-server-prefer-ip-address) 在某些情况下,对 Eureka 来说,更好的方法是宣传服务的 IP 地址,而不是主机名。将`eureka.instance.preferIpAddress`设置为`true`,并且,当应用程序向 Eureka 注册时,它使用其 IP 地址而不是其主机名。 | |如果主机名不能由 Java 确定,则将 IP 地址发送到 Eureka。
设置主机名的唯一方法是通过设置`eureka.instance.hostname`属性。
你可以在运行时使用环境变量设置你的主机名——例如,`eureka.instance.hostname=${HOST_NAME}`。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#securing-the-eureka-server)[2.7.保护 Eureka 服务器](#securing-the-eureka-server) ### +### [](#securing-the-eureka-server)[2.7.保护 Eureka 服务器](#securing-the-eureka-server) -你只需通过`spring-boot-starter-security`将 Spring 安全性添加到你的服务器的 Classpath,就可以保护你的 Eureka 服务器。默认情况下,当 Spring 安全性位于 Classpath 上时,它将要求在向应用程序发送每个请求时都发送一个有效的 CSRF 令牌。Eureka 客户机通常不会拥有有效的跨站点请求伪造令牌,你将需要为`/eureka/**`端点禁用此要求。例如: +你只需通过`spring-boot-starter-security`将 Spring 安全性添加到你的服务器的 Classpath,就可以保护你的 Eureka 服务器。默认情况下,当 Spring 安全性在 Classpath 上时,它将要求在向应用程序发送每个请求时都发送一个有效的 CSRF 令牌。Eureka 客户机通常不会拥有有效的跨站点请求伪造令牌,你将需要为`/eureka/**`端点禁用此要求。例如: ``` @EnableWebSecurity @@ -457,9 +456,9 @@ class WebSecurityConfig extends WebSecurityConfigurerAdapter { 有关 CSRF 的更多信息,请参见[Spring Security documentation](https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf)。 -可以在 Spring 云样本[repo](https://github.com/spring-cloud-samples/eureka/tree/Eureka-With-Security)中找到演示 Eureka 服务器。 +可以在 Spring Cloud样本[repo](https://github.com/spring-cloud-samples/eureka/tree/Eureka-With-Security)中找到演示 Eureka 服务器。 -### [](#jdk-11-support)[2.8.JDK11 支援](#jdk-11-support) ### +### [](#jdk-11-support)[2.8.JDK11 支援](#jdk-11-support) 在 JDK11 中删除了 Eureka 服务器所依赖的 JAXB 模块。如果打算在运行 Eureka 服务器时使用 JDK11,则必须在 POM 或 Gradle 文件中包含这些依赖关系。 @@ -470,7 +469,8 @@ class WebSecurityConfig extends WebSecurityConfigurerAdapter {
``` -[](#configuration-properties)[3.配置属性](#configuration-properties) ----------- +## [](#configuration-properties)[3.配置属性](#configuration-properties) 要查看所有 Spring Cloud Netflix 相关配置属性的列表,请检查[附录页](appendix.html)。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-openfeign.md b/docs/spring-cloud/spring-cloud-openfeign.md index c32bc1f5e8f6d4ebc3c85603a52d0a6394af795f..bb18037af44720321f805c695cbc02c5e90876bd 100644 --- a/docs/spring-cloud/spring-cloud-openfeign.md +++ b/docs/spring-cloud/spring-cloud-openfeign.md @@ -1,16 +1,16 @@ -Spring 云 OpenFeign -========== +# Spring Cloud OpenFeign + +**3.1.1** 该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 OpenFeign 集成。 -[](#spring-cloud-feign)[1.声明式 REST 客户端:假装](#spring-cloud-feign) ----------- +## [](#spring-cloud-feign)[1.声明式 REST 客户端:假装](#spring-cloud-feign) -[Feign](https://github.com/OpenFeign/feign)是一个声明性 Web 服务客户机。它使编写 Web 服务客户机变得更加容易。要使用 feign 创建一个界面并对其进行注释。它具有可插入的注释支持,包括伪装注释和 JAX-RS 注释。Feign 还支持可插拔的编码器和解码器。 Spring Cloud 增加了对 Spring MVC 注释的支持,并支持使用与 Spring Web 中默认使用的`HttpMessageConverters`相同的`HttpMessageConverters`。 Spring Cloud 集成了 Eureka、 Spring Cloud Circuitbreaker 以及 Spring Cloud LoadBalancer,以在使用 Feign 时提供负载平衡的 HTTP 客户端。 +[Feign](https://github.com/OpenFeign/feign)是一个声明性 Web 服务客户机。它使编写 Web 服务客户机变得更加容易。要使用 feign 创建一个界面并对其进行注释。它具有可插入的注释支持,包括伪装注释和 JAX-RS 注释。Feign 还支持可插拔的编码器和解码器。 Spring Cloud 增加了对 Spring MVC 注释的支持,并支持使用与 Spring Web 中默认使用的相同的`HttpMessageConverters`。 Spring Cloud集成了 Eureka、 Spring Cloud电路断路器,以及 Spring Cloud负载平衡器,以在使用 Feign 时提供负载平衡的 HTTP 客户端。 -### [](#netflix-feign-starter)[1.1.如何包含佯装](#netflix-feign-starter) ### +### [](#netflix-feign-starter)[1.1.如何包含佯装](#netflix-feign-starter) -要在项目中包含假动作,请使用组合`org.springframework.cloud`和工件 ID`spring-cloud-starter-openfeign`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring 云发布系列设置构建系统的详细信息。 +要在项目中包含假动作,请使用组合`org.springframework.cloud`和工件 ID`spring-cloud-starter-openfeign`的启动器。请参阅[Spring Cloud Project page](https://projects.spring.io/spring-cloud/),以获取有关使用当前 Spring Cloud发布系列设置构建系统的详细信息。 示例 Spring 启动应用程序 @@ -47,18 +47,18 @@ public interface StoreClient { 在`@FeignClient`注释中,字符串值(上面的“存储”)是一个任意的客户端名称,用于创建[Spring Cloud LoadBalancer client](https://github.com/spring-cloud/spring-cloud-commons/blob/main/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java)。你还可以使用`url`属性(绝对值或只是一个主机名)指定一个 URL。应用程序上下文中 Bean 的名称是接口的完全限定名称。要指定你自己的别名值,你可以使用`qualifiers`注释的`@FeignClient`值。 -上面的负载平衡器客户机将希望发现“存储”服务的物理地址。如果你的应用程序是 Eureka 客户机,那么它将解析 Eureka 服务注册中心中的服务。如果不想使用 Eureka,可以使用[“简单发现”](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#simplediscoveryclient)在外部配置中配置服务器列表。 +上面的负载平衡器客户机将希望发现“存储”服务的物理地址。如果你的应用程序是 Eureka 客户机,那么它将解析 Eureka 服务注册中心中的服务。如果不想使用 Eureka,可以使用[`SimpleDiscoveryClient`](https://DOCS. Spring.io/ Spring-cloud-commons/DOCS/current/reference/html/#SimpleDiscoveryclient)在外部配置中配置一个服务器列表。 Spring Cloud OpenFeign 支持用于 Spring Cloud LoadBalancer 的阻塞模式的所有可用功能。你可以在[项目文件](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)中阅读有关它们的更多信息。 -| |要在`@EnableFeignClients`上使用`@Configuration`-annotated-classes 注释,请确保指定客户机的位置,例如:@enableFeignclients(basepackages=“com.example.clients”),或显式列出它们:@enableFeignclients(clients=inventoryserviceFeignclient.class)| +| |要在`@Configuration`-annotated-classes 上使用`@EnableFeignClients`注释,请确保指定客户机的位置,例如:`@EnableFeignClients(basePackages = "com.example.clients")`或显式列出它们:`@EnableFeignClients(clients = InventoryServiceFeignClient.class)`| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#spring-cloud-feign-overriding-defaults)[1.2.覆盖假装默认值](#spring-cloud-feign-overriding-defaults) ### +### [](#spring-cloud-feign-overriding-defaults)[1.2.覆盖假装默认值](#spring-cloud-feign-overriding-defaults) -Spring Cloud 的假装支持中的一个核心概念是命名客户端。每个假客户机都是组件集合的一部分,这些组件组合在一起工作,以便按需联系远程服务器,并且该集合有一个名称,你可以使用`@FeignClient`注释将其命名为应用程序开发人员。 Spring 云使用`FeignClientsConfiguration`按需为每个命名的客户机创建一个新的集成,作为 `ApplicationContext’。其中包括`feign.Decoder`、`feign.Encoder`和`feign.Contract`。通过使用`@FeignClient`注释的`contextId`属性,可以覆盖该集合的名称。 +Spring Cloud 的假装支持中的一个核心概念是命名客户端。每个假客户机都是组件集合的一部分,这些组件组合在一起工作,以便按需联系远程服务器,并且该集合有一个名称,你可以使用`@FeignClient`注释将其命名为应用程序开发人员。 Spring Cloud使用`FeignClientsConfiguration`按需为每个命名客户端创建一个新的集成,作为`ApplicationContext`。其中包括`feign.Decoder`、`feign.Encoder`和`feign.Contract`。通过使用`@FeignClient`注释的`contextId`属性,可以覆盖该集合的名称。 -Spring Cloud 允许你通过使用`@FeignClient`声明附加配置(在`FeignClientsConfiguration`之上)来完全控制假客户端。示例: +Spring Cloud 允许你通过使用`@FeignClient`声明额外的配置(在`FeignClientsConfiguration`之上)来完全控制假客户端。示例: ``` @FeignClient(name = "stores", configuration = FooConfiguration.class) @@ -72,7 +72,7 @@ public interface StoreClient { | |`FooConfiguration`不需要用`@Configuration`进行注释。但是,如果是,那么请注意将它从任何`@ComponentScan`中排除,否则将包括此配置,因为当指定时,它将成为`feign.Decoder`、`feign.Encoder`、`feign.Contract`等的默认源。这可以通过将其放在一个单独的、不重叠的包中来避免,而不是使用`@ComponentScan`或`@SpringBootApplication`,或者可以在`@ComponentScan`中显式地排除它。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| |使用`contextId``@FeignClient`注释的`contextId`属性,除了更改
的名称外,还将覆盖客户端名称
的别名,并将其用作为该客户端创建的配置 Bean 名称的一部分。| +| |使用`contextId``@FeignClient`注释的`contextId`属性,除了更改
的名称外,还将覆盖客户机名`ApplicationContext`的别名,并将其用作为该客户机创建的配置 Bean 名称的一部分。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |以前,使用`url`属性时,不需要`name`属性。现在需要使用`name`。| @@ -87,11 +87,11 @@ public interface StoreClient { } ``` -Spring Cloud OpenFeign 默认情况下为 Feign 提供以下 bean(`beantype`beanname:`ClassName`): +Spring Cloud OpenFeign 默认情况下为 Feign 提供以下 bean(`BeanType`beanname:`ClassName`): -* `Decoder`伪译码:`ResponseEntityDecoder`(其中包含一个`SpringDecoder`) +* `Decoder`伪译码:`ResponseEntityDecoder`(它包含一个`SpringDecoder`) -* `Encoder`伪编码器:`SpringEncoder` +* `Encoder`feignencoder:`SpringEncoder` * `Logger`伪装者:`Slf4jLogger` @@ -108,7 +108,7 @@ Spring Cloud OpenFeign 默认情况下为 Feign 提供以下 bean(`beantype`be | |`spring-cloud-starter-openfeign`支持`spring-cloud-starter-loadbalancer`。然而,作为一个可选的依赖项,如果你想使用它,你需要确保它已被添加到你的项目中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -通过将`feign.okhttp.enabled`或`feign.httpclient.enabled`或`feign.httpclient.hc5.enabled`分别设置为`true`,并将其设置在 Classpath 上,可以使用 OkHtttpClient 和 ApacheHttpClient 和 ApachehtpClient5 假客户端。你可以通过在使用 Apache 时提供`org.apache.http.impl.client.CloseableHttpClient`的 Bean 或在使用 OK HTTP 时提供`okhttp3.OkHttpClient`或在使用 Apache HC5 时提供`org.apache.hc.client5.http.impl.classic.CloseableHttpClient`的 Bean 来定制所使用的 HTTP 客户端。 +通过将`feign.okhttp.enabled`或`feign.httpclient.enabled`或`feign.httpclient.hc5.enabled`分别设置为`true`,并将它们设置在 Classpath 上,可以使用 OkHtttpClient 和 ApacheHttpClient 和 ApachehtpClient5 假客户端。你可以通过在使用 Apache 时提供`org.apache.http.impl.client.CloseableHttpClient`的 Bean 或在使用 OK HTTP 时提供`okhttp3.OkHttpClient`或在使用 Apache HC5 时提供`org.apache.hc.client5.http.impl.classic.CloseableHttpClient`的 Bean 来定制所使用的 HTTP 客户端。 Spring Cloud OpenFeign*不是*默认情况下提供以下 bean 用于伪装,但仍然从应用程序上下文中查找这些类型的 bean 以创建伪装客户端: @@ -126,11 +126,11 @@ Spring Cloud OpenFeign*不是*默认情况下提供以下 bean 用于伪装, * `QueryMapEncoder` -* `Capability`(默认情况下提供 `micrometerability’和`CachingCapability`) +* `Capability`(默认情况下提供`MicrometerCapability`和`CachingCapability`) -默认情况下创建了类型`Retryer.NEVER_RETRY`的`Retryer`的 Bean,这将禁用重试。请注意,这种重试行为与假装默认的行为不同,在这种情况下,它会自动重试 ioExceptions,将它们视为与网络相关的瞬态异常,以及从错误解码器中抛出的任何 RetryableException。 +默认情况下创建了类型`Retryer`的`Retryer.NEVER_RETRY`的 Bean,这将禁用重试。请注意,这种重试行为与假装默认的行为不同,在这种情况下,它会自动重试 ioExceptions,将它们视为与网络相关的瞬态异常,以及从错误解码器中抛出的任何 RetryableException。 -创建其中一种类型的 Bean,并将其放置在`@FeignClient`配置中(例如上面的`FooConfiguration`),这样就可以覆盖所描述的每个 bean。示例: +创建其中一种类型的 Bean 并将其放置在`@FeignClient`配置中(例如上面的`FooConfiguration`),允许你覆盖所描述的每个 bean。示例: ``` @Configuration @@ -181,7 +181,7 @@ feign: metrics.enabled: false ``` -默认配置可以在`@EnableFeignClients`属性`defaultConfiguration`中以与上述类似的方式指定。不同之处在于,此配置将应用于*全部*假客户机。 +可以在`@EnableFeignClients`属性`defaultConfiguration`中以与上述类似的方式指定默认配置。不同之处在于,此配置将应用于*全部*假客户机。 如果你更喜欢使用配置属性来配置所有`@FeignClient`,那么你可以使用`default`假名创建配置属性。 @@ -240,13 +240,13 @@ public FeignClientConfigurer feignClientConfigurer() { | |默认情况下,假客户端不对斜杠`/`字符进行编码。可以通过将`feign.client.decodeSlash`的值设置为`false`来更改此行为。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#springencoder-configuration)[1.2.1. `SpringEncoder` configuration](#springencoder-configuration) #### +#### [](#springencoder-configuration)[1.2.1。`SpringEncoder`配置](#SpringEncoder-配置) 在我们提供的`SpringEncoder`中,我们为二进制内容类型设置`null`字符集,为所有其他类型设置`UTF-8`字符集。 通过将`feign.encoder.charset-from-content-type`的值设置为`true`,可以修改此行为以从`Content-Type`头字符集派生字符集。 -### [](#timeout-handling)[1.3.超时处理](#timeout-handling) ### +### [](#timeout-handling)[1.3.超时处理](#timeout-handling) 我们可以在默认值和指定的客户机上配置超时。OpenFeign 使用两个超时参数: @@ -254,10 +254,10 @@ public FeignClientConfigurer feignClientConfigurer() { * `readTimeout`从建立连接的时间开始应用,并在返回响应花费太长时间时触发。 -| |在服务器不运行或可用的情况下,数据包将导致*连接被拒绝*。通信以错误消息或回退结束。这可能发生*在此之前*如果`connectTimeout`设置得很低。执行查找和接收这样的数据包所需的时间造成了该延迟的很大一部分。它可能会根据涉及 DNS 查找的远程主机进行更改。| +| |在服务器不运行或可用的情况下,数据包将导致*连接被拒绝*。通信以错误消息或回退结束。如果设置得很低,*在此之前*`connectTimeout`就会发生这种情况。执行查找和接收这样的数据包所需的时间造成了该延迟的很大一部分。它可能会根据涉及 DNS 查找的远程主机进行更改。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#creating-feign-clients-manually)[1.4.手动创建假客户端](#creating-feign-clients-manually) ### +### [](#creating-feign-clients-manually)[1.4.手动创建假客户端](#creating-feign-clients-manually) 在某些情况下,可能有必要以一种不可能使用上述方法的方式定制你的假装客户机。在这种情况下,你可以使用[Feign Builder API](https://github.com/OpenFeign/feign/#basics)创建客户机。下面是一个示例,该示例使用相同的接口创建两个假客户机,但将每个客户机配置为单独的请求拦截器。 @@ -296,16 +296,16 @@ class FooController { | |`PROD-SVC`是客户机将向其发出请求的服务的名称。| |---|-----------------------------------------------------------------------------| -| |feign`Contract`对象定义了哪些注释和值在接口上是有效的。
autowired`Contract` Bean 提供了对 SpringMVC 注释的支持,而不是
默认的伪装原生注释。| +| |feign`Contract`对象定义了哪些注释和值在接口上是有效的。
Autowired`Contract` Bean 提供了对 SpringMVC 注释的支持,而不是
默认的伪装原生注释。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 你还可以使用`Builder`来配置 FeignClient,使其不从父上下文继承 bean。你可以通过在`Builder`上重写调用`inheritParentContext(false)`来实现此目的。 -### [](#spring-cloud-feign-circuitbreaker)[1.5. Feign Spring Cloud CircuitBreaker Support](#spring-cloud-feign-circuitbreaker) ### +### [](#spring-cloud-feign-circuitbreaker)[1.5. Feign Spring Cloud CircuitBreaker Support](#spring-cloud-feign-circuitbreaker) -如果 Spring 云电路断路器在 Classpath 和`feign.circuitbreaker.enabled=true`上,Feign 将用一个断路器封装所有方法。 +如果 Spring Cloud断路器在 Classpath 和`feign.circuitbreaker.enabled=true`上,Feign 将用一个断路器包装所有方法。 -要在每个客户端的基础上禁用 Spring 云电路断路器支持,请使用“原型”范围创建一个普通的`Feign.Builder`,例如: +要在每个客户端的基础上禁用 Spring Cloud电路断路器支持,请使用“原型”范围创建一个普通的`Feign.Builder`,例如: ``` @Configuration @@ -318,7 +318,7 @@ public class FooConfiguration { } ``` -断路器名称遵循此模式`#()`。当调用带有`FooClient`接口的`@FeignClient`时,所调用的接口方法没有参数是`bar`,那么断路器的名称将是`FooClient#bar()`。 +断路器名称遵循此模式`#()`。当调用带有`FooClient`接口的`@FeignClient`时,调用的接口方法没有参数是`bar`,那么断路器的名称将是`FooClient#bar()`。 | |截至 2020.0.2,断路器名称模式已从`_`变为
使用 2020.0.4 引入的`CircuitBreakerNameResolver`,断路器名称可以保留旧模式。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -335,11 +335,11 @@ public class FooConfiguration { } ``` -要启用 Spring Cloud Circuitbreaker 组,将`feign.circuitbreaker.group.enabled`属性设置为`true`(默认情况下`false`)。 +要启用 Spring Cloud电路断路器组,请将`feign.circuitbreaker.group.enabled`属性设置为`true`(默认情况下`false`)。 -### [](#spring-cloud-feign-circuitbreaker-fallback)[1.6. Feign Spring Cloud CircuitBreaker Fallbacks](#spring-cloud-feign-circuitbreaker-fallback) ### +### [](#spring-cloud-feign-circuitbreaker-fallback)[1.6. Feign Spring Cloud CircuitBreaker Fallbacks](#spring-cloud-feign-circuitbreaker-fallback) -Spring 云电路断路器支持回退的概念:当电路打开或存在错误时执行的默认代码路径。要为给定的`@FeignClient`启用回退,请将`fallback`属性设置为实现回退的类名。你还需要将你的实现声明为 Spring Bean。 +Spring Cloud电路断路器支持回退的概念:当电路打开或存在错误时执行的默认代码路径。要为给定的`@FeignClient`启用回退,请将`fallback`属性设置为实现回退的类名。你还需要将你的实现声明为 Spring Bean。 ``` @FeignClient(name = "test", url = "http://localhost:${server.port}/", fallback = Fallback.class) @@ -409,9 +409,9 @@ Spring 云电路断路器支持回退的概念:当电路打开或存在错误 } ``` -### [](#feign-and-primary)[1.7. Feign and `@Primary`](#feign-and-primary) ### +### [](#feign-and-primary)[1.7。假装和`@Primary`](# 假装和主要) -当使用 Feign with Spring Cloud Circuitbreaker 回退时,在`ApplicationContext`中有多个相同类型的 bean。这将导致`@Autowired`不工作,因为没有一个 Bean,或一个标记为主要的。为了解决这个问题, Spring Cloud OpenFeign 将所有的 Feign 实例标记为`@Primary`,因此 Spring Framework 将知道要注入哪个 Bean。在某些情况下,这可能是不可取的。要关闭此行为,请将`@FeignClient`的`primary`属性设置为 false。 +当使用与 Spring Cloud电路断路器后备假动作时,在`ApplicationContext`中有多个相同类型的 bean。这将导致`@Autowired`不工作,因为没有一个 Bean,或一个标记为主要的。为了解决这个问题, Spring Cloud OpenFeign 将所有的 Feign 实例标记为`@Primary`,因此 Spring Framework 将知道要注入哪个 Bean。在某些情况下,这可能是不可取的。要关闭此行为,请将`@FeignClient`的`primary`属性设置为 false。 ``` @FeignClient(name = "hello", primary = false) @@ -420,7 +420,7 @@ public interface HelloClient { } ``` -### [](#spring-cloud-feign-inheritance)[1.8.假装继承支持](#spring-cloud-feign-inheritance) ### +### [](#spring-cloud-feign-inheritance)[1.8.假装继承支持](#spring-cloud-feign-inheritance) Feign 通过单继承接口支持样板 API。这允许将公共操作分组到方便的基本接口中。 @@ -454,10 +454,10 @@ public interface UserClient extends UserService { } ``` -| |`@FeignClient`接口不应在服务器和客户机之间共享,并且不再支持在类级别上注释带有`@RequestMapping`的`@FeignClient`接口。| +| |`@FeignClient`接口不应在服务器和客户机之间共享,并且不再支持在类级别上注释`@FeignClient`带有`@RequestMapping`的接口。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#feign-requestresponse-compression)[1.9.假装请求/响应压缩](#feign-requestresponse-compression) ### +### [](#feign-requestresponse-compression)[1.9.假装请求/响应压缩](#feign-requestresponse-compression) 你可以考虑为你的假请求启用请求或响应 gzip 压缩。你可以通过启用其中一个属性来实现这一点: @@ -476,9 +476,9 @@ feign.compression.request.min-request-size=2048 这些属性允许你对压缩媒体类型和最小请求阈值长度进行选择。 -### [](#feign-logging)[1.10.伪测井](#feign-logging) ### +### [](#feign-logging)[1.10.伪测井](#feign-logging) -为创建的每个假客户机创建一个记录器。默认情况下,记录器的名称是用于创建假客户端的接口的完整类名。假装日志记录只响应`DEBUG`级别。 +日志记录器是为每个创建的假客户端创建的。默认情况下,日志记录器的名称是用于创建假客户端的接口的完整类名。假装日志记录只响应`DEBUG`级别。 应用程序.yml @@ -486,7 +486,7 @@ feign.compression.request.min-request-size=2048 logging.level.project.user.UserClient: DEBUG ``` -你可以为每个客户机配置的`Logger.Level`对象告诉你要记录多少。选择如下: +你可以为每个客户机配置的`Logger.Level`对象告诉你要记录多少日志。选择如下: * `NONE`,没有日志记录(** 默认 **)。 @@ -508,9 +508,9 @@ public class FooConfiguration { } ``` -### [](#feign-capability-support)[1.11.佯装能力支持](#feign-capability-support) ### +### [](#feign-capability-support)[1.11.佯装能力支持](#feign-capability-support) -伪装功能公开了核心伪装组件,以便可以修改这些组件。例如,这些功能可以使用`Client`、*装饰*,并将修饰过的实例返回到 feign 中。对 Metrics 库的支持就是一个很好的实例。见[Feign metrics](#feign-metrics)。 +伪装功能公开了核心伪装组件,以便可以修改这些组件。例如,这些功能可以使用`Client`、*装饰*,并将修饰过的实例返回给 feign。对 Metrics 库的支持就是一个很好的实例。见[假装度量](#feign-metrics)。 创建一个或多个`Capability`bean 并将其放置在`@FeignClient`配置中,可以注册它们并修改所涉及的客户机的行为。 @@ -524,9 +524,9 @@ public class FooConfiguration { } ``` -### [](#feign-metrics)[1.12.假装度量](#feign-metrics) ### +### [](#feign-metrics)[1.12.假装度量](#feign-metrics) -如果以下所有条件均为真,则创建并注册一个`MicrometerCapability` Bean,以便你的假客户机将度量发布到 Micrometer: +如果以下所有条件都是真的,则创建并注册一个`MicrometerCapability` Bean,以便你的假客户机将度量数据发布到 Micrometer: * `feign-micrometer`在 Classpath 上 @@ -551,7 +551,7 @@ public class FooConfiguration { * `feign.client.config.feignName.metrics.enabled=false` -| |`feign.metrics.enabled=false`禁用对**全部**冒充客户端的度量支持,而不管客户端级别标志的值是多少:`feign.client.config.feignName.metrics.enabled`。
如果你想在每个客户端启用或禁用 Merics,请不要设置`feign.metrics.enabled`,而使用`feign.client.config.feignName.metrics.enabled`。| +| |`feign.metrics.enabled=false`禁用对**全部**冒充客户端的度量支持,而不管客户端级别标志的值是多少:`feign.client.config.feignName.metrics.enabled`。
如果你想在每个客户端启用或禁用 Merics,请不要设置,而使用`feign.client.config.feignName.metrics.enabled`。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 你还可以通过注册自己的 Bean 来自定义`MicrometerCapability`: @@ -566,7 +566,7 @@ public class FooConfiguration { } ``` -### [](#feign-caching)[1.13.假装缓存](#feign-caching) ### +### [](#feign-caching)[1.13.假装缓存](#feign-caching) 如果使用`@EnableCaching`注释,则创建并注册一个`CachingCapability` Bean,以便你的假客户端在其接口上识别`@Cache*`注释: @@ -581,13 +581,13 @@ public interface DemoClient { 你还可以通过属性`feign.cache.enabled=false`禁用该功能。 -### [](#feign-querymap-support)[1.14.假装 @QueryMap 支持](#feign-querymap-support) ### +### [](#feign-querymap-support)[1.14.假装 @QueryMap 支持](#feign-querymap-support) OpenFeign`@QueryMap`注释支持将 POJO 用作 GET 参数映射。遗憾的是,缺省的 OpenFeign QueryMap 注释与 Spring 不兼容,因为它缺少`value`属性。 -Spring Cloud OpenFeign 提供了一个等效的`@SpringQueryMap`注释,其用于将一个 POJO 或 MAP 参数注释为查询参数映射。 +Spring Cloud OpenFeign 提供了等价的`@SpringQueryMap`注释,其用于将 POJO 或 MAP 参数注释为查询参数映射。 -例如,`Params`类定义了参数`param1`和`param2`: +例如,`Params`类定义参数`param1`和`param2`: ``` // Params.java @@ -612,13 +612,13 @@ public interface DemoTemplate { 如果需要对生成的查询参数映射进行更多控制,则可以实现自定义的`QueryMapEncoder` Bean。 -### [](#hateoas-support)[1.15.Hateoas 支持](#hateoas-support) ### +### [](#hateoas-support)[1.15.Hateoas 支持](#hateoas-support) Spring 提供了一些 API 来创建遵循[HATEOAS](https://en.wikipedia.org/wiki/HATEOAS)原则、[Spring Hateoas](https://spring.io/projects/spring-hateoas)和[Spring Data REST](https://spring.io/projects/spring-data-rest)的 REST 表示。 如果你的项目使用`org.springframework.boot:spring-boot-starter-hateoas`starter 或`org.springframework.boot:spring-boot-starter-data-rest`starter,则默认情况下会启用 feignhateoas 支持。 -当启用 Hateoas 支持时,允许 Feign 客户端序列化和反序列化 Hateoas 表示模型:[EntityModel](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/EntityModel.html),[CollectionModel](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/CollectionModel.html)和[PagedModel](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/PagedModel.html)。 +当启用 Hateoas 支持时,允许 Feign 客户端序列化和反序列化 Hateoas 表示模型:[实体模型](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/EntityModel.html),[集合模型](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/CollectionModel.html)和[PagedModel](https://docs.spring.io/spring-hateoas/docs/1.0.0.M1/apidocs/org/springframework/hateoas/PagedModel.html)。 ``` @FeignClient("demo") @@ -629,17 +629,17 @@ public interface DemoTemplate { } ``` -### [](#spring-matrixvariable-support)[1.16. Spring @MatrixVariable Support](#spring-matrixvariable-support) ### +### [](#spring-matrixvariable-support)[1.16. Spring @MatrixVariable Support](#spring-matrixvariable-support) Spring Cloud OpenFeign 提供了对 Spring `@MatrixVariable`注释的支持。 如果将映射作为方法参数传递,则通过将映射中的键值对与`=`连接起来来创建`@MatrixVariable`路径段。 -如果传递了一个不同的对象,那么`@MatrixVariable`注释(如果已定义)中提供的`name`或者注释的变量名将使用`=`与提供的方法参数连接。 +如果传递了一个不同的对象,那么`@MatrixVariable`注释(如果已定义)中提供的`name`或注释的变量名将使用`=`与提供的方法参数连接。 IMPORTANT -尽管如此,在服务器端, Spring 并不要求用户将路径段占位符的名称与矩阵变量的名称相同,因为在客户端,该名称将过于模棱两可, Spring 云 OpenFeign 要求你添加一个路径段占位符,其名称与`@MatrixVariable`注释(如果已定义)中提供的`name`或注释的变量名称相匹配。 +尽管如此,在服务器端, Spring 并不要求用户将路径段占位符的名称与矩阵变量的名称相同,因为在客户端,该名称将过于模棱两可, Spring Cloud OpenFeign 要求你添加一个路径段占位符,其名称与`name`注释(如果已定义)中提供的`@MatrixVariable`或注释的变量名称相匹配。 例如: @@ -659,9 +659,9 @@ public interface DemoTemplate { } ``` -### [](#feign-collectionformat-support)[1.17. Feign `CollectionFormat` support](#feign-collectionformat-support) ### +### [](#feign-collectionformat-support)[1.17。feign`CollectionFormat`support](#feign-collectionformat-support) -我们通过提供`@CollectionFormat`注释来支持`feign.CollectionFormat`。你可以通过传递所需的`feign.CollectionFormat`作为注释值,用它来对假客户机方法(或整个类进行注释以影响所有方法)进行注释。 +我们通过提供`@CollectionFormat`注释来支持`feign.CollectionFormat`。你可以通过传递所需的`feign.CollectionFormat`作为注释值,用它来注释一个假客户机方法(或整个类以影响所有方法)。 在下面的示例中,使用`CSV`格式而不是默认的`EXPLODED`来处理该方法。 @@ -676,16 +676,16 @@ protected interface PageableFeignClient { } ``` -| |在发送`Pageable`作为查询参数时,设置`CSV`格式,以便对其进行正确编码。| +| |在发送`Pageable`作为查询参数时设置`CSV`格式,以便对其进行正确编码。| |---|-----------------------------------------------------------------------------------------------------------| -### [](#reactive-support)[1.18.反应性支持](#reactive-support) ### +### [](#reactive-support)[1.18.反应性支持](#reactive-support) 由于[OpenFeign 项目](https://github.com/OpenFeign/feign)目前不支持反应式客户端,例如[Spring WebClient](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.html), Spring Cloud OpenFeign 也不支持。我们将在此添加对它的支持,只要它在核心项目中可用。 -在此之前,我们建议使用[feign-reactive](https://github.com/Playtika/feign-reactive)作为 Spring WebClient 支持。 +在此之前,我们建议使用[假装反应](https://github.com/Playtika/feign-reactive)作为 Spring WebClient 支持。 -#### [](#early-initialization-errors)[1.18.1.早期初始化错误](#early-initialization-errors) #### +#### [](#early-initialization-errors)[1.18.1.早期初始化错误](#early-initialization-errors) 在启动应用程序时,你可能会看到初始化错误,这取决于你如何使用你的假客户机。要解决这个问题,你可以在自动连接客户机时使用`ObjectProvider`。 @@ -694,7 +694,7 @@ protected interface PageableFeignClient { ObjectProvider testFeignClient; ``` -### [](#spring-data-support)[1.19. Spring Data Support](#spring-data-support) ### +### [](#spring-data-support)[1.19. Spring Data Support](#spring-data-support) 可以考虑启用用于支持`org.springframework.data.domain.Page`和`org.springframework.data.domain.Sort`解码的 Jackson 模块。 @@ -702,9 +702,9 @@ ObjectProvider testFeignClient; feign.autoconfiguration.jackson.enabled=true ``` -### [](#spring-refreshscope-support)[1.20. Spring `@RefreshScope` Support](#spring-refreshscope-support) ### +### [](#spring-refreshscope-support)[1.20。 Spring `@RefreshScope`支持](# Spring-refreshScope-支持) -如果启用了假客户端刷新,那么每个假客户端都是以`feign.Request.Options`作为刷新范围来创建的 Bean。这意味着诸如`connectTimeout`和`readTimeout`之类的属性可以通过`POST /actuator/refresh`针对任何伪装客户端实例进行刷新。 +如果启用了假客户机刷新,那么每个假客户机都是以`feign.Request.Options`作为刷新范围来创建的 Bean。这意味着诸如`connectTimeout`和`readTimeout`之类的属性可以通过`POST /actuator/refresh`针对任何伪装客户端实例进行刷新。 默认情况下,feign 客户端中的刷新行为是禁用的。使用以下属性启用刷新行为: @@ -715,7 +715,7 @@ feign.client.refresh-enabled=true | |不要使用`@RefreshScope`注释对`@FeignClient`接口进行注释。| |---|---------------------------------------------------------------------------------| -### [](#oauth2-support)[1.21.OAuth2 支持](#oauth2-support) ### +### [](#oauth2-support)[1.21.OAuth2 支持](#oauth2-support) 可以通过设置以下标志来启用 OAuth2 支持: @@ -729,7 +729,8 @@ feign.oauth2.enabled=true feign.oauth2.load-balanced=true ``` -[](#configuration-properties)[2.配置属性](#configuration-properties) ----------- +## [](#configuration-properties)[2.配置属性](#configuration-properties) 要查看所有 Spring Cloud OpenFeign 相关配置属性的列表,请检查[附录页](appendix.html)。 + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-sleuth.md b/docs/spring-cloud/spring-cloud-sleuth.md index 8b024e70f0976787885988e83ab3653183dd55a3..029a34f2ae24f846c08ddbcf3167b7eeb8b34f05 100644 --- a/docs/spring-cloud/spring-cloud-sleuth.md +++ b/docs/spring-cloud/spring-cloud-sleuth.md @@ -1,5 +1,4 @@ -Spring 云侦探参考文献 -========== +# Spring Cloud 侦探参考文献 Adrian Cole,Spencer Gibb,Marcin Grzejszczak,DAVESyer,Jay Bryant @@ -9,8 +8,10 @@ Adrian Cole,Spencer Gibb,Marcin Grzejszczak,DAVESyer,Jay Bryant |--------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| |[Documentation Overview](documentation-overview.html#sleuth-documentation-about)|关于文档,获得帮助,第一步,等等。| | [Getting Started](getting-started.html#getting-started) |介绍 Spring Cloud Sleuth,开发你的第一个 Spring 基于 Cloud Sleuth 的应用程序| -| [Using Spring Cloud Sleuth](using.html#using) |Spring 云侦探的使用示例和工作流程。| +| [Using Spring Cloud Sleuth](using.html#using) |Spring Cloud侦探的使用示例和工作流程。| | [Spring Cloud Sleuth Features](project-features.html#features) |跨越创建、上下文传播等。| | [“How-to” Guides](howto.html#howto) |添加采样、传播远程标记等等。| | [Spring Cloud Sleuth Integrations](integrations.html#sleuth-integration) |插装配置、上下文传播等。| | [Appendices](appendix.html#appendix) |span 定义和配置属性。| + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-stream.md b/docs/spring-cloud/spring-cloud-stream.md index 45569b6abdeb138977a7fe54b484c5f2b1326e18..9f2febc205511601603aec63d9c8bbdc523a09a6 100644 --- a/docs/spring-cloud/spring-cloud-stream.md +++ b/docs/spring-cloud/spring-cloud-stream.md @@ -1,5 +1,6 @@ -Spring 云流参考文档 -========== +# Spring Cloud 流参考文档 + +Sabby Anandan Marius Bogovici ERICBottard Mark FisherIlayaperumal Gopinathan Mark Heckler Gunnar Hillert Mark Pollack Patrick Peralta Glenn Renfro Thomas Risberg DAVESyer David Turanski Janne Valkealahti Benjamin Klein Vinicius Carvalho Gary Russell Oleg Zhurakousky Jay Bryant Soby Chacko **3.2.2** @@ -19,3 +20,5 @@ Spring 云流参考文档 |--------------------------------------------------------------------------------|------------------------------------------------------| |[Enterprise 整合模式](http://www.enterpriseintegrationpatterns.com/)|Patterns and Best Practices for Enterprise Integration| |[Spring Integration](https://spring.io/projects/spring-integration)| Spring Integration framework | + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-task.md b/docs/spring-cloud/spring-cloud-task.md index 2920301f234860340887295de2a6b845912c2d01..b6e628f5c0422641873fd5f444d05cb8d5867df1 100644 --- a/docs/spring-cloud/spring-cloud-task.md +++ b/docs/spring-cloud/spring-cloud-task.md @@ -1,35 +1,29 @@ -Spring 云任务参考指南 -========== +# Spring Cloud 任务参考指南 +# [](#preface)[Preface](#preface) -[](#preface)[Preface](#preface) -========== +本节提供了 Spring Cloud任务参考文档的简要概述。把它看作是文档其余部分的一张地图。你可以以线性方式阅读此参考指南,或者如果你对某些内容不感兴趣,可以跳过部分。 -本节提供了 Spring 云任务参考文档的简要概述。把它看作是文档其余部分的一张地图。你可以以线性方式阅读此参考指南,或者如果你对某些内容不感兴趣,可以跳过部分。 +## [](#about-the-documentation)[1.关于文档](#about-the-documentation) -[](#about-the-documentation)[1.关于文档](#about-the-documentation) ----------- - -Spring 云任务参考指南在[html](https://docs.spring.io/spring-cloud-task/docs/current/reference)和[pdf](https://docs.spring.io/spring-cloud-task/docs/current/reference/index.pdf),[epub](https://docs.spring.io/spring-cloud-task/docs/current/reference/index.epub)中可用。最新版本可在[docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/](https://docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/)处获得。 +Spring Cloud任务参考指南在[html](https://docs.spring.io/spring-cloud-task/docs/current/reference)和[pdf](https://docs.spring.io/spring-cloud-task/docs/current/reference/index.pdf),[epub](https://docs.spring.io/spring-cloud-task/docs/current/reference/index.epub)中可用。最新版本可在[docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/](https://docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/)处获得。 本文件的副本可供你自己使用并分发给他人,但前提是你不对此类副本收取任何费用,并且还需每一份副本均包含本版权声明,无论是以印刷形式还是以电子方式分发。 -[](#task-documentation-getting-help)[2. Getting help](#task-documentation-getting-help) ----------- +## [](#task-documentation-getting-help)[2.获得帮助](#task-documentation-getting-help) 云任务有问题吗?我们愿意提供帮助! -* 问一个问题。我们监控[stackoverflow.com](https://stackoverflow.com)中带有[`spring-cloud-task`](https://stackoverflow.com/tags/spring-cloud-task)标记的问题。 +* 问一个问题。我们监视[stackoverflow.com](https://stackoverflow.com)中带有[`spring-cloud-task`]标记的问题(https://stackoverflow.com/tags/ Spring-cloud-task)。 -* 使用 Spring 云任务在[github.com/spring-cloud/spring-cloud-task/issues](https://github.com/spring-cloud/spring-cloud-task/issues)上报告错误。 +* 使用 Spring Cloud任务在[github.com/spring-cloud/spring-cloud-task/issues](https://github.com/spring-cloud/spring-cloud-task/issues)上报告错误。 | |所有的云任务都是开源的,包括文档。如果你发现
是 DOCS 的问题,或者你只是想改进它们,请[get
involved](https://github.com/spring-cloud/spring-cloud-task/tree/master)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#task-documentation-first-steps)[3. First Steps](#task-documentation-first-steps) ----------- +## [](#task-documentation-first-steps)[3.第一步](#task-documentation-first-steps) -如果你刚刚开始使用 Spring 云任务或一般的“ Spring”,我们建议你阅读[Getting started](#getting-started)章节。 +如果你刚刚开始使用 Spring Cloud任务或一般的“ Spring”,我们建议你阅读[开始](#getting-started)章节。 要从头开始,请阅读以下部分: @@ -39,24 +33,21 @@ Spring 云任务参考指南在[html](https://docs.spring.io/spring-cloud-task/d 要遵循本教程,请阅读[Developing Your First Spring Cloud Task Application](#getting-started-developing-first-task)以运行你的示例,请阅读[运行示例](#getting-started-running-the-example) -[](#getting-started)[Getting started](#getting-started) -========== +# [](#getting-started)[开始](#getting-started) -如果你刚刚开始使用 Spring Cloud Task,那么你应该阅读这一部分。在这里,我们回答基本的“什么?”、“怎么做?”和“为什么?”的问题。我们从温和地介绍云任务开始。然后,我们构建了一个 Spring 云任务应用程序,讨论了一些核心原则。 +如果你刚刚开始使用 Spring Cloud Task,那么你应该阅读这一部分。在这里,我们回答基本的“什么?”、“怎么做?”和“为什么?”的问题。我们从温和地介绍云任务开始。然后,我们构建了一个 Spring Cloud任务应用程序,讨论了一些核心原则。 -[](#getting-started-introducing-spring-cloud-task)[4. Introducing Spring Cloud Task](#getting-started-introducing-spring-cloud-task) ----------- +## [](#getting-started-introducing-spring-cloud-task)[4. Introducing Spring Cloud Task](#getting-started-introducing-spring-cloud-task) -Spring 云任务使创建短期微服务变得容易。它提供了允许在生产环境中按需执行短期 JVM 流程的功能。 +Spring Cloud任务使创建短期微服务变得容易。它提供了允许在生产环境中按需执行短期 JVM 流程的功能。 -[](#getting-started-system-requirements)[5.系统要求](#getting-started-system-requirements) ----------- +## [](#getting-started-system-requirements)[5.系统要求](#getting-started-system-requirements) 你需要安装 Java(Java8 或更好)。要进行构建,还需要安装 Maven。 -### [](#database-requirements)[5.1.数据库需求](#database-requirements) ### +### [](#database-requirements)[5.1.数据库需求](#database-requirements) -Spring 云任务使用关系数据库来存储已执行任务的结果。虽然可以在没有数据库的情况下开始开发任务(任务的状态作为任务存储库更新的一部分记录),但对于生产环境,你希望使用受支持的数据库。 Spring 云任务当前支持以下数据库: +Spring Cloud任务使用关系数据库来存储已执行任务的结果。虽然可以在没有数据库的情况下开始开发任务(任务的状态作为任务存储库更新的一部分记录),但对于生产环境,你希望使用受支持的数据库。 Spring Cloud任务当前支持以下数据库: * DB2 @@ -72,15 +63,14 @@ Spring 云任务使用关系数据库来存储已执行任务的结果。虽然 * SQLServer -[](#getting-started-developing-first-task)[6. Developing Your First Spring Cloud Task Application](#getting-started-developing-first-task) ----------- +## [](#getting-started-developing-first-task)[6. Developing Your First Spring Cloud Task Application](#getting-started-developing-first-task) 一个很好的起点是使用一个简单的“你好,世界!”应用程序,因此我们创建了相当于突出该框架功能的 Spring Cloud 任务。大多数 IDE 都对 Apache Maven 有很好的支持,因此我们将它用作这个项目的构建工具。 -| |Spring.io 网站包含许多使用 Spring 引导的[“`Getting Started`”
guides](https://spring.io/guides)。如果你需要解决某个特定的问题,请先在此进行检查。
你可以通过执行[Spring Initializr](https://start.spring.io/)并创建一个新项目来快捷执行以下步骤。这样做
会自动生成一个新的项目结构,这样你就可以立即开始编码。
我们建议你尝试使用 Spring initializr 来熟悉它。| +| |Spring.io 网站包含许多使用 Spring boot 的[`Getting Started`“
guides](https:// Spring.io/guides)。如果你需要解决某个特定的问题,请先在此进行检查。
你可以通过执行[Spring Initializr](https://start.spring.io/)并创建一个新项目来快捷执行以下步骤。这样做
会自动生成一个新的项目结构,这样你就可以立即开始编码。
我们建议你尝试使用 Spring initializr 来熟悉它。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#getting-started-creating-project)[6.1. Creating the Spring Task Project using Spring Initializr](#getting-started-creating-project) ### +### [](#getting-started-creating-project)[6.1. Creating the Spring Task Project using Spring Initializr](#getting-started-creating-project) 现在,我们可以创建并测试一个将`Hello, World!`打印到控制台的应用程序。 @@ -92,7 +82,7 @@ Spring 云任务使用关系数据库来存储已执行任务的结果。虽然 2. 在“依赖关系”文本框中,键入`task`,然后选择`Cloud Task`依赖关系。 - 3. 在“依赖项”文本框中,键入`jdbc`,然后选择`JDBC`依赖项。 + 3. 在“依赖关系”文本框中,键入`jdbc`,然后选择`JDBC`依赖关系。 4. 在“依赖关系”文本框中,键入`h2`,然后选择`H2`。(或者你最喜欢的数据库) @@ -100,7 +90,7 @@ Spring 云任务使用关系数据库来存储已执行任务的结果。虽然 2. 解压 helloworld.zip 文件并将项目导入到你最喜欢的 IDE 中。 -### [](#getting-started-writing-the-code)[6.2.编写代码](#getting-started-writing-the-code) ### +### [](#getting-started-writing-the-code)[6.2.编写代码](#getting-started-writing-the-code) 要完成我们的应用程序,我们需要用以下内容更新生成的`HelloworldApplication`,以便它启动一个任务。 @@ -141,7 +131,7 @@ public class HelloworldApplication { * `application.name`:设置应用程序名(已转换为任务名) -* `logging.level`:将 Spring 云任务的日志设置为`DEBUG`,以便查看正在发生的事情。 +* `logging.level`:将 Spring Cloud任务的日志设置为`DEBUG`,以便查看正在发生的事情。 下面的示例展示了如何同时做到这两点: @@ -150,28 +140,28 @@ logging.level.org.springframework.cloud.task=DEBUG spring.application.name=helloWorld ``` -#### [](#getting-started-at-task)[6.2.1.任务自动配置](#getting-started-at-task) #### +#### [](#getting-started-at-task)[6.2.1.任务自动配置](#getting-started-at-task) 当包含 Spring Cloud Task Starter 依赖项时,Task Auto 会配置所有 bean 以引导其功能。此配置的一部分注册了`TaskRepository`及其使用的基础结构。 -在我们的演示中,`TaskRepository`使用嵌入式 H2 数据库来记录任务的结果。这种 H2 嵌入式数据库对于生产环境不是一种实用的解决方案,因为一旦任务结束,H2DB 就会消失。然而,为了获得快速的入门体验,我们可以在示例中使用它,也可以将存储库中正在更新的内容与日志相呼应。在[Configuration](#features-configuration)小节(在本文档的后面)中,我们介绍了如何定制 Spring Cloud Task 提供的组件的配置。 +在我们的演示中,`TaskRepository`使用嵌入式 H2 数据库来记录任务的结果。这种 H2 嵌入式数据库对于生产环境不是一种实用的解决方案,因为一旦任务结束,H2DB 就会消失。然而,为了获得快速的入门体验,我们可以在示例中使用它,也可以将存储库中正在更新的内容与日志相呼应。在[配置](#features-configuration)小节(在本文档的后面)中,我们介绍了如何定制 Spring Cloud Task 提供的组件的配置。 当我们的示例应用程序运行时, Spring 启动我们的`HelloWorldCommandLineRunner`,并将我们的“你好,世界!”消息输出为标准输出。`TaskLifecycleListener`在存储库中记录任务的开始和结束。 -#### [](#getting-started-main-method)[6.2.2.主要方法](#getting-started-main-method) #### +#### [](#getting-started-main-method)[6.2.2.主要方法](#getting-started-main-method) Main 方法是任何 Java 应用程序的入口点。我们的主方法将委托给 Spring Boot 的[SpringApplication](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html)类。 -#### [](#getting-started-clr)[6.2.3.The CommandlineRunner](#getting-started-clr) #### +#### [](#getting-started-clr)[6.2.3.The CommandlineRunner](#getting-started-clr) -Spring 包括引导应用程序逻辑的许多方法。 Spring Boot 通过其`*Runner`接口(`CommandlineRunner` 或`ApplicationRunner`)以有组织的方式提供了一种方便的方法。一个表现良好的任务可以通过使用这两个运行器中的一个来引导任何逻辑。 +Spring 包括引导应用程序逻辑的许多方法。 Spring Boot 通过其`*Runner`接口(`CommandLineRunner`或`ApplicationRunner`)以有组织的方式提供了这样做的方便方法。一个表现良好的任务可以通过使用这两个运行器中的一个来引导任何逻辑。 -任务的生命周期是从`*Runner#run`方法被执行到它们全部完成之前考虑的。 Spring 引导允许应用程序使用多个 `*runner’实现,就像 Spring 云任务一样。 +任务的生命周期是从`*Runner#run`方法被执行到它们全部完成之前考虑的。 Spring 引导让应用程序使用多个`*Runner`实现,就像 Spring Cloud任务一样。 -| |除`CommandLineRunner`或 `ApplicationRunner’(例如,通过使用`InitializingBean#afterPropertiesSet`)以外的机制引导的任何处理都不是由 Spring 云任务记录的
。| +| |除`CommandLineRunner`或`ApplicationRunner`(例如通过使用`InitializingBean#afterPropertiesSet`)以外的机制引导的任何处理都不是由 Spring Cloud任务记录的
。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#getting-started-running-the-example)[6.3.运行示例](#getting-started-running-the-example) ### +### [](#getting-started-running-the-example)[6.3.运行示例](#getting-started-running-the-example) 在这一点上,我们的应用程序应该可以工作。由于此应用程序是基于 Spring 引导的,因此我们可以从应用程序的根使用`$ mvn spring-boot:run`从命令行运行它,如下例所示(其输出): @@ -213,42 +203,40 @@ Hello, World! * `SimpleTaskRepository`在`TaskRepository`中记录了条目的创建。 -* 我们的`CommandLineRunner`的执行,通过“你好,世界!”输出进行了演示。 +* 我们的`CommandLineRunner`的执行,通过输出“Hello,World!”进行了演示。 * `SimpleTaskRepository`在`TaskRepository`中记录任务的完成情况。 -| |一个简单的任务应用程序可以在 Spring 云
任务项目[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/timestamp)的样例模块中找到。| +| |一个简单的任务应用程序可以在 Spring Cloud
任务项目[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/timestamp)的样例模块中找到。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#features)[Features](#features) -========== +# [](#features)[Features](#features) -本节将更详细地介绍 Spring 云任务,包括如何使用它,如何配置它,以及适当的扩展点。 +本节将更详细地介绍 Spring Cloud任务,包括如何使用它,如何配置它,以及适当的扩展点。 -[](#features-lifecycle)[7. The lifecycle of a Spring Cloud Task](#features-lifecycle) ----------- +## [](#features-lifecycle)[7. The lifecycle of a Spring Cloud Task](#features-lifecycle) -在大多数情况下,现代云环境是围绕预期不会结束的流程的执行而设计的。如果它们结束了,它们通常会重新启动。虽然大多数平台确实有某种方式来运行一个在结束时不会重新启动的流程,但该运行的结果通常不会以可消耗的方式维护。 Spring 云任务提供了在环境中执行短期过程并记录结果的能力。这样做允许围绕短期流程的微服务架构,以及通过消息集成任务来运行较长时间的服务。 +在大多数情况下,现代云环境是围绕预期不会结束的流程的执行而设计的。如果它们结束了,它们通常会重新启动。虽然大多数平台确实有某种方式来运行一个在结束时不会重新启动的流程,但该运行的结果通常不会以可消耗的方式维护。 Spring Cloud任务提供了在环境中执行短期过程并记录结果的能力。这样做允许围绕短期流程的微服务架构,以及通过消息集成任务来运行较长时间的服务。 虽然这种功能在云环境中很有用,但在传统的部署模型中也可能出现同样的问题。 Spring 当启动应用程序与诸如 CRON 的调度程序一起运行时,能够在其完成后监视应用程序的结果是有用的。 -Spring 云任务采取的方法是, Spring 引导应用程序可以有一个开始和一个结束,并且仍然是成功的。批处理应用程序就是一个例子,它说明了预期结束的过程(通常是短暂的)是如何有用的。 +Spring Cloud任务采取的方法是, Spring 引导应用程序可以有一个开始和一个结束,并且仍然是成功的。批处理应用程序就是一个例子,它说明了预期结束的过程(通常是短暂的)是如何有用的。 -Spring 云任务记录给定任务的生命周期事件。以大多数 Web 应用程序为代表的大多数长时间运行的进程都不保存其生命周期事件。 Spring 云任务的核心任务就是这样做的。 +Spring Cloud任务记录给定任务的生命周期事件。以大多数 Web 应用程序为代表的大多数长时间运行的进程都不保存其生命周期事件。 Spring Cloud任务的核心任务就是这样做的。 生命周期由单个任务执行组成。这是一个 Spring 引导应用程序的物理执行,该应用程序被配置为一个任务(即,它具有 Sprint 云任务的依赖性)。 -在任务开始时,在运行任何`CommandLineRunner`或`ApplicationRunner`实现之前,将在`TaskRepository`中创建一个记录开始事件的条目。此事件是通过由 Spring 框架触发的`SmartLifecycle#start`触发的。这向系统指示,所有 bean 都已准备好使用,并且在运行 Spring 引导提供的`CommandLineRunner`或`ApplicationRunner`实现之前就会出现。 +在任务开始时,在运行任何`CommandLineRunner`或`ApplicationRunner`实现之前,将在`TaskRepository`中创建一个记录开始事件的条目。此事件是通过由 Spring 框架触发的`SmartLifecycle#start`触发的。这向系统指示,所有 bean 都已准备好使用,并且在运行 Spring boot 提供的`CommandLineRunner`或`ApplicationRunner`实现之前就会出现。 -| |任务的记录只有在成功引导“ApplicationContext”时才会发生。如果上下文根本无法引导,则不会记录任务的运行
。| +| |只有在成功引导`ApplicationContext`时,才会记录任务。如果上下文根本无法引导,则不会记录任务的运行
。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -在完成来自 Spring 引导的所有`*Runner#run`调用或“ApplicationContext”失败(由`ApplicationFailedEvent`表示)后,存储库中的任务执行将与结果一起更新。 +在完成来自 Spring 引导的所有`*Runner#run`调用或`ApplicationContext`失败(由`ApplicationFailedEvent`表示)后,将在存储库中使用结果更新任务执行。 | |如果应用程序要求在
处关闭`ApplicationContext`任务的完成(所有`*Runner#run`方法都已调用,并且任务
存储库已更新),则将属性`spring.cloud.task.closecontextEnabled`设置为 true。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#features-task-execution-details)[7.1.任务执行](#features-task-execution-details) ### +### [](#features-task-execution-details)[7.1.任务执行](#features-task-execution-details) 存储在`TaskRepository`中的信息在`TaskExecution`类中建模,并由以下信息组成: @@ -259,115 +247,114 @@ Spring 云任务记录给定任务的生命周期事件。以大多数 Web 应 | `taskName` |任务的名称,由配置的`TaskNameResolver`确定。| | `startTime` |任务启动的时间,如`SmartLifecycle#start`调用所示。| | `endTime` |任务完成的时间,如`ApplicationReadyEvent`所示。| -|`exitMessage` |退出时可获得的任何信息。这可以通过编程由“TaskExecutionListener”设置。| -|`errorMessage`|如果异常是任务结束的原因(如“applicationfailedevent”所示),则该异常的堆栈跟踪存储在此。| +|`exitMessage` |退出时可获得的任何信息。这可以通过`TaskExecutionListener`以编程方式设置。| +|`errorMessage`|如果异常是任务结束的原因(如`ApplicationFailedEvent`所示),则该异常的堆栈跟踪存储在此。| | `arguments` |一个`List`的字符串命令行参数,因为它们被传递到可执行的
引导应用程序中。| -### [](#features-lifecycle-exit-codes)[7.2.映射退出代码](#features-lifecycle-exit-codes) ### +### [](#features-lifecycle-exit-codes)[7.2.映射退出代码](#features-lifecycle-exit-codes) -当任务完成时,它会尝试将退出代码返回到操作系统。如果我们看一下我们的[原始示例](#getting-started-developing-first-task),我们可以看到我们并没有控制我们应用程序的那个方面。因此,如果抛出了异常,JVM 将返回一段代码,该代码在调试中可能对你有任何用处,也可能对你没有任何用处。 +当任务完成时,它会尝试将退出代码返回到操作系统。如果我们看一下我们的[原始示例](#getting-started-developing-first-task),我们可以看到,我们并没有控制我们应用程序的那个方面。因此,如果抛出了异常,JVM 将返回一段代码,该代码在调试中可能对你有任何用处,也可能对你没有任何用处。 -因此, Spring Boot 提供了一个接口`ExitCodeExceptionMapper`,它允许你将未捕获的异常映射到退出代码。这样做可以让你在退出代码的层面上指出出了什么问题。另外,通过以这种方式映射退出代码, Spring 云任务记录返回的退出代码。 +因此, Spring Boot 提供了一个接口`ExitCodeExceptionMapper`,它允许你将未捕获的异常映射到退出代码。这样做可以让你在退出代码的层面上指出出了什么问题。另外,通过以这种方式映射退出代码, Spring Cloud任务记录返回的退出代码。 如果任务以 SIG-INT 或 SIG-项结束,则除非代码中另有指定,否则退出代码为零。 | |在任务运行时,退出代码以空的形式存储在存储库中。
一旦任务完成,相应的退出代码将根据本节前面描述的
准则进行存储。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#features-configuration)[8.配置](#features-configuration) ----------- +## [](#features-configuration)[8.配置](#features-configuration) -Spring 云任务提供了一种随时可用的配置,如在“DefaultAskConfigurer”和`SimpleTaskConfiguration`类中定义的那样。本节将介绍默认值以及如何根据你的需要定制 Spring 云任务。 +Spring Cloud任务提供了一种现成的配置,如在`DefaultTaskConfigurer`和`SimpleTaskConfiguration`类中所定义的那样。本节将介绍默认值以及如何根据你的需要定制 Spring Cloud任务。 -### [](#features-data-source)[8.1. DataSource](#features-data-source) ### +### [](#features-data-source)[8.1.数据源](#features-data-source) -Spring 云任务使用数据源存储任务执行的结果。默认情况下,我们提供了一个 H2 的内存实例,以提供一种简单的引导开发方法。但是,在生产环境中,你可能希望配置自己的`DataSource`。 +Spring Cloud任务使用数据源来存储任务执行的结果。默认情况下,我们提供了一个 H2 的内存实例,以提供一种简单的引导开发方法。但是,在生产环境中,你可能希望配置自己的`DataSource`。 -如果你的应用程序只使用一个`DataSource`并同时作为你的业务模式和任务存储库,那么你所需要做的就是提供任何`DataSource`(这样做的最简单方法是通过 Spring Boot 的配置约定)。 Spring 云任务为存储库自动使用这个“数据源”。 +如果你的应用程序只使用一个`DataSource`并同时作为你的业务模式和任务存储库,那么你所需要做的就是提供任何`DataSource`(这样做的最简单方法是通过 Spring Boot 的配置约定)。 Spring Cloud Task 为存储库自动使用这个`DataSource`。 如果应用程序使用多个`DataSource`,则需要使用适当的`DataSource`配置任务存储库。这种定制可以通过`TaskConfigurer`的实现来完成。 -### [](#features-table-prefix)[8.2.表格前缀](#features-table-prefix) ### +### [](#features-table-prefix)[8.2.表格前缀](#features-table-prefix) `TaskRepository`的一个可修改的属性是任务表的表前缀。默认情况下,它们都以`TASK_`开头。`TASK_EXECUTION`和`TASK_EXECUTION_PARAMS`是两个例子。然而,有潜在的理由修改这个前缀。如果需要将模式名前置到表名,或者如果同一模式中需要一组以上的任务表,则必须更改表前缀。可以将`spring.cloud.task.tablePrefix`设置为所需的前缀,如下所示: `spring.cloud.task.tablePrefix=yourPrefix` -通过使用`spring.cloud.task.tablePrefix`,用户承担了创建任务表的责任,这些任务表满足任务表模式的两个标准,但需要进行用户业务需求所需的修改。在创建你自己的任务 DDL 时,可以使用 Spring 云任务模式 DDL 作为指导,如[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task)所示。 +通过使用`spring.cloud.task.tablePrefix`,用户承担了创建任务表的责任,这些任务表满足任务表模式的两个标准,但需要进行用户业务需求所需的修改。在创建你自己的任务 DDL 时,可以使用 Spring Cloud任务模式 DDL 作为指导,如[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task)所示。 -### [](#features-table-initialization)[8.3.启用/禁用表初始化](#features-table-initialization) ### +### [](#features-table-initialization)[8.3.启用/禁用表初始化](#features-table-initialization) -如果你正在创建任务表,并且不希望 Spring Cloud Task 在任务启动时创建它们,请将`spring.cloud.task.initialize-enabled`属性设置为 `false’,如下所示: +如果你正在创建任务表,并且不希望 Spring Cloud Task 在任务启动时创建它们,请将`spring.cloud.task.initialize-enabled`属性设置为`false`,如下所示: `spring.cloud.task.initialize-enabled=false` -它默认为`true`。 +它的默认值为`true`。 | |属性`spring.cloud.task.initialize.enable`已被弃用。| |---|-----------------------------------------------------------------------| -### [](#features-generated_task_id)[8.4.外部生成的任务 ID](#features-generated_task_id) ### +### [](#features-generated_task_id)[8.4.外部生成的任务 ID](#features-generated_task_id) -在某些情况下,你可能希望在请求任务和基础设施实际启动任务之间留出时间差。 Spring 云任务允许你在任务被请求时创建`TaskExecution`。然后将生成的`TaskExecution`的执行 ID 传递给任务,以便它可以在任务的生命周期中更新`TaskExecution`。 +在某些情况下,你可能希望在请求任务和基础设施实际启动任务之间留出时间差。 Spring Cloud任务允许你在任务被请求时创建`TaskExecution`。然后将生成的`TaskExecution`的执行 ID 传递给任务,以便它可以在任务的生命周期中更新`TaskExecution`。 -可以通过在`TaskRepository`的实现上调用`TaskExecution`方法创建`createTaskExecution`方法,该实现引用了保存`TaskExecution`对象的数据存储。 +可以通过在`TaskRepository`的实现上调用`createTaskExecution`方法来创建`TaskExecution`,该实现引用了保存`TaskExecution`对象的数据存储。 为了将任务配置为使用生成的`TaskExecutionId`,请添加以下属性: `spring.cloud.task.executionid=yourtaskId` -### [](#features-external_task_id)[8.5.外部任务 ID](#features-external_task_id) ### +### [](#features-external_task_id)[8.5.外部任务 ID](#features-external_task_id) -Spring Cloud Task 允许你为每个“taskexecution”存储一个外部任务 ID。这方面的一个例子是,当一个任务在平台上启动时,Cloud Foundry 提供了一个任务 ID。为了将任务配置为使用生成的`TaskExecutionId`,请添加以下属性: +Spring Cloud Task 允许你为每个`TaskExecution`存储一个外部任务 ID。这方面的一个例子是,当一个任务在平台上启动时,Cloud Foundry 提供了一个任务 ID。为了将任务配置为使用生成的`TaskExecutionId`,请添加以下属性: `spring.cloud.task.external-execution-id=` -### [](#features-parent_task_id)[8.6.父任务 ID](#features-parent_task_id) ### +### [](#features-parent_task_id)[8.6.父任务 ID](#features-parent_task_id) -Spring Cloud Task 允许你为每个`TaskExecution`存储父任务 ID。这方面的一个例子是一个执行另一个或多个任务的任务,你希望记录每个子任务启动的任务。为了将任务配置为设置父“taskexecutionID”,在子任务上添加以下属性: +Spring Cloud Task 允许你为每个`TaskExecution`存储父任务 ID。这方面的一个例子是一个执行另一个或多个任务的任务,你希望记录每个子任务启动了哪个任务。为了将任务配置为设置父`TaskExecutionId`,在子任务上添加以下属性: `spring.cloud.task.parent-execution-id=` -### [](#features-task-configurer)[8.7.任务配置器](#features-task-configurer) ### +### [](#features-task-configurer)[8.7.任务配置器](#features-task-configurer) -`TaskConfigurer`是一个策略接口,允许你定制 Spring 云任务组件的配置方式。默认情况下,我们提供了提供逻辑默认值的`DefaultTaskConfigurer`:基于`Map`的内存中组件(如果没有提供 ` 数据源’,则对开发有用)和基于 JDBC 的组件(如果有`DataSource`可用,则很有用)。 +`TaskConfigurer`是一个策略接口,它允许你定制 Spring Cloud任务组件的配置方式。默认情况下,我们提供了提供逻辑默认值的`DefaultTaskConfigurer`:基于`Map`的内存中组件(如果不提供`DataSource`,则对开发有用)和基于 JDBC 的组件(如果有`DataSource`可用,则很有用)。 `TaskConfigurer`允许你配置三个主要组件: | Component |说明| Default (provided by `DefaultTaskConfigurer`) | |----------------------------|------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------| -| `TaskRepository` |要使用的`TaskRepository`的实现。| `SimpleTaskRepository` | +| `TaskRepository` |实现`TaskRepository`所要使用的。| `SimpleTaskRepository` | | `TaskExplorer` |要使用的`TaskExplorer`(用于对任务
存储库进行只读访问的组件)的实现。| `SimpleTaskExplorer` | |`PlatformTransactionManager`|运行任务更新时使用的事务管理器。|`DataSourceTransactionManager` if a `DataSource` is used.`ResourcelessTransactionManager` if it is not.| -你可以通过创建`TaskConfigurer`接口的自定义实现来定制上表中描述的任何组件。通常,扩展“defaultTaskConfigurer”(如果没有找到`TaskConfigurer`,则提供它)并重写所需的 getter 就足够了。然而,可能需要从头开始实现自己的功能。 +你可以通过创建`TaskConfigurer`接口的自定义实现来定制上表中描述的任何组件。通常,扩展`DefaultTaskConfigurer`(如果没有找到`TaskConfigurer`,则提供该扩展)并重写所需的吸气器就足够了。然而,可能需要从头开始实现你自己的功能。 | |用户不应该直接使用来自`TaskConfigurer`的 getter 方法直接
,除非他们正在使用它来提供将被公开为 Spring bean 的实现。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#features-task-name)[8.8. Task Name](#features-task-name) ### +### [](#features-task-name)[8.8.任务名称](#features-task-name) -在大多数情况下,任务的名称是在 Spring 引导中配置的应用程序名称。但是,在某些情况下,你可能希望将任务的运行映射到不同的名称。 Spring 云数据流就是这方面的一个例子(因为你可能希望以任务定义的名称运行该任务)。因此,我们提供了通过`TaskNameResolver`接口定制任务命名方式的能力。 +在大多数情况下,任务的名称是在 Spring 引导中配置的应用程序名称。但是,在某些情况下,你可能希望将任务的运行映射到不同的名称。 Spring Cloud数据流就是这方面的一个例子(因为你可能希望以任务定义的名称运行该任务)。因此,我们提供了通过`TaskNameResolver`接口定制任务命名方式的能力。 默认情况下, Spring Cloud Task 提供`SimpleTaskNameResolver`,它使用以下选项(按优先顺序排列): -1. Spring 引导属性(以 Spring 引导允许的任何方式进行配置)称为 ` Spring.cloud.task.name`。 +1. Spring 引导属性(以 Spring 引导允许的任何方式配置)称为`spring.cloud.task.name`。 -2. 使用 Spring 引导规则解析的应用程序名称(通过“ApplicationContext#GetID”获得)。 +2. 使用 Spring 引导规则解析的应用程序名称(通过`ApplicationContext#getId`获得)。 -### [](#features-task-execution-listener)[8.9.任务执行监听器](#features-task-execution-listener) ### +### [](#features-task-execution-listener)[8.9.任务执行监听器](#features-task-execution-listener) -`TaskExecutionListener`允许你为任务生命周期中发生的特定事件注册侦听器。为此,创建一个实现“TaskExecutionListener”接口的类。实现`TaskExecutionListener`接口的类将收到以下事件的通知: +`TaskExecutionListener`允许你为任务生命周期中发生的特定事件注册侦听器。为此,创建一个实现`TaskExecutionListener`接口的类。实现`TaskExecutionListener`接口的类将收到以下事件的通知: * `onTaskStartup`:在将`TaskExecution`存储到`TaskRepository`之前。 -* `onTaskEnd`:在更新`TaskRepository`中的`TaskExecution`条目并标记任务的最终状态之前。 +* `onTaskEnd`:在更新`TaskExecution`中的`TaskExecution`条目并标记任务的最终状态之前。 -* `onTaskFailed`:在任务引发未处理异常时调用`onTaskEnd`方法之前。 +* `onTaskFailed`:在任务抛出未处理的异常时调用`onTaskEnd`方法之前。 Spring Cloud Task 还允许你通过使用以下方法注释将`TaskExecution`侦听器添加到 Bean 内的方法: -* `@BeforeTask`:在将`TaskExecution`存储到`TaskRepository`之前 +* `@BeforeTask`:将之前的`TaskExecution`存储到`TaskRepository`中 * `@AfterTask`:在更新`TaskExecution`条目之前,在`TaskRepository`中标记任务的最终状态。 @@ -392,23 +379,23 @@ Spring Cloud Task 还允许你通过使用以下方法注释将`TaskExecution` } ``` -| |在链中比`TaskLifecycleListener`存在更早地插入`ApplicationListener`可能会导致意想不到的影响。| +| |在链中比`TaskLifecycleListener`存在更早地插入`ApplicationListener`可能会导致意外的影响。| |---|-------------------------------------------------------------------------------------------------------------------------| -#### [](#features-task-execution-listener-Exceptions)[8.9.1.任务执行侦听器抛出的异常](#features-task-execution-listener-Exceptions) #### +#### [](#features-task-execution-listener-Exceptions)[8.9.1.任务执行侦听器抛出的异常](#features-task-execution-listener-Exceptions) -如果`TaskExecutionListener`事件处理程序引发异常,则该事件处理程序的所有侦听器处理都将停止。例如,如果三个`onTaskStartup`侦听器已经启动,并且第一个`onTaskStartup`事件处理程序抛出一个异常,则不调用另外两个`onTaskStartup`方法。但是,调用`TaskExecutionListeners`的其他事件处理程序(`ontaskend` 和`onTaskFailed`)。 +如果`TaskExecutionListener`事件处理程序引发异常,则该事件处理程序的所有侦听器处理都将停止。例如,如果三个`onTaskStartup`侦听器已经启动,并且第一个`onTaskStartup`事件处理程序抛出一个异常,则不调用另外两个`onTaskStartup`方法。但是,调用`TaskExecutionListeners`的其他事件处理程序(`onTaskEnd`和`onTaskFailed`)。 -当`TaskExecutionListener`事件处理程序抛出异常时返回的退出代码是[ExitCodeEvent](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/ExitCodeEvent.html)报告的退出代码。如果没有`ExitCodeEvent`发出,则对抛出的异常进行评估,以查看它是否为[exitcodegenerator](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-application-exit)类型。如果是,则返回来自`ExitCodeGenerator`的退出代码。否则,将返回`1`。 +当`TaskExecutionListener`事件处理程序抛出异常时返回的退出代码是[exitcodeevent](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/ExitCodeEvent.html)报告的退出代码。如果没有`ExitCodeEvent`发出,则对抛出的异常进行评估,以查看它是否为[exitcodegenerator](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-application-exit)类型。如果是,则返回来自`ExitCodeGenerator`的退出代码。否则,将返回`1`。 在`onTaskStartup`方法中抛出异常的情况下,应用程序的退出代码将是`1`。如果在`onTaskEnd`或`onTaskFailed`方法中抛出异常,则应用程序的退出代码将是使用上面列举的规则建立的代码。 | |在`onTaskStartup`、`onTaskEnd`或`onTaskFailed`中抛出异常的情况下,你无法使用`ExitCodeExceptionMapper`覆盖应用程序的退出代码。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#features-task-execution-listener-exit-messages)[8.9.2.退出消息](#features-task-execution-listener-exit-messages) #### +#### [](#features-task-execution-listener-exit-messages)[8.9.2.退出消息](#features-task-execution-listener-exit-messages) -你可以通过使用“TaskExecutionListener”以编程方式设置任务的退出消息。这是通过设置`TaskExecution’s``exitMessage`来完成的,然后将其传递到`TaskExecutionListener`中。下面的示例显示了一个用`@AfterTask``ExecutionListener`进行注释的方法: +可以通过使用`TaskExecutionListener`以编程方式设置任务的退出消息。这是通过设置`TaskExecution’s``exitMessage`来完成的,然后将其传递到`TaskExecutionListener`中。下面的示例显示了一个用`@AfterTask``ExecutionListener`进行注释的方法: ``` @AfterTask @@ -417,7 +404,7 @@ public void afterMe(TaskExecution taskExecution) { } ``` -可以在任何侦听器事件(“ontaskstartup”、“ontaskfailed”和`onTaskEnd`)上设置`ExitMessage`。这三个侦听器的优先顺序如下: +可以在任何侦听器事件(`onTaskStartup`、`onTaskFailed`和`onTaskEnd`)上设置`ExitMessage`。这三个侦听器的优先顺序如下: 1. `onTaskEnd` @@ -425,11 +412,11 @@ public void afterMe(TaskExecution taskExecution) { 3. `onTaskStartup` -例如,如果你为`onTaskStartup`和`onTaskFailed`侦听器设置了`exitMessage`,并且任务没有失败就结束了,则来自`onTaskStartup`的`exitMessage`将存储在存储库中。否则,如果发生故障,则存储来自`onTaskFailed`的`exitMessage`。同样,如果你使用 `ontaskend’侦听器设置`exitMessage`,则来自`onTaskEnd`的`exitMessage`将取代来自`onTaskStartup`和`onTaskFailed`的退出消息。 +例如,如果你为`onTaskStartup`和`onTaskFailed`侦听器设置了`exitMessage`,并且任务没有失败就结束了,则来自`onTaskStartup`的`exitMessage`将存储在存储库中。否则,如果发生故障,则存储来自`onTaskFailed`的`exitMessage`。同样,如果你使用`onTaskEnd`侦听器设置`exitMessage`,则来自`onTaskEnd`的`exitMessage`将取代来自`onTaskStartup`和`onTaskFailed`的退出消息。 -### [](#features-single-instance-enabled)[8.10. Restricting Spring Cloud Task Instances](#features-single-instance-enabled) ### +### [](#features-single-instance-enabled)[8.10. Restricting Spring Cloud Task Instances](#features-single-instance-enabled) -Spring 云任务允许你确定一次只能运行一个具有给定任务名的任务。为此,你需要为每个任务执行建立[task name](#features-task-name)并设置 ` Spring.cloud.task.single-instance-enabled=true`。当第一个任务执行正在运行时,当你尝试运行一个具有相同[task name](#features-task-name)和 ` Spring.cloud.task.single-instance-enabled=true` 的任务时,该任务会失败,并出现以下错误消息:`Task with name "application" is already running.``spring.cloud.task.single-instance-enabled`的默认值为`false`。下面的示例展示了如何将`spring.cloud.task.single-instance-enabled`设置为`true`: +Spring Cloud任务允许你确定一次只能运行一个具有给定任务名的任务。要做到这一点,你需要为每个任务执行建立[task name](#features-task-name)并设置`spring.cloud.task.single-instance-enabled=true`。当第一个任务执行正在运行时,当你尝试运行具有相同[task name](#features-task-name)和`spring.cloud.task.single-instance-enabled=true`的任务时,该任务将失败,并出现以下错误消息:`Task with name "application" is already running.``spring.cloud.task.single-instance-enabled`的默认值为`false`。下面的示例展示了如何将`spring.cloud.task.single-instance-enabled`设置为`true`: `spring.cloud.task.single-instance-enabled=true or false` @@ -449,9 +436,9 @@ Spring 云任务允许你确定一次只能运行一个具有给定任务名的 | |如果任务失败,则应用程序的退出代码将为 1,因为启用了此功能
,并且另一个任务正在以相同的任务名运行。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#disabling-spring-cloud-task-auto-configuration)[8.11. Disabling Spring Cloud Task Auto Configuration](#disabling-spring-cloud-task-auto-configuration) ### +### [](#disabling-spring-cloud-task-auto-configuration)[8.11. Disabling Spring Cloud Task Auto Configuration](#disabling-spring-cloud-task-auto-configuration) -在不应该为某个实现自动配置 Spring 云任务的情况下,你可以禁用 Task 的自动配置。这可以通过向任务应用程序添加以下注释来完成: +在不应该为某个实现自动配置 Spring Cloud任务的情况下,你可以禁用 Task 的自动配置。这可以通过向任务应用程序添加以下注释来完成: ``` @EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class}) @@ -459,29 +446,27 @@ Spring 云任务允许你确定一次只能运行一个具有给定任务名的 还可以通过将`spring.cloud.task.autoconfiguration.enabled`属性设置为`false`来禁用任务自动配置。 -### [](#closing-the-context)[8.12.结束上下文](#closing-the-context) ### +### [](#closing-the-context)[8.12.结束上下文](#closing-the-context) 如果应用程序要求在任务完成时关闭`ApplicationContext`(所有`*Runner#run`方法都已被调用,并且任务存储库已更新),则将属性`spring.cloud.task.closecontextEnabled`设置为`true`。 关闭上下文的另一种情况是当任务执行完成但应用程序没有终止时。在这些情况下,上下文是开放的,因为已经分配了一个线程(例如:如果你正在使用 TaskExecutor)。在这些情况下,在启动任务时将`spring.cloud.task.closecontextEnabled`属性设置为`true`。一旦任务完成,这将关闭应用程序的上下文。从而允许应用程序终止。 -[](#batch)[Batch](#batch) -========== +# [](#batch)[Batch](#batch) 本节将更详细地介绍 Spring Cloud Task 与 Spring Batch 的集成。跟踪作业执行与其执行的任务之间的关联,以及通过 Spring Cloud Deployer 进行远程分区,将在本节中介绍。 -[](#batch-association)[9.将作业执行与其执行的任务关联起来](#batch-association) ----------- +## [](#batch-association)[9.将作业执行与其执行的任务关联起来](#batch-association) -Spring Boot 提供了用于在 anüber- jar 内执行批处理作业的设施。 Spring Boot 对该功能的支持使开发人员能够在该执行中执行多个批处理任务。 Spring 云任务提供了将作业(作业执行)的执行与任务的执行相关联的能力,以便一个可以追溯到另一个。 +Spring Boot 为在 anüber- jar 内执行批处理作业提供了便利。 Spring Boot 对该功能的支持使开发人员能够在该执行中执行多个批处理任务。 Spring Cloud任务提供了将作业(作业执行)的执行与任务的执行相关联的能力,以便一个可以追溯到另一个。 -Spring 云任务通过使用`TaskBatchExecutionListener`来实现这一功能。默认情况下,此侦听器在任何上下文中自动配置,该上下文同时配置了 Spring 批作业(通过在上下文中定义了类型`Job`的 Bean)和 Classpath 上的 ` Spring-cloud-task-batch` jar。所有符合这些条件的工作都会被注入监听器。 +Spring Cloud任务通过使用`TaskBatchExecutionListener`来实现这一功能。默认情况下,此侦听器在任何同时配置了 Spring 批作业(通过在上下文中定义了类型`Job`的 Bean)和 Classpath 上的`spring-cloud-task-batch` jar 的上下文中自动配置。所有符合这些条件的工作都会被注入监听器。 -### [](#batch-association-override)[9.1.覆盖 TaskBatchExecutionListener](#batch-association-override) ### +### [](#batch-association-override)[9.1.覆盖 TaskBatchExecutionListener](#batch-association-override) 为了防止侦听器被注入到当前上下文中的任何批处理作业中,你可以使用标准的 Spring 引导机制禁用自动配置。 -要仅将侦听器注入到上下文中的特定作业中,请覆盖“BatchtaskExecutionListentenerBeanPostProcessor”,并提供作业 Bean ID 的列表,如以下示例所示: +要仅将侦听器注入到上下文中的特定作业中,请覆盖`batchTaskExecutionListenerBeanPostProcessor`并提供作业 Bean ID 的列表,如以下示例所示: ``` public TaskBatchExecutionListenerBeanPostProcessor batchTaskExecutionListenerBeanPostProcessor() { @@ -497,12 +482,11 @@ public TaskBatchExecutionListenerBeanPostProcessor batchTaskExecutionListenerBea | |你可以在 Spring Cloud
任务项目的样例模块中找到样例批处理应用程序,[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/batch-job)。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#batch-partitioning)[10.远程分区](#batch-partitioning) ----------- +## [](#batch-partitioning)[10.远程分区](#batch-partitioning) -Spring Cloud Deployer 提供了用于在大多数云基础设施上启动 Spring 基于引导的应用程序的设施。`DeployerPartitionHandler`和 `DeployerStepExecutionHandler’将工人步骤执行的启动委托给 Spring Cloud Deployer。 +Spring Cloud Deployer 提供了用于在大多数云基础设施上启动 Spring 基于引导的应用程序的设施。`DeployerPartitionHandler`和`DeployerStepExecutionHandler`将工人步骤执行的启动委托给 Spring Cloud Deployer。 -要配置`DeployerStepExecutionHandler`,必须提供一个表示要执行的 Spring bootüber- jar 的`Resource`、一个`TaskLauncher`和一个 `jobexplorer’。你可以配置任何环境属性,以及一次执行的工作人员的最大数量、轮询结果的间隔(默认为 10 秒)和超时(默认为-1 或无超时)。下面的示例显示了如何配置`PartitionHandler`: +要配置`DeployerStepExecutionHandler`,必须提供表示要执行的 Spring bootüber- jar 的`Resource`、`TaskLauncher`和`JobExplorer`。你可以配置任何环境属性,以及一次执行的工作人员的最大数量、轮询结果的间隔(默认为 10 秒)和超时(默认为-1 或无超时)。下面的示例显示了如何配置`PartitionHandler`: ``` @Bean @@ -542,7 +526,7 @@ public PartitionHandler partitionHandler(TaskLauncher taskLauncher, 请注意,在上面的示例中,我们将工人的最大数量设置为 2。设置工人的最大值可以确定一次应该运行的分区的最大数量。 -要执行的`Resource`应该是一个 Spring bootüber- jar,其中的 `DeployerStepExecutionHandler’在当前上下文中被配置为`CommandLineRunner`。前面示例中列举的存储库应该是 über- jar 所在的远程存储库。Manager 和 Worker 都应该对作为作业存储库和任务存储库使用的同一数据存储具有可见性。一旦底层基础结构引导了 Spring boot jar,并且 Spring boot 启动了`DeployerStepExecutionHandler`,步骤处理程序将执行请求的 `step’。下面的示例展示了如何配置`DeployerStepExecutionHandler`: +要执行的`Resource`预计是一个 Spring Bootüber- jar,其`DeployerStepExecutionHandler`在当前上下文中被配置为`CommandLineRunner`。前面示例中列举的存储库应该是 über- jar 所在的远程存储库。Manager 和 Worker 都应该对作为作业存储库和任务存储库使用的同一数据存储具有可见性。一旦底层基础结构引导了 Spring boot jar,并且 Spring boot 启动了`DeployerStepExecutionHandler`,步骤处理程序将执行请求的`Step`。下面的示例展示了如何配置`DeployerStepExecutionHandler`: ``` @Bean @@ -554,12 +538,12 @@ public DeployerStepExecutionHandler stepExecutionHandler(JobExplorer jobExplorer } ``` -| |你可以在
Spring 云任务项目的样例模块[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/partitioned-batch-job)中找到一个样例远程分区应用程序。| +| |你可以在
Spring Cloud任务项目的样例模块[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/partitioned-batch-job)中找到一个样例远程分区应用程序。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform)[10.1.关于为 Kubernetes 平台开发批处理分区应用程序的说明](#notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform) ### +### [](#notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform)[10.1.关于为 Kubernetes 平台开发批处理分区应用程序的说明](#notes-on-developing-a-batch-partitioned-application-for-the-kubernetes-platform) -* 在 Kubernetes 平台上部署分区应用程序时,你必须对 Spring Cloud Kubernetes 部署程序使用以下依赖关系: +* 在 Kubernetes 平台上部署分区应用程序时,对于 Spring Cloud Kubernetes 部署程序,必须使用以下依赖项: ``` @@ -570,7 +554,7 @@ public DeployerStepExecutionHandler stepExecutionHandler(JobExplorer jobExplorer * 任务应用程序及其分区的应用程序名称需要遵循以下正则表达式模式:`[a-z0-9]([-a-z0-9]*[a-z0-9])`。否则,将抛出异常。 -### [](#notes-on-developing-a-batch-partitioned-application-for-the-cloud-foundry-platform)[10.2.为 Cloud Foundry 平台开发批处理分区应用程序的注意事项](#notes-on-developing-a-batch-partitioned-application-for-the-cloud-foundry-platform) ### +### [](#notes-on-developing-a-batch-partitioned-application-for-the-cloud-foundry-platform)[10.2.为 Cloud Foundry 平台开发批处理分区应用程序的注意事项](#notes-on-developing-a-batch-partitioned-application-for-the-cloud-foundry-platform) * 在 Cloud Foundry 平台上部署分区应用程序时,对于 Spring Cloud Foundry 部署人员,你必须使用以下依赖关系: @@ -622,25 +606,22 @@ spring_cloud_deployer_cloudfoundry_services=mysql spring_cloud_deployer_cloudfoundry_taskTimeout=300 ``` -| |在使用 PCF-Dev 时,还需要使用以下环境变量:`Spring_Cloud_Deployer_CloudFoundry_SkipsslValidation=true’| +| |当使用 PCF-Dev 时,还需要以下环境变量:`spring_cloud_deployer_cloudfoundry_skipSslValidation=true`| |---|-----------------------------------------------------------------------------------------------------------------------------------| -[](#batch-informational-messages)[11.批处理信息消息](#batch-informational-messages) ----------- +## [](#batch-informational-messages)[11.批处理信息消息](#batch-informational-messages) -Spring 云任务为批处理作业提供了发出信息消息的能力。“[Spring Batch Events](#stream-integration-batch-events)”部分详细介绍了此功能。 +Spring Cloud任务提供了批处理作业发送信息消息的能力。“[Spring Batch Events](#stream-integration-batch-events)”部分详细介绍了此功能。 -[](#batch-failures-and-tasks)[12.批处理作业退出代码](#batch-failures-and-tasks) ----------- +## [](#batch-failures-and-tasks)[12.批处理作业退出代码](#batch-failures-and-tasks) -正如[earlier](#features-lifecycle-exit-codes)所讨论的, Spring 云任务应用程序支持记录任务执行的退出代码的能力。然而,在任务中运行 Spring 批处理作业的情况下,无论批处理作业如何执行,当使用默认的批处理/引导行为时,任务的结果始终为零。请记住,任务是一个引导应用程序,从该任务返回的退出代码与引导应用程序相同。要重写此行为并允许任务在批处理作业返回`FAILED`的[BatchStatus](https://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#batchStatusVsExitStatus)时返回除零以外的退出代码,请将`spring.cloud.task.batch.fail-on-job-failure`设置为`true`。然后退出代码可以是 1(默认值),也可以基于[指定的“exitcodegenerator”](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-application-exit)) +正如[earlier](#features-lifecycle-exit-codes)所讨论的, Spring Cloud任务应用程序支持记录任务执行的退出代码的能力。然而,在任务中运行 Spring 批处理作业的情况下,无论批处理作业如何执行,当使用默认的批处理/引导行为时,任务的结果始终为零。请记住,任务是一个引导应用程序,从该任务返回的退出代码与引导应用程序相同。要重写此行为并允许任务在批处理作业返回`FAILED`的[BatchStatus](https://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#batchStatusVsExitStatus)时返回除零以外的退出代码,请将`spring.cloud.task.batch.fail-on-job-failure`设置为`true`。然后退出代码可以是 1(默认)或基于[指定的`ExitCodeGenerator`](https://DOCS. Spring.io/ Spring-boot/DOCS/current/reference/html/boot-features- Spring-application.html#boot-features-application-exit)))) -这个功能使用了一个新的`CommandLineRunner`,它取代了 Spring boot 提供的功能。默认情况下,它的配置顺序相同。但是,如果你想定制`CommandLineRunner`的运行顺序,可以通过设置 ` Spring.cloud.task.batch.CommandlineRunnerOrder` 属性来设置其顺序。要让你的任务返回基于批处理作业执行结果的退出代码,你需要编写自己的“CommandLineRunner”。 +这个功能使用了一个新的`CommandLineRunner`,它取代了 Spring boot 提供的功能。默认情况下,它的配置顺序相同。但是,如果你希望自定义运行`CommandLineRunner`的顺序,则可以通过设置`spring.cloud.task.batch.commandLineRunnerOrder`属性来设置其顺序。要让你的任务返回基于批处理作业执行结果的退出代码,你需要编写自己的`CommandLineRunner`。 -[](#batch-job-starter)[单步批处理作业启动器](#batch-job-starter) -========== +# [](#batch-job-starter)[单步批处理作业启动器](#batch-job-starter) -本节将讨论如何通过使用 Spring 云任务中包含的启动器来开发具有单个`Step`的 Spring 批处理`Job`。这个启动器允许你使用配置来定义`ItemReader`、`ItemWriter`或完整的单步 Spring 批处理`Job`。有关 Spring 批处理及其功能的更多信息,请参见[Spring Batch documentation](https://spring.io/projects/spring-batch)。 +本节将讨论如何通过使用 Spring Cloud任务中包含的启动器来开发具有单个`Step`的 Spring 批处理`Job`。这个启动器允许你使用配置来定义`ItemReader`、`ItemWriter`或完整的单步 Spring 批处理`Job`。有关 Spring 批处理及其功能的更多信息,请参见[Spring Batch documentation](https://spring.io/projects/spring-batch)。 要获得 Maven 的启动器,请在构建中添加以下内容: @@ -658,12 +639,11 @@ Spring 云任务为批处理作业提供了发出信息消息的能力。“[Spr compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0" ``` -[](#job-definition)[13.定义工作](#job-definition) ----------- +## [](#job-definition)[13.定义工作](#job-definition) -你可以使用 starter 来定义很少的`ItemReader`或`ItemWriter`,也可以定义很多的`Job`。在本节中,我们定义了配置“作业”所需定义的属性。 +你可以使用 starter 来定义很少的`ItemReader`或`ItemWriter`,也可以定义很多的`Job`。在本节中,我们将定义需要定义哪些属性来配置`Job`。 -### [](#job-definition-properties)[13.1.属性](#job-definition-properties) ### +### [](#job-definition-properties)[13.1.属性](#job-definition-properties) 首先,Starter 提供了一组属性,让你只需一步就可以配置作业的基本知识: @@ -675,15 +655,14 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. 配置了上述属性后,你就可以使用一个基于块的步骤来执行作业了。这个基于块的步骤读取、处理和写入`Map`实例作为项。然而,这一步还没有起到任何作用。你需要配置一个`ItemReader`、一个可选的`ItemProcessor`和一个`ItemWriter`,以便让它做一些事情。要配置其中之一,你可以使用属性并配置已提供自动配置的选项之一,也可以使用标准 Spring 配置机制配置你自己的选项。 -| |如果配置自己的,则输入和输出类型必须与步骤中的其他类型匹配。
该启动器中的`ItemReader`实现和`ItemWriter`实现都使用
a`Map`作为输入和输出项。| +| |如果你配置自己的,则输入和输出类型必须与步骤中的其他类型匹配。
在此启动器中的`ItemReader`实现和`ItemWriter`实现都使用
a`Map`作为输入和输出项。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#item-readers)[14.ItemReader 实现的自动配置](#item-readers) ----------- +## [](#item-readers)[14.ItemReader 实现的自动配置](#item-readers) -这个启动器为四个不同的`ItemReader`实现提供自动配置:`amqpitemreader`,`FlatFileItemReader`,`JdbcCursorItemReader`,和`KafkaItemReader`。在本节中,我们将概述如何通过使用提供的自动配置来配置其中的每一个。 +此启动器为四种不同的`ItemReader`实现提供自动配置:`AmqpItemReader`、`FlatFileItemReader`、`JdbcCursorItemReader`和`KafkaItemReader`。在本节中,我们将概述如何通过使用提供的自动配置来配置其中的每一个。 -### [](#amqpitemreader)[14.1.AMQPitemReader](#amqpitemreader) ### +### [](#amqpitemreader)[14.1.AMQPitemReader](#amqpitemreader) 你可以使用`AmqpItemReader`使用 AMQP 读取队列或主题。这个`ItemReader`实现的自动配置依赖于两组配置。第一个是`AmqpTemplate`的配置。你可以自己对此进行配置,也可以使用 Spring Boot 提供的自动配置。参见[Spring Boot AMQP documentation](https://docs.spring.io/spring-boot/docs/2.4.x/reference/htmlsingle/#boot-features-amqp)。一旦配置了`AmqpTemplate`,就可以通过设置以下属性来启用批处理功能来支持它: @@ -692,11 +671,11 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. | `spring.batch.job.amqpitemreader.enabled` |`boolean`| `false` |如果`true`,则自动配置将执行。| |`spring.batch.job.amqpitemreader.jsonConverterEnabled`|`boolean`| `true` |指示是否应注册`Jackson2JsonMessageConverter`以解析消息。| -有关更多信息,请参见[“AmqPitemReader”文档](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/amqp/AmqpItemReader.html)。 +有关更多信息,请参见[`AmqpItemReader`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/amqp/amqpitemreader.html)。 -### [](#flatfileitemreader)[14.2.平板文件阅读器](#flatfileitemreader) ### +### [](#flatfileitemreader)[14.2.平板文件阅读器](#flatfileitemreader) -`FlatFileItemReader`允许你从平面文件(例如 CSV 和其他文件格式)进行读取。要从文件中读取数据,你可以通过正常的 Spring 配置(’linetokenizer’,`RecordSeparatorPolicy`,’fieldsetmapper’,`LineMapper`,或`SkippedLinesCallback`)自己提供一些组件。你还可以使用以下属性来配置阅读器: +`FlatFileItemReader`允许你从平面文件(例如 CSV 和其他文件格式)进行读取。要从文件中读取,你可以通过正常的 Spring 配置(`LineTokenizer`,`RecordSeparatorPolicy`,`FieldSetMapper`,`LineMapper`,或`SkippedLinesCallback`)自己提供一些组件。你还可以使用以下属性来配置阅读器: | Property | Type | Default Value |说明| |------------------------------------------------------|---------------|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -713,21 +692,21 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. | `spring.batch.job.flatfileitemreader.delimiter` | `String` | `DelimitedLineTokenizer.DELIMITER_COMMA` |如果读取分隔符文件,则指示要解析的分隔符。| | `spring.batch.job.flatfileitemreader.quoteCharacter` | `char` |`DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER`|用于确定用于引用值的字符。| | `spring.batch.job.flatfileitemreader.includedFields` |`List`| empty list |一个索引列表,用于确定记录中的哪些字段要包含在项中。| -| `spring.batch.job.flatfileitemreader.fixedLength` | `boolean` | `false` |指示文件的记录是否由列号解析。此属性中只有一个或`spring.batch.job.flatfileitemreader.delimited`可以同时是`true`。| +| `spring.batch.job.flatfileitemreader.fixedLength` | `boolean` | `false` |表示文件的记录是否由列号解析。此属性中只有一个或`spring.batch.job.flatfileitemreader.delimited`可以同时是`true`。| | `spring.batch.job.flatfileitemreader.ranges` | `List` | empty list |用于解析固定宽度记录的列范围列表。参见[范围文档](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/file/transform/Range.html)。| | `spring.batch.job.flatfileitemreader.names` | `String []` | `null` |从记录中解析的每个字段的名称列表。这些名称是从这个`ItemReader`返回的项中的`Map`中的键。| | `spring.batch.job.flatfileitemreader.parsingStrict` | `boolean` | `true` |如果设置为`true`,则如果无法映射字段,则映射失败。| -参见[“平板文件阅读器”文件](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/file/FlatFileItemReader.html)。 +参见[`FlatFileItemReader`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/file/flatfileitemreader.html)。 -### [](#jdbcCursorItemReader)[14.3.JDBCCursoritemReader](#jdbcCursorItemReader) ### +### [](#jdbcCursorItemReader)[14.3.JDBCCursoritemReader](#jdbcCursorItemReader) -`JdbcCursorItemReader`针对关系数据库运行一个查询,并在结果游标上进行迭代,以提供结果项。此自动配置允许你提供`PreparedStatementSetter`、`RowMapper`或两者。你还可以使用以下属性来配置`JdbcCursorItemReader`: +`JdbcCursorItemReader`对关系数据库运行查询,并在结果游标(`ResultSet`)上进行迭代,以提供结果项。此自动配置允许你提供`PreparedStatementSetter`、`RowMapper`或两者。你还可以使用以下属性来配置`JdbcCursorItemReader`: | Property | Type | Default Value |说明| |-------------------------------------------------------------------|---------|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `spring.batch.job.jdbccursoritemreader.saveState` |`boolean`| `true` |确定是否应将状态保存以重新启动。| -| `spring.batch.job.jdbccursoritemreader.name` |`String` | `null` |用于在`ExecutionContext`中提供唯一键的名称。| +| `spring.batch.job.jdbccursoritemreader.name` |`String` | `null` |用于在`ExecutionContext`中提供唯一密钥的名称。| | `spring.batch.job.jdbccursoritemreader.maxItemcount` | `int` |`Integer.MAX_VALUE`|从文件中读取的项目的最大数量。| | `spring.batch.job.jdbccursoritemreader.currentItemCount` | `int` | 0 |已读项目的数量。用于重启。| | `spring.batch.job.jdbccursoritemreader.fetchSize` | `int` | |给驱动程序的一个提示,指示每次调用数据库系统要检索多少记录。为了获得最佳性能,你通常希望将其设置为与块大小匹配。| @@ -739,11 +718,11 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. |`spring.batch.job.jdbccursoritemreader.useSharedExtendedConnection`|`boolean`| `false` |指示连接是否与其他处理共享(因此是事务的一部分)。| | `spring.batch.job.jdbccursoritemreader.sql` |`String` | `null` |要读取的 SQL 查询。| -参见[JDBCCursoritemReader 文档](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/database/JdbcCursorItemReader.html)。 +参见[`JdbcCursorItemReader`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/database/jdbcccursoritemreader.html)。 -### [](#kafkaItemReader)[14.4.Kafkaitemreader](#kafkaItemReader) ### +### [](#kafkaItemReader)[14.4.Kafkaitemreader](#kafkaItemReader) -从 Kafka 主题中获取数据分区非常有用,也正是“Kafkaitemreader”所能做的。要配置`KafkaItemReader`,需要进行两部分配置。首先,需要使用 Spring Boot 的 Kafka 自动配置来配置 Kafka(参见[Spring Boot Kafka documentation](https://docs.spring.io/spring-boot/docs/2.4.x/reference/htmlsingle/#boot-features-kafka))。在配置了 Spring 引导中的 Kafka 属性之后,可以通过设置以下属性来配置`KafkaItemReader`本身: +从 Kafka 主题中获取数据分区是有用的,也正是`KafkaItemReader`所能做的。要配置`KafkaItemReader`,需要进行两部分配置。首先,需要使用 Spring Boot 的 Kafka 自动配置来配置 Kafka(参见[Spring Boot Kafka documentation](https://docs.spring.io/spring-boot/docs/2.4.x/reference/htmlsingle/#boot-features-kafka))。在配置了 Spring boot 中的 Kafka 属性之后,可以通过设置以下属性来配置`KafkaItemReader`本身: | Property | Type |Default Value|说明| |-------------------------------------------------------|---------------|-------------|-----------------------------------------------------------| @@ -753,30 +732,28 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. |`spring.batch.job.kafkaitemreader.pollTimeOutInSeconds`| `long` | 30 |`poll()`操作的超时。| | `spring.batch.job.kafkaitemreader.saveState` | `boolean` | `true` |确定是否应将状态保存以重新启动。| -参见[“KafkaitemReader”文件](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/kafka/KafkaItemReader.html)。 +参见[`KafkaItemReader`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/kafka/kafkaitemreader.html)。 -[](#item-processors)[15.项目处理器配置](#item-processors) ----------- +## [](#item-processors)[15.项目处理器配置](#item-processors) -如果`ApplicationContext`中有一个选项可用,那么单步批处理作业自动配置接受`ItemProcessor`。如果找到了正确的类型(`itemprocessor,map>`),则自动连线到步骤中。 +如果`ApplicationContext`中有一个选项可用,那么单步批处理作业自动配置接受`ItemProcessor`。如果找到了正确的类型(`ItemProcessor, Map>`),则自动连接到该步骤中。 -[](#item-writers)[16.ItemWriter 实现的自动配置](#item-writers) ----------- +## [](#item-writers)[16.ItemWriter 实现的自动配置](#item-writers) -此启动器为`ItemWriter`实现提供自动配置,这些实现匹配所支持的`ItemReader`实现:`AmqpItemWriter`、`中由此`ItemWriter`接收的项的键。| | `spring.batch.job.flatfileitemwriter.append` | `boolean` | `false` |指示如果找到输出文件,是否应将文件追加到该文件。| | `spring.batch.job.flatfileitemwriter.lineSeparator` | `String` |`FlatFileItemWriter.DEFAULT_LINE_SEPARATOR`|用什么`String`来分隔输出文件中的行。| -| `spring.batch.job.flatfileitemwriter.name` | `String` | `null` |用于在`ExecutionContext`中提供唯一密钥的名称。| +| `spring.batch.job.flatfileitemwriter.name` | `String` | `null` |用于在`ExecutionContext`中提供唯一键的名称。| | `spring.batch.job.flatfileitemwriter.saveState` | `boolean` | `true` |确定是否应将状态保存以重新启动。| |`spring.batch.job.flatfileitemwriter.shouldDeleteIfEmpty` | `boolean` | `false` |如果设置为`true`,则在作业完成时将删除一个空文件(没有输出)。| |`spring.batch.job.flatfileitemwriter.shouldDeleteIfExists`| `boolean` | `true` |如果设置为`true`,并且在输出文件应该在的位置找到一个文件,则在步骤开始之前将其删除。| | `spring.batch.job.flatfileitemwriter.transactional` | `boolean` |`FlatFileItemWriter.DEFAULT_TRANSACTIONAL` |指示读取器是否为事务性队列(表示读取的项在出现故障时返回到队列中)。| -参见[FlatFileitemWriter 文档](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/file/FlatFileItemWriter.html)。 +参见[`FlatFileItemWriter`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/file/flatfileitemwriter.html)。 -### [](#jdbcitemwriter)[16.3.JDBCBatchitemwriter](#jdbcitemwriter) ### +### [](#jdbcitemwriter)[16.3.JDBCBatchitemwriter](#jdbcitemwriter) 要将一个步骤的输出写到关系数据库中,此启动器提供了自动配置`JdbcBatchItemWriter`的功能。自动配置允许你通过设置以下属性来提供自己的`ItemPreparedStatementSetter`或`ItemSqlParameterSourceProvider`和配置选项: @@ -811,9 +788,9 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. | `spring.batch.job.jdbcbatchitemwriter.sql` |`String` | `null` |用于插入每个项的 SQL。| |`spring.batch.job.jdbcbatchitemwriter.assertUpdates`|`boolean`| `true` |是否要验证每个插入都会导致至少一条记录的更新。| -参见[JDBCBatchitemWriter 文档](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/database/JdbcBatchItemWriter.html)。 +参见[`JdbcBatchItemWriter`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/database/jdbcbatchitemwriter.html)。 -### [](#kafkaitemwriter)[16.4.KafkaitemWriter](#kafkaitemwriter) ### +### [](#kafkaitemwriter)[16.4.KafkaitemWriter](#kafkaitemwriter) 要将步骤输出写入 Kafka 主题,你需要`KafkaItemWriter`。这个启动器通过使用来自两个地方的设备为`KafkaItemWriter`提供自动配置。第一个是 Spring Boot 的 Kafka 自动配置。(参见[Spring Boot Kafka documentation](https://docs.spring.io/spring-boot/docs/2.4.x/reference/htmlsingle/#boot-features-kafka)。)其次,这个启动器允许你在 Writer 上配置两个属性。 @@ -822,15 +799,13 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. |`spring.batch.job.kafkaitemwriter.topic` |`String` | `null` |写卡夫卡的主题。| |`spring.batch.job.kafkaitemwriter.delete`|`boolean`| `false` |被传递给 Writer 的项目是否都将作为删除事件发送到主题。| -有关`KafkaItemWriter`的配置选项的更多信息,请参见[“Kafkaitemwiter”文件](https://docs.spring.io/spring-batch/docs/4.3.x/api/org/springframework/batch/item/kafka/KafkaItemWriter.html)。 +有关`KafkaItemWriter`的配置选项的更多信息,请参见[`KafkaItemWiter`文档](https://DOCS. Spring.io/ Spring-batch/DOCS/4.3.x/api/org/springframework/batch/item/kafkaitemwriter.html)。 -[](#stream-integration)[Spring Cloud Stream Integration](#stream-integration) -========== +# [](#stream-integration)[Spring Cloud Stream Integration](#stream-integration) -任务本身可能是有用的,但是将任务集成到一个更大的生态系统中,可以使它对更复杂的处理和编排非常有用。本节介绍了 Spring 云任务与 Spring 云流的集成选项。 +任务本身可能是有用的,但是将任务集成到一个更大的生态系统中,可以使它对更复杂的处理和编排非常有用。本节介绍了 Spring Cloud任务与 Spring Cloud流的集成选项。 -[](#stream-integration-launching-sink)[17. Launching a Task from a Spring Cloud Stream](#stream-integration-launching-sink) ----------- +## [](#stream-integration-launching-sink)[17. Launching a Task from a Spring Cloud Stream](#stream-integration-launching-sink) 你可以从流启动任务。为此,创建一个接收器,该接收器监听包含`TaskLaunchRequest`作为其有效负载的消息。`TaskLaunchRequest`包含: @@ -847,9 +822,9 @@ compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2. | |如果有效载荷的类型不同,则接收器将抛出一个异常。| |---|--------------------------------------------------------------------| -例如,可以创建一个流,该流具有一个处理器,该处理器从 HTTP 源接收数据,并创建一个包含`GenericMessage`并将消息发送到其输出通道的`TaskLaunchRequest`。然后,任务接收器将从其输入通道接收消息,然后启动任务。 +例如,可以创建一个流,该流具有一个处理器,该处理器从 HTTP 源接收数据,并创建一个`GenericMessage`,其中包含`TaskLaunchRequest`,并将消息发送到其输出通道。然后,任务接收器将从其输入通道接收消息,然后启动任务。 -要创建 TaskSink,你只需要创建一个包含“EnabletAskLauncher”注释的 Spring 启动应用程序,如下例所示: +要创建 TaskSink,你只需要创建一个包含`EnableTaskLauncher`注释的 Spring 引导应用程序,如下例所示: ``` @SpringBootApplication @@ -861,37 +836,36 @@ public class TaskSinkApplication { } ``` -Spring 云任务项目的[samples module](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples)包含一个样例接收器和处理器。要将这些示例安装到本地 Maven 存储库中,请从 ` Spring-cloud-task-samples’目录运行一个 Maven 构建,并将`skipInstall`属性设置为`false`,如以下示例所示: +Spring Cloud任务项目的[样本模块](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples)包含一个样例接收器和处理器。要将这些示例安装到本地 Maven 存储库中,请从`spring-cloud-task-samples`目录运行 Maven 构建,并将`skipInstall`属性设置为`false`,如以下示例所示: `mvn clean install` | |必须将`maven.remoteRepositories.springRepo.url`属性设置为 über- jar 所在的远程存储库的位置
。如果未设置,则不存在远程
存储库,因此它仅依赖于本地存储库。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#stream-integration-launching-sink-dataflow)[17.1. Spring Cloud Data Flow](#stream-integration-launching-sink-dataflow) ### +### [](#stream-integration-launching-sink-dataflow)[17.1. Spring Cloud Data Flow](#stream-integration-launching-sink-dataflow) -要在 Spring 云数据流中创建流,你必须首先注册我们创建的任务接收应用程序。在下面的示例中,我们使用 Spring 云数据流壳来注册处理器和接收器示例应用程序: +要在 Spring Cloud数据流中创建流,你必须首先注册我们创建的任务接收应用程序。在下面的示例中,我们使用 Spring Cloud数据流壳来注册处理器和接收器示例应用程序: ``` app register --name taskSink --type sink --uri maven://io.spring.cloud:tasksink: app register --name taskProcessor --type processor --uri maven:io.spring.cloud:taskprocessor: ``` -下面的示例展示了如何从 Spring 云数据流壳层创建流: +下面的示例展示了如何从 Spring Cloud数据流壳层创建流: ``` stream create foo --definition "http --server.port=9000|taskProcessor|taskSink" --deploy ``` -[](#stream-integration-events)[18. Spring Cloud Task Events](#stream-integration-events) ----------- +## [](#stream-integration-events)[18. Spring Cloud Task Events](#stream-integration-events) -Spring 云任务提供了当该任务通过 Spring 云流通道运行时通过 Spring 云流通道发出事件的能力。任务侦听器用于在名为`task-events`的消息通道上发布`TaskExecution`。此功能可自动连接到任何具有`spring-cloud-stream`、`spring-cloud-stream-`以及在其 Classpath 上定义的任务的任务中。 +Spring Cloud任务提供了当该任务通过 Spring Cloud流通道运行时通过 Spring Cloud流通道发出事件的能力。任务侦听器用于在名为`task-events`的消息通道上发布`TaskExecution`。此功能可自动连接到任何具有`spring-cloud-stream`、`spring-cloud-stream-`以及在其 Classpath 上定义的任务的任务中。 | |要禁用事件发送侦听器,请将`spring.cloud.task.events.enabled`属性设置为`false`。| |---|------------------------------------------------------------------------------------------------------| -在定义了适当的 Classpath 之后,以下任务将在`task-events`通道上(在任务的开始和结束时)发出`TaskExecution`作为事件: +在定义了适当的 Classpath 之后,以下任务在`task-events`通道上(在任务的开始和结束时)作为事件发射`TaskExecution`: ``` @SpringBootApplication @@ -917,20 +891,19 @@ public class TaskEventsApplication { } ``` -| |Classpath 上还需要一个粘合剂实现。| +| |Classpath 上还需要一个粘结器实现方式。| |---|----------------------------------------------------------------| -| |一个示例任务事件应用程序可以在 Spring 云任务项目的示例模块
中找到,[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/task-events)。| +| |一个示例任务事件应用程序可以在 Spring Cloud任务项目的示例模块
中找到,[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/task-events)。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#stream-integration-disable-task-events)[18.1.禁用特定的任务事件](#stream-integration-disable-task-events) ### +### [](#stream-integration-disable-task-events)[18.1.禁用特定的任务事件](#stream-integration-disable-task-events) -要禁用任务事件,可以将`spring.cloud.task.events.enabled`属性设置为 `false’。 +要禁用任务事件,可以将`spring.cloud.task.events.enabled`属性设置为`false`。 -[](#stream-integration-batch-events)[19. Spring Batch Events](#stream-integration-batch-events) ----------- +## [](#stream-integration-batch-events)[19. Spring Batch Events](#stream-integration-batch-events) -当通过任务执行 Spring 批处理作业时, Spring 云任务可以被配置为基于 Spring 批处理中可用的 Spring 批处理侦听器发出信息消息。具体地,以下 Spring 批处理侦听器被自动配置到每个批处理作业中,并在通过 Spring 云任务运行时在相关联的 Spring 云流通道上发出消息: +当通过任务执行 Spring 批处理作业时, Spring Cloud任务可以被配置为基于 Spring 批处理中可用的 Spring 批处理侦听器发出信息消息。具体地,以下 Spring 批处理侦听器被自动配置到每个批处理作业中并且在通过 Spring Cloud任务运行时在相关联的 Spring Cloud流通道上发出消息: * `JobExecutionListener`监听`job-execution-events` @@ -946,25 +919,25 @@ public class TaskEventsApplication { * `SkipListener`监听`skip-events` -当上下文中存在适当的 bean(a`Job`和 a`TaskLifecycleListener`)时,这些侦听器将自动配置为任意`AbstractJob`。对侦听这些事件的配置的处理方式与绑定到任何其他 Spring 云流通道的处理方式相同。我们的任务(运行批处理作业的任务)充当“源”,监听应用程序充当`Processor`或`Sink`。 +当上下文中存在适当的 bean(a`Job`和 a`TaskLifecycleListener`)时,这些侦听器将自动配置为任意`AbstractJob`。用于侦听这些事件的配置的处理方式与绑定到任何其他 Spring Cloud流通道的处理方式相同。我们的任务(运行批处理作业的任务)充当`Source`,监听应用程序充当`Processor`或`Sink`。 -例如,可以让一个应用程序监听`job-execution-events`通道来启动和停止作业。要配置监听应用程序,你可以将输入配置为`job-execution-events`,如下所示: +例如,可以让一个应用程序监听`job-execution-events`用于作业开始和停止的通道。要配置监听应用程序,你可以将输入配置为`job-execution-events`,如下所示: `spring.cloud.stream.bindings.input.destination=job-execution-events` -| |Classpath 上还需要一个绑定器实现。| +| |Classpath 上的粘合剂实现方式也是必需的。| |---|----------------------------------------------------------------| -| |一个样例批处理事件应用程序可以在 Spring 云任务项目的样例模块
中找到,[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/batch-events)。| +| |一个样例批处理事件应用程序可以在 Spring Cloud任务项目的样例模块
中找到,[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-samples/batch-events)。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#sending-batch-events-to-different-channels)[19.1.将批处理事件发送到不同的通道](#sending-batch-events-to-different-channels) ### +### [](#sending-batch-events-to-different-channels)[19.1.将批处理事件发送到不同的通道](#sending-batch-events-to-different-channels) -Spring Cloud Task 为批处理事件提供的选项之一是能够更改特定侦听器可以向其发送消息的通道。为此,使用以下配置:` Spring.cloud.stream.bindings..destination=`。例如,如果`StepExecutionListener`需要将其消息发送到另一个名为 `my-step-execution-events’的通道,而不是默认的`step-execution-events`,则可以添加以下配置: +Spring Cloud Task 为批处理事件提供的选项之一是能够更改特定侦听器可以向其发送消息的通道。要做到这一点,请使用以下配置:`spring.cloud.stream.bindings..destination=`。例如,如果`StepExecutionListener`需要将其消息发送到另一个名为`my-step-execution-events`的通道,而不是默认的`step-execution-events`,则可以添加以下配置: `spring.cloud.stream.bindings.step-execution-events.destination=my-step-execution-events` -### [](#disabling-batch-events)[19.2.禁用批处理事件](#disabling-batch-events) ### +### [](#disabling-batch-events)[19.2.禁用批处理事件](#disabling-batch-events) 要禁用所有批处理事件的侦听器功能,请使用以下配置: @@ -986,7 +959,7 @@ spring.cloud.task.batch.events.item-write.enabled=false spring.cloud.task.batch.events.skip.enabled=false ``` -### [](#emit-order-for-batch-events)[19.3.为批处理事件发出命令](#emit-order-for-batch-events) ### +### [](#emit-order-for-batch-events)[19.3.为批处理事件发出命令](#emit-order-for-batch-events) 默认情况下,批处理事件具有`Ordered.LOWEST_PRECEDENCE`。要更改该值(例如,为 5),请使用以下配置: @@ -1000,17 +973,15 @@ spring.cloud.task.batch.events.item-write-order=5 spring.cloud.task.batch.events.skip-order=5 ``` -[](#appendix)[Appendices](#appendix) -========== +# [](#appendix)[Appendices](#appendix) -[](#appendix-task-repository-schema)[20.任务存储库模式](#appendix-task-repository-schema) ----------- +## [](#appendix-task-repository-schema)[20.任务存储库模式](#appendix-task-repository-schema) 本附录为任务存储库中使用的数据库模式提供了 ERD。 -![task schema](./images/task_schema.png) +![任务模式](https://docs.spring.io/spring-cloud-task/docs/2.4.1/reference/html/images/task_schema.png) -### [](#table-information)[20.1.表格信息](#table-information) ### +### [](#table-information)[20.1.表格信息](#table-information) 任务 \_ 执行 @@ -1018,14 +989,14 @@ spring.cloud.task.batch.events.skip-order=5 | 列名称 |Required| Type |Field Length|笔记| |---------------------------|--------|--------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 任务 \_ 执行 \_ID | TRUE | BIGINT | X |Spring 云任务框架在应用程序启动时建立如从`TASK_SEQ`中获得的下一个可用 ID。或者,如果记录是在任务之外创建的,那么值必须在记录创建时填充。| -| START\_TIME | FALSE |DATETIME| X |Spring 云任务框架在应用程序启动时建立了价值。| -| END\_TIME | FALSE |DATETIME| X |Spring 云任务框架在应用程序出口处建立了价值.| -| TASK\_NAME | FALSE |VARCHAR | 100 |Spring 云任务框架在应用程序启动时将此设置为“应用程序”,除非用户使用所讨论的 Spring.cloud.task.name 建立名称[here](#features-task-name)| +| 任务 \_ 执行 \_ID | TRUE | BIGINT | X |Spring Cloud任务框架在应用程序启动时建立如从`TASK_SEQ`中获得的下一个可用 ID。或者,如果记录是在任务之外创建的,那么值必须在记录创建时填充。| +| START\_TIME | FALSE |DATETIME| X |Spring Cloud任务框架在应用程序启动时建立了价值。| +| END\_TIME | FALSE |DATETIME| X |Spring Cloud任务框架在应用程序出口处建立了价值.| +| TASK\_NAME | FALSE |VARCHAR | 100 |Spring Cloud任务框架在应用程序启动时将此设置为“应用程序”,除非用户使用所讨论的 Spring.cloud.task.name 建立名称[here](#features-task-name)| | EXIT\_CODE | FALSE |INTEGER | X |遵循 Spring 引导默认值,除非如[here](https://docs.spring.io/spring-cloud-task/docs/current/reference/#features-lifecycle-exit-codes)所讨论的那样被用户重写。| | EXIT\_MESSAGE | FALSE |VARCHAR | 2500 |用户定义为讨论[here](https://docs.spring.io/spring-cloud-task/docs/current/reference/#features-task-execution-listener-exit-messages)。| -| ERROR\_MESSAGE | FALSE |VARCHAR | 2500 |Spring 云任务框架在应用程序出口建立的价值.| -| LAST\_UPDATED | TRUE |DATETIME| X |Spring 云任务框架在应用程序启动时建立的价值。或者,如果记录是在任务之外创建的,那么值必须在记录创建时填充。| +| ERROR\_MESSAGE | FALSE |VARCHAR | 2500 |Spring Cloud任务框架在应用程序出口处建立了价值。| +| LAST\_UPDATED | TRUE |DATETIME| X |Spring Cloud任务框架在应用程序启动时建立了价值。或者,如果记录是在任务之外创建的,那么值必须在记录创建时填充。| | EXTERNAL\_EXECUTION\_ID | FALSE |VARCHAR | 250 |如果设置了`spring.cloud.task.external-execution-id`属性,那么应用程序启动时的 Spring Cloud Task Framework 将把它设置为指定的值。更多信息请访问[here](#features-external_task_id)| |PARENT\_任务 \_ 执行 \_ID| FALSE | BIGINT | X |如果设置了`spring.cloud.task.parent-execution-id`属性,那么应用程序启动时的 Spring Cloud Task Framework 将把它设置为指定的值。更多信息请访问[here](#features-parent_task_id)| @@ -1061,9 +1032,9 @@ spring.cloud.task.batch.events.skip-order=5 | |可以找到用于为每个数据库类型设置表的 DDL[here](https://github.com/spring-cloud/spring-cloud-task/tree/master/spring-cloud-task-core/src/main/resources/org/springframework/cloud/task)。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#sql-server)[20.2.SQL 服务器](#sql-server) ### +### [](#sql-server)[20.2.SQL 服务器](#sql-server) -Spring 云任务默认情况下使用一个序列表来确定`TASK_EXECUTION_ID`的`TASK_EXECUTION`表。但是,当使用 SQL Server 同时启动多个任务时,这可能会导致`TASK_SEQ`表上出现死锁。解决方法是删除`TASK_EXECUTION_SEQ`表,并使用相同的名称创建一个序列。例如: +Spring Cloud任务默认情况下使用序列表来确定`TASK_EXECUTION_ID`的`TASK_EXECUTION`表。但是,当使用 SQL Server 同时启动多个任务时,这可能会导致`TASK_SEQ`表上出现死锁。解决方案是删除`TASK_EXECUTION_SEQ`表,并使用相同的名称创建一个序列。例如: ``` DROP TABLE TASK_SEQ; @@ -1076,12 +1047,12 @@ CREATE SEQUENCE [DBO].[TASK_SEQ] AS BIGINT | |将`START WITH`设置为高于当前执行 ID 的值。| |---|----------------------------------------------------------------------| -[](#appendix-building-the-documentation)[21.构建这个文档](#appendix-building-the-documentation) ----------- +## [](#appendix-building-the-documentation)[21.构建这个文档](#appendix-building-the-documentation) 该项目使用 Maven 来生成该文档。要为自己生成它,请运行以下命令:`$ ./mvnw clean package -P full`。 -[](#appendix-cloud-foundry)[22.在 Cloud Foundry 上运行任务应用程序](#appendix-cloud-foundry) ----------- +## [](#appendix-cloud-foundry)[22.在 Cloud Foundry 上运行任务应用程序](#appendix-cloud-foundry) + +Spring Cloud任务应用程序作为在 Cloud Foundry 上的任务而启动的最简单的方法是使用 Spring Cloud数据流。 Spring 通过云数据流,你可以注册你的任务应用程序,为其创建定义,然后启动它。然后,你可以通过 RESTful API、 Spring Cloud Data Flow Shell 或 UI 跟踪任务执行。要了解如何开始安装数据流,请遵循参考文档[开始](https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#getting-started)部分中的说明。有关如何注册和启动任务的信息,请参见[任务的生命周期](https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#_the_lifecycle_of_a_task)文档。 -Spring 云任务应用程序在 Cloud Foundry 上作为任务启动的最简单方法是使用 Spring 云数据流。 Spring 通过云数据流,你可以注册你的任务应用程序,为其创建定义,然后启动它。然后,你可以通过 RESTful API、 Spring Cloud Data Flow Shell 或 UI 跟踪任务执行。要了解如何开始安装数据流,请遵循参考文档[Getting Started](https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#getting-started)部分中的说明。有关如何注册和启动任务的信息,请参见[任务的生命周期](https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#_the_lifecycle_of_a_task)文档。 +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-vault.md b/docs/spring-cloud/spring-cloud-vault.md index 1a3b72f4da89b33fc857500b28402c6a5f708160..fc2b9a2810d1b0feba18fc5f86118adc4f3debe5 100644 --- a/docs/spring-cloud/spring-cloud-vault.md +++ b/docs/spring-cloud/spring-cloud-vault.md @@ -1,27 +1,24 @@ -Spring Cloud Vault -========== +# Spring Cloud Vault Spring Cloud Vault Config 为分布式系统中的外部化配置提供了客户端支持。有了[HashiCorp 的保险库](https://www.vaultproject.io),你就有了一个中心位置来管理跨所有环境的应用程序的外部秘密属性。Vault 可以管理静态和动态秘密,例如远程应用程序/资源的用户名/密码,并为外部服务(例如 MySQL、PostgreSQL、Apache Cassandra、CouchBase、MongoDB、Consul、AWS 等)提供凭据。 -[](#new-noteworthy)[1.新的和值得注意的](#new-noteworthy) ----------- +## [](#new-noteworthy)[1.新的和值得注意的](#new-noteworthy) 本节简要介绍了最新版本中新的和值得注意的项目。 -### [](#new-in-3.0.0)[1.1. New in Spring Cloud Vault 3.0](#new-in-3.0.0) ### +### [](#new-in-3.0.0)[1.1. New in Spring Cloud Vault 3.0](#new-in-3.0.0) -* 将`PropertySource`初始化从 Spring cloud 的 bootstrap 上下文迁移到 Spring boot 的[ConfigData API](#vault.configdata)。 +* 将`PropertySource`初始化从 Spring cloud 的 bootstrap 上下文迁移到 Spring boot 的[配置数据 API](#vault.configdata)。 * 支持[CouchBase 数据库](#vault.config.backends.couchbase)后端。 -* 通过`spring.cloud.vault.ssl.key-store-type=…`/` Spring.cloud.vault.ssl.trust-store-type=…` 配置 keystore/truststore 类型,包括 PEM 支持。 +* 通过`spring.cloud.vault.ssl.key-store-type=…`/`spring.cloud.vault.ssl.trust-store-type=…`配置 keystore/truststore 类型,包括 PEM 支持。 * 通过配置`ReactiveVaultEndpointProvider`来支持`ReactiveDiscoveryClient`。 * 支持配置[多个数据库](#vault.config.backends.databases)。 -[](#quick-start)[2. Quick Start](#quick-start) ----------- +## [](#quick-start)[2.快速启动](#quick-start) **先决条件** @@ -41,7 +38,7 @@ $ wget https://releases.hashicorp.com/vault/${vault_version}/vault_${vault_versi $ unzip vault_${vault_version}_${platform}.zip ``` -| |这些步骤可以通过下载和运行[install_vault.sh](https://github.com/spring-cloud/spring-cloud-vault/blob/master/src/test/bash/install_vault.sh)来实现。| +| |这些步骤可以通过下载并运行[`install_vault.sh`](https://github.com/ Spring-cloud/ Spring-cloud-vault/blob/master/SRC/test/bash/install_vault.sh)来实现。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| **为 Vault 创建 SSL 证书** @@ -52,11 +49,11 @@ $ unzip vault_${vault_version}_${platform}.zip * 保险库证书(解密密钥`work/ca/private/localhost.decrypted.key.pem`和证书`work/ca/certs/localhost.cert.pem`) -确保将根证书导入到兼容 Java 的信任存储库中。 +确保将根证书导入到符合 Java 的信任存储库中。 实现这一点的最简单方法是使用 OpenSSL。 -| |[create_certificates.sh](https://github.com/spring-cloud/spring-cloud-vault/blob/master/src/test/bash/)在`work/ca`和一个 JKS 信任存储库`work/keystore.jks`中创建证书。
如果你想使用此快速启动指南运行 Spring Cloud Vault,则需要将信任存储库中的`spring.cloud.vault.ssl.trust-store`属性配置为`file:work/keystore.jks`。| +| |[`create_certificates.sh`](https://github.com/ Spring-cloud/ Spring-cloud-vault/blob/master/SRC/test/bash/)在`work/ca`和一个 JKS 信任库`work/keystore.jks`中创建证书。
如果你想使用这个快速启动指南运行 Spring Cloud Vault,你需要将信任库中的`spring.cloud.vault.ssl.trust-store`属性配置为`file:work/keystore.jks`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| **启动 Vault 服务器** @@ -76,7 +73,7 @@ listener "tcp" { disable_mlock = true ``` -| |你可以在[`vault.conf`](https://github.com/spring-clod/spring-cloud-vault/blob/master/src/test/bash/vault.conf)找到一个示例配置文件。| +| |你可以在[`vault.conf`](https://github.com/ Spring-clod/ Spring-cloud-vault/blob/master/SRC/test/bash/vault.conf)上找到一个示例配置文件。| |---|----------------------------------------------------------------------------------------------------------------------------------------------| ``` @@ -137,10 +134,9 @@ HTTP 服务具有以下形式的资源: /secret/{defaultContext} ``` -如果在“SpringApplication”(即在常规 Spring 引导应用程序中通常是“Application”)中,将“Application”作为`spring.application.name`注入,则“Profile”是一个活动的配置文件(或以逗号分隔的属性列表)。从 Vault 检索到的属性将按“原样”使用,而不会对属性名称作进一步的前缀。 +如果在`SpringApplication`中将“application”注入为`spring.application.name`(即在常规 Spring 引导应用程序中通常是“application”),则“profile”是一个活动配置文件(或以逗号分隔的属性列表)。从 Vault 检索到的属性将按“原样”使用,而不会对属性名称作进一步的前缀。 -[](#client-side-usage)[3.客户端使用](#client-side-usage) ----------- +## [](#client-side-usage)[3.客户端使用](#client-side-usage) 要在应用程序中使用这些特性,只需将其构建为依赖于`spring-cloud-vault-config`的 Spring 引导应用程序(例如,请参见测试用例)。示例 Maven 配置: @@ -197,7 +193,7 @@ public class Application { } ``` -当它运行时,如果它正在运行,它将从端口`8200`上的默认本地 Vault 服务器获取外部配置。要修改启动行为,你可以使用`application.properties`更改保险库服务器的位置,例如 +当它运行时,如果它正在运行,它将从端口`8200`上的默认本地 Vault 服务器获取外部配置。要修改启动行为,你可以使用`application.properties`更改 Vault 服务器的位置,例如 示例 2.application.yml @@ -227,22 +223,22 @@ spring.config.import: vault:// * `spring.config.import`使用所有启用的秘密后端(默认启用键值)将 Vault 挂载为`PropertySource` -启用进一步的集成需要额外的依赖关系和配置。根据设置 Vault 的方式,你可能需要额外的配置,如[SSL](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.ssl)和[authentication](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication)。 +启用进一步的集成需要额外的依赖关系和配置。根据设置 Vault 的方式,你可能需要额外的配置,如[SSL](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.ssl)和[认证](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication)。 如果应用程序导入`spring-boot-starter-actuator`项目,那么 Vault 服务器的状态将通过`/health`端点可用。 可以通过属性`management.health.vault.enabled`启用或禁用 Vault 健康指示器(默认为`true`)。 -| |在 Spring Cloud Vault3.0 和 Spring Boot2.4 中,对属性源的 Bootstrap 上下文初始化(`bootstrap.yml`,`bootstrap.properties`)被弃用。相反, Spring Cloud Vault 支持 Spring Boot 的 Config Data API,该 API 允许从 Vault 导入配置。使用 Spring 引导配置数据方法,你需要设置`spring.config.import`属性才能绑定到 Vault。你可以在[配置数据位置部分](#vault.configdata.locations)中阅读有关它的更多信息。
你可以通过设置配置属性`spring.cloud.bootstrap.enabled=true`或包括依赖项`org.springframework.cloud:spring-cloud-starter-bootstrap`来启用引导程序上下文。| +| |在 Spring Cloud Vault3.0 和 Spring Boot2.4 中,对属性源的 BootStrap 上下文初始化(`bootstrap.yml`,`bootstrap.properties`)被弃用。相反, Spring Cloud Vault 支持 Spring Boot 的 Config Data API,该 API 允许从 Vault 导入配置。使用 Spring 引导配置数据方法,你需要设置`spring.config.import`属性才能绑定到 Vault。你可以在[配置数据位置部分](#vault.configdata.locations)中阅读有关它的更多信息。
你可以通过设置配置属性`spring.cloud.bootstrap.enabled=true`或包括依赖项`org.springframework.cloud:spring-cloud-starter-bootstrap`来启用引导程序上下文。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#authentication)[3.1.认证](#authentication) ### +### [](#authentication)[3.1.认证](#authentication) Vault 需要[认证机制](https://www.vaultproject.io/docs/concepts/auth.html)到[授权客户请求](https://www.vaultproject.io/docs/concepts/tokens.html)。 Spring Cloud Vault 支持多个[认证机制](https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication)来使用 Vault 对应用程序进行身份验证。 -对于快速启动,使用由[保险库初始化](#quickstart.vault.start)打印的根令牌。 +对于快速启动,使用[保险库初始化](#quickstart.vault.start)打印的根令牌。 示例 3.application.yml @@ -255,8 +251,7 @@ spring.config.import: vault:// | |仔细考虑你的安全需求。
静态令牌身份验证很好,如果你想快速地开始使用 Vault,但是静态令牌不会受到进一步的保护。
向非预期的各方披露的任何信息都允许 Vault 与相关的令牌角色一起使用。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#vault.configdata)[4.配置数据 API](#vault.configdata) ----------- +## [](#vault.configdata)[4.配置数据 API](#vault.configdata) Spring 自版本 2.4 起,启动提供了一个 ConfigData API,该 API 允许声明配置源并将其导入为属性源。 @@ -265,7 +260,7 @@ Spring Cloud Vault 从 3.0 版本开始使用 ConfigData API 来挂载 Vault 的 | |你可以通过设置配置属性`spring.cloud.bootstrap.enabled=true`或包括依赖项`org.springframework.cloud:spring-cloud-starter-bootstrap`来启用已弃用的引导程序上下文。| |---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#vault.configdata.locations)[4.1.配置数据位置](#vault.configdata.locations) ### +### [](#vault.configdata.locations)[4.1.配置数据位置](#vault.configdata.locations) 你可以通过从 Vault 实现的一个或多个`PropertySource`挂载 Vault 配置。 Spring Cloud Vault 支持两个配置位置: @@ -273,9 +268,9 @@ Spring Cloud Vault 从 3.0 版本开始使用 ConfigData API 来挂载 Vault 的 * `vault:///`(上下文位置) -对所有启用的[Secret Backends](#vault.config.backends)使用默认的位置挂载属性源。在没有进一步配置的情况下, Spring Cloud Vault 在`/secret/${spring.application.name}`处挂载键值后端。每个激活的配置文件都会在`/secret/${spring.application.name}/${profile}`表单之后添加另一个上下文路径。向 Classpath 中添加更多的模块,例如`spring-cloud-config-databases`,提供了额外的秘密后端配置选项,如果启用,这些选项将被挂载为属性源。 +使用所有启用[秘密后端](#vault.config.backends)的默认位置挂载属性源。在没有进一步配置的情况下, Spring Cloud Vault 在`/secret/${spring.application.name}`处挂载键值后端。每个激活的配置文件都会在`/secret/${spring.application.name}/${profile}`表单之后添加另一个上下文路径。向 Classpath 中添加更多的模块,例如`spring-cloud-config-databases`,提供了额外的秘密后端配置选项,如果启用,这些选项将被挂载为属性源。 -如果要控制从 Vault 挂载哪些上下文路径为`PropertySource`,可以使用上下文位置或配置[“VaultConfigurer”](#vault.config.backends.configurer)。 +如果要控制从 Vault 挂载的上下文路径为`PropertySource`,则可以使用上下文位置(`vault:///my/context/path`)或配置[`VaultConfigurer`](#vault.config.backends.configrer)。 上下文位置是单独指定和挂载的。 Spring Cloud Vault 将每个位置挂载为唯一的`PropertySource`。你可以将默认位置与上下文位置(或其他配置系统)混合,以控制属性源的顺序。如果你想禁用缺省键值路径计算并自己挂载每个键值后端,那么这种方法特别有用。 @@ -285,7 +280,7 @@ Spring Cloud Vault 从 3.0 版本开始使用 ConfigData API 来挂载 Vault 的 spring.config.import: vault://first/context/path, vault://other/path, vault:// ``` -Spring `Environment`中的属性名称必须是唯一的,以避免出现阴影。如果你在不同的上下文路径中使用相同的秘密名称,并且希望将这些秘密名称作为单独的属性公开,则可以通过向位置添加`prefix`查询参数来区分它们。 +Spring `Environment`中的属性名称必须是唯一的,以避免被遮蔽。如果你在不同的上下文路径中使用相同的秘密名称,并且希望将它们作为单独的属性公开,那么可以通过向位置添加`prefix`查询参数来区分它们。 示例 5.application.yml @@ -298,7 +293,7 @@ other.secret: ${bar.secret} | |前缀按原样添加到 Vault 返回的所有属性名称中。如果你希望在前缀和键名之间用一个点分隔键名,请确保在前缀中添加一个尾随的点。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#vault.configdata.location.optional)[4.2.有条件地启用/禁用保险库配置](#vault.configdata.location.optional) ### +### [](#vault.configdata.location.optional)[4.2.有条件地启用/禁用保险库配置](#vault.configdata.location.optional) 在某些情况下,可能需要在没有 Vault 的情况下启动应用程序。你可以通过 Location 字符串表示 Vault Config 位置应该是可选的还是强制的(默认): @@ -311,11 +306,11 @@ other.secret: ${bar.secret} | |无论配置位置是否标记为可选的,都会跳过无法找到的 Vault 上下文路径(HTTP STATUS404)。[Vault 客户端快速失败](#vault.config.fail-fast)如果由于 HTTP STATUS404 而找不到保险库上下文路径,则允许在启动时失败。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#vault.configdata.customization)[4.3.基础设施定制](#vault.configdata.customization) ### +### [](#vault.configdata.customization)[4.3.基础设施定制](#vault.configdata.customization) -Spring Cloud Vault 需要基础设施类与 Vault 进行交互。当不使用 ConfigData API(这意味着你还没有指定`spring.config.import=vault://`或上下文 Vault 路径)时, Spring Cloud Vault 通过`VaultAutoConfiguration`和`VaultReactiveAutoConfiguration`定义其 bean。 Spring 在 Spring 上下文可用之前引导应用程序。因此`VaultConfigDataLoader`注册 bean 本身,以便稍后将其传播到应用程序上下文中。 +Spring Cloud Vault 需要基础设施类与 Vault 进行交互。当不使用 ConfigData API(这意味着你还没有指定`spring.config.import=vault://`或上下文 Vault 路径)时, Spring Cloud Vault 通过`VaultAutoConfiguration`和`VaultReactiveAutoConfiguration`定义其 bean。 Spring 在 Spring 上下文可用之前引导应用程序。因此`VaultConfigDataLoader`注册 bean 本身,以便稍后将这些内容传播到应用程序上下文中。 -你可以通过使用`Bootstrapper`API 注册自定义实例来定制 Spring Cloud Vault 使用的基础架构: +通过使用`Bootstrapper`API 注册自定义实例,你可以自定义 Spring Cloud Vault 使用的基础架构: ``` InstanceSupplier builderSupplier = ctx -> RestTemplateBuilder @@ -329,16 +324,15 @@ application.addBootstrapper(registry -> registry.register(RestTemplateBuilder.cl 另请参见[自定义要作为 PropertySource 公开的秘密后端](#vault.config.backends.configurer)和`VaultConfigDataLoader`的自定义钩源。 -[](#vault.config.authentication)[5.认证方法](#vault.config.authentication) ----------- +## [](#vault.config.authentication)[5.认证方法](#vault.config.authentication) 不同的组织对安全性和身份验证有不同的要求。Vault 通过提供多种身份验证方法来反映这种需求。 Spring Cloud Vault 支持令牌和 APPID 身份验证。 -### [](#vault.config.authentication.token)[5.1.令牌认证](#vault.config.authentication.token) ### +### [](#vault.config.authentication.token)[5.1.令牌认证](#vault.config.authentication.token) 令牌是在 Vault 中进行身份验证的核心方法。令牌身份验证需要使用配置提供一个静态令牌。作为后备,也可以从`~/.vault-token`检索令牌,这是 Vault CLI 用于缓存令牌的默认位置。 -| |令牌身份验证是默认的身份验证方法。
如果一个令牌被公开,则非预期的一方获得对保险库的访问权限,并可以为预期的客户端访问机密。| +| |令牌身份验证是默认的身份验证方法。
如果令牌被公开,则非预期的一方获得对 Vault 的访问权限,并可以为预期的客户端访问机密。| |---|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 示例 6.application.yml @@ -361,9 +355,9 @@ spring.cloud.vault: * [Vault 文档:CLI 默认为 \~/.vault-token](https://www.vaultproject.io/docs/commands/token-helper) -### [](#vault.config.authentication.vault-agent)[5.2.保险库代理身份验证](#vault.config.authentication.vault-agent) ### +### [](#vault.config.authentication.vault-agent)[5.2.保险库代理身份验证](#vault.config.authentication.vault-agent) -Vault 自 0.11.0 版本以来,通过 Vault Agent 提供了一个 Sidecar 实用程序。Vault Agent 通过其自动验证功能实现了 Spring Vault 的`SessionManager`的功能。应用程序可以通过依赖运行在`localhost`上的 Vault 代理重用缓存的会话凭据。 Spring Vault 可以在没有“X-Vault-Token”头的情况下发送请求。禁用 Spring Vault 的身份验证基础设施,以禁用客户端身份验证和会话管理。 +Vault 自 0.11.0 版本以来,通过 Vault Agent 提供了一个 Sidecar 实用程序。Vault Agent 通过其自动验证功能实现了 Spring Vault 的`SessionManager`的功能。应用程序可以依赖运行在`localhost`上的 Vault 代理重用缓存的会话凭据。 Spring Vault 可以在没有`X-Vault-Token`头的情况下发送请求。禁用 Spring Vault 的身份验证基础设施,以禁用客户端身份验证和会话管理。 示例 7.application.yml @@ -376,7 +370,7 @@ spring.cloud.vault: 另见:[保险库文档:代理](https://www.vaultproject.io/docs/agent/index.html) -### [](#vault.config.authentication.appid)[5.3.APPID 身份验证](#vault.config.authentication.appid) ### +### [](#vault.config.authentication.appid)[5.3.APPID 身份验证](#vault.config.authentication.appid) Vault 支持[AppId](https://www.vaultproject.io/docs/auth/app-id.html)身份验证,该验证由两个难以猜测的令牌组成。APPID 默认为静态配置的`spring.application.name`。第二个标记是 userid,它是由应用程序决定的一部分,通常与运行时环境相关。IP 地址、MAC 地址或 Docker 容器名称都是很好的例子。 Spring Cloud Vault Config 支持 IP 地址、MAC 地址和静态用户 ID(例如,通过系统属性提供)。IP 和 MAC 地址表示为十六进制编码的 SHA256 散列。 @@ -395,7 +389,7 @@ spring.cloud.vault: * `app-id-path`设置要使用的 appid 挂载的路径 -* `user-id`设置 userid 方法。可能的值是`IP_ADDRESS`、`mac_address’或实现自定义`AppIdUserIdMechanism`的类名 +* `user-id`设置 userid 方法。可能的值是`IP_ADDRESS`、`MAC_ADDRESS`或实现自定义`AppIdUserIdMechanism`的类名 从命令行生成 IP 地址 userid 的相应命令是: @@ -403,10 +397,10 @@ spring.cloud.vault: $ echo -n 192.168.99.1 | sha256sum ``` -| |包含`echo`的换行将导致不同的散列值,因此请确保包含`-n`标志。| +| |包含`echo`的换行符会导致不同的散列值,因此请确保包含`-n`标志。| |---|---------------------------------------------------------------------------------------------------------| -基于 MAC 地址的用户 ID 从本地主机绑定的设备获得他们的网络设备。该配置还允许指定`network-interface`提示来选择正确的设备。“network-interface”的值是可选的,可以是接口名称或接口索引(基于 0)。 +基于 MAC 地址的用户 ID 从本地主机绑定的设备获得他们的网络设备。该配置还允许指定`network-interface`提示来选择正确的设备。`network-interface`的值是可选的,可以是接口名称或接口索引(基于 0)。 示例 9.使用 SHA256MAC-Address Userid 的 application.yml @@ -429,9 +423,9 @@ $ echo -n 0AFEDE1234AC | sha256sum | |MAC 地址是大写的,不带冒号。
包括`echo`的换行将导致不同的散列值,因此请确保包含`-n`标志。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -#### [](#custom-userid)[5.3.1.自定义用户 ID](#custom-userid) #### +#### [](#custom-userid)[5.3.1.自定义用户 ID](#custom-userid) -用户 ID 生成是一种开放机制。你可以将 ` Spring.cloud.vault.app-id.user-id` 设置为任意字符串,配置的值将用作静态 userid。 +用户 ID 生成是一种开放机制。你可以将`spring.cloud.vault.app-id.user-id`设置为任意字符串,并且配置的值将用作静态用户 ID。 一种更高级的方法允许你将`spring.cloud.vault.app-id.user-id`设置为类名。这个类必须位于你的 Classpath 上,并且必须实现`org.springframework.cloud.vault.AppIdUserIdMechanism`接口和`createUserId`方法。 Spring Cloud Vault 将在每次使用 APPID 进行身份验证以获得令牌时通过调用来获得用户 ID。 @@ -459,13 +453,13 @@ public class MyUserIdMechanism implements AppIdUserIdMechanism { 另见:[Vault 文档:使用应用程序 ID Auth 后台](https://www.vaultproject.io/docs/auth/app-id.html) -### [](#approle-authentication)[5.4.Approle 身份验证](#approle-authentication) ### +### [](#approle-authentication)[5.4.Approle 身份验证](#approle-authentication) [AppRole](https://www.vaultproject.io/docs/auth/app-id.html)用于机器身份验证,就像不推荐的(因为 Vault0.6.1)[APPID 身份验证](#vault.config.authentication.appid)一样。Approle 身份验证由两个难以猜测的(秘密)令牌组成:ROLEID 和 SECTROTID。 Spring Vault 支持各种接近场景(推/拉模式和包装)。 -Roleid 和可选的 SecretID 必须由配置提供, Spring Vault 不会查找这些或创建自定义的 SecretID。 +ROLEID 和可选的 SecretID 必须通过配置提供, Spring Vault 不会查找这些或创建自定义的 SecretID。 示例 12.approle 身份验证属性的 application.yml @@ -532,7 +526,7 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Approle Auth 后端](https://www.vaultproject.io/docs/auth/approle.html) -### [](#vault.config.authentication.awsec2)[5.5.AWS-EC2 身份验证](#vault.config.authentication.awsec2) ### +### [](#vault.config.authentication.awsec2)[5.5.AWS-EC2 身份验证](#vault.config.authentication.awsec2) [aws-ec2](https://www.vaultproject.io/docs/auth/aws-ec2.html)Auth 后端为 AWS EC2 实例提供了一种安全的引入机制,允许自动检索保险库令牌。与大多数 Vault 身份验证后端不同,该后端不需要首次部署或提供安全敏感的凭据(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为受信任的第三方,并使用以密码签名的动态元数据信息来唯一地表示每个 EC2 实例。 @@ -545,11 +539,11 @@ spring.cloud.vault: 在默认情况下,AWS-EC2 身份验证使 Nonce 能够遵循信任第一次使用(Tofu)原则。任何意外获得 PKCS#7 身份元数据访问权限的一方都可以对 Vault 进行身份验证。 -在第一次登录期间, Spring Cloud Vault 生成一个 Nonce,该 Nonce 存储在实例 ID 旁边的 auth 后台。重新验证需要发送相同的 nonce。其他任何一方都没有 Nonce,可以在 Vault 中发出警报,以进行进一步的调查。 +在第一次登录期间, Spring Cloud Vault 生成一个 nonce,该 nonce 存储在实例 ID 旁边的 auth 后台。重新验证需要发送相同的 nonce。其他任何一方都没有 Nonce,可以在 Vault 中发出警报,以进行进一步的调查。 -nonce 保存在内存中,并在应用程序重新启动时丢失。你可以使用`spring.cloud.vault.aws-ec2.nonce`配置静态 nonce。 +nonce 保存在内存中,并在应用程序重新启动时丢失。可以使用`spring.cloud.vault.aws-ec2.nonce`配置静态 nonce。 -AWS-EC2 身份验证角色是可选的,并且是 AMI 的默认值。你可以通过设置“ Spring.cloud.vault.aws-ec2.role”属性来配置身份验证角色。 +AWS-EC2 身份验证角色是可选的,并且是 AMI 的默认值。你可以通过设置`spring.cloud.vault.aws-ec2.role`属性来配置身份验证角色。 示例 15.已配置角色的 application.yml @@ -584,13 +578,13 @@ spring.cloud.vault: 另见:[Vault 文档:使用 AWS Auth 后端](https://www.vaultproject.io/docs/auth/aws.html) -### [](#vault.config.authentication.awsiam)[5.6.AWS-IAM 身份验证](#vault.config.authentication.awsiam) ### +### [](#vault.config.authentication.awsiam)[5.6.AWS-IAM 身份验证](#vault.config.authentication.awsiam) [aws](https://www.vaultproject.io/docs/auth/aws-ec2.html)后端为 AWS IAM 角色提供了一种安全的身份验证机制,允许基于正在运行的应用程序的当前 IAM 角色使用 Vault 进行自动身份验证。与大多数 Vault 身份验证后端不同,该后端不需要首次部署或提供安全敏感的凭据(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为受信任的第三方,并使用调用者与其 IAM 凭据签署的 4 条信息来验证调用者确实在使用该 IAM 角色。 自动计算应用程序正在运行的当前 IAM 角色。如果你在 AWS ECS 上运行你的应用程序,那么应用程序将使用分配给正在运行的容器的 ECS 任务的 IAM 角色。如果你在 EC2 实例之上裸体运行你的应用程序,那么使用的 IAM 角色将是分配给 EC2 实例的角色。 -当使用 AWS-IAM 身份验证时,你必须在 Vault 中创建一个角色,并将其分配给你的 IAM 角色。一个空的`role`默认为当前 IAM 角色的友好名称。 +当使用 AWS-IAM 身份验证时,你必须在 Vault 中创建一个角色,并将其分配给你的 IAM 角色。一个空的`role`默认为友好名称当前 IAM 角色。 示例 17.application.yml 具有所需的 AWS-IAM 身份验证属性 @@ -619,11 +613,11 @@ spring.cloud.vault: * `endpoint-uri`设置用于`iam_request_url`参数的 AWS STS API 的值。 -AWS-IAM 需要 AWS Java SDK 依赖关系(“com.amazonaws:AWS-Java-SDK-Core”),因为身份验证实现使用 AWS SDK 类型来进行凭据和请求签名。 +AWS-IAM 需要 AWS Java SDK 依赖项(`com.amazonaws:aws-java-sdk-core`),因为身份验证实现使用 AWS SDK 类型来进行凭据和请求签名。 另见:[Vault 文档:使用 AWS Auth 后端](https://www.vaultproject.io/docs/auth/aws.html) -### [](#vault.config.authentication.azuremsi)[5.7.Azure MSI 认证](#vault.config.authentication.azuremsi) ### +### [](#vault.config.authentication.azuremsi)[5.7.Azure MSI 认证](#vault.config.authentication.azuremsi) [azure](https://www.vaultproject.io/docs/auth/azure.html)Auth 后端为 Azure VM 实例提供了一种安全的引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,该后端不需要首次部署或提供安全敏感的凭据(令牌、用户名/密码、客户端证书等)。相反,它将 Azure 视为可信任的第三方,并使用可绑定到 VM 实例的托管服务标识和实例元数据信息。 @@ -664,9 +658,9 @@ Azure MSI 身份验证从实例元数据服务获得有关虚拟机的环境详 * [Azure 文档:Azure 实例元数据服务](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service) -### [](#vault.config.authentication.clientcert)[5.8.TLS 证书认证](#vault.config.authentication.clientcert) ### +### [](#vault.config.authentication.clientcert)[5.8.TLS 证书认证](#vault.config.authentication.clientcert) -`cert`Auth 后台允许使用 SSL/TLS 客户端证书进行身份验证,这些证书由 CA 签名或自签名。 +`cert`Auth 后台允许使用 SSL/TLS 客户机证书进行身份验证,这些证书由 CA 签名或自签名。 要启用`cert`身份验证,你需要: @@ -690,9 +684,9 @@ spring.cloud.vault: 另见:[Vault 文档:使用 CERTAuth 后端](https://www.vaultproject.io/docs/auth/cert.html) -### [](#vault.config.authentication.cubbyhole)[5.9.空穴身份验证](#vault.config.authentication.cubbyhole) ### +### [](#vault.config.authentication.cubbyhole)[5.9.空穴身份验证](#vault.config.authentication.cubbyhole) -Cubbyhole 身份验证使用 Vault 原语提供安全的身份验证工作流。Cubbyhole 身份验证使用令牌作为主要登录方法。一个短暂的令牌用于从 Vault 的 Cubbyhole 秘密后端获得第二个登录 VaultToken。登录令牌通常寿命更长,并用于与 Vault 交互。登录令牌将从存储在`/cubbyhole/response`的包装响应中检索。 +Cubbyhole 身份验证使用 Vault 原语来提供一个安全的身份验证工作流。Cubbyhole 身份验证使用令牌作为主要登录方法。一个短暂的令牌用于从 Vault 的 Cubbyhole 秘密后端获得第二个登录 VaultToken。登录令牌通常寿命更长,并用于与 Vault 交互。登录令牌将从存储在`/cubbyhole/response`的包装响应中检索。 **创建一个包装好的令牌** @@ -727,7 +721,7 @@ spring.cloud.vault: * [保险库文档:响应包装](https://www.vaultproject.io/docs/concepts/response-wrapping.html) -### [](#vault.config.authentication.gcpgce)[5.10.GCP-GCE 认证](#vault.config.authentication.gcpgce) ### +### [](#vault.config.authentication.gcpgce)[5.10.GCP-GCE 认证](#vault.config.authentication.gcpgce) [gcp](https://www.vaultproject.io/docs/auth/gcp.html)Auth 后端允许 Vault 通过使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭据登录。 @@ -767,13 +761,13 @@ spring.cloud.vault: * [GCP 文件:验证实例的身份](https://cloud.google.com/compute/docs/instances/verifying-instance-identity) -### [](#vault.config.authentication.gcpiam)[5.11.GCP-IAM 认证](#vault.config.authentication.gcpiam) ### +### [](#vault.config.authentication.gcpiam)[5.11.GCP-IAM 认证](#vault.config.authentication.gcpiam) [gcp](https://www.vaultproject.io/docs/auth/gcp.html)Auth 后端允许 Vault 通过使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭据登录。 -GCP,IAM 身份验证以 JSON Web 令牌的形式为服务帐户创建签名。通过调用 GCPIAM 的[`Projects.ServiceAccounts.signjwt’](https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/signJwt)API,可以获得服务帐户的 JWT。调用者针对 GCPIAM 进行身份验证,并由此证明其身份。此保险库后端将 GCP 视为受信任的第三方。 +GCP,IAM 身份验证以 JSON Web 令牌的形式为服务帐户创建签名。通过调用 GCPIAM 的[`projects.serviceAccounts.signJwt`](https://cloud.google.com/iam/reference/rest/v1/projects.serviceaccounts/signjwt)API,可以获得服务帐户的 JWT。调用者针对 GCPIAM 进行身份验证,并由此证明其身份。此保险库后端将 GCP 视为受信任的第三方。 -IAM 凭据可以从运行时环境(特别是[google_application_creditions’](https://cloud.google.com/docs/authentication/production)环境变量、Google Compute 元数据服务)获得,也可以从外部提供,例如 JSON 或 Base64 编码。JSON 是首选的表单,因为它带有调用`projects.serviceAccounts.signJwt`所需的项目 ID 和服务帐户标识符。 +IAM 凭据可以从运行时环境,特别是[`GOOGLE_APPLICATION_CREDENTIALS`](https://cloud.google.com/DOCS/Authentication/Production)环境变量、Google Compute 元数据服务中获得,或者从外部提供,例如 JSON 或 base64 编码。JSON 是首选的表单,因为它带有调用`projects.serviceAccounts.signJwt`所需的项目 ID 和服务帐户标识符。 示例 26.带有所需 GCP 的 application.yml-IAM 身份验证属性 @@ -814,7 +808,7 @@ spring.cloud.vault: * `service-account`允许将服务帐户 ID 重写为特定值。从获得的凭据到服务帐户的默认值。 -GCP 的 IAM 认证需要 Google Cloud Java SDK 依赖关系(“com.google.apis:Google-api-services-IAM”和`com.google.auth:google-auth-library-oauth2-http`),因为认证实现使用 Google API 进行凭据和 JWT 签名。 +GCPIAM 身份验证需要 Google Cloud Java SDK 依赖项(`com.google.apis:google-api-services-iam`和`com.google.auth:google-auth-library-oauth2-http`),因为身份验证实现使用 Google API 进行凭据和 JWT 签名。 | |Google 凭据需要一个 OAuth2 令牌来维护令牌生命周期。
所有 API 都是同步的,因此,`GcpIamAuthentication`不支持反应性使用所需的`AuthenticationSteps`。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -825,7 +819,7 @@ GCP 的 IAM 认证需要 Google Cloud Java SDK 依赖关系(“com.google.apis * [GCP 文档:projects.serviceaccounts.signjwt](https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/signJwt) -### [](#vault.config.authentication.kubernetes)[5.12.Kubernetes 认证](#vault.config.authentication.kubernetes) ### +### [](#vault.config.authentication.kubernetes)[5.12.Kubernetes 认证](#vault.config.authentication.kubernetes) Kubernetes 身份验证机制(从 Vault0.8.3 开始)允许使用 Kubernetes 服务帐户令牌对 Vault 进行身份验证。身份验证是基于角色的,角色绑定到服务帐户名和名称空间。 @@ -854,9 +848,9 @@ spring.cloud.vault: * [Kubernetes 文档:为 PODS 配置服务帐户](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) -### [](#vault.config.authentication.pcf)[5.13.Pivotal CloudFoundry 身份验证](#vault.config.authentication.pcf) ### +### [](#vault.config.authentication.pcf)[5.13.Pivotal CloudFoundry 认证](#vault.config.authentication.pcf) -[pcf](https://www.vaultproject.io/docs/auth/pcf.html)Auth 后端为在 Pivotal 的 CloudFoundry 实例中运行的应用程序提供了一种安全的引入机制,允许自动检索保险库令牌。与大多数 Vault 身份验证后端不同,该后端不需要首次部署或配置安全敏感的凭据(令牌、用户名/密码、客户端证书等),因为身份配置由 PCF 本身处理。相反,它将 PCF 视为受信任的第三方,并使用托管实例标识。 +[pcf](https://www.vaultproject.io/docs/auth/pcf.html)Auth 后端为在 Pivotal 的 CloudFoundry 实例中运行的应用程序提供了一种安全的引入机制,允许自动检索保险库令牌。与大多数 Vault 身份验证后端不同,该后端不需要首次部署或配置安全敏感凭据(令牌、用户名/密码、客户端证书等),因为身份配置由 PCF 本身处理。相反,它将 PCF 视为受信任的第三方,并使用托管实例标识。 示例 29.带有必需的 PCF 身份验证属性的 application.yml @@ -867,7 +861,7 @@ spring.cloud.vault: role: my-dev-role ``` -具有所有 PCF 身份验证属性的 application.yml +示例 30.application.yml 具有所有 PCF 身份验证属性 ``` spring.cloud.vault: @@ -887,35 +881,34 @@ spring.cloud.vault: * `instance-key`设置到 PCF 实例标识密钥的路径。默认值为`${CF_INSTANCE_KEY}`ENV 变量。 -| |PCF 身份验证需要 BouncyCastle(BCPKIX-JDK15on)在 Classpath 上进行 RSA PSS 签名。| +| |PCF 身份验证要求 BouncyCastle(BCPKIX-JDK15on)在 Classpath 上进行 RSA PSS 签名。| |---|-----------------------------------------------------------------------------------------------------| 另见:[Vault 文档:使用 PCF Auth 后端](https://www.vaultproject.io/docs/auth/pcf.html) -[](#vault.config.acl)[6.ACL 要求](#vault.config.acl) ----------- +## [](#vault.config.acl)[6.ACL 要求](#vault.config.acl) -本节将解释 Spring Vault 访问哪些路径,以便你可以从所需的功能中获得策略声明。 +本节将解释 Spring Vault 访问哪些路径,以便你可以从所需的功能派生出你的策略声明。 |Capability|关联的 HTTP 动词| |----------|---------------------| -| create |`POST`/`put`| +| create |`POST`/`PUT`| | read |`GET`| -| update |`POST`/`put`| +| update |`POST`/`PUT`| | delete |`DELETE`| -| list |`LIST`| +| list |`LIST`(`GET`)| 另见[WWW.vaultproject.io/guides/identity/policies](https://www.vaultproject.io/guides/identity/policies)。 -### [](#authentication-2)[6.1.认证](#authentication-2) ### +### [](#authentication-2)[6.1.认证](#authentication-2) 登录:`POST auth/$authMethod/login` -### [](#keyvalue-mount-discovery)[6.2.KeyValue Mount 发现](#keyvalue-mount-discovery) ### +### [](#keyvalue-mount-discovery)[6.2.KeyValue Mount 发现](#keyvalue-mount-discovery) `GET sys/internal/ui/mounts/$mountPath` -### [](#secretleasecontainer)[6.3.分泌物酶抑制剂](#secretleasecontainer) ### +### [](#secretleasecontainer)[6.3.分泌物酶抑制剂](#secretleasecontainer) `SecretLeaseContainer`根据配置的租赁端点使用不同的路径。 @@ -925,13 +918,13 @@ spring.cloud.vault: * 续约:`PUT sys/renew` -`LeaseEndpoints.Leases` +`LeaseEndpoints.Leases`(`SysLeases`) * 撤销:`PUT sys/leases/revoke` * 续约:`PUT sys/leases/renew` -### [](#session-management)[6.4.会话管理](#session-management) ### +### [](#session-management)[6.4.会话管理](#session-management) * 令牌查找:`GET auth/token/lookup-self` @@ -939,12 +932,11 @@ spring.cloud.vault: * 撤销:`POST auth/token/revoke-self` -[](#vault.config.backends)[7.秘密后端](#vault.config.backends) ----------- +## [](#vault.config.backends)[7.秘密后端](#vault.config.backends) -### [](#vault.config.backends.kv.versioned)[7.1.键值后端](#vault.config.backends.kv.versioned) ### +### [](#vault.config.backends.kv.versioned)[7.1.键值后端](#vault.config.backends.kv.versioned) -Spring Cloud Vault 支持两个键值秘密后端,版本控制的(V2)和未版本控制的(V1)。键值后端允许将任意值存储为键值存储。单个上下文可以存储一个或多个键值元组。上下文可以按层次进行组织。 Spring Cloud Vault 确定自己的秘密是否正在使用版本控制,并将路径映射到其适当的 URL。 Spring Cloud Vault 允许使用应用程序名称,以及与活动配置文件相结合的默认上下文名。 +Spring Cloud Vault 支持两个键值秘密后端,即版本控制的(V2)和非版本控制的(V1)。键值后端允许将任意值存储为键值存储。单个上下文可以存储一个或多个键值元组。上下文可以按层次进行组织。 Spring Cloud Vault 确定一个秘密是否正在使用版本控制,并将路径映射到其适当的 URL。 Spring Cloud Vault 允许使用应用程序名称,并将默认的上下文名(`application`)与活动配置文件结合起来。 ``` /secret/{application}/{profile} @@ -1014,9 +1006,9 @@ spring.cloud.vault: * [Vault 文档:使用 KV Secrets 引擎-Version2(版本管理的键值后端)](https://www.vaultproject.io/docs/secrets/kv/kv-v2.html) -### [](#vault.config.backends.consul)[7.2. Consul](#vault.config.backends.consul) ### +### [](#vault.config.backends.consul)[7.2.执政官](#vault.config.backends.consul) -Spring Cloud Vault 可以获得用于 HashiCorp 领事的凭据。Consul 集成要求`spring-cloud-vault-config-consul`依赖关系。 +Spring Cloud保险库可以获得用于 HashiCorp 领事的凭据。Consul 集成要求`spring-cloud-vault-config-consul`依赖关系。 例 31。 POM.xml @@ -1030,9 +1022,9 @@ Spring Cloud Vault 可以获得用于 HashiCorp 领事的凭据。Consul 集成 ``` -可以通过设置 ` Spring.cloud.vault.consul.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.consul.role=…`的角色名来启用集成。 +可以通过设置`spring.cloud.vault.consul.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.consul.role=…`的角色名来启用集成。 -所获得的令牌存储在`spring.cloud.consul.token`中,因此使用 Spring Cloud Consul 可以提取生成的凭据,而无需进一步配置。你可以通过设置`spring.cloud.vault.consul.token-property`来配置属性名称。 +所获得的令牌存储在`spring.cloud.consul.token`中,因此使用 Spring Cloud Consul 可以在不需要进一步配置的情况下获取生成的凭据。你可以通过设置`spring.cloud.vault.consul.token-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1047,13 +1039,13 @@ spring.cloud.vault: * `role`设置 consul 角色定义的角色名 -* `backend`设置要使用的 Consul 坐骑的路径 +* `backend`设置要使用的执政架的路径 * `token-property`设置用于存储 consul ACL 令牌的属性名称 另见:[保险库文档:与保险库建立领事关系](https://www.vaultproject.io/docs/secrets/consul/index.html) -### [](#vault.config.backends.rabbitmq)[7.3. RabbitMQ](#vault.config.backends.rabbitmq) ### +### [](#vault.config.backends.rabbitmq)[7.3.RabbitMQ](#vault.config.backends.rabbitmq) Spring Cloud Vault 可以获得 RabbitMQ 的凭据。 @@ -1071,9 +1063,9 @@ RabbitMQ 集成需要`spring-cloud-vault-config-rabbitmq`依赖项。 ``` -可以通过设置 ` Spring.cloud.vault.rabbitmq.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.rabbitmq.role=…`的角色名来启用集成。 +可以通过设置`spring.cloud.vault.rabbitmq.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.rabbitmq.role=…`的角色名来启用集成。 -用户名和密码存储在`spring.rabbitmq.username`和`spring.rabbitmq.password`中,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置`spring.cloud.vault.rabbitmq.username-property`和 ` Spring.cloud.vault.rabbitmq.password-property` 来配置属性名称。 +用户名和密码存储在`spring.rabbitmq.username`和`spring.rabbitmq.password`中,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置`spring.cloud.vault.rabbitmq.username-property`和`spring.cloud.vault.rabbitmq.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1097,7 +1089,7 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 设置 RabbitMQ](https://www.vaultproject.io/docs/secrets/rabbitmq/index.html) -### [](#vault.config.backends.aws)[7.4. AWS](#vault.config.backends.aws) ### +### [](#vault.config.backends.aws)[7.4. AWS](#vault.config.backends.aws) Spring Cloud Vault 可以获得 AWS 的凭据。 @@ -1115,7 +1107,7 @@ AWS 集成需要`spring-cloud-vault-config-aws`依赖关系。 ``` -可以通过设置 ` Spring.cloud.vault.aws=true`(默认`false`)并提供带有`spring.cloud.vault.aws.role=…`的角色名来启用集成。 +可以通过设置`spring.cloud.vault.aws=true`(默认`false`)并提供带有`spring.cloud.vault.aws.role=…`的角色名来启用集成。 支持的 AWS 凭据类型: @@ -1127,7 +1119,7 @@ AWS 集成需要`spring-cloud-vault-config-aws`依赖关系。 访问密钥和密钥存储在`cloud.aws.credentials.accessKey`和`cloud.aws.credentials.secretKey`中。因此,使用 Spring Cloud AWS 将在不需要进一步配置的情况下获取生成的凭据。 -你可以通过设置`spring.cloud.vault.aws.access-key-property`和 ` Spring.cloud.vault.aws.secret-key-property` 来配置属性名称。 +可以通过设置`spring.cloud.vault.aws.access-key-property`和`spring.cloud.vault.aws.secret-key-property`来配置属性名。 对于 STS 安全令牌,你可以通过设置`spring.cloud.vault.aws.session-token-key-property`来配置属性名。安全令牌存储在`cloud.aws.credentials.sessionToken`(默认)下。 @@ -1167,7 +1159,7 @@ spring.cloud.vault: * `access-key-property`设置用于存储 AWS 访问密钥的属性名 -* `secret-key-property`设置存储 AWS 密钥的属性名 +* `secret-key-property`设置用于存储 AWS 密钥的属性名 * `session-token-key-property`设置用于存储 AWS STS 安全令牌的属性名称。 @@ -1175,12 +1167,11 @@ spring.cloud.vault: * 当使用`assumed_role`或`federation_token`时,`ttl`设置 STS 令牌的 TTL。Vault 角色指定的 TTL 的默认值。最小/最大值也仅限于 AWS 对 STS 的支持。 -* `role-arn`将 IAM 角色设置为在使用`assumed_role`时假设为保险库角色配置了多个 IAM 角色。 +* `role-arn`设置 IAM 角色,以假设在使用`assumed_role`时,为 Vault 角色配置了多个 IAM 角色。 另见:[Vault 文档:使用 Vault 设置 AWS](https://www.vaultproject.io/docs/secrets/aws/index.html) -[](#vault.config.backends.database-backends)[8.数据库后端](#vault.config.backends.database-backends) ----------- +## [](#vault.config.backends.database-backends)[8.数据库后端](#vault.config.backends.database-backends) Vault 支持多个数据库秘密后端,以根据配置的角色动态生成数据库凭据。这意味着需要访问数据库的服务不再需要配置凭据:它们可以从 Vault 请求凭据,并使用 Vault 的租赁机制更容易地滚动密钥。 @@ -1219,11 +1210,11 @@ Vault 从 0.7.1 开始提供专用的`database`秘密后端,允许通过插件 | |启用多个符合 JDBC 的数据库将生成凭据,并在默认情况下将它们存储在相同的属性键中,因此需要单独配置 JDBC 秘密的属性名。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#vault.config.backends.database)[8.1. Database](#vault.config.backends.database) ### +### [](#vault.config.backends.database)[8.1.数据库](#vault.config.backends.database) -Spring Cloud Vault 可以获得在[WWW.vaultproject.io/api/secret/databases/index.html](https://www.vaultproject.io/api/secret/databases/index.html)处列出的任何数据库的凭据。可以通过设置 ` Spring.cloud.vault.database.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.database.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得在[WWW.vaultproject.io/api/secret/databases/index.html](https://www.vaultproject.io/api/secret/databases/index.html)处列出的任何数据库的凭据。可以通过设置`spring.cloud.vault.database.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.database.role=…`的角色名来启用集成。 -虽然数据库后端是通用的,但`spring.cloud.vault.database`专门针对 JDBC 数据库。用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将为你的`DataSource`获取生成的凭据,而无需进一步配置。你可以通过设置“ Spring.cloud.vault.database.username-property”和“ Spring.cloud.vault.database.password-property”来配置属性名称。 +虽然数据库后端是通用的,但`spring.cloud.vault.database`专门针对 JDBC 数据库。用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将为你的`DataSource`获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.database.username-property`和`spring.cloud.vault.database.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1235,7 +1226,7 @@ spring.cloud.vault: password-property: spring.datasource.password ``` -### [](#vault.config.backends.databases)[8.2.多个数据库](#vault.config.backends.databases) ### +### [](#vault.config.backends.databases)[8.2.多个数据库](#vault.config.backends.databases) 有时,单个数据库的凭据是不够的,因为一个应用程序可能会连接到两个或更多个同类数据库。从版本 3.0.5 开始, Spring Vault 支持在`spring.cloud.vault.databases.*`名称空间下配置多个数据库秘密后端。 @@ -1275,14 +1266,14 @@ spring.cloud.vault: | |Spring Cloud Vault 不支持在达到最大租赁时间时获取新的凭据并用它们配置你的`DataSource`。
即,如果 Vault 中数据库角色的`max_ttl`被设置为`24h`,这意味着在你的应用程序启动 24 小时后,它将不再能够使用数据库进行身份验证。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#vault.config.backends.cassandra)[8.3.Apache Cassandra](#vault.config.backends.cassandra) ### +### [](#vault.config.backends.cassandra)[8.3.Apache Cassandra](#vault.config.backends.cassandra) | |`cassandra`后端在 Vault0.7.1 中已被弃用,建议使用`database`后端并将其挂载为`cassandra`。| |---|-------------------------------------------------------------------------------------------------------------------------------------------| -Spring Cloud Vault 可以获得 Apache Cassandra 的凭据。可以通过设置 ` Spring.cloud.vault.cassandra.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.cassandra.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得 Apache Cassandra 的凭据。可以通过设置`spring.cloud.vault.cassandra.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.cassandra.role=…`的角色名来启用集成。 -用户名和密码可从`spring.data.cassandra.username`和`spring.data.cassandra.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置“ Spring.cloud.vault.cassandra.username-property”和“ Spring.cloud.vault.cassandra.password-property”来配置属性名称。 +用户名和密码可从`spring.data.cassandra.username`和`spring.data.cassandra.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.cassandra.username-property`和`spring.cloud.vault.cassandra.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1306,11 +1297,11 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 设置 Apache Cassandra](https://www.vaultproject.io/docs/secrets/cassandra/index.html) -### [](#vault.config.backends.couchbase)[8.4.CouchBase 数据库](#vault.config.backends.couchbase) ### +### [](#vault.config.backends.couchbase)[8.4.CouchBase 数据库](#vault.config.backends.couchbase) -Spring Cloud Vault 可以获得用于 CouchBase 的凭据。可以通过设置 ` Spring.cloud.vault.couchbase.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.couchbase.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得 CouchBase 的凭据。可以通过设置`spring.cloud.vault.couchbase.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.couchbase.role=…`的角色名来启用集成。 -用户名和密码可从`spring.couchbase.username`和`spring.couchbase.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置 ` Spring.cloud.vault.couchbase.username-property` 和 ` Spring.cloud.vault.couchbase.password-property` 来配置属性名称。 +用户名和密码可从`spring.couchbase.username`和`spring.couchbase.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.couchbase.username-property`和`spring.cloud.vault.couchbase.password-property`来配置属性名。 ``` spring.cloud.vault: @@ -1334,11 +1325,11 @@ spring.cloud.vault: 另见:[CouchBase 数据库插件文档](https://github.com/hashicorp/vault-plugin-database-couchbase) -### [](#vault.config.backends.elasticsearch)[8.5.Elasticsearch](#vault.config.backends.elasticsearch) ### +### [](#vault.config.backends.elasticsearch)[8.5.Elasticsearch](#vault.config.backends.elasticsearch) -Spring Cloud Vault 可以获得自 3.0 版本以来用于 ElasticSearch 的凭据。可以通过设置 ` Spring.cloud.vault.elasticsearch.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.elasticsearch.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得自 3.0 版本以来用于 ElasticSearch 的凭据。可以通过设置`spring.cloud.vault.elasticsearch.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.elasticsearch.role=…`的角色名来启用集成。 -用户名和密码可从`spring.elasticsearch.rest.username`和`spring.elasticsearch.rest.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置 ` Spring.cloud.vault.elasticsearch.username-property` 和 ` Spring.cloud.vault.elasticsearch.password-property` 来配置属性名称。 +用户名和密码可从`spring.elasticsearch.rest.username`和`spring.elasticsearch.rest.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.elasticsearch.username-property`和`spring.cloud.vault.elasticsearch.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1362,14 +1353,14 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 设置 ElasticSearch](https://www.vaultproject.io/docs/secrets/databases/elasticdb) -### [](#vault.config.backends.mongodb)[8.6. MongoDB](#vault.config.backends.mongodb) ### +### [](#vault.config.backends.mongodb)[8.6.MongoDB](#vault.config.backends.mongodb) | |`mongodb`后端在 Vault0.7.1 中已被弃用,建议使用`database`后端并将其挂载为`mongodb`。| |---|---------------------------------------------------------------------------------------------------------------------------------------| -Spring Cloud Vault 可以获得 MongoDB 的凭据。可以通过设置 ` Spring.cloud.vault.mongodb.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.mongodb.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得 MongoDB 的凭据。可以通过设置`spring.cloud.vault.mongodb.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.mongodb.role=…`的角色名来启用集成。 -用户名和密码存储在`spring.data.mongodb.username`和`spring.data.mongodb.password`中,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置 ` Spring.cloud.vault.mongodb.username-property` 和 ` Spring.cloud.vault.mongodb.password-property` 来配置属性名称。 +用户名和密码存储在`spring.data.mongodb.username`和`spring.data.mongodb.password`中,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.mongodb.username-property`和`spring.cloud.vault.mongodb.password-property`来配置属性名。 ``` spring.cloud.vault: @@ -1393,14 +1384,14 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 建立 MongoDB](https://www.vaultproject.io/docs/secrets/mongodb/index.html) -### [](#vault.config.backends.mysql)[8.7. MySQL](#vault.config.backends.mysql) ### +### [](#vault.config.backends.mysql)[8.7. MySQL](#vault.config.backends.mysql) | |`mysql`后端在 Vault0.7.1 中已被弃用,建议使用`database`后端并将其挂载为`mysql`。
`spring.cloud.vault.mysql`的配置将在未来的版本中删除。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring Cloud Vault 可以获得用于 MySQL 的凭据。可以通过设置 ` Spring.cloud.vault.mysql.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.mysql.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得 MySQL 的凭据。可以通过设置`spring.cloud.vault.mysql.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.mysql.role=…`的角色名来启用集成。 -用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置“ Spring.cloud.vault.mysql.username-property”和“ Spring.cloud.vault.mysql.password-property”来配置属性名称。 +用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.mysql.username-property`和`spring.cloud.vault.mysql.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1424,14 +1415,14 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 设置 MySQL](https://www.vaultproject.io/docs/secrets/mysql/index.html) -### [](#vault.config.backends.postgresql)[8.8. PostgreSQL](#vault.config.backends.postgresql) ### +### [](#vault.config.backends.postgresql)[8.8.PostgreSQL](#vault.config.backends.postgresql) | |`postgresql`后端在 Vault0.7.1 中已被弃用,建议使用`database`后端并将其挂载为`postgresql`。
`spring.cloud.vault.postgresql`的配置将在未来的版本中删除。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -Spring Cloud Vault 可以获得用于 PostgreSQL 的凭据。可以通过设置 ` Spring.cloud.vault.postgreSQL.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.postgresql.role=…`的角色名来启用集成。 +Spring Cloud Vault 可以获得 PostgreSQL 的凭据。可以通过设置`spring.cloud.vault.postgresql.enabled=true`(默认`false`)并提供带有`spring.cloud.vault.postgresql.role=…`的角色名来启用集成。 -用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。你可以通过设置 ` Spring.cloud.vault.postgreSQL.username-property` 和 ` Spring.cloud.vault.postgreSQL.password-property` 来配置属性名称。 +用户名和密码可从`spring.datasource.username`和`spring.datasource.password`属性中获得,因此使用 Spring 引导将获取生成的凭据,而无需进一步配置。可以通过设置`spring.cloud.vault.postgresql.username-property`和`spring.cloud.vault.postgresql.password-property`来配置属性名称。 ``` spring.cloud.vault: @@ -1455,16 +1446,15 @@ spring.cloud.vault: 另见:[Vault 文档:使用 Vault 设置 PostgreSQL](https://www.vaultproject.io/docs/secrets/postgresql/index.html) -[](#vault.config.backends.configurer)[9.自定义要作为 PropertySource 公开的秘密后端](#vault.config.backends.configurer) ----------- +## [](#vault.config.backends.configurer)[9.自定义要作为 PropertySource 公开的秘密后端](#vault.config.backends.configurer) -Spring Cloud Vault 使用基于属性的配置来为键值和已发现的秘密后端创建`PropertySource`s。 +Spring Cloud Vault 使用基于属性的配置来为键值和已发现的秘密后台创建`PropertySource`s。 已发现的后端提供`VaultSecretBackendDescriptor`bean 来描述使用秘密后端的配置状态为`PropertySource`。需要一个`SecretBackendMetadataFactory`来创建一个`SecretBackendMetadata`对象,该对象包含路径、名称和属性转换配置。 `SecretBackendMetadata`用于支持特定的`PropertySource`。 -你可以注册`VaultConfigurer`以进行定制。如果提供`VaultConfigurer`,则禁用默认的键值和已发现的后端注册。但是,你可以使用“secretbackendconfigurer.registerdefaultKeyValuesecretBackends()”和启用默认注册。 +你可以注册`VaultConfigurer`以进行定制。如果提供`VaultConfigurer`,则禁用默认的键值和已发现的后端注册。但是,你可以启用`SecretBackendConfigurer.registerDefaultKeyValueSecretBackends()`和`SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends()`的默认注册。 ``` public class CustomizationBean implements VaultConfigurer { @@ -1485,10 +1475,9 @@ SpringApplication application = new SpringApplication(MyApplication.class); application.addBootstrapper(VaultBootstrapper.fromConfigurer(new CustomizationBean())); ``` -[](#vault.config.backends.custom)[10.自定义秘密后端实现](#vault.config.backends.custom) ----------- +## [](#vault.config.backends.custom)[10.自定义秘密后端实现](#vault.config.backends.custom) -Spring Cloud Vault 附带对最常见的后端集成的秘密后端支持。你可以通过提供一个实现来与任何类型的后端集成,该实现描述了如何从要使用的后端获取数据,以及如何通过提供`PropertyTransformer`来处理该后端提供的数据。 +Spring Cloud Vault 为最常见的后端集成提供了秘密的后端支持。你可以通过提供一个实现来与任何类型的后端集成,该实现描述了如何从要使用的后端获取数据,以及如何通过提供`PropertyTransformer`来处理该后端提供的数据。 为后端添加自定义实现需要实现两个接口: @@ -1496,18 +1485,17 @@ Spring Cloud Vault 附带对最常见的后端集成的秘密后端支持。你 * `org.springframework.cloud.vault.config.SecretBackendMetadataFactory` -`VaultSecretBackendDescriptor`通常是保存配置数据的对象,例如`VaultDatabaseProperties`。 Spring Cloud Vault 要求你的类型被注释为`@ConfigurationProperties`,以从配置中实现类。 +`VaultSecretBackendDescriptor`通常是保存配置数据的对象,例如`VaultDatabaseProperties`。 Spring Cloud Vault 要求用`@ConfigurationProperties`对类型进行注释,以便从配置中实现类。 `SecretBackendMetadataFactory`接受`VaultSecretBackendDescriptor`以创建实际的`SecretBackendMetadata`对象,该对象保存 Vault 服务器内的上下文路径、解析参数化上下文路径所需的任何路径变量和`PropertyTransformer`。 `VaultSecretBackendDescriptor`和`SecretBackendMetadataFactory`类型都必须在`spring.factories`中注册,这是 Spring 提供的一种扩展机制,类似于 Java 的 ServiceLoader。 -[](#service-registry-configuration)[11.服务注册中心配置](#service-registry-configuration) ----------- +## [](#service-registry-configuration)[11.服务注册中心配置](#service-registry-configuration) -你可以使用`DiscoveryClient`(例如 from Spring Cloud Consul)通过设置 Spring.cloud.vault.discovery.enabled=true(默认`false`)来定位 Vault 服务器。这样做的最终结果是,你的应用程序需要一个具有适当的发现配置的 application.yml(或环境变量)。好处是,只要发现服务是一个固定点,保险库就可以更改其坐标。默认的服务 ID 是`vault`,但是你可以在客户机上使用 ` Spring.cloud.vault.Discovery.ServiceID’更改它。 +你可以使用`DiscoveryClient`(例如来自 Spring Cloud Consul)通过设置 Spring.cloud.vault.discovery.enabled=true(默认`false`)来定位 Vault 服务器。这样做的最终结果是,你的应用程序需要一个具有适当的发现配置的 application.yml(或环境变量)。好处是,只要发现服务是一个固定点,保险库就可以更改其坐标。默认的服务 ID 是`vault`,但是你可以在客户机上使用`spring.cloud.vault.discovery.serviceId`更改它。 -发现客户机实现都支持某种元数据映射(例如,对于 Eureka,我们有 eureka.instance.metadatamap)。服务的一些附加属性可能需要在其服务注册元数据中进行配置,以便客户端能够正确地连接。不提供传输层安全性详细信息的服务注册中心需要提供一个`scheme`元数据条目,将其设置为`https`或`http`。如果没有配置任何方案,并且该服务不作为安全服务公开,那么配置默认为`spring.cloud.vault.scheme`,如果未设置该配置,则为`https`。 +发现客户机实现都支持某种元数据映射(例如,对于 Eureka,我们有 eureka.instance.metadatamap)。服务的一些附加属性可能需要在其服务注册元数据中进行配置,以便客户端能够正确地连接。不提供传输层安全性详细信息的服务注册中心需要提供一个`scheme`元数据条目,将其设置为`https`或`http`。如果没有配置任何方案,并且服务不作为安全服务公开,那么在未设置配置时,配置默认为`spring.cloud.vault.scheme`,即`https`。 ``` spring.cloud.vault.discovery: @@ -1515,20 +1503,18 @@ spring.cloud.vault.discovery: service-id: my-vault-service ``` -[](#vault.config.fail-fast)[12.Vault 客户端快速失败](#vault.config.fail-fast) ----------- +## [](#vault.config.fail-fast)[12.Vault 客户端快速失败](#vault.config.fail-fast) -在某些情况下,如果服务无法连接到 Vault 服务器,则可能希望服务启动失败。如果这是期望的行为,那么设置 bootstrap 配置属性 ` Spring.cloud.vault.fail-fast=true`,客户端将异常停止。 +在某些情况下,如果服务无法连接到 Vault 服务器,则可能希望服务启动失败。如果这是所需的行为,那么设置 BootStrap 配置属性`spring.cloud.vault.fail-fast=true`,客户端将异常停止。 ``` spring.cloud.vault: fail-fast: true ``` -[](#vault.config.namespaces)[13.Vault Enterprise 命名空间支持](#vault.config.namespaces) ----------- +## [](#vault.config.namespaces)[13.Vault Enterprise 命名空间支持](#vault.config.namespaces) -Vault Enterprise 允许使用名称空间来隔离单个 Vault 服务器上的多个 Vault。在使用 vault`resttemplate’或`WebClient`时,通过设置 ` Spring.cloud.vault.namespace=…` 在每个传出的 HTTP 请求上启用名称空间头 `x-vault-namespace’来配置名称空间。 +Vault Enterprise 允许使用名称空间来隔离单个 Vault 服务器上的多个 Vault。在使用 vault`RestTemplate`或`WebClient`时,通过设置`spring.cloud.vault.namespace=…`来配置名称空间,可以在每个传出的 HTTP 请求上启用名称空间标头`X-Vault-Namespace`。 请注意,Vault Community Edition 不支持此功能,并且对 Vault 操作没有影响。 @@ -1539,8 +1525,7 @@ spring.cloud.vault: 另见:[Vault Enterprise:名称空间](https://www.vaultproject.io/docs/enterprise/namespaces/index.html) -[](#vault.config.ssl)[14.Vault 客户端 SSL 配置](#vault.config.ssl) ----------- +## [](#vault.config.ssl)[14.Vault 客户端 SSL 配置](#vault.config.ssl) 可以通过设置各种属性来声明性地配置 SSL。你可以设置`javax.net.ssl.trustStore`来配置 JVM 范围内的 SSL 设置,也可以设置`spring.cloud.vault.ssl.trust-store`来仅为 Spring Cloud Vault 配置设置 SSL 设置。 @@ -1566,10 +1551,9 @@ spring.cloud.vault: 请注意,配置`spring.cloud.vault.ssl.*`只能在 Apache HTTP 组件或 OKHTTP 客户机位于类路径上时才能应用。 -[](#vault-lease-renewal)[15.租赁生命周期管理(更新和撤销)](#vault-lease-renewal) ----------- +## [](#vault-lease-renewal)[15.租赁生命周期管理(更新和撤销)](#vault-lease-renewal) -对于每个秘密,Vault 都会创建一个租约:元数据,其中包含时间持续时间、可更新性等信息。 +对于每个秘密,Vault 都会创建一个租约:元数据,其中包含诸如时间期限、可更新性等信息。 Vault 承诺,这些数据将在给定的持续时间或生存时间内有效。一旦租约到期,Vault 可以撤销该数据,并且该秘密的使用者不能再确定它是否有效。 @@ -1595,18 +1579,17 @@ spring.cloud.vault: * `min-renewal`设置续租前至少需要的期限。这种设置可以防止更新太频繁。 -* `expiry-threshold`设置到期阈值。租约在到期前会在配置的期限内续签。 +* `expiry-threshold`设置到期阈值。租约在到期前会在配置好的期限内续签。 * `lease-endpoints`设置更新和撤销的端点。旧版的 Vault 版本在 0.8 之前,Sysleases 版本在以后。 另见:[保险库文档:租赁、续订和撤销](https://www.vaultproject.io/docs/concepts/lease.html) -[](#vault-session-lifecycle)[16.会话令牌生命周期管理(更新、重新登录和撤销)](#vault-session-lifecycle) ----------- +## [](#vault-session-lifecycle)[16.会话令牌生命周期管理(更新、重新登录和撤销)](#vault-session-lifecycle) -Vault 会话令牌(也称为`LoginToken`)与租赁非常相似,因为它具有 TTL,最大 TTL,并且可能会过期。一旦登录令牌过期,就不能再使用它与 Vault 进行交互。因此, Spring Vault 提供了一个`SessionManager`API,用于命令式和反应式使用。 +Vault 会话令牌(也称为`LoginToken`)与租赁非常相似,因为它具有 TTL,最大 TTL,并且可能会过期。一旦一个登录令牌过期,它就不能再用于与 Vault 交互。因此, Spring Vault 使用`SessionManager`API 进行命令和反应使用。 -Spring 默认情况下,Cloud Vault 维护会话令牌生命周期。会话令牌是懒洋洋地获得的,因此实际的登录被推迟到第一次使用 Vault 的会话绑定时。一旦 Spring Cloud Vault 获得会话令牌,它将保留它直到到期。下一次使用会话绑定活动时, Spring Cloud Vault 重新登录到 Vault 并获得一个新的会话令牌。在应用程序关闭时, Spring Cloud Vault 撤销令牌,如果它仍然处于活动状态以终止会话。 +Spring 默认情况下,Cloud Vault 维护会话令牌生命周期。会话令牌是懒洋洋地获得的,因此实际的登录被推迟到 Vault 的第一次会话绑定使用时。一旦 Spring Cloud Vault 获得会话令牌,它将保留该令牌直到到期。下一次使用会话绑定活动时, Spring Cloud Vault 重新登录到 Vault 并获得一个新的会话令牌。在应用程序关闭时, Spring Cloud Vault 撤销令牌,如果它仍然处于活动状态以终止会话。 默认情况下,会话生命周期是启用的,可以通过将`spring.cloud.vault.session.lifecycle.enabled`设置为`false`来禁用。不建议禁用,因为会话令牌可能会过期,并且 Spring Cloud Vault 无法更长时间访问 Vault。 @@ -1626,8 +1609,7 @@ spring.cloud.vault: 另见:[保险库文档:令牌更新](https://www.vaultproject.io/api-docs/auth/token#renew-a-token-self) -[](#common-application-properties)[附录 A:通用应用程序属性](#common-application-properties) ----------- +## [](#common-application-properties)[附录 A:通用应用程序属性](#common-application-properties) 可以在`application.properties`文件内、`application.yml`文件内或作为命令行开关指定各种属性。本附录提供了一个常见的 Spring Cloud Vault 属性的列表,以及对使用它们的基础类的引用。 @@ -1662,7 +1644,7 @@ spring.cloud.vault: | spring.cloud.vault.aws.secret-key-property | `cloud.aws.credentials.secretKey` |获取的密钥的目标属性。| | spring.cloud.vault.aws.session-token-key-property | `cloud.aws.credentials.sessionToken` |获取的密钥的目标属性。| | spring.cloud.vault.aws.ttl | `0` |STS 代币的 TTL。默认情况下,无论保险库角色可能对 MAX 有什么影响。也仅限于 AWS 支持的 STS 的最大值。@since3.0.2| -| spring.cloud.vault.azure-msi.azure-path | `azure` |安装路径的 Azure MSI 身份验证后端。| +| spring.cloud.vault.azure-msi.azure-path | `azure` |安装 Azure MSI 认证后端的路径。| | spring.cloud.vault.azure-msi.identity-token-service | |身份令牌服务 URI。@since3.0| | spring.cloud.vault.azure-msi.metadata-service | |实例元数据服务 URI。@since3.0| | spring.cloud.vault.azure-msi.role | |角色的名称。| @@ -1675,7 +1657,7 @@ spring.cloud.vault: | spring.cloud.vault.config.lifecycle.enabled | `true` |启用生命周期管理。| | spring.cloud.vault.config.lifecycle.expiry-threshold | |到期日门槛。{@link lease}在给定的{@link duration}到期前更新。@ 自 2.2 起| | spring.cloud.vault.config.lifecycle.lease-endpoints | |将{@Link LeaseEndpoints}设置为将续订/撤销调用委托给。{@link leaseendpoints}封装了影响更新/撤销端点位置的 Vault 版本之间的差异。对于 Vault 的 0.8 或更高版本,可以使用{@Link LeaseEndpoints#sysleases},对于较旧的版本,可以使用{@Link LeaseEndpoints#Legacy}(默认)。@ 自 2.2 起| -| spring.cloud.vault.config.lifecycle.min-renewal | |在续约前至少需要的时间。@ 自 2.2 起| +| spring.cloud.vault.config.lifecycle.min-renewal | |在续租前至少需要的时间。@ 自 2.2 起| | spring.cloud.vault.config.order | `0` |用于设置{@link org.springframework.core.ENV.PropertySource}的优先级。这对于使用 Vault 作为对其他属性源的覆盖是有用的。@see org.springframework.core.priorityordered| | spring.cloud.vault.connection-timeout | `5000` |连接超时。| | spring.cloud.vault.consul.backend | `consul` |领事后台路径。| @@ -1709,7 +1691,7 @@ spring.cloud.vault: | spring.cloud.vault.gcp-gce.role | |尝试登录所针对的角色的名称。| | spring.cloud.vault.gcp-gce.service-account | |可选服务帐户 ID。如果未配置,则使用默认 ID。| | spring.cloud.vault.gcp-iam.credentials.encoded-key | |base64 以 JSON 格式对 OAuth2 帐户私钥的内容进行了编码。| -| spring.cloud.vault.gcp-iam.credentials.location | |OAuth2 凭证私钥的位置。\由于这是一种资源,私钥可以位于多种位置,例如本地文件系统、 Classpath、URL 等。| +| spring.cloud.vault.gcp-iam.credentials.location | |OAuth2 凭证私钥的位置。\由于这是一个资源,私钥可以位于多种位置,例如本地文件系统、 Classpath、URL 等。| | spring.cloud.vault.gcp-iam.gcp-path | `gcp` |Kubernetes 身份验证后端的挂载路径。| | spring.cloud.vault.gcp-iam.jwt-validity | `15m` |JWT 令牌的有效性。| | spring.cloud.vault.gcp-iam.project-id | |重写 GCP 项目 ID。| @@ -1770,3 +1752,5 @@ spring.cloud.vault: | spring.cloud.vault.ssl.trust-store-type | |信任存储的类型。@since3.0| | spring.cloud.vault.token | |静态保险库令牌。如果{@link#authentication}是{@code token},则需要。| | spring.cloud.vault.uri | |Vault Uri。可以用方案、主机和端口进行设置.| + +如果{{{i[’GoogleAnalyticsObject’]=r;i[r]=i[r]|function(){q=i[r].push(参数)},i[r].l=1\*new date();a=s.createElement(o),m=s.getelementsbyName(0);a.parentsName(1);a.A.SRC=g;m.M.analytnode(gua,m.com.com);(google=document=’,’,’’’’’’’’),’documents’,’’.’’’’’’’’’’’,’’’’’’ \ No newline at end of file diff --git a/docs/spring-cloud/spring-cloud-zookeeper.md b/docs/spring-cloud/spring-cloud-zookeeper.md index 50cb6c9488b591e53104742f102315462ab818a2..b1f248abd44b2d2f17eee02bf499a934c1c76bf2 100644 --- a/docs/spring-cloud/spring-cloud-zookeeper.md +++ b/docs/spring-cloud/spring-cloud-zookeeper.md @@ -1,16 +1,14 @@ -[Spring Cloud Zookeeper](#_spring_cloud_zookeeper) -========== +# [Spring Cloud Zookeeper](#_spring_cloud_zookeeper) 该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring 引导应用程序提供 ZooKeeper 集成。通过一些注释,你可以快速启用和配置应用程序中的常见模式,并使用基于 ZooKeeper 的组件构建大型分布式系统。所提供的模式包括服务发现和配置。该项目还通过集成 Spring Cloud LoadBalancer 提供客户端负载平衡。 -[](#quick-start)[1. Quick Start](#quick-start) ----------- +## [](#quick-start)[1.快速启动](#quick-start) 这个快速的开始将使用 Spring Cloud ZooKeeper 进行服务发现和分布式配置。 首先,在你的机器上运行 ZooKeeper。然后,你可以访问它,并将其作为服务注册表和配置源使用 Spring Cloud ZooKeeper。 -### [](#discovery-client-usage)[1.1.发现客户端使用情况](#discovery-client-usage) ### +### [](#discovery-client-usage)[1.1.发现客户端使用情况](#discovery-client-usage) 要在应用程序中使用这些特性,你可以将其构建为依赖于`spring-cloud-zookeeper-core`和`spring-cloud-zookeeper-discovery`的 Spring 引导应用程序。添加依赖项最方便的方法是使用 Spring 引导启动器:`org.springframework.cloud:spring-cloud-starter-zookeeper-discovery`。我们建议使用依赖管理和`spring-boot-starter-parent`。下面的示例展示了一个典型的 Maven 配置: @@ -130,7 +128,7 @@ public String serviceUrl() { } ``` -### [](#distributed-configuration-usage)[1.2.分布式配置使用](#distributed-configuration-usage) ### +### [](#distributed-configuration-usage)[1.2.分布式配置使用](#distributed-configuration-usage) 要在应用程序中使用这些特性,你可以将其构建为依赖于`spring-cloud-zookeeper-core`和`spring-cloud-zookeeper-config`的 Spring 引导应用程序。添加依赖项最方便的方法是使用 Spring 引导启动器:`org.springframework.cloud:spring-cloud-starter-zookeeper-config`。我们建议使用依赖管理和`spring-boot-starter-parent`。下面的示例显示了典型的 Maven 配置: @@ -231,8 +229,7 @@ public class Application { | |如果使用 Spring Cloud ZooKeeper Config,则需要设置`spring.config.import`属性才能绑定到 ZooKeeper。
你可以在[Spring Boot Config Data Import section](#config-data-import)中阅读有关它的更多信息。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#spring-cloud-zookeeper-install)[2.安装 ZooKeeper](#spring-cloud-zookeeper-install) ----------- +## [](#spring-cloud-zookeeper-install)[2.安装 ZooKeeper](#spring-cloud-zookeeper-install) 有关如何安装 ZooKeeper 的说明,请参见[安装文档](https://zookeeper.apache.org/doc/current/zookeeperStarted.html)。 @@ -277,22 +274,21 @@ compile('org.apache.zookeeper:zookeeper:3.4.12') { } ``` -[](#spring-cloud-zookeeper-discovery)[3.使用 ZooKeeper 进行服务发现](#spring-cloud-zookeeper-discovery) ----------- +## [](#spring-cloud-zookeeper-discovery)[3.使用 ZooKeeper 进行服务发现](#spring-cloud-zookeeper-discovery) 服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户机或某种形式的约定可能很难做到,并且可能很脆弱。[Curator](https://curator.apache.org)(ZooKeeper 的 Java 库)通过[服务发现扩展](https://curator.apache.org/curator-x-discovery/)提供服务发现。 Spring Cloud ZooKeeper 将此扩展用于服务注册和发现。 -### [](#activating)[3.1. Activating](#activating) ### +### [](#activating)[3.1.激活](#activating) -包括对 `org.springframework.cloud: Spring-cloud-starter-zookeeper-discovery’的依赖,使自动配置能够设置 Spring cloud zookeeper discovery。 +包括对`org.springframework.cloud:spring-cloud-starter-zookeeper-discovery`的依赖可以实现自动配置,从而设置 Spring Cloud ZooKeeper 发现。 -| |对于 Web 功能,仍然需要包含“org.springframework.boot: Spring-boot-starter-web”。| +| |对于 Web 功能,你仍然需要包含`org.springframework.boot:spring-boot-starter-web`。| |---|---------------------------------------------------------------------------------------------------| | |在使用 ZooKeeper 的 3.4 版本时,你需要更改
包含依赖项的方式,如[here](#spring-cloud-zookeeper-install)所述。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#registering-with-zookeeper)[3.2.在动物园管理员处注册](#registering-with-zookeeper) ### +### [](#registering-with-zookeeper)[3.2.在动物园管理员处注册](#registering-with-zookeeper) 当客户机向 ZooKeeper 注册时,它提供有关自身的元数据(如主机和端口、ID 和名称)。 @@ -318,7 +314,7 @@ public class Application { | |前面的示例是一个普通的引导应用程序 Spring。| |---|----------------------------------------------------------| -如果 ZooKeeper 位于`localhost:2181`以外的地方,则配置必须提供服务器的位置,如以下示例所示: +如果 ZooKeeper 位于`localhost:2181`以外的地方,则配置必须提供服务器的位置,如下例所示: 应用程序.yml @@ -329,18 +325,18 @@ spring: connect-string: localhost:2181 ``` -| |如果使用[Spring Cloud Zookeeper Config](#spring-cloud-zookeeper-config),则前面示例中显示的
值需要在`bootstrap.yml`中,而不是在 `应用程序.yml` 中。| +| |如果使用[Spring Cloud Zookeeper Config](#spring-cloud-zookeeper-config),则前面示例中显示的
值需要在`bootstrap.yml`而不是`应用程序.yml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -默认的服务名称、实例 ID 和端口(取自`Environment`)分别是 `${ Spring.application.name}`、 Spring 上下文 ID 和`${server.port}`。 +默认的服务名、实例 ID 和端口(取自`Environment`)分别是`${spring.application.name}`、 Spring 上下文 ID 和`${server.port}`。 在 Classpath 上具有`spring-cloud-starter-zookeeper-discovery`使得该应用程序既可以成为 ZooKeeper“服务”(即它自己注册),也可以成为“客户端”(即它可以查询 ZooKeeper 以定位其他服务)。 -如果你想禁用 ZooKeeper Discovery 客户端,可以将 ` Spring.cloud.zooKeeper.Discovery.enabled` 设置为`false`。 +如果你想禁用 ZooKeeper 发现客户端,可以将`spring.cloud.zookeeper.discovery.enabled`设置为`false`。 -### [](#using-the-discoveryclient)[3.3.使用 DiscoveryClient](#using-the-discoveryclient) ### +### [](#using-the-discoveryclient)[3.3.使用 DiscoveryClient](#using-the-discoveryclient) -Spring 云具有对[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(一个 REST 客户机构建器)、[Spring`RestTemplate`](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/ascii)和[Spring WebFlux](https://cloud.spring.io/spring-cloud-commons/reference/html/#loadbalanced-webclient)的支持,使用逻辑服务名称而不是物理 URL。 +Spring Cloud 支持[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(一个 REST 客户端构建器)、[[ Spring `RestTemplate`](https://github.com/ Spring-cloud/ Spring-cloud-netflix/blob/master/DOCS/SRC/main/ascii)和[Spring WebFlux](https://cloud.spring.io/spring-cloud-commons/reference/html/#loadbalanced-webclient),使用逻辑服务名称而不是物理 URL。 你也可以使用`org.springframework.cloud.client.discovery.DiscoveryClient`,它为不特定于 Netflix 的发现客户端提供了一个简单的 API,如下例所示: @@ -357,24 +353,22 @@ public String serviceUrl() { } ``` -[](#spring-cloud-zookeeper-other-componentes)[4. Using Spring Cloud Zookeeper with Spring Cloud Components](#spring-cloud-zookeeper-other-componentes) ----------- +## [](#spring-cloud-zookeeper-other-componentes)[4. Using Spring Cloud Zookeeper with Spring Cloud Components](#spring-cloud-zookeeper-other-componentes) -佯装、 Spring 云网关和 Spring 云负载均衡器都与 Spring 云 ZooKeeper 一起工作。 +假装、 Spring Cloud网关和 Spring Cloud负载均衡器都与 Spring Cloud ZooKeeper 一起工作。 -### [](#spring-cloud-loadbalancer-with-zookeeper)[4.1. Spring Cloud LoadBalancer with Zookeeper](#spring-cloud-loadbalancer-with-zookeeper) ### +### [](#spring-cloud-loadbalancer-with-zookeeper)[4.1. Spring Cloud LoadBalancer with Zookeeper](#spring-cloud-loadbalancer-with-zookeeper) -Spring Cloud ZooKeeper 提供了 Spring Cloud LoadBalancer`ServiceInstanceListSupplier`的实现方式。当你使用`spring-cloud-starter-zookeeper-discovery`时, Spring 云负载平衡器被自动配置为默认使用“ZooKeeperServiceInstanceListSupplier”。 +Spring Cloud ZooKeeper 提供了 Spring Cloud LoadBalancer`ServiceInstanceListSupplier`的实现方式。当你使用`spring-cloud-starter-zookeeper-discovery`时, Spring Cloud负载平衡器被自动配置为默认使用`ZookeeperServiceInstanceListSupplier`。 -| |如果你以前在 ZooKeeper 中使用了 StickyRule,那么当前堆栈中的 stickyRule
中的替换项是 SC LoadBalancer 中的`SameInstancePreferenceServiceInstanceListSupplier`。你可以在[Spring Cloud Commons documentation](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)中了解如何设置它。| +| |如果你以前在 ZooKeeper 中使用 StickyRule,则当前堆栈中的 stickyRule
中的替换项是 SC LoadBalancer 中的`SameInstancePreferenceServiceInstanceListSupplier`。你可以在[Spring Cloud Commons documentation](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)中阅读有关如何设置它的内容。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -[](#spring-cloud-zookeeper-service-registry)[5. Spring Cloud Zookeeper and Service Registry](#spring-cloud-zookeeper-service-registry) ----------- +## [](#spring-cloud-zookeeper-service-registry)[5. Spring Cloud Zookeeper and Service Registry](#spring-cloud-zookeeper-service-registry) Spring Cloud ZooKeeper 实现了`ServiceRegistry`接口,允许开发人员以编程的方式注册任意服务。 -`ServiceInstanceRegistration`类提供了一个`builder()`方法来创建一个`ServiceRegistry`可以使用的 `registration’对象,如以下示例所示: +`ServiceInstanceRegistration`类提供了一个`builder()`方法来创建`Registration`对象,该对象可以由`ServiceRegistry`使用,如以下示例所示: ``` @Autowired @@ -391,7 +385,7 @@ public void registerThings() { } ``` -### [](#instance-status)[5.1.实例状态](#instance-status) ### +### [](#instance-status)[5.1.实例状态](#instance-status) Netflix Eureka 支持在服务器上注册`OUT_OF_SERVICE`实例。这些实例不作为活动服务实例返回。这对于诸如蓝色/绿色部署之类的行为很有用。(注意,Curator 服务发现配方不支持此行为。)利用灵活的有效负载, Spring Cloud ZooKeeper 可以通过更新一些特定的元数据,然后在 Spring Cloud LoadBalancer中对该元数据进行过滤来实现。`ZookeeperServiceInstanceListSupplier`过滤掉所有不等于`UP`的非空实例状态。如果实例状态字段为空,则认为它是`UP`,用于向后兼容。要更改实例的状态,请将`POST`与`OUT_OF_SERVICE`连接到`ServiceRegistry`实例状态执行器端点,如以下示例所示: @@ -402,8 +396,7 @@ $ http POST http://localhost:8081/service-registry status=OUT_OF_SERVICE | |前面的示例使用[httpie.org](https://httpie.org)中的`http`命令。| |---|------------------------------------------------------------------------------------| -[](#spring-cloud-zookeeper-dependencies)[6.动物园管理员依赖关系](#spring-cloud-zookeeper-dependencies) ----------- +## [](#spring-cloud-zookeeper-dependencies)[6.动物园管理员依赖关系](#spring-cloud-zookeeper-dependencies) 以下主题涵盖了如何使用 Spring Cloud ZooKeeper 依赖项: @@ -415,17 +408,17 @@ $ http POST http://localhost:8081/service-registry status=OUT_OF_SERVICE * [Configuring Spring Cloud Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-configuring) -### [](#spring-cloud-zookeeper-dependencies-using)[6.1.使用 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-using) ### +### [](#spring-cloud-zookeeper-dependencies-using)[6.1.使用 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-using) -Spring Cloud ZooKeeper 为你提供了一种可能性,可以将你的应用程序的依赖关系作为属性提供。作为依赖关系,你可以理解在 ZooKeeper 中注册的其他应用程序,你希望通过[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(REST 客户机生成器)、[Spring`RestTemplate`](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/ascii)和[Spring WebFlux](https://cloud.spring.io/spring-cloud-commons/reference/html/#loadbalanced-webclient)调用这些应用程序。 +Spring Cloud ZooKeeper 为你提供了一种可能性,可以将你的应用程序的依赖关系作为属性提供。作为依赖关系,你可以了解注册在 ZooKeeper 中并希望通过[Feign](https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#spring-cloud-feign)(一个 REST 客户机生成器)调用的其他应用程序,[ Spring `RestTemplate`](https://github.com/ Spring-cloud/ Spring-cloud/ Spring-cloud-netflix/blob/master/DOCS/SRC/main/ascii)和[Spring WebFlux](https://cloud.spring.io/spring-cloud-commons/reference/html/#loadbalanced-webclient)。 你还可以使用 ZooKeeper Dependency Watchers 功能来控制和监视你的依赖关系的状态。 -### [](#spring-cloud-zookeeper-dependencies-activating)[6.2.激活 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-activating) ### +### [](#spring-cloud-zookeeper-dependencies-activating)[6.2.激活 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-activating) -包括对 `org.springframework.cloud: Spring-cloud-starter-zookeeper-discovery’的依赖,使自动配置能够建立 Spring cloud zookeeper 依赖关系。即使你在属性中提供了依赖关系,也可以关闭依赖关系。为此,将 ` Spring.cloud.zookeeper.dependency.enabled’属性设置为 false(默认设置为`true`)。 +包含对`org.springframework.cloud:spring-cloud-starter-zookeeper-discovery`的依赖项,可以实现自动配置,从而设置 Spring Cloud ZooKeeper 依赖项。即使你在属性中提供了依赖关系,也可以关闭依赖关系。为此,将`spring.cloud.zookeeper.dependency.enabled`属性设置为 false(默认设置为`true`)。 -### [](#spring-cloud-zookeeper-dependencies-setting-up)[6.3.设置 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-setting-up) ### +### [](#spring-cloud-zookeeper-dependencies-setting-up)[6.3.设置 ZooKeeper 依赖项](#spring-cloud-zookeeper-dependencies-setting-up) 考虑下面的依赖关系表示示例: @@ -457,9 +450,9 @@ spring.cloud.zookeeper: 接下来的几节将逐一介绍依赖关系的每个部分。根属性名为`spring.cloud.zookeeper.dependencies`。 -#### [](#spring-cloud-zookeeper-dependencies-setting-up-aliases)[6.3.1. Aliases](#spring-cloud-zookeeper-dependencies-setting-up-aliases) #### +#### [](#spring-cloud-zookeeper-dependencies-setting-up-aliases)[6.3.1.别名](#spring-cloud-zookeeper-dependencies-setting-up-aliases) -在根属性下面,你必须将每个依赖项表示为别名。这是由于 Spring Cloud LoadBalancer 的限制,它要求将应用程序 ID 放置在 URL 中。因此,你不能通过任何复杂的路径,例如`/myApp/myRoute/name`)。别名是你使用的名称,而不是`DiscoveryClient`,`Feign`或 `resttemplate’的`serviceId`。 +在根属性下面,你必须将每个依赖项表示为别名。这是由于 Spring Cloud LoadBalancer 的限制,它要求将应用程序 ID 放置在 URL 中。因此,你不能通过任何复杂的路径,例如`/myApp/myRoute/name`)。别名是你使用的名称,而不是用于`DiscoveryClient`,`Feign`或`RestTemplate`的`serviceId`。 在前面的示例中,别名是`newsletter`和`mailing`。下面的示例显示了使用`newsletter`别名的假装用法: @@ -471,11 +464,11 @@ public interface NewsletterService { } ``` -#### [](#path)[6.3.2. Path](#path) #### +#### [](#path)[6.3.2.路径](#path) -该路径由`path`YAML 属性表示,并且是在 ZooKeeper 下注册依赖项的路径。如[上一节](#spring-cloud-zookeeper-dependencies-setting-up-aliases)中所述, Spring Cloud LoadBalancer 在 URL 上运行。因此,此路径不符合其需求。这就是为什么 Spring Cloud ZooKeeper 将别名映射到正确的路径。 +该路径由`path`YAML 属性表示,并且是在 ZooKeeper 下注册依赖项的路径。正如[上一节](#spring-cloud-zookeeper-dependencies-setting-up-aliases)中所描述的, Spring Cloud LoadBalancer 在 URL 上运行。因此,此路径不符合其需求。这就是为什么 Spring Cloud ZooKeeper 将别名映射到正确的路径。 -#### [](#load-balancer-type)[6.3.3.负载平衡器类型](#load-balancer-type) #### +#### [](#load-balancer-type)[6.3.3.负载平衡器类型](#load-balancer-type) 负载均衡器类型由`loadBalancerType`YAML 属性表示。 @@ -487,11 +480,11 @@ public interface NewsletterService { * Round\_Robin:一遍又一遍地迭代实例。 -#### [](#content-type-template-and-version)[6.3.4. `Content-Type` Template and Version](#content-type-template-and-version) #### +#### [](#content-type-template-and-version)[6.3.4。`Content-Type`模板和版本](#content-type-template-and-version) -`Content-Type`模板和版本由`contentTypeTemplate`和 `version’yaml 属性表示。 +`Content-Type`模板和版本由`contentTypeTemplate`和`version`YAML 属性表示。 -如果在`Content-Type`头中对 API 进行版本,则不希望将此头添加到每个请求中。此外,如果你想调用一个新版本的 API,那么你不希望围绕你的代码 ROAM 来提高 API 版本。这就是为什么你可以提供带有特殊`$version`占位符的 `ContentTypeTemplate’。这个占位符将由“version”YAML 属性的值来填充。考虑以下`contentTypeTemplate`的示例: +如果在`Content-Type`头中对 API 进行版本,则不希望将此头添加到每个请求中。此外,如果你想调用一个新版本的 API,那么你不希望围绕你的代码 ROAM 来提高 API 版本。这就是为什么可以为`contentTypeTemplate`提供一个特殊的`$version`占位符。这个占位符将由`version`YAML 属性的值来填充。考虑以下`contentTypeTemplate`的示例: ``` application/vnd.newsletter.$version+json @@ -503,17 +496,17 @@ application/vnd.newsletter.$version+json v1 ``` -结合`contentTypeTemplate`和版本,将为每个请求创建一个 `Content-Type’头,如下所示: +结合`contentTypeTemplate`和版本,将为每个请求创建`Content-Type`头,如下所示: ``` application/vnd.newsletter.v1+json ``` -#### [](#default-headers)[6.3.5.默认标头](#default-headers) #### +#### [](#default-headers)[6.3.5.默认标头](#default-headers) -在 YAML 中,默认的头由`headers`映射表示。 +默认的头文件由 YAML 中的`headers`映射表示。 -有时,对依赖项的每次调用都需要设置一些默认的标头。要在代码中不这样做,你可以在 YAML 文件中设置它们,如下面的示例“headers”部分所示: +有时,对依赖项的每次调用都需要设置一些默认的标头。要在代码中不这样做,你可以在 YAML 文件中设置它们,如以下示例`headers`部分所示: ``` headers: @@ -524,9 +517,9 @@ headers: - no-cache ``` -该`headers`部分会导致在 HTTP 请求中添加带有适当的值列表的`Accept`和`Cache-Control`标题。 +该`headers`部分导致在 HTTP 请求中添加带有适当的值列表的`Accept`和`Cache-Control`标题。 -#### [](#required-dependencies)[6.3.6.所需依赖项](#required-dependencies) #### +#### [](#required-dependencies)[6.3.6.所需依赖项](#required-dependencies) 在 YAML 中,所需的依赖项由`required`属性表示。 @@ -534,9 +527,9 @@ headers: 如果你的应用程序无法在引导期间定位所需的依赖项,那么它将抛出一个异常,并且 Spring 上下文将无法设置。换句话说,如果所需的依赖项未在 ZooKeeper 中注册,则应用程序无法启动。 -你可以阅读有关 Spring Cloud ZooKeeper Presence Checker[在本文的后面部分](#spring-cloud-zookeeper-dependency-watcher-presence-checker)的更多信息。 +你可以阅读更多关于 Spring Cloud ZooKeeper Presence Checker[在本文的后面部分](#spring-cloud-zookeeper-dependency-watcher-presence-checker)的信息。 -#### [](#stubs)[6.3.7. Stubs](#stubs) #### +#### [](#stubs)[6.3.7.小作品](#stubs) 可以为 jar 包含依赖项存根的 jar 提供一个以冒号分隔的路径,如以下示例所示: @@ -554,30 +547,29 @@ headers: `stubs: org.springframework:myApp` -### [](#spring-cloud-zookeeper-dependencies-configuring)[6.4. Configuring Spring Cloud Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-configuring) ### +### [](#spring-cloud-zookeeper-dependencies-configuring)[6.4. Configuring Spring Cloud Zookeeper Dependencies](#spring-cloud-zookeeper-dependencies-configuring) 你可以设置以下属性来启用或禁用 ZooKeeper 依赖项功能的部分功能: -* `spring.cloud.zookeeper.dependencies`:如果未设置此属性,则不能使用 ZooKeeper 依赖关系。 +* `spring.cloud.zookeeper.dependencies`:如果未设置此属性,则不能使用 ZooKeeper 依赖项。 * `spring.cloud.zookeeper.dependency.loadbalancer.enabled`(默认启用):开启特定于 ZooKeeper 的定制负载平衡策略,包括`ZookeeperServiceInstanceListSupplier`和基于依赖项的负载平衡`RestTemplate`设置。 -* `spring.cloud.zookeeper.dependency.headers.enabled`(默认情况下启用):此属性注册了一个`FeignBlockingLoadBalancerClient`,该属性会自动将适当的标题和内容类型附加到它们的版本中,如依赖项配置中所示。如果没有这个设置,这两个参数将无法工作。 +* `spring.cloud.zookeeper.dependency.headers.enabled`(默认情况下启用):此属性注册了`FeignBlockingLoadBalancerClient`,该属性会自动将适当的标题和内容类型附加到它们的版本中,如依赖项配置中所示。如果没有这个设置,这两个参数将无法工作。 -* `spring.cloud.zookeeper.dependency.resttemplate.enabled`(默认情况下启用):启用时,此属性修改带有`@LoadBalanced`注释的 `resttemplate’的请求标头,以便将标头和内容类型与依赖项配置中设置的版本一起传递。如果没有此设置,这两个参数将无法工作。 +* `spring.cloud.zookeeper.dependency.resttemplate.enabled`(默认情况下启用):启用时,此属性修改`@LoadBalanced`-带注释的`RestTemplate`的请求标头,使其传递带有依赖项配置中设置的版本的标头和内容类型。如果没有这个设置,这两个参数将无法工作。 -[](#spring-cloud-zookeeper-dependency-watcher)[7. Spring Cloud Zookeeper Dependency Watcher](#spring-cloud-zookeeper-dependency-watcher) ----------- +## [](#spring-cloud-zookeeper-dependency-watcher)[7. Spring Cloud Zookeeper Dependency Watcher](#spring-cloud-zookeeper-dependency-watcher) -依赖项监视器机制允许你将侦听器注册到依赖项。实际上,该功能是`Observator`模式的一种实现。当依赖项改变时,它的状态(向上或向下),可以应用一些自定义逻辑。 +依赖项监视器机制允许你将侦听器注册到依赖项。实际上,该功能是`Observator`模式的一种实现。当依赖项发生变化时,它的状态(向上或向下),可以应用一些自定义逻辑。 -### [](#activating-2)[7.1. Activating](#activating-2) ### +### [](#activating-2)[7.1.激活](#activating-2) -Spring 云 ZooKeeper 依赖项功能需要被启用,以便你使用依赖项观察机制。 +Spring Cloud ZooKeeper 依赖项功能需要被启用,以便你使用依赖项观察机制。 -### [](#registering-a-listener)[7.2.注册侦听器](#registering-a-listener) ### +### [](#registering-a-listener)[7.2.注册侦听器](#registering-a-listener) -要注册一个侦听器,你必须实现一个名为 `org.springframework.cloud.zookeeper.discovery.watcher.dependencywatcherlistener’的接口,并将其注册为 Bean。该接口为你提供了一种方法: +要注册一个侦听器,你必须实现一个名为`org.springframework.cloud.zookeeper.discovery.watcher.DependencyWatcherListener`的接口,并将其注册为 Bean。该接口为你提供了一种方法: ``` void stateChanged(String dependencyName, DependencyState newState); @@ -585,22 +577,21 @@ void stateChanged(String dependencyName, DependencyState newState); 如果你想注册一个特定依赖项的侦听器,那么`dependencyName`将是你的具体实现的鉴别器。`newState`为你提供有关你的依赖关系是否已更改为`CONNECTED`或`DISCONNECTED`的信息。 -### [](#spring-cloud-zookeeper-dependency-watcher-presence-checker)[7.3.使用临场感检查器](#spring-cloud-zookeeper-dependency-watcher-presence-checker) ### +### [](#spring-cloud-zookeeper-dependency-watcher-presence-checker)[7.3.使用临场感检查器](#spring-cloud-zookeeper-dependency-watcher-presence-checker) 与依赖项监视器绑定的是名为存在检查器的功能。它允许你在应用程序启动时提供自定义行为,以便根据依赖关系的状态做出反应。 -抽象的 `org.SpringFramework.Cloud.ZooKeeper.Discovery.Watcher.Presence.DependencyPresenceOnStartupVerifier’类的默认实现是 `org.SpringFramework.Cloud.ZooKeeper.Discovery.Watcher.Presence.DefaultDependencyPresenceOnStartupVerifier’,其工作方式如下。 +抽象`org.springframework.cloud.zookeeper.discovery.watcher.presence.DependencyPresenceOnStartupVerifier`类的默认实现是`org.springframework.cloud.zookeeper.discovery.watcher.presence.DefaultDependencyPresenceOnStartupVerifier`,其工作方式如下。 1. 如果依赖项被标记为 US`required`,并且不在 ZooKeeper 中,那么当应用程序启动时,它将抛出一个异常并关闭。 -2. 如果依赖项不是`required`,则 `org.springframework.cloud.zookeeper.discovery.watcher.presence.logmissingDependencyChecker’记录在`WARN`级别缺少依赖项。 +2. 如果依赖项不是`required`,则`org.springframework.cloud.zookeeper.discovery.watcher.presence.LogMissingDependencyChecker`记录在`WARN`级别缺少依赖项。 因为`DefaultDependencyPresenceOnStartupVerifier`只有在没有`DependencyPresenceOnStartupVerifier`类型的 Bean 时才注册,所以可以重写此功能。 -[](#spring-cloud-zookeeper-config)[8.使用 ZooKeeper 的分布式配置](#spring-cloud-zookeeper-config) ----------- +## [](#spring-cloud-zookeeper-config)[8.使用 ZooKeeper 的分布式配置](#spring-cloud-zookeeper-config) -ZooKeeper 提供了一个[层次命名空间](https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_dataModelNameSpace),它允许客户端存储任意数据,例如配置数据。 Spring Cloud ZooKeeper Config 是[配置服务器和客户端](https://github.com/spring-cloud/spring-cloud-config)的一种替代方案。在特殊的“引导”阶段,将配置加载到 Spring 环境中。默认情况下,配置存储在`/config`名称空间中。根据应用程序的名称和活动配置文件创建了多个“PropertySource”实例,以模拟解析属性的 Spring 云配置顺序。例如,名称为`testApp`且配置文件为`dev`的应用程序具有为其创建的以下属性源: +ZooKeeper 提供了一个[层次命名空间](https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_dataModelNameSpace),它允许客户端存储任意数据,例如配置数据。 Spring Cloud ZooKeeper Config 是[配置服务器和客户端](https://github.com/spring-cloud/spring-cloud-config)的一种替代方案。在特殊的“引导”阶段,将配置加载到 Spring 环境中。默认情况下,配置存储在`/config`名称空间中。基于应用程序的名称和活动配置文件,创建了多个`PropertySource`实例,以模拟解析属性的 Spring Cloud配置顺序。例如,名称为`testApp`且配置文件为`dev`的应用程序具有为其创建的以下属性源: * `config/testApp,dev` @@ -610,18 +601,18 @@ ZooKeeper 提供了一个[层次命名空间](https://zookeeper.apache.org/doc/c * `config/application` -最具体的属性源位于顶部,而最不具体的属性源位于底部。`config/application`命名空间中的属性应用于所有使用 ZooKeeper 进行配置的应用程序。名称空间`config/testApp`中的属性仅对名为`testApp`的服务实例可用。 +最具体的属性源位于顶部,而最不具体的属性源位于底部。`config/application`命名空间中的属性应用于所有使用 ZooKeeper 进行配置的应用程序。`config/testApp`命名空间中的属性仅对名为`testApp`的服务实例可用。 当前在启动应用程序时读取配置。向`/refresh`发送一个 HTTP`POST`请求会导致重新加载配置。监视配置名称空间(ZooKeeper 支持的)当前未实现。 -### [](#activating-3)[8.1. Activating](#activating-3) ### +### [](#activating-3)[8.1.激活](#activating-3) -包括对 `org.springframework.cloud: Spring-cloud-starter-zookeeper-config 的依赖,使自动配置能够设置 Spring cloud zookeeper config。 +包括对`org.springframework.cloud:spring-cloud-starter-zookeeper-config`的依赖可以实现自动配置,从而设置 Spring Cloud ZooKeeper 配置。 | |在使用 ZooKeeper 的 3.4 版本时,你需要更改
包含依赖项的方式,如[here](#spring-cloud-zookeeper-install)所述。| |---|----------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#config-data-import)[8.2. Spring Boot Config Data Import](#config-data-import) ### +### [](#config-data-import)[8.2. Spring Boot Config Data Import](#config-data-import) Spring Boot2.4 引入了一种通过`spring.config.import`属性导入配置数据的新方法。这是现在从 ZooKeeper 获得配置的默认方式。 @@ -635,7 +626,7 @@ spring.config.import=optional:zookeeper: 这将在“localhost:2181”的默认位置连接到 ZooKeeper。如果无法连接到 ZooKeeper,删除`optional:`前缀将导致 ZooKeeper 配置失败。要更改 ZooKeeper Config 的连接属性,可以设置`spring.cloud.zookeeper.connect-string`,也可以将 connect 字符串添加到`spring.config.import`语句中,例如,`spring.config.import=optional:zookeeper:myhost:2818`。导入属性中的位置优先于`connect-string`属性。 -ZooKeeper Config 将尝试根据`spring.cloud.zookeeper.config.name`(默认为`spring.application.name`属性的值)和`spring.cloud.zookeeper.config.default-context`(默认为`application`)从四个自动上下文加载值。如果你希望指定上下文而不是使用计算的上下文,那么可以将该信息添加到`spring.config.import`语句中。 +ZooKeeper Config 将尝试根据`spring.cloud.zookeeper.config.name`(默认为`spring.application.name`属性的值)和`spring.cloud.zookeeper.config.default-context`(默认为`application`)从四个自动上下文加载值。如果你希望指定上下文,而不是使用计算的上下文,那么可以将该信息添加到`spring.config.import`语句中。 application.properties @@ -648,7 +639,7 @@ spring.config.import=optional:zookeeper:myhost:2181/contextone;/context/two | |通过`spring.config.import`导入 Spring 引导配置数据方法所需的`bootstrap`文件(属性或 YAML)是**不是**。| |---|--------------------------------------------------------------------------------------------------------------------------------------| -### [](#customizing)[8.3.定制](#customizing) ### +### [](#customizing)[8.3.定制](#customizing) 可以通过设置以下属性来定制 ZooKeeper 配置: @@ -674,9 +665,9 @@ spring: | |如果你已经设置了`spring.cloud.bootstrap.enabled=true`或`spring.config.use-legacy-processing=true`,或者包含了`spring-cloud-starter-bootstrap`,那么上述值将需要放置在`bootstrap.yml`中,而不是`application.yml`中。| |---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -### [](#access-control-lists-acls)[8.4.访问控制列表(ACLS)](#access-control-lists-acls) ### +### [](#access-control-lists-acls)[8.4.访问控制列表(ACLS)](#access-control-lists-acls) -通过调用`CuratorFramework` Bean 的`addAuthInfo`方法,可以为 ZooKeeper ACLS 添加身份验证信息。实现这一点的一种方法是提供自己的“curatorframework” Bean,如下例所示: +通过调用`CuratorFramework` Bean 的`addAuthInfo`方法,可以为 ZooKeeper ACLS 添加身份验证信息。实现这一点的一种方法是提供你自己的`CuratorFramework` Bean,如下例所示: ``` @BoostrapConfiguration @@ -694,7 +685,7 @@ public class CustomCuratorFrameworkConfig { 请参阅[ZookeeperAutoConfiguration 类](https://github.com/spring-cloud/spring-cloud-zookeeper/blob/master/spring-cloud-zookeeper-core/src/main/java/org/springframework/cloud/zookeeper/ZookeeperAutoConfiguration.java)以查看`CuratorFramework` Bean 的默认配置。 -或者,你可以从依赖于现有的“curatorFramework” Bean 的类中添加你的凭据,如下例所示: +或者,你可以从依赖于现有`CuratorFramework` Bean 的类中添加凭据,如以下示例所示: ``` @BoostrapConfiguration @@ -707,12 +698,13 @@ public class DefaultCuratorFrameworkConfig { } ``` -此 Bean 的创建必须在引导阶段发生。你可以注册要在此阶段运行的配置类,方法是使用“@bootstrapconfiguration”对它们进行注释,并将它们包含在一个逗号分隔的列表中,你将该列表设置为“resources/meta-inf/ Spring.factories”文件中`org.springframework.cloud.bootstrap.BootstrapConfiguration`属性的值,如以下示例所示: +此 Bean 的创建必须在引导阶段发生。你可以注册要在此阶段运行的配置类,方法是用`@BootstrapConfiguration`对它们进行注释,并将它们包括在一个逗号分隔的列表中,你将该列表设置为`Party-INF/ Spring.Factories`文件中`org.springframework.cloud.bootstrap.BootstrapConfiguration`属性的值,如以下示例所示: -Party-INF/ Spring.Factories +resources/META-INF/spring.factories ``` org.springframework.cloud.bootstrap.BootstrapConfiguration=\ my.project.CustomCuratorFrameworkConfig,\ my.project.DefaultCuratorFrameworkConfig -``` \ No newline at end of file +``` + diff --git a/docs/spring-credhub/READEME.md b/docs/spring-credhub/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-flo/READEME.md b/docs/spring-flo/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-for-apache-kafka/READEME.md b/docs/spring-for-apache-kafka/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-for-graphql/READEME.md b/docs/spring-for-graphql/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-hateoas/READEME.md b/docs/spring-hateoas/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-integration/READEME.md b/docs/spring-integration/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-ldap/READEME.md b/docs/spring-ldap/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-rest-docs/READEME.md b/docs/spring-rest-docs/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-security/READEME.md b/docs/spring-security/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-session/READEME.md b/docs/spring-session/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-shell/READEME.md b/docs/spring-shell/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-statemachine/READEME.md b/docs/spring-statemachine/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-vault/READEME.md b/docs/spring-vault/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-web-flow/READEME.md b/docs/spring-web-flow/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/docs/spring-web-services/READEME.md b/docs/spring-web-services/READEME.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000