springcloud系列24——SpringCloud配置管理
为什么要统一管理配置?
1、集中管理
2、不同环境不同配置
3、运行期间动态调整配置
4、自动刷新
Spring Cloud简介
为了解决上面的4个问题,spring cloud提供了spring cloud config组件。
Spring Cloud Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括Config Server和Config Client两部分。由于Config Server和Config Cleint都实现了对Spring Environment和PropertySource抽象的映射,因此,Spring Cloud非常适合Spring应用程序,当然也可与任何其他语言编写的应用程序配合使用。
Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置内容(也可使用Subversion、本地文件系统或Vault存储配置),因此可以方便的实现对配置的版本控制与内容审计。
Config Client 是Config Server的客户端,用于操作存储在Config Server中的配置属性。
springcloud架构图
下面是从网上弄的一张架构图
.
每个微服务有一个Spring Cloud Client,从Spring Cloud Config Server获取配置信息,Spring Cloud Config Server从Git仓库拉取配置。
Spring Cloud Config Server基础使用
1.maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.Spring Boot主类增加@EnableConfigServer注解
@SpringBootApplication
@EnableConfigServer
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
3.application.yml配置
server.port=8888
spring.cloud.config.server.git.uri=https://gitee.com/tommy88/springcloud-demos.git
spring.cloud.config.server.git.uri配置Git仓库地址。
spring cloud config server提供了下面的映射规则:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
{application}会被spring.config.name
注入,{profile}是环境信息,比如dev/test/product。{label}是一个可选的git标签,默认是master。
如果查找aaa项目的application-dev.yml,输入匹配路径/aaa/dev。如果application-dev.yml存在,则返回;如果不存在,则会返回application.yml的内容。
Git仓库配置详解
Spring Cloud Config支持Git/SVN/文件系统等,默认使用的是Git。这里介绍Git在Spring Cloud Config Server中的一些配置。
1.Git uri中的通配符
Spring Cloud Config Server支持带有{application}和{profile}(和{label}的占位符的git存储库URL(如果需要),但请记住,无论如何都要将标签应用为git标签)。
所以,你可以一个应用一个仓库,比如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
比如有2个Git Repo,分别为aaa和bbb。比如获取aaa的dev环境的配置,通过上面的配置可以通过/aaa/dev,同理bbb的dev环境的配置则为/bbb/dev。
你也可以配置{profile}通配符,比如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}-{profile}
2.模式匹配
通过{application}和{profile}的模式匹配,可以支持更复杂的需求。模式格式是带有{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*/test*
uri: https://github.com/special/config-repo
local:
pattern: local*
uri: file:/home/configsvc/config-repo
如果没有指定模式,则会使用/*,即匹配所有模式。
spring.cloud.config.server.git.uri
是默认的git uri,如果{application}/{profile}
没有匹配到任何模式,则会使用默认的git uri。
在上面的例子中,simple/*模式只匹配simple应用的所有环境。special则匹配special开头的dev和test环境的配置。local/*
匹配任何以local开头任意profile的配置。
在上面的例子中,/special/dev会匹配到special-dev.yml,/special/default则会匹配到默认的application.yml。即上面说的,如果没有匹配到,会使用默认的git uri。
上面的配置中,repos其实是一个数组。所以如果使用yml也可以下面这样配置:
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
3.搜索路径
每个Git repo还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以指定为searchPaths。
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: foo,bar*
在这个例子中,Spring Cloud Config Server将会在/config-repo,/config-repo/foo和/config-repo/bar*开头的位置查找。
4.clondOnStart
默认情况下,Spring Cloud Config Server会在第一次请求配置时克隆远程仓库。可以配置在应用启动时就克隆远程仓库,这样首次请求配置就会快一些响应。
比如:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
repos:
team-a:
pattern: team-a-*
cloneOnStart: true
uri: http://git/team-a/config-repo.git
team-b:
pattern: team-b-*
cloneOnStart: false
uri: http://git/team-b/config-repo.git
team-c:
pattern: team-c-*
uri: http://git/team-a/config-repo.git
在上面的配置中,team-a的配置在应用启动时就会从远程仓库克隆。其他的仓库在首次请求配置时从远程仓库克隆。
上面的cloneOnStart也可以配置为全局,即在spring.cloud.config.server.git.cloneOnStart=true。配置了全局的cloneOnStart,则子repo没有配置时使用全局配置,如果子repo配置了,则使用子repo的配置。
设置cloneOnStart为true有助于在Spring Cloud Config Server启动时快速识别配资源的错误,比如仓库URI错误。这样就不至于在首次请求配置时才去检查到配置错误。
5.配置Git仓库的用户名和密码
如果git仓库时私有的,那么就需要用户名和密码才能访问。在配置git仓库URI时指定username和password即可。
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
6.搜索路径中的通配符
Spring Cloud Config Server还支持带有{application}和{profile}(以及{label}的占位符的搜索路径。
例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}'
在仓库中搜索与目录同名的文件(包括*目录/)。通配符在带占位符的搜索路径中也有效(搜索中包含任何匹配的目录)。
7.强制从Git仓库拉取更新
如前所述,Spring Cloud Config Server会克隆远程git存储库,并且如果本地副本变得脏了(例如,OS进程更改了文件夹内容),那么Spring Cloud Config Server无法从远程存储库更新本地副本。
为了解决这个问题,有一个强制拉动属性,如果本地副本很脏,它将使Spring Cloud Config Server从远程存储库强行拉取。 例:
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: http://git/team-a/config-repo.git
force-pull: true
team-b:
pattern: team-b-*
uri: http://git/team-b/config-repo.git
force-pull: true
team-c:
pattern: team-c-*
uri: http://git/team-a/config-repo.git
force-pull
默认值是false。
8.删除Git存储库中未跟踪的分支
由于Spring Cloud Config Server在签出分支到本地存储库后具有远程git存储库的克隆(例如,通过标签获取属性),它将永久保留此分支或直到下一个服务器重新启动(这将创建新的本地存储库)。 因此可能存在删除远程分支但仍然可以获取其本地副本的情况。 如果Spring Cloud Config Server客户端服务以–spring.cloud.config.label = deletedRemoteBranch启动,那么它将从deletedRemoteBranch本地分支获取属性,但不从master获取属性。
为了保持本地存储库分支的清洁和远程 - 可以设置deleteUntrackedBranches属性。 它将使Spring Cloud Config Server强制从本地存储库中删除未跟踪的分支。 例:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
deleteUntrackedBranches: true
``deleteUntrackedBranches
默认值为false。
Spring Cloud Config Client基础使用
可以参考springcloud系列13——实现分布式配置管理
一节有使用的demo。
1.maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.bootstrap.properties
spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}
spring.cloud.config.name=cloud-config
spring.cloud.config.profile=${config.profile:dev}
指定spring cloud config server的地址,应用名称和环境。
然后就可以使用配置属性了。如果是配置文件中使用,使用${配置项name}即可,比如:
#DB Configuration:
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = ${mysqldb.datasource.url}
spring.datasource.username = ${mysqldb.datasource.username}
spring.datasource.password = ${mysqldb.datasource.password}
如果是在java属性中,使用@Value("${配置项那么}")即可。
注意:config server的uri的配置必须配置在bootstrap文件中,否则会出错。比如你config server应用端口为8080,你config server的uri配置为http://localhsot:8080,实际启动时会发现是8888端口。
这是因为bootstrap文件也有一个端口,默认为8888,在应用启动时会先读取bootstrap的配置。
上一篇: 设计模式1——策略模式
推荐阅读
-
SpringCloud系列-整合Hystrix的两种方式
-
实战SpringCloud响应式微服务系列教程(第六章)
-
实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
-
实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例
-
实战SpringCloud响应式微服务系列教程(第一章)
-
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现
-
SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版
-
实战SpringCloud响应式微服务系列教程(第四章)
-
SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)
-
新手必备系列之从零开始搭建springcloud脚手架