本文主要介绍 Nacos,它是阿里巴巴开源的管理微服务的平台,在国内很多公司都在使用 Nacos 作为微服务的注册中心和全局配置中心,而且它在国内的中文文档比较丰富,比较是国产开源的,而且背后有阿里撑腰,目前软件还是一直在更新当中,于是我就开始学习 Nacos,全局配置管理和配置共享这两个功能还是很实用的。废话不多说,开始今天的教程。
0x0. 介绍
Nacos 主要作用有 2 个
- 实现服务注册与发现
- 作为配置中心
0x1. 安装 Nacos
本文使用的是 Docker 部署 Nacos。
Docker Hub nacos-server: https://hub.docker.com/r/nacos/nacos-server
Nacos 单节点版运行命令如下:
1 | docker run --name forum-nacos -e MODE=standalone -p 8848:8848 --restart=always -d nacos/nacos-server |
参数解释
- –name 容器的名称
- –name 容器的名称
- -e 传入参数
- -p 映射端口
- –restart=always 随着 Docker 启动而启动
- -d 后台运行
运行好之后,访问http://Nacos服务器的IP:8848/nacos
就可以访问 Nacos 控制台。
0x2. Nacos 实现服务注册与发现
1. 服务提供者(生产者)
新建一个名称为:
nacos-discovery-consumer
的 Spring Boot 工程。引入依赖
1 | <dependency> |
- 在主类上添加
@EnableDiscoveryClient
注解
1 |
|
- 配置服务名称和 Nacos 地址
1 | server.port=8081 |
- 启动应用,打开 Nacos 控制台->服务管理->服务列表
2. 服务消费者(消费者)
新建一个名称为:
nacos-discovery-consumer
的 Spring Boot 工程。引入依赖
1 | <dependency> |
在主类上添加
@EnableDiscoveryClient
注解配置服务名称和 Nacos 地址
1 | server.port=9023 |
3. 消费者调用生产者接口
- 在
provider
工程中添加一个测试接口
1 |
|
- 在
consumer
工程中调用接口
1 |
|
- 请求消费者的接口,消费者会调用生产者的接口
0x3. Nacos 作为配置中心
进入 Nacos 的控制页面,在配置列表功能页面中,点击右上角的 + 按钮,进入新建配置页面,如下图填写内容:
新建 Spring Boot 项目并引入依赖
1 |
|
在resources
新建bootstrap.properties
(文件名称必须是 bootstrap,文件类型可以是.properties 或者.yaml),文件内容如下:
1 | server.port=8081 |
配置解析:
Data ID
填forum-service
: 对应客户端的配置spring.cloud.nacos.config.prefix
,默认值为`${spring.application.name}``,即:服务名- 配置格式选
properties
:对应客户端的配置spring.cloud.nacos.config.file-extension
,默认值为properties
Group
的值DEFAULT_GROUP
:对应客户端的配置spring.cloud.nacos.config.group
,默认值为DEFAULT_GROUP
1. 配置的加载规则
在采用默认值的应用要加载的配置规则就是:Data ID=${spring.application.name}.properties,Group=DEFAULT_GROUP
如果我们想通过自定义配置,实现加载 Data ID=example.yaml,Group=DEV 的配置内容,则按照如下配置即可:
1 | spring.cloud.nacos.config.prefix=example |
2. 多环境管理
- 使用
Data ID
与profiles
实现
默认情况下Data ID
的名称格式是这样的:${spring.application.name}.properties
,其实还包含了环境逻辑,我们在启动应用时,可以通过spring.profiles.active
来指定具体的环境名称,此时客户端就会把要获取配置的Data ID
设置为:${spring.application.name}-${spring.profiles.active}.properties
- 使用
Group
实现
Group
在 Nacos 中是用来对Data ID
做集合管理的重要概念。所以,如果我们把一个环境的配置视为一个集合,那么也就可以实现不同环境的配置管理。
- 使用
Namespace
实现
Namespace
的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。
可通过以下方式指定项目的Namespace
1 | spring.cloud.nacos.config.namespace=c3583494-5c1e-42be-b946-fb3b726dfebe |
总结:
对于指定环境的配置(spring.profiles.active=dev
、spring.cloud.nacos.config.group=DEV
、spring.cloud.nacos.config.namespace=c3583494-5c1e-42be-b946-fb3b726dfebe
),都不要配置在应用的 bootstrap.properties
中。而是在发布脚本的启动命令中,用-Dspring.profiles.active=dev
的方式来动态指定,会更加灵活!
3. Nacos 配置的多文件加载与共享配置
- 加载多个配置
1 | spring.cloud.nacos.config.shared-configs[0].data-id=forum-service |
spring.cloud.nacos.config.shared-configs
配置是一个数组 List 类型。每个配置中包含三个参数:data-id
、group
,refresh
。refresh
参数控制这个配置文件中的内容时候支持自动刷新,默认情况下,只有默认加载的配置才会自动刷新,对于这些扩展的配置加载内容需要配置该设置时候才会实现自动刷新。
- 配置加载的优先级
- A: 通过
spring.cloud.nacos.config.shared-dataids
定义的共享配置 - B: 通过
spring.cloud.nacos.config.ext-config[n]
定义的加载配置 - C: 通过内部规则(
spring.cloud.nacos.config.prefix
、spring.cloud.nacos.config.file-extension
、spring.cloud.nacos.config.group
这几个参数)拼接出来的配置
优先级关系是:A < B < C