阿里巴巴开源注册配置中心
点击免费观看教学视频
在前面文章中我们学习了Nacos注册中心注册中心传送门,接下来我们来学习配置中心。
Nacos配置中心
配置中心知名的有Apllo
,Spring Cloud Config
。application.yml
里边配置的一些系统变量数据, 通常会再Controller
里边用@Value
取出使用, 但是你要是想改变他,就要重新改代码,打包,部署,十分麻烦,我们需要让配置文件的值变得动起来,Nacos
也采用了Spring Cloud
原生注解 @RefreshScope
实现配置自动更新,
-
在需要添加配置中心的服务中添加mvn依赖
<!-- SpringCloud Ailibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
修改
bootstrap.yml
配置文件,这里我以order-service
应用为例,新增配置中心属性,如下:server: port: 6010 spring: application: name: order-service cloud: nacos: discovery: #必须配置ip地址 server-addr: localhost:8848 # 将自己的服务注册到注册中心 register-enabled: true # 配置中心新增部分 config: server-addr: localhost:8848 file-extension: yaml profiles: active: dev # 新加属性,作为配置测试 merber: name: 订单服务中的配置名称 age: 18
配置文件加载的优先级(由高到低)
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
-
OrderController
类中添加@RefreshScope
注解@RestController @RequestMapping("order") @RefreshScope //动态刷新配置,重要 public class OrderController { //Spring常规取值 @Value("${merber.name:}") private String merberName; @Value("${merber.age:}") private Integer merberAge; @Autowired private RestTemplate restTemplate; @GetMapping("get") public String get(){ String result = restTemplate.getForObject("http://course-service/course/list", String.class); return result + ",merberName:" + merberName + ",merberAge:" + merberAge; } }
-
给配置中心默认添加一个数据集 (Data Id)
-
配置中心命名规则
-
Data Id:
在
Nacos Spring Cloud
中,数据集(Data Id) 的配置完整格式如下:${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
,通俗一点就是前缀-环境-扩展名
-
prefix:默认为
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置# 手动指定 spring: cloud: nacos: config: prefix: order-service-config # 若不指定,默认采用应用名的方案 spring: application: name: order-sevice #服务名
-
active:是配置开发环境的值,一个程序不可能总是在开发环境,可能需要切换到测试环境,上线环境,他们的配置文件都是不同的,所以为了方便环境切换,我们配置不同的开发环境文档。比如以前我们在
application.yml
中有配置dev、test、prod,其中dev就是开发环境。。注意:当
spring.profile.active
为空时,对应的连接符-
也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
spring: profiles: active: dev #表示开发环境
-
file-extension:最后我们需要指定配置文件类型,默认是
properties
。我们可以自己指定文件类型,比如配置:spring: cloud: nacos: config: file-extension: yaml #指定配置文件类型为yaml文件
Nacos为我们提供了:
TEXT、JSON、XML、YAML、HTML、Properties
几种类型 -
最终配置
指定好配置文件类型,我们最终在配置中心新增配置文件就是:
order-sevice-dev.yaml
-
-
Group
${spring.cloud.nacos.config.group} 若未配置则取Nacos默认值:DEFAULT_GROUP
-
-
启动服务验证
再次刷新浏览器请求查看
到此配置中心接入完毕,课件代码详见:https://gitee.com/appdoc/it235.git,tag名:1.2.0
命名空间
Nacos
引入了命名空间(Namespace
)的概念来进行多环境配置和服务的管理及隔离,Namespace
也是官方推荐的多环境支持方案。
例如,你可能有dev,test和prod
三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace
。在没有明确指定命名空间配置的情况下, 默认新增的所有配置都在public空间,Nacos控制台对不同的Namespace
做了Tab栏分组展示,如下图:
隔离开发,测试,生产环境可以添加命名空间,然后在bootstrap.yml
配置文件添加命名空间的id即可切换到对应的命名空间,使用对应空间下的配置文件:
cloud:
nacos:
config:
namespace: a65a17de-e8f3-4d00-8d87-91549aaa0f02 #对应创建的命名空间的UUID
也可以基于微服务来创建命名空间,用每一个微服务名来命名,达到隔离每一个微服务的目的,哪一个微服务需要配置直接去对应的微服务空间下找配置即可,使得项目更加结构化。
命名空间课件代码详见:https://gitee.com/appdoc/it235.git,tag名:1.3.0
Data ID
Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java package的命名规则保证全局唯一性。此命名规则非强制。
大多数时候我们可能更加倾向于将不同的配置分开写到不同的配置文件中,将一个配置文件按功能拆分成不同的文件,然后在程序组合加载到一起组成一个完整的配置文件。比如我想把 DB类 和 日志类 的配置拆分开写到两个配置中,nacos也是支持这种一个配置中心多个配置集这种写法的。
-
我们在nacos中新建两个
Data ID
分别是db.yaml
和log.yaml
的文件。 -
在配置文件中分别加入部分配置内容
-
更改
bootstrap.yml
中的nacos配置为spring: cloud: nacos: config: extension-configs[0]: data-id: db.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false extension-configs[1]: data-id: log.yaml group: DEFAULT_GROUP refresh: true
为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用
shared-configs
,配置如下:spring: cloud: nacos: config: shared-configs[0]: data-id: db.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false shared-configs[1]: data-id: log.yaml group: DEFAULT_GROUP refresh: true
-
思考:在这2个文件中出现相同配置,nacos如何选取?
多个 Data Id 同时配置时,他的优先级关系是
spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。注意:
spring.cloud.nacos.config.extension-configs[n].data-id
的值必须带文件扩展名,文件扩展名既可支持properties
,又可以支持yaml/yml
。 此时spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。 -
不同方式配置加载优先级
Spring Cloud Alibaba Nacos Config
目前提供了三种配置能力从 Nacos 拉取相关的配置。- 通过
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置 - 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置 - 通过内部相关规则(
spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group
)自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
- 通过
-
配置集拆分实践
以下配置集可以拆分为:db、log、mybatis 三块
Group的使用
这是一个很灵活的配置项,并没有固定的规定,可以用作多环境、多模块、多版本之间区分配置,namespace
因其TAB栏的设定就是用作环境隔离。
Group也能干环境隔离这种事,但Group设计出来主要是做同一个环境中的不同服务分组,Group可以把不同的微服务划分到同一个分组里面去;默认所有的配置集都属于: DEFAULT_ GROUP;
常见的分组场景(维度)
不同的应用或组件使用了相同的配置类型,比如:
- database_url 配置和 MQ_topic 配置
- 对内配置组,对外配置组
总结
- dataid:配置文件的名字,相当于主键的作用;
- group: 不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中;
- namespace: Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等;