本文章将通过结合consul config来讲解在springboot中如何加载远程配置:通过consul config加载consul server中存储的配置。
我们先来说下在spring中常规的加载配置文件的方式。
加载配置文件方式
对于一个工程来说,我们一般都会需要有各种配置,在spring工程里面,一般都是yml或者properties文件,如下所示:
server:
port: 9991 # 端口
spring:
application:
name: ts-service1 # 应用名称
profiles:
active: dev # 指定环境,默认加载 default 环境
cloud:
consul:
# Consul 服务器地址
host: 51.6.196.200
port: 8500
# 配置中心相关配置
config:
# 是否启用配置中心,默认值 true 开启
enabled: true
# 设置配置的基本文件夹,默认值 config 可以理解为配置文件所在的最外层文件夹
prefix: config
# 设置应用的文件夹名称,默认值 application 一般建议设置为微服务应用名称
default-context: tsService
# 配置环境分隔符,默认值 "," 和 default-context 配置项搭配
# 例如应用 orderService 分别有环境 default、dev、test、prod
# 只需在 config 文件夹下创建 orderService、orderService-dev、orderService-test、orderService-prod 文件夹即可
profile-separator: '-'
# 指定配置格式为 yaml
format: YAML
# Consul 的 Key/Values 中的 Key,Value 对应整个配置文件
data-key: redisConfig
# 以上配置可以理解为:加载 config/orderService/ 文件夹下 Key 为 orderServiceConfig 的 Value 对应的配置信息
watch:
# 是否开启自动刷新,默认值 true 开启
enabled: true
# 刷新频率,单位:毫秒,默认值 1000
delay: 1000
# 服务发现相关配置
discovery:
register: true # 是否需要注册
instance-id: ${spring.application.name}-01 # 注册实例 id(必须唯一)
service-name: ${spring.application.name} # 服务名称
port: ${server.port} # 服务端口
prefer-ip-address: true # 是否使用 ip 地址注册
ip-address: ${spring.cloud.client.ip-address} # 服务请求 ip
那么对于读取这些配置文件中的值,一般有如下几种方式
1、使用 @Value("${property}") 读取比较简单的配置信息。
2、通过@ConfigurationProperties读取并通过@Component与 bean 绑定
3、通过@ConfigurationProperties读取并在使用的地方使用@EnableConfigurationProperties注册需要的配置 bean
4、通过@PropertySource读取指定 properties 文件
注:spring加载配置文件有个默认的加载顺序的,根据存放的路径来决定。
拉取远程配置
我们知道,上面说的那些一般要求配置都必须是本地,而且格式只能是 properties(或者 yaml)。那么,如果我们有远程配置,如何把他引入进来来呢。主要有以下三步:
1、编写PropertySource:编写一个类继承EnumerablePropertySource,然后实现它的抽象方法即可。
2、编写PropertySourceLocator:PropertySourceLocator 其实就是用来定位我们前面的PropertySource,需要重写的方法只有一个,就是返回一个PropertySource对象。
3、配置PropertySourceLocator生效
下面就以consul为例,剖析下它是怎么做的
consul的配置示例如下:
spring:
app