起步
通过官方的脚手架生成工具Spring Initializr 选择两个依赖:
- Config Server
- Eureka Discovery Client
配置
开启ConfigServer
启动类上增加 @EnableConfigServer
注解(也就是这个注解搭配Auto Configure就算注入了相关的配置)
application.properties配置文件
# 配置端口、服务名称以及本地测试用的存储目录
server.port=9000
spring.application.name=config-server
spring.cloud.config.server.git.uri=file:///C:/config
# 因为配置中心本身是无状态的,和其他服务一样也可以注册到Registry,也算是一种HA策略吧
eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
eureka.instance.prefer-ip-address=true
本地存储配置的目录初始化
因为配置中心支持多种底层存储,常见就是git/svn/jdbc,在C:/config
下执行git init
启动
main函数直接run,控制台打印log一般都是启动成功以及报错信息(注册到eureka报错,因为还没启动注册中心)
使用
我在哪能看到配置
官方嫡系的配置中心因为底层存储是可选的,所以没有一个统一的管理后台,也就是你用git 就用git相关的管理工具,jdbc自己做个后台。
配置中心如何访问
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
配置的大概设计思想
对于某一个服务来说,一般都会有一个全局配置 + 应用公共配置 + 环境特有配置,也就是常见的application.properties + application-{profile}.properties
但是由于配置中心是集中式的管理所有应用的配置,当然不可能都叫application,所以采取应用的spring.application.name
来区分不同应用的配置文件,application作为全局配置的默认规则
拿订单服务举个例子,假如订单服务就叫order,那么在SpringCloudConfig里比较典型的一个存储list:
- application.properties
- order.properties
- order-dev.properties
- order-stg.properties
- order-prd.properties
准备下测试用的配置数据
# application.properties
global.xxx=yyy
# order.properties
server.port=10000
order.hello=default
# order-prd.properties
order.hello=prd
这三个文件放到指定的存储目录C:/config
,并git add commit
测试配置访问
http://localhost:9000/order/prd
{
"name": "order",
"profiles": ["prd"],
"label": null,
"version": "9a952387b9dd640f9b43a061c2a0d74b1b41de70",
"state": null,
"propertySources": [{
"name": "file:///C:/config/order-prd.properties",
"source": {
"order.hello": "prd"
}
}, {
"name": "file:///C:/config/order.properties",
"source": {
"server.port": "10000",
"order.hello": "default"
}
}, {
"name": "file:///C:/config/application.properties",
"source": {
"global.xxx": "yyy"
}
}]
}
http://localhost:9000/order/default
{
"name": "order",
"profiles": ["default"],
"label": null,
"version": "9a952387b9dd640f9b43a061c2a0d74b1b41de70",
"state": null,
"propertySources": [{
"name": "file:///C:/config/order.properties",
"source": {
"server.port": "10000",
"order.hello": "default"
}
}, {
"name": "file:///C:/config/application.properties",
"source": {
"global.xxx": "yyy"
}
}]
}
default只是一个约定,就算你随便写一个不存在的profile也会和default返回结果一样(因为没有order-default.properties)
done!