Spring Cloud Config 配置中心使用说明(4) -- 服务器+数据库存储

本文详细介绍配置中心的多种后端存储方案,包括JDBC、Redis、CredHub等,以及如何在复合环境中使用多个仓库,实现配置的灵活管理和共享。

1. JDBC后端

配置服务器支持使用JDBC(关系数据库)后端来存储属性配置。要启用这个特性,添加spring-jdbc依赖,然后使用jdbc profile或添加JdbcEnvironmentRepository实例bean。如果你添加了正确的依赖,Spring Boot会配置一个数据源。

你可以通过设置pring.cloud.config.server.jdbc.enabled为false 来 禁止JdbcEnvironmentRepository的自动配置。

数据数据库需要创建一个表PROPERTIES, 表里的列有APPLICATION, PROFILE,和 LABEL(与通常的Environment属性一致),加上KEY和VALUE 列来保存 Properties样式的键值对。数据类型都是java里的String类型,所以数据库中对应的类型是varchar,长度根据需要设置。效果与在{application}-{profile}.properties文件中配置属性是一样的,包括获取后的加密和解密步骤(那些步骤不是在仓库中实现)。

2. Redis后端

配置服务器支持使用Redis保存属性。需要添加redis依赖:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
</dependencies>

下面的配置使用Spring Data的RedisTemplate去访问Redis数据库。我们可以使用spring.redis.*属性去配置连接属性。

spring:
  profiles:
    active: redis
  redis:
    host: redis
    port: 16379

那些属性会保存在hash里的字段中。该hash的名字应该和spring.application.name属性值一致,或是spring.application.namespring.profiles.active[n]的结合。

HMSET sample-app server.port “8100” sample.topic.name “test” test.property1 “property1”

运行上面的命令后,对应的hash应该包含以下数据:

HGETALL sample-app
{
  "server.port": "8100",
  "sample.topic.name": "test",
  "test.property1": "property1"
}

信息:
如果不指定profile,会使用default

3. CredHub后端

配置服务器支持使用CredHub后端库来保存属性配置。
需要添加依赖:

<dependencies>
	<dependency>
		<groupId>org.springframework.credhub</groupId>
		<artifactId>spring-credhub-starter</artifactId>
	</dependency>
</dependencies>

下面配置通过双向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
}

信息:
如果不指定profile, 则使用默认值default;如果不指定label,则使用默认值master。注意:application中的值会被所有应用共享。

3.1 OAuth 2.0

你可以使用由UAA提供的OAuth 2.0 进行认证。
pom.xml

<dependencies>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-oauth2-client</artifactId>
	</dependency>
</dependencies>

下面是通过OAuth 2.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的client-id应该有credhub.read权限

4. 与所有应用共享配置

不同的后端仓库,配置的方式不一样。

4.1 基于文件的存储库

使用基于文件(即git,svn和native)的存储库,所有客户端应用程序共享文件名为application*(application.properties,application.yml,application-*.properties等)的资源。您可以使用这些文件来配置全局默认值,并根据需要通过application-specific文件覆盖某些值。

property_overrides [属性覆盖]功能也可用于设置全局默认值,并且允许占位符应用程序在本地覆盖它们。

提示:
使用“native”配置文件(本地文件系统后端),配置服务器本身的配置文件要和搜索位置分开。否则,本身的配置文件有可能会被删除,因为他是仓库的一部分。

4.2 Vault服务器

使用Vault作为后端的时候,你可以把要在全部应用中分享的配置放在secret/application位置中。例如,运行以下命令后,配置服务器的所有客户端都会有foobaz两个属性:

$ vault write secret/application foo=bar baz=bam

4.3 CredHub服务器

使用CredHub作为后端的时候,你可以把要在全部应用中分享的配置放在/application/位置或应用的default profile中。比如,如果你运行以下命令,配置服务器的所有客户端都会有shared.color1shared.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"}

5 复合环境库

在某些情况下,您可能希望从多个环境存储库中提取配置数据。为此,只需在配置服务器的应用程序属性或YAML文件中启用多个配置文件即可。例如,如果您要从Git存储库以及SVN存储库中提取配置数据,那么您将为配置服务器设置以下属性。

spring:
  profiles:
    active: git, svn
  cloud:
    config:
      server:
        svn:
          uri: file:///path/to/svn/repo
          order: 2
        git:
          uri: file:///path/to/git/repo
          order: 1

除了指定URI的每个repo之外,还可以指定order属性。order属性允许您指定所有存储库的优先级顺序。order属性的数值越低,优先级越高。存储库的优先顺序将有助于解决包含相同属性的值的存储库之间的任何潜在冲突。

提示:
如果你的复合环境库中包含了Vault服务器,那么你的每一个配置服务器的请求都要带上Vault 的token

提示:
从环境仓库检索值时的任何类型的故障将导致整个复合环境的故障。

提示:
当使用复合环境时,重要的是所有repos都包含相同的标签。如果您有类似于上述的环境,并且使用标签master请求配置数据,但是SVN repo不包含称为master的分支,则整个请求将失败。

5.1 自定义复合环境库

除了使用Spring Cloud中定义好的环境存储库之外,还可以提供自己的EnvironmentRepository bean作为复合环境的一部分。要做到这一点,你的bean必须实现EnvironmentRepository接口。如果您想在复合环境中控制自定义EnvironmentRepository的优先级,您还应该实现Ordered接口并覆盖getOrdered方法。如果您不实现Ordered接口,则您的EnvironmentRepository将被赋予最低优先级。

6. 属性覆盖

Config Server具有“覆盖”功能,允许操作员为所有应用程序提供配置属性。这些覆盖的属性不会被应用程序使用正常的Spring Boot钩子意外更改。要声明覆盖,只需将键值对的map添加到spring.cloud.config.server.overrides。例如

spring:
  cloud:
    config:
      server:
        overrides:
          foo: bar

将导致配置客户端的所有应用程序拥有额外的属性foo=bar。

信息:
配置服务器无法强制应用程序使用特定的配置数据,但可以为所有客户端提供一个有用的默认行为。

提示:
通常使用“$ {}”的Spring环境占位符可以使用反斜杠(“\”)来转义(并在客户端上解析)。例如${app.foo:bar}解析为“bar “,除非该应用程序提供自己的”app.foo“。

注意
在YAML中,您不需要转义反斜杠本身。而在properties文件中,你配置的覆盖属性需要转义反斜杠。

您可以更改overrides 在客户端中的优先级,使之看起来更像默认值,从而允许应用程序在环境变量或系统属性中提供自己的值。只需在远程存储库中设置属性spring.cloud.config.overrideNone=true(默认值为false)。

Spring Cloud Config 使用说明(1) – 快速开始
Spring Cloud Config 配置中心使用说明(2) – 服务器+git库
Spring Cloud Config 配置中心使用说明(3) – 服务器+文件存储
Spring Cloud Config 配置中心使用说明(4) – 服务器+数据库存储
Spring Cloud Config 配置中心使用说明(5) – 服务器健康与安全配置
Spring Cloud Config 配置中心使用说明(6) – 服务器 配置文件格式
Spring Cloud Config 配置中心使用说明(7) – 服务器 配置变更通知
Spring Cloud Config 配置中心使用说明(8) – 客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值