spring boot版本为:2.5.6
spring cloud版本为:2020.0.4
spring cloud config版本为:3.0.5
Spring Cloud Config Client
Spring Boot应用程序可以立即利用Spring Config Server(或应用程序开发人员提供的其他外部属性源)。它还获得了一些与Environment更改事件相关的其他有用特性。
Spring Boot配置数据导入
Spring Boot 2.4引入了一种通过spring .config.import
属性导入配置数据的新方法。这是现在绑定到Config Server的默认方法。
要选择连接到配置服务器,请在application.properties中设置以下内容:
application.properties
spring.config.import=optional:configserver:
这将连接到配置服务器的默认位置“http://localhost:8888”。如果不能连接到配置服务器,删除optional:
前缀将导致配置客户端失败。要更改配置服务器的位置,可以设置spring.cloud.config.uri
或将url添加到spring.config.import
语句中,例如,spring.config.import=optional:configserver:http://myhost:8888
。import
属性中的位置优先于uri
属性。
通过
spring.config .import
导入的Spring Boot配置数据方法不需要一个bootstrap
文件(properties或yaml)。
Config First Bootstrap
要使用传统的bootstrap方式连接到Config Server,必须通过一个属性或spring-cloud-starter-bootstrap
starter。这个属性是spring.cloud.bootstrap.enabled=true
。它必须设置为系统属性或环境变量。一旦启动了bootstrap,类路径上的任何带有Spring Cloud Config Client的应用程序都将连接到Config Server,如下所示:当一个配置客户端启动时,它绑定到Config Server(通过spring.cloud.config.uri
引导配置属性),并使用远程属性源初始化Spring Environment。
这种行为的最终结果是,所有想要使用Config Server的客户端应用程序都需要一个bootstrap.yml(
或一个环境变量)。在spring.cloud.config.uri
中设置服务器地址(默认为“http://localhost:8888”)。
Discovery First Lookup
除非你使用Config First Bootstrap,否则你需要在你的配置属性中有一个带有
optional:
前缀的spring.config.import
属性。例如,spring.config.import =optional:configserver:
。
如果您使用DiscoveryClient实现,例如Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul,您可以让配置服务器向Discovery Service注册。
如果您喜欢使用DiscoveryClient来定位配置服务器,可以通过设置spring.cloud.config.discovery.enabled=true
(默认为false)来实现。例如,在Spring Cloud Netflix中,您需要定义Eureka服务器地址(例如,在eureka.client.serviceurl.defaultzone
中)。使用此选项的代价是启动时额外的网络往返,以定位服务注册。这样做的好处是,只要Discovery Service是一个固定点,Config Server就可以更改它的坐标。默认的服务ID是configserver
,但是你可以在客户端通过设置spring.cloud.config.discovery.serviceId
来更改它(在服务器端,按照服务的通常方式,比如设置spring.application.name
)。
发现客户端实现都支持某种类型的元数据映射(例如,Eureka有eureka.instance.metadataMap
)。可能需要在其服务注册元数据中配置Config Server的一些附加属性,以便客户机能够正确连接。如果使用HTTP Basic保护配置服务器,则可以将凭据配置为user
和password
。另外,如果配置服务器有上下文路径,您可以设置configPath
。例如,下面的YAML文件是针对Eureka客户端的配置服务器:
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
Discovery First Bootstrap Using Eureka And WebClient
如果你使用Spring Cloud Netflix的Eureka DiscoveryClient,并且想要使用WebClient而不是Jersey或RestTemplate,你需要在类路径中包含WebClient,并设置eureka.client.Webclient .enabled=true
。
Config Client Fail Fast
在某些情况下,如果服务无法连接到配置服务器,您可能希望服务启动失败。如果这是想要的行为,设置bootstrap配置属性spring.cloud.config.fail-fast=true
使客户端通过异常停止。
使用
spring.config.import
获得类似的功能。只需省略optional:
前缀。
Config Client 重试
如果您预期在应用程序启动时配置服务器可能偶尔不可用,那么您可以在出现故障后让它继续尝试。首先,您需要设置spring.cloud.config.fail-fast=true
。然后需要在类路径中添加spring-retry
和spring-boot-starter-aop
。默认行为是重试6次,初始重试间隔为1000ms
,后续重试间隔为指数乘以1.1。您可以通过设置spring.cloud.config.retry.*
来配置这些属性(以及其他属性)
为了完全控制重试行为并使用遗留bootstrap,添加一个类型为
RetryOperationsInterceptor
的@Bean
,其ID为configServerRetryInterceptor
。Spring Retry有一个RetryInterceptorBuilder
,它支持创建一个。
使用spring.config.import配置客户端重试
Retry
使用Spring Boot spring.config.import
语句工作。但是,如果import
语句在profile
文件中,比如application-prod.properties
,则需要使用不同的方法来配置重试。配置需要作为url参数放置在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.*
配置属性。
定位远程配置资源
配置服务提供的属性源来自/{application}/{profile}/{label},其中客户端应用程序中的默认绑定如下:
"application" = ${spring.application.name}
"profile" = ${spring.profiles.active} (实际上 Environment.getActiveProfiles())
"label" = "master"
当设置属性
${spring.application.name}
时,不要用保留字application-
作为应用名称的前缀。以防止解决正确的属性源问题。
你可以通过设置spring.cloud.config.*
来覆盖它们(其中*
是name、profile或label)。label对于回滚到以前版本的配置很有用。对于默认的Config Server实现,它可以是一个git标签、分支名称或提交ID。标签也可以作为逗号分隔的列表提供。在这种情况下,将逐个尝试列表中的项目,直到其中一个成功。当处理一个特性分支时,这种行为很有用。例如,你可能想让配置标签与你的分支对齐,但让它是可选的(在这种情况下,使用spring.cloud.config.label=myfeature,develop
)
为配置服务器指定多个url
当您部署了多个Config Server实例并偶尔有一个或多个实例不可用时,为了确保高可用性,你可以指定多个url(在spring.cloud.config.uri
属性下以逗号分隔的列表),或者让你的所有实例在像Eureka这样的Service Registry中注册(如果使用Discovery-First Bootstrap模式)。注意,只有在Config Server未运行时(即应用程序退出时)或发生连接超时时,这样做才能确保高可用性。例如,如果配置服务器返回一个500(内部服务器错误)响应,或者配置客户端从配置服务器收到一个401(由于错误凭证或其他原因),配置客户端不会尝试从其他url获取属性。这类错误表明是用户问题,而不是可用性问题。
如果您在配置服务器上使用HTTP基本安全,那么目前只有在您在spring.cloud.config.uri
属性下指定的每个URL中嵌入凭证时,才有可能支持每个配置服务器的身份验证凭证。如果使用任何其他类型的安全机制,则不能(目前)支持每个配置服务器的身份验证和授权。
配置超时
如果需要配置超时阈值:
- 读取超时可以通过使用属性
spring.cloud.config.request-read-timeout
来配置。 - 可以使用
spring.cloud.config.request-connect-timeout
属性配置连接超时。
安全
如果在服务器上使用HTTP基本安全性,客户端需要知道密码(如果不是默认值,则需要知道用户名)。您可以通过配置服务器URI或通过单独的用户名和密码属性指定用户名和密码,如下面的示例所示:
spring:
cloud:
config:
uri: https://user:[email protected]
下面的示例显示了传递相同信息的另一种方法:
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
spring.cloud.config.password
和spring.cloud.config.username
值覆盖URI中提供的任何内容。
如果你把你的应用部署在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:
key-store-type: PKCS12
key-store-password:
key-password:
trust-store:
trust-store-type: PKCS12
trust-store-password:
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
。当省略密码属性时,假设密码为空。
如果您使用另一种形式的安全性,您可能需要向ConfigServicePropertySourceLocator提供一个RestTemplate(例如,通过在引导上下文中获取它并注入它)。
健康指标
配置客户端提供一个Spring Boot运行状况指示器,该指示器试图从配置服务器加载配置。可以通过设置health.config.enabled=false
禁用运行状况指标。由于性能原因,响应也被缓存。默认缓存存活时间为5分钟。要更改该值,请设置health.config.time-to-live
属性(毫秒)。
提供自定义RestTemplate
在某些情况下,您可能需要自定义从客户端向配置服务器发出的请求。通常,这样做需要向服务器传递特殊的Authorization头来对请求进行身份验证。 提供一个自定义的RestTemplate:
- 创建一个带有PropertySourceLocator实现的新配置bean,如下面的示例所示:
CustomConfigServiceBootstrapConfiguration.java
@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作为配置服务器的后端时,客户机需要为服务器提供一个令牌,以便从Vault检索值。这个令牌可以在客户端中通过在bootstrap.yml
中设置spring.cloud.config.token
来提供,如下例所示:
spring:
cloud:
config:
token: YourVaultToken
Vault中的嵌套键
Vault支持在Vault中存储的值中嵌套键的能力,如下例所示:
echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -
这个命令将一个JSON对象写入到您的Vault。要在Spring中访问这些值,您可以使用传统的点(.)注释,如下面的示例所示
@Value("${appA.secret}")
String name = "World";
前面的代码将name
变量的值设置为appAsecret
。
欢迎关注我的公众号:程序员L札记