1. Nacos配置中心使用
官方文档: https://qithub.com/alibaba/spring-cloud-alibaba/wiki/Nacos-confia
Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用Spring Cloud Alibaba Nacos Config,您可以在Nacos Server集中管理你Spring Cloud应用的外部属性配置。
nacos-config支持:
- 环境拆分:通过namespace、group、DataId来区分不同项目不同环境下的配置文件
- 热更新:无需手动维护,1秒内自动更新配置
2. 权限控制
通过URL访问可视化界面在左侧菜单“权限控制”中进行操作,同时在nacos的conf文件夹下的application.properties中将nacos.core.auth.enabled修改为true
nacos.core.auth.enabled=true
2.1. 配置文件最佳实践
Namespace:代表不同环境,如:dev、test、prod。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件
3. Spring Cloud Alibaba 整合 Nacos-config
3.1. 第一步
添加依赖
<!-- nacos-config依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.2. 第二步
新建bootstrap.yml来配置
spring:
application:
# 会自动根据服务名拉取dataId对应的文件,如果dataId跟服务名不一致,那么需要手动指定
# 默认文件,除了默认文件,其他文件必须写上后缀
name: com.tulingmall.order.redis
profiles:
# 环境配置,在配置中心可以通过profile进行设置,只有默认的配置文件(spring.application.name)才能这么使用
# 拉取到的文件为${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
active: dev
cloud:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
# profile配置文件的优先级 > 默认配置文件优先级 > extension-configs(下标大的优先级高) > shared-configs(下标大的优先级高) 并且优先级大的会覆盖小的,形成互补
config:
#refresh-enabled: false #nacos客户端将无法感知配置文件的变化
# nacos客户端默认读取properties文件拓展名,当读取非properties时需修改此配置
# 只针对默认配置文件和profile配置文件
file-extension: yaml
namespace: public
group: DEFAULT_GROUP
shared-configs:
- data-id: com.xxx.common.properties
refresh: true
#group: 默认是DEFAULT_GROUP
extension-configs:
- data-id: com.xxx.common.properties02
refresh: true
#group: 默认是DEFAULT_GROUP
3.3. 第三步
URL访问nacos可视化工具来创建相应的配置文件
4. 注意项
- profile配置文件的优先级 > 默认配置文件优先级 > extension-configs(下标大的优先级高) > shared-configs(下标大的优先级高) 并且优先级大的会覆盖小的,形成互补
- nacos开启认证后nacos配置文件中必须填写name和password
- 代码中实时获取配置中心的值
@RestController @RequestMapping("/config") // 使用该注解来动态获取配置中心的值 @RefreshScope public class ConfigController { @Value("${user.name}") private String name; @RequestMapping("/show") public String show(){ return name; } }