Spring Cloud Config 客户端
Spring Boot 应用程序可以立即利用 Spring Config Server(或应用程序开发人员提供的其他外部属性源)。
它还选取了一些与 change 事件相关的其他有用功能。Environment
Spring Boot Config 数据导入
Spring Boot 2.4 引入了一种通过属性导入配置数据的新方法。这是绑定到 Config Server 的默认方式。spring.config.import
要选择性地连接到 config server,请在 application.properties 中设置以下内容:
spring.config.import=optional:configserver:
这将连接到默认位置 “http://localhost:8888” 的 Config Server。如果 Config Client 无法连接到 Config Server,则删除前缀将导致 Config Client 失败。要更改 Config Server 的位置,请在语句中设置或添加 url,例如 .import 属性中的位置优先于 uri 属性。optional:
spring.cloud.config.uri
spring.config.import
spring.config.import=optional:configserver:http://myhost:8888
通过 .bootstrap spring.config.import |
Config First 引导
要使用传统的 bootstrap 方式连接到 Config Server,必须通过属性或 starter 启用 bootstrap。属性为 。它必须设置为 System Property 或 environment variable。
启用 bootstrap 后,在 Classpath 上具有 Spring Cloud Config Client 的任何应用程序都将连接到 Config Server,如下所示:
当 config client 启动时,它会绑定到 Config Server(通过 bootstrap 配置属性)并使用远程属性源初始化 Spring。spring-cloud-starter-bootstrap
spring.cloud.bootstrap.enabled=true
spring.cloud.config.uri
Environment
这种行为的最终结果是,所有想要使用 Config Server 的客户端应用程序都需要一个(或一个环境变量),其中设置了服务器地址(默认为“http://localhost:8888”)。bootstrap.yml
spring.cloud.config.uri
Discovery 首次查找
除非您使用 config first 引导,否则您需要在配置属性中有一个带前缀的属性。
例如。spring.config.import optional: spring.config.import=optional:configserver: |
如果使用 Spring Cloud Netflix 和 Eureka Service Discovery 或 Spring Cloud Consul 等实现,则可以让 Config Server 向 Discovery Service 注册。DiscoveryClient
如果您更喜欢使用来查找 Config Server,可以通过设置(默认为 )来实现。
例如,对于 Spring Cloud Netflix,您需要定义 Eureka 服务器地址(例如,in )。
使用此选项的价格是启动时的额外网络往返,以查找服务注册。
好处是,只要 Discovery Service 是一个固定点,Config Server 就可以更改其坐标。
默认服务 ID 为 ,但您可以通过设置在客户端上更改它(在服务器上,以服务的通常方式,例如 通过设置 )来更改它。DiscoveryClient
spring.cloud.config.discovery.enabled=true
false
eureka.client.serviceUrl.defaultZone
configserver
spring.cloud.config.discovery.serviceId
spring.application.name
发现客户端实现都支持某种元数据 Map(例如,我们为 Eureka 提供)。
可能需要在其服务注册元数据中配置 Config Server 的一些其他属性,以便 Client 端可以正确连接。
如果 Config Server 使用 HTTP Basic 进行保护,则可以将凭据配置为 和 。
此外,如果 Config Server 具有上下文路径,则可以设置 .
例如,以下 YAML 文件适用于作为 Eureka 客户端的 Config Server:eureka.instance.metadataMap
user
password
configPath
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
使用 Eureka 和 WebClient 的 Discovery First Bootstrap
如果您使用 Spring Cloud Netflix 中的 Eureka,并且还想使用 Jersey 或 ,
您需要包含在 Classpath 中,并设置 SET 。DiscoveryClient
WebClient
RestTemplate
WebClient
eureka.client.webclient.enabled=true
Config 客户端快速失败
在某些情况下,如果服务无法连接到 Config Server,您可能希望服务启动失败。
如果这是所需的行为,请设置 bootstrap 配置属性以使客户端停止并显示 Exception。spring.cloud.config.fail-fast=true
要使用 获得类似的功能,只需省略前缀即可。spring.config.import optional: |
Config 客户端重试
如果您预计 config server 在应用程序启动时可能偶尔不可用,则可以使其在失败后继续尝试。
首先,您需要设置 .
然后你需要将 and 添加到你的 classpath 中。
默认行为是重试六次,初始回退间隔为 1000 毫秒,后续回退的指数乘数为 1.1。
您可以通过设置配置属性来配置这些属性(和其他属性)。spring.cloud.config.fail-fast=true
spring-retry
spring-boot-starter-aop
spring.cloud.config.retry.*
要完全控制重试行为并使用旧版引导程序,请添加 ID 为 的 type 。
Spring Retry 有一个支持创建一个。@Bean RetryOperationsInterceptor configServerRetryInterceptor RetryInterceptorBuilder |
使用 spring.config.import 配置客户端重试
Retry 适用于 Spring Boot 语句,普通属性有效。但是,如果 import 语句位于配置文件中,例如 ,则需要另一种方式来配置重试。配置需要作为 url 参数放在 import 语句上。spring.config.import
application-prod.properties
spring.config.import=configserver:http://configserver.example.com?fail-fast=true&max-attempts=10&max-interval=1500&multiplier=1.2&initial-interval=1100"
这将设置 (注意上面缺少的前缀) 和所有可用的配置属性。spring.cloud.config.fail-fast=true
spring.cloud.config.retry.*
查找远程配置资源
Config Service 提供来自 的属性源,其中客户端应用程序中的默认绑定如下:/{application}/{profile}/{label}
-
“应用程序” =
${spring.application.name}
-
“profile” = (实际上
${spring.profiles.active}
Environment.getActiveProfiles()
) -
“标签” = “主”
设置属性时,请勿在应用程序名称前加上保留字,以防止在解析正确的属性源时出现问题。${spring.application.name} application- |
您可以通过设置 (where is , or ) 来覆盖所有这些
这对于回滚到以前版本的配置很有用。
使用默认的 Config Server 实现,它可以是 git 标签、分支名称或提交 ID。
Label 也可以作为逗号分隔的列表提供。
在这种情况下,将逐个尝试列表中的项目,直到一个项目成功。
在功能分支上工作时,此行为可能很有用。
例如,您可能希望将 config 标签与分支对齐,但将其设置为可选(在这种情况下,请使用 )。spring.cloud.config.*
*
name
profile
label
label
spring.cloud.config.label=myfeature,develop
为 Config Server 指定多个 URL
为了确保在部署了多个 Config Server 实例并预计一个或多个实例不时不可用时具有高可用性,您可以指定多个 URL(作为属性下的逗号分隔列表)或让所有实例在服务注册表中注册,如 Eureka (如果使用 Discovery-First Bootstrap 模式)。请注意,这样做仅在 Config Server 未运行时(即应用程序已退出)或发生连接超时时确保高可用性。例如,如果 Config Server 返回 500(内部服务器错误)响应或 Config Client 从 Config Server 收到 401(由于凭据错误或其他原因),则 Config Client 不会尝试从其他 URL 获取属性。此类错误表示用户问题,而不是可用性问题。spring.cloud.config.uri
如果您在 Config Server 上使用 HTTP 基本安全性,则当前只有在将凭据嵌入到您在属性下指定的每个 URL 中时,才能支持每个 Config Server 身份验证凭据。如果您使用任何其他类型的安全机制,则(当前)无法支持每个 Config Server 的身份验证和授权。spring.cloud.config.uri
配置超时
如果要配置超时阈值:
-
可以使用属性 来配置读取超时 。
spring.cloud.config.request-read-timeout
-
可以使用属性 配置连接超时 。
spring.cloud.config.request-connect-timeout
安全
如果您在服务器上使用 HTTP Basic 安全性,则 Client 端需要知道密码(如果不是默认密码,则需要知道用户名)。 您可以通过配置服务器 URI 或通过单独的用户名和密码属性指定用户名和密码,如以下示例所示:
spring:
cloud:
config:
uri: https://user:[email protected]
以下示例显示了传递相同信息的另一种方法:
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
和 值将覆盖 URI 中提供的任何内容。spring.cloud.config.password
spring.cloud.config.username
如果您在 Cloud Foundry 上部署应用程序,则提供密码的最佳方式是通过服务凭证(例如在 URI 中,因为它不需要位于配置文件中)。
以下示例在本地工作,并适用于名为 :configserver
spring:
cloud:
config:
uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
如果配置服务器需要客户端 TLS 证书,则可以通过属性配置客户端 TLS 证书和信任存储,如以下示例所示:
spring:
cloud:
config:
uri: https://myconfig.myconfig.com
tls:
enabled: true
key-store: <path-of-key-store>
key-store-type: PKCS12
key-store-password: <key-store-password>
key-password: <key-password>
trust-store: <path-of-trust-store>
trust-store-type: PKCS12
trust-store-password: <trust-store-password>
要启用 config 客户端 TLS,需要为 true。如果省略,则使用 JVM 默认信任存储。和 的默认值为 PKCS12。如果省略 password 属性,则假定 password 为空。spring.cloud.config.tls.enabled
spring.cloud.config.tls.trust-store
spring.cloud.config.tls.key-store-type
spring.cloud.config.tls.trust-store-type
如果你使用其他形式的安全性,你可能需要向 提供 RestTemplate
(例如,通过在引导上下文中获取它并注入它)。ConfigServicePropertySourceLocator
运行状况指示器
Config Client 提供了一个 Spring Boot Health Indicator,该指示器尝试从 Config Server 加载配置。
可以通过设置 来禁用运行状况指示器。
出于性能原因,也会缓存响应。
默认缓存生存时间为 5 分钟。
要更改该值,请设置属性(以毫秒为单位)。health.config.enabled=false
health.config.time-to-live
提供自定义 RestTemplate
在某些情况下,您可能需要自定义从 Client 端向 config server 发出的请求。
通常,这样做涉及传递特殊标头以对服务器请求进行身份验证。
要提供自定义 :Authorization
RestTemplate
-
使用 的实现创建一个新的配置 Bean,如以下示例所示:
PropertySourceLocator
@Configuration
public class CustomConfigServiceBootstrapConfiguration {
@Bean
public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
ConfigClientProperties clientProperties = configClientProperties();
ConfigServicePropertySourceLocator configServicePropertySourceLocator = new ConfigServicePropertySourceLocator(clientProperties);
configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
return configServicePropertySourceLocator;
}
}
对于添加标头的简化方法,可以改用该属性。Authorization spring.cloud.config.headers.* |
-
在 中,创建一个名为 并指定自定义配置的文件,如以下示例所示:
resources/META-INF
spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
库
当使用 Vault 作为配置服务器的后端时,客户端需要为服务器提供一个令牌以从 Vault 中检索值。
可以通过在 中设置 在客户端中提供此令牌,如以下示例所示:spring.cloud.config.token
bootstrap.yml
spring:
cloud:
config:
token: YourVaultToken
Vault 中的嵌套密钥
Vault 支持将键嵌套在 Vault 中存储的值中,如以下示例所示:
echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -
此命令将 JSON 对象写入您的 Vault。
要在 Spring 中访问这些值,您可以使用传统的 dot() 注释,如以下示例所示.
@Value("${appA.secret}")
String name = "World";
前面的代码会将变量的值设置为 .name
appAsecret