SpringCloud 如何提取公共配置
SpringCloud 提取公共配置
在开发微服务项目时,通常会有很多服务,此时会用配置中心来管理这些服务的配置,但有些服务可能会有相同的配置,比如数据源配置,eureka server注册中心地址配置,actuator开放端口配置等,很多的服务都需要,如果每个服务都写一份这样相同的配置,服务一多,也挺麻烦的,并且如果要换一个数据库或注册中心,每个服务都得改,很麻烦,所以就需要将这些公共的配置提取出来,放到公共的配置文件中,而这些服务去引用这些配置即可。
原本服务的配置文件可能是这样的:
spring: application: name: eureka-client cloud: config: uri: http://localhost:8888 #配置中心地址 label: master profile: dev
此时服务默认会去config找名字为eureka-client-dev.yml的配置文件,这个配置文件里可能有eureka server地址,数据源配置,redis配置等,而另一个服务的配置文件可能也有这些相同的配置,这时就可以将这些相同的配置提取出来,放到多个配置文件中,让服务去读取这些配置文件,比如可能有base-dev.yml来放各个服务公共的配置,datasource-dev.yml来存放数据源配置,而eureka-client-dev.yml是这个服务独有的配置,这些配置文件都在config server中,则服务的工程中的配置文件则可以改成这样:
spring: application: name: eureka-client cloud: config: uri: http://localhost:8888 #配置中心地址 label: master profile: dev name: eureka-client,base,datasource
这样eureka-client服务就会去配置中心读取这3个配置文件,其他的服务如果需要,直接在自身的配置中在spring.cloud.config.name属性中添加文件名即可,而不用再写相同的配置了。
SpringCloud config 多服务共享公共配置的解决
问题描述
我们公司的项目是基于SpringCloud开发的微服务,用到了Spring-Cloud-Config作为微服务统一的配置中心,可以将散落在各个服务的配置进行统一配置管理。
虽然配置中心将各个应用的配置文件进行了统一管理, 但是涉及到的一些公共配置,比如数据库连接,redis连接,ftp连接等,依然还散落在各个应用的配置文件中,并没有抽取,我们需要根据环境的不同,而动态修改它们,非常难以维护。导致每次涉及修改这些公共配置,就非常老火。
所以想到了利用公共文件方法,现在在这里简单阐述一下如何配置。(下面例子Spring-Cloud-Config-Server都是使用本地配置方式)。
经过网上查阅资料,大部分都是采用方法一进行配置的,那么我提供了一个方式二配置,也许会让你眼前一亮,然后留下你的想法,如果是你去选择,会选择哪个方法呢?
方法一:
首先在配置中心的 config/ 目录下创建一个公共配置文件common.yml, 然后在各个应用下的 bootstrap.yml 文件中 spring.cloud.config.name 这里去配置多个配置文件名。
例如:
service-a 客户端的 bootstap.yml:
spring: cloud: config: name: service-a, common
service-b 客户端的 bootstap.yml:
spring: cloud: config: name: service-b, common
方法二:(比较推荐)
我们还记得springboot单体应用的时候, 是如何抽离公共配置呢?答案是用spring.profiles.include 进行引用其他公共配置文件。而且它的文件命名有个特点,就是必须是application-开头的配置文件。
我们也会去想,像spring-cloud-config这样的配置集中化,这样的配置会生效吗?
例如:
首先,我们在 config/ 目录下创建 application-common-dev.yml 配置文件
然后分别修改 service-a 和 service-b 在 config/ 目录下的配置文件,配置如下:
service-a 客户端的 service-a-dev.yml
spring: application: name: service-a #公共配置文件 profiles: include: common-dev
service-b 客户端的 service-b-dev.yml
spring: application: name: service-b #公共配置文件 profiles: include: common-dev
分别启动各自的服务,就可以看到服务启动成功。
那么,这两种方式那种更好一些呢?
方法一:
缺点:如果有新加的公共配置文件,需要去每个服务的bootstrap.yml都去修改一下。并且需要重新发布jar包。
方法二:
优点:配置可以外部化,而且修改配置文件,不需要单独发布jar包。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。