Version: Next
服务配置中心
基础配置
cloudalibaba-config-nacos-client3377
POM
- Nacos Config 依赖
- 完整依赖
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
YAML
需要配置
application.yaml
和bootstrap.yaml
两个文件
- 由于
bootstrap
优先级更高,因此用来写配置application.yaml
写自身的一些配置
- bootstrap.yaml
- application.yaml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定远程代码仓库上配置文件的格式 -> yaml格式配置
# group: DEV_GROUP
# namespace: 9a770128-f22f-40a3-b060-7488e1e4a7bc
#${prefix}-${spring.profile.active}.${file-extension}
# ${spring.application.name}-${spring.profile.active}.${file-extension}
主启动
- 使用
@EnableDiscoveryClient
注解
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
业务类
- 写一个 Controller 对外暴露配置信息
- 使用
@RefreshScope
注解支持 Nacos 动态刷新功能 - 使用
@Value("${config.info}")
读取远程代码仓库中配置文件配置信息
@RestController
@RefreshScope // 支持 Nacos 动态刷新
public class ConfigClientController {
// 这个配置写在远程代码仓库的配置文件中 config-test.yaml; config-dev.yaml
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
Nacos 添加配置信息
Nacos 中的匹配规则
- Nacos 中 dataId 的组成格式以及 SpringBoot 配置文件中的匹配规则
- 在 Nacos Spring Cloud 中,
dataId
的完整格式如下${prefix}-${spring.profile.active}.${file-extension}// 例如 provider-test.yaml
prefix
:默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置spring.profile.activ
为当前环境的profile
(dev、test那种东西,配置在application.yaml
中)。
- 当
spring.profile.active
为空时,对应连接符-
也将不存在,dataId 的格式变为${prefix}.${file-extension}
file-extension
:为配置文件的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置,目前仅支持properties
和yaml
两种类型- 通过
Spring Cloud
原生注解@RefreshScope
实现配置自动更新最终:将
prefix
明确指定为spring.application.name
得到最终公式${spring.application.name}-${spring.profile.active}.${file-extension}// 目前得到的就是 nacos-config-client-test.yaml
- 目前推出的远程配置文件名应当是
nacos-config-client-test.yaml
,即应当在配置中心配置这么个文件,配置内容就是ConfigClientController
中读取的config.info
Nacos 添加配置
- 访问
localhost:8848/nacos
,打开配置管理-配置列表
- 根据推算出的文件名
nacos-config-client-test.yaml
新建配置文件- 配置内容应当包含
config.info
为:config:info: "Config info for 「test」, from nacos config center, version = 1"
- 点击
发布
,再次查看配置列表,可以发现配置已经添加了并且能够显示和操作
测试
- 测试前,确保
nacos 管理网站 -> 配置管理 -> 配置列表
下有对应的yaml
配置文件 - 运行
cloud-config-nacos-client3377
- 访问
localhost:3377/config/info
,发现配置已经更新
动态刷新配置测试
- 在
Nacos 8848 管理页面
直接使用编辑
修改配置文件的version
值- 再次访问
localhost:3377/config/info
分类配置
多环境多项目配置
问题一
dev 开发环境
、test 测试环境
、prod 生产环境
- 如何保证指定环境启动时服务能正确读取到
Nacos
上响应环境的配置文件?问题二
- 大型分布式微服务系统会有很多微服务子项目
- 每个微服务子项目都有自己对应的
开发环境
、测试环境
、生产环境
- 如何对这些微服务子项目进行配置管理
Namespace + Group + Data ID
默认情况
Namespace = public
Group = DEFAULT_GROUP
默认 Cluster:
DEFAULT
Namespace
主要用来实现隔离
- 例如三个环境
dev
、text
、prod
,就可以创建三个Namespace
,不同的Namespace
之间是隔离的
Group
用来分组
Cluster
用来指定微服务的虚拟划分,可以实现容灾
DataID 配置
- 指定
spring.profile.active
(application.yaml) 和配置文件的 DataID 来使不同环境下读取不同的配置- 默认空间 + 默认分组 + 新建 dev 和 test 两个 DataID
- 通过
spring.profile.active
属性就能进行多环境下配置文件的读取
- 就是按照先前添加配置的方式,模仿
test
配置文件,新建一个dev
配置文件,nacos-config-client-dev.yaml
,内容如下
config:
info: "Config info for 「dev」, from nacos config center, version = 1"
- 变为两个 DataId,并且属于同一个 Group
- 修改
spring.profile.active
属性就能进行多环境下配置文件的读取,从test
切换到dev
修改 application.yaml
spring:
profiles:
#active: test
active: dev #表示开发环境
测试
- 重启
3377
- 访问
http://localhost:3377/config/info
- 得到响应
Config info for 「dev」, from nacos config center, version = 1
,已经切换到了dev
环境的配置文件
Group 配置
- 通过 Group 实现环境区分
- 默认 Group 为
DEFAULT_GROUP
新建 Group
- 在创建
DataId
时,填写Group
栏目即可- 新建一个 DataId :
nacos-config-client-info.yaml
,Group 设置为DEV_GROUP
config:info: "nacos-config-client-info.yaml, 「 DEV_GROUP 」, version = 1"
- 再新建一个 DataId :
nacos-config-client-info.yaml
,Group 设置为TEST_GROUP
- 在两个不同的
Group
中,存在同名的配置文件
微服务指定 Group
- 在
bootstrap.yaml
中,在先前配置的基础上,添加group
配置即可
- bootstrap.yaml
- application.yaml
server:port: 3377spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式配置group: TEST_GROUP# namespace: 9a770128-f22f-40a3-b060-7488e1e4a7bc# ${spring.application.name}-${spring.profile.active}.${file-extension}#${prefix}-${spring.profile.active}.${file-extension}
- 这样就回去读取
TEST_GROUP
分组下的nacos-config-client-info.yaml
文件
测试
- 重启
3377
- 访问
http://localhost:3377/config/info
- 响应
nacos-config-client-info.yaml, 「 TEST_GROUP 」, version = 1
- 可以看到读取了
TEST_GROUP
分组的配置文件
Namespace 配置
新建 NameSpace
- 新建
dev
、test
两个 Namespace命名空间
-新建命名空间
- 在配置列表可以看到已经出现了新增的命名空间
新建 DataId
- 在新的
Namespace
下新建 DataId 配置文件
- 修改
bootstrap.yaml
添加namesapce
属性,值为命名空间 ID
- bootstrap.yaml
- application.yaml
server:port: 3377spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式配置group: DEV_GROUPnamespace: 6ce749f4-8ff9-4bcb-82d3-948b04411c8b# ${spring.application.name}-${spring.profile.active}.${file-extension}#${prefix}-${spring.profile.active}.${file-extension}
测试
- 重启
3377
- 访问
http://localhost:3377/config/info
- 响应
Config info for 「dev」, from nacos config center 「dev NameSpace」, 「 DEV_GROUP 」, version = 1
- 可见已经从
dev namesapce
,DEV_GROUP
读取了nacos-config-client-dev.yaml
配置文件