一、什么是配置中心?
当微服务过多的时候,每个微服务的配置很难集中管理。SpringCloud Config通过git代码托管来实现配置的集中管理。实现配置中心客户端获取远程的配置文件,并可以动态刷新,即时生效。
二、分布式配置中心应用场景
单体应用架构,配置信息的管理、维护并不会显得特别麻烦,手动操作就可以,因为就一个工程;
微服务架构,因为我们的分布式集群环境中可能有很多个微服务,我们不可能一个 一个去修改配置然后重启生效,在一定场景下我们还需要在运行期间动态调整配置 信息,比如:根据各个微服务的负载情况,动态调整数据源连接池大小,我们希望 配置内容发生变化的时候,微服务可以自动更新。
场景总结如下:
1)集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理 是很重要的(一次修改、到处生效)
2)不同环境不同配置,比如数据源配置在不同环境(开发dev,测试test,生产prod) 中是不同的
3)运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连 接池大小等配置修改后可自动更新
4)如配置内容发生变化,微服务可以自动更新配置
那么,我们就需要对配置文件进行集中式管理,这也是分布式配置中心的作用。
三、配置中心存在的意义
一个应用中不只是代码,还需要连接资源和其它应用,经常有很多需要外部设置的项去调整应用行为,如切换不同的数据库,设置功能开关等。
随着系统微服务的不断增加,首要考虑的是系统的可伸缩、可扩展性好,随之就是一个配置管理的问题。各自管各自的开发时没什么问题,到了线上之后管理就会很头疼,到了要大规模更新就更烦了。
而且你不可能停止你的服务集群去更新的你配置,这是不现实的做法,因此Spring Cloud配置中心就是一个比较好的解决方案
常见的配置中心的实现方法有:
硬编码(缺点:需要修改代码,风险大)
放在xml等配置文件中,和应用一起打包(缺点:需要重新打包和重启)
文件系统中(缺点:依赖操作系统等)
环境变量(缺点:有大量的配置需要人工设置到环境变量中,不便于管理且依赖平台)
云端存储(缺点:与其他应用耦合)
Spring Cloud Config就是云端存储配置信息的,它具有中心化、版本控制、支持动态更新、平台独立、语言独立等特性。其特点是:
提供服务端和客户端支持(spring cloud config server和spring cloud config client)
集中式管理分布式环境下的应用配置
基于Spring环境,无缝与Spring应用集成
可用于任何语言开发的程序
默认实现基于git仓库,可以进行版本管理
可替换自定义实现
四、如何使用
目前SpringCloud Config的使用主要是通过Git/SVN方式做一个配置中心,然后每个服务从其中获取自身配置所需的参数。SpringCloud Config也支持本地参数配置的获取。
如果使用本地存储的方式,在application.properties 或application.yml 文件添加 spring.profiles.active=native 配置即可,它会从项目的 resources路径下读取配置文件。如果是读取指定的配置文件,那么可以使用 spring.cloud.config.server.native.searchLocations = file:D:/properties/来读取。
1、服务端
首先是服务端这块,首先创建一个注册中心,为了进行区分,创建一个springcloud-config-eureka的项目
application.properties配置信息:
![](https://i-blog.csdnimg.cn/blog_migrate/ff4651810bb2b602884aa5b4a4e7b2ac.png)
配置说明:
spring.application.name: 这个是指定服务名称
server.port: 服务指定的端口
eureka.client.register-with-eureka: 表示是否将自己注册到Eureka Server,默认是true
eureka.client.fetch-registry: 表示是否从Eureka Server获取注册信息,默认为true
eureka.client.serviceUrl.defaultZone: 这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址
服务端这边只需要在SpringBoot启动类添加@EnableEurekaServer注解就可以了,该注解表示此服务是一个服务注册中心服务。
代码示例:
![](https://i-blog.csdnimg.cn/blog_migrate/7569679158ad374cecf6ec66e714b271.png)
创建好了注册中心之后,我们再来创建一个配置中心,用于管理配置。
创建一个springcloud-config-server的项目。然后在application.properties配置文件添加如下配置:
![](https://i-blog.csdnimg.cn/blog_migrate/ec8b9b291106555190823f051740eaf4.png)
配置说明:
spring.application.name: 这个是指定服务名称
server.port:服务指定的端口
eureka.client.serviceUrl.defaultZone: 这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址
spring.cloud.config.server.git.uri: 配置的Git仓库的地址
spring.cloud.config.server.git.search-paths: git仓库地址下的相对地址 多个用逗号","分割
spring.cloud.config.server.git.username: git仓库的账号
spring.cloud.config.server.git.password: git仓库的密码
注:如果想使用本地方式读取配置信息,那么只需将spring.cloud.config.server.git的配置改成spring.profiles.active=native,然后在resources路径下新增一个文件即可。
这里为了进行本地配置文件测试,新建一个configtest.properties配置文件,添加如下内容:
![](https://i-blog.csdnimg.cn/blog_migrate/036387b2df11b0849a17b93e9f014e55.png)
代码这块也很简单,在程序主类中,额外添加@EnableConfigServer注解,该注解表示启用config配置中心功能。代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9dcc4787c4b2268e531aadcf31ac2f90.png)
完成上述代码之后,我们的配置中心服务端已经构建完成了。 2、客户端
我们新建一个springcloud-config-client的项目,用于做读取配置中心的配置。pom依赖还是和配置中心一样,不过需要新增一个配置,用于指定配置的读取。
创建一个bootstrap.properties文件,并添加如下信息:
![](https://i-blog.csdnimg.cn/blog_migrate/48629be90478478dcaf3ba04c8bd1109.png)
配置说明:
spring.cloud.config.name: 获取配置文件的名称
spring.cloud.config.profile: 获取配置的策略
spring.cloud.config.label: 获取配置文件的分支,默认是master。如果是是本地获取的话,则无用
spring.cloud.config.discovery.enabled: 开启配置信息发现
spring.cloud.config.discovery.serviceId: 指定配置中心的service-id,便于扩展为高可用配置集群
eureka.client.serviceUrl.defaultZone: 这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址
注:上面这些与spring-cloud相关的属性必须配置在bootstrap.properties中,config部分内容才能被正确加载。因为bootstrap.properties的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties。需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.properties,不然客户端是无法获取配置中心参数的,会启动失败!
application.properties配置
![](https://i-blog.csdnimg.cn/blog_migrate/480b05a8f8ec34348b9f2f6fbb0e204d.png)
配置说明:
![](https://i-blog.csdnimg.cn/blog_migrate/23e9f35659ccb36040971b4e967e590f.png)
程序主类代码,和之前的基本一致。代码如下:
代码示例:
![](https://i-blog.csdnimg.cn/blog_migrate/5bf782f53248879e467fc9d39ee656de.png)
为了方便查询,在控制中进行参数的获取,并返回。@Value注解是默认是从application.properties配置文件获取参数,但是这里我们在客户端并没有进行配置,该配置在配置中心服务端,我们只需指定好了配置文件之后即可进行使用。
代码示例:
![](https://i-blog.csdnimg.cn/blog_migrate/a8332f592cb80b99bb605ed05385c144.png)
到此,客户端项目也就构建完成了。