1.引言
在系列第一篇文章:搭建nacos管理控制台中,我们说nacos不单支持用于服务注册发现,还可以用于配置管理,而且用起来相当丝滑!
常用的配置管理组件,你熟悉的都有哪些呢?
- spring cloud config:spring cloud原生态组件,可谓原汁原味!但是缺少生产环境案例检验,因此一般不建议你在生产环境使用
- apollo:携程开源的配置中心组件,功能强大易用!业界用的比较多,我们团队也基于apollo二次封装了一个适合我们内部业务的配置中心
- nacos:阿里开源的配置中心组件,功能强大易用!且经过阿里自身业务的检验,业界用的比较多,你值得拥有!
本文我们探讨的就是nacos作为配置中心组件的使用。
2.基础应用
我们将前面文章用的案例:follow-me-springloud-nacos-consumer,改造使用nacos进行配置管理
2.1.引入依赖
nacos提供了与spring cloud整合的starter
xml
<!--nacos config依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2.nacos管理控制台增加配置
nacos管理配置有一个关键属性:dataId,该dataId的完整格式是这样
bash
${prefix}-${spring.profiles.active}.${file-extension}
- prefix:默认是spring.application.name,可以通过配置项spring.cloud.nacos.config.prefix进行配置
- spring.profiles.active:当前环境profile,你应该还记得spring.profiles.active。需要注意的是,如果spring.profiles.active属性为空,那么dataId的格式是
bash
${prefix}.${file-extension}
- file-extension:支持的配置文件格式,目前只支持properties与yaml。通过spring.cloud.nacos.config.file-extension进行配置
因此,我们先为应用follow-me-springloud-nacos-consumer增加一个配置文件,它的dataId是
vbnet
follow-me-springloud-nacos-consumer.yaml
之所以不配置spring.profiles.active,是因为nacos的namespace本身就是不同环境的隔离,这个特性如果你不记得了,可以看前一篇文章:项目中nacos高级特性实战,在这篇文章中,我有详细的介绍nacos服务领域模型
好了,来增加配置吧!我在dev名称空间中增加
图一

图二

2.3.编写应用配置类
为了方便查看使用效果,我们编写一个配置类,对应follow-me-springcloud-nacos.consumer.yaml中配置内容
yaml
consumer:
appId: c0000001
appName: myConsumer_DEV
ConsumerNacosConfig:
java
/**
* 配置类
*
* @author ThinkPad
* @version 1.0
*/
@Configuration
@ConfigurationProperties("consumer")
@Data
public class ConsumerNacosConfig {
private String appId;
private String appName;
}
2.4.增加测试端点
增加一个测试端点,方便测试效果
java
@Autowired
private ConsumerNacosConfig consumerNacosConfig;
@RequestMapping("config")
public String testConfig(){
log.info("ConsumerController---testConfig.当前配置信息:{}", consumerNacosConfig);
return consumerNacosConfig.toString();
}
2.5.增加启动配置文件
配置中心连接信息,需要在应用启动的时候最先加载,因此需要增加启动配置文件bootstrap.yml,它是在springboot应用启动中,最先加载的配置文件,满足我们的需求
yaml
spring:
cloud:
nacos:
config:
#配置中心地址
server-addr: 127.0.0.1:8848
#配置中心名称空间,配置dev环境
namespace: 1a500714-6fdc-410c-8743-ae30d0edf92e
# 配置文件格式
file-extension: yaml
2.6.启动应用
启动应用,访问端点:http://127.0.0.1:8090/consumer/config

3.高级特性
3.1.spring.profiles.active属性
前面我们说,nacos配置管理的关键属性:dataId,它的完整格式是
bash
${prefix}-${spring.profiles.active}.${file-extension}
因此它支持spring.profiles.active特性,在项目实践中,一般会这么去设置配置文件
- follow-me-springloud-nacos-consumer.yaml:配置通用属性
- follow-me-springloud-nacos-consumer-dev.yaml:配置特定环境属性,比如开发环境
- follow-me-springloud-nacos-consumer-prod.yaml:配置特定环境属性,比如生产环境
图一

follow-me-springloud-nacos-consumer.yaml
yaml
server:
port: 8090
follow-me-springloud-nacos-consumer-dev.yaml
yaml
consumer:
appId: c0000001
appName: myConsumer_DEV
#ribbon配置
ribbon:
eager-load:
#开启ribbon饥饿加载
enabled: true
#服务提供者,使用nacos提供的负载均衡策略:同集群优先调用
follow-me-springloud-nacos-provider:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
follow-me-springloud-nacos-consumer-prod.yaml
yaml
consumer:
appId: c0000001
appName: myConsumer_PROD
#ribbon配置
ribbon:
eager-load:
#开启ribbon饥饿加载
enabled: true
#服务提供者,使用ribbon默认的负载均衡策略:轮询
follow-me-springloud-nacos-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
在bootstrap.yml中增加spring.profiles.active配置,并启动应用测试
yaml
spring:
profiles:
#当前环境:dev
active: dev
访问端点:http://127.0.0.1:8090/consumer/config

访问端点:http://127.0.0.1:8090/consumer/test,观察到使用的是NacosRule负载均衡策略,即同集群优先,随机调用
在bootstrap.yml中增加spring.profiles.active配置,并启动应用测试
yaml
spring:
profiles:
#当前环境:prod
active: prod
访问端点:http://127.0.0.1:8090/consumer/config

访问端点:http://127.0.0.1:8090/consumer/test,观察到使用的是RoundRobinRule负载均衡策略,即同轮询
3.2.namespace隔离
如果不使用nacos提供的dataId属性,与spring.profiles.active特性实现环境隔离。我们还可以选择通过namespace特性实现环境之间的隔离。
在bootstrap.yml配置文件中,我们其实是指定了namespace属性为dev环境的
yaml
spring:
profiles:
#当前环境:prod
active: prod
cloud:
nacos:
config:
#配置中心地址
server-addr: 127.0.0.1:8848
#配置中心名称空间,配置dev环境
namespace: 1a500714-6fdc-410c-8743-ae30d0edf92e
# 配置文件格式
file-extension: yaml
如果我把spring.cloud.nacos.config.namespace改为prod的namespace,你会发现配置不生效了,原因是我们在prod 名称空间环境下没有相应的配置,具体我就不演示了,留给你去实践。
本文源码地址:gitee.com/yanghouhua/...