一、使用场景
- 当配置信息发生变动时,传统修改配置信息后,需要重新重启服务器才可以生效。
- 大量应用配置修改时,需要一个个修改配置,无法统一修改,且没有办法回溯配置版本。
- 配置没有区别环境,分组,可能因为事务将开发测试配置发布到生产环境。
- 等等问题啊…以上问题使用Nacos-Config都可以解决。
二、开箱使用
以Nacos官网中快速开始为例子 Nacos-config
1. 启动好Nacos服务,添加配置
默认存在配置空间public,直接新增配置,命名配置ID,配置GROUP保存即可。
# 配置内容
user.name = wql
user.name = 15
2. 配置Spring Boot
2.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2 配置bootstrap.properties
Nacos Server配置中心指定必须在bootstrap.properties中配置,配置信息如下
spring:
application:
name: com.wql.order
cloud:
nacos:
server-addr: 192.168.31.233:8847
username: nacos
password: nacos
config:
namespace: public
file-extension: Properties
refresh-enabled: true
group: DEFAULT_GROUP
- application.name :应用名称,这个对应在Nacos中填写的配置Data ID,针对配置Data ID与应用名称不同情况后面介绍。
- server-addr : Nacos服务地址
username : 账号 password : 密码 - namespace :命名空间。这里填写为默认的命名空间public,可以在Nacos中新增命名中间,新增时需要注意这里填写的是命名空间的ID。
- file-extension:文件扩展名,默认Properties,可选YAML,XML等。
- refresh-enabled:Nacos动态感知配置文件变化,默认true,如果为false,配置中心数据修改将不会通知客户端。
- group:配置文件组,默认DEFAULT_GROUP,可以针对业务进行分组,如订单模块,库存模块等。
2.3 验证数据
写一个端口,将获取配置文件的信息返回,然后动态修改Nacos配置中心的配置信息后,查看客户端是否动态获取到配置信息。
@RestController
@RequestMapping("/config/")
@RefreshScope
public class ConfigController {
@Value("${user.name}")
String name;
@RequestMapping("getName")
public String getName() {
System.out.println("Name:" + name);
return name;
}
}
- @RefreshScope:用来刷新配置信息,如果缺少,修改Nacos配置中心后,客户端已经引用到配置中的数据不会被刷新。
3. 配置不同于应用名称的Nacos配置
上面配置中Nacos配置中心的Data_Id必须要和应用名称相同,如果不同时,客户端会无法读取,这时候我们可以通过以下方式来配置:
spring:
application:
name: com.wql.order
cloud:
nacos:
server-addr: 192.168.31.233:8847
username: nacos
password: nacos
config:
namespace: 91302ae5-45b9-43f4-b9d3-702b3ccfecde
file-extension: yaml
refresh-enabled: true
group: order
shared-configs:
- data-id: com.wql.common.properties
refresh: true
group: DEFAULT_GROUP
可以看到这里新建了一个Data Id为com.wql.common.properties的配置,这里使用的了共享配置shared-configs,在下面以 “-” 分隔,相当于数组,每一个 “-” 意味着一个配置,每一个配置都可以自定义命名空间、扩展名、配置组等这些信息。另外还可以用下面数据形式来配置,效果等同于 “-” 。
spring:
application:
name: com.wql.order
cloud:
nacos:
server-addr: 192.168.31.233:8847
username: nacos
password: nacos
config:
namespace: 91302ae5-45b9-43f4-b9d3-702b3ccfecde
file-extension: yaml
refresh-enabled: true
group: order
shared-configs[0]:
data-id: com.wql.common.properties
refresh: true
group: DEFAULT_GROUP
4. 配置的优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
5. 客户端配置多套环境配置
在实际开发中,通常对配置会有dev、test、prod等配置,通过spring.profiles.active来指定配置,如下意味着应用会使用配置文件application-dev.yml。 这种情况强大的Nacos一样可以解决,我们只需要将原本的Data Id 即 com.wql.order修改为: com.wql.order-dev.yaml即可,-dev.yaml以为着 - active.配置文件类型,比如应用使用prod配置文件即spring.profiles.active为prod,文件类型为properties,那么Nacos配置Data Id为 com.wql.order-prod.properties。
三、对比常用的配置中心
| spring cloud config | appllo | nacos |
---|
开源时间 | 2014.9 | 2016.5 | 2018.6 | 配置实时推送 | 支持(依赖Spring Cloud Bus) | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) | 版本管理 | 支持(Git) | 自动管理 | 自动管理 | 配置回滚 | 支持(Git) | 支持 | 支持 | 灰度发布 | 支持 | 支持 | 待支持 | 权限管理 | 支持 | 支持 | 待支持 | 多集群多环境 | 支持 | 支持 | 支持 | 监听查询 | 支持 | 支持 | 支持 | 多语言 | 仅支持Java | Go、C++、Python、Java、.Net、OpenAPI | Python、Java、NodeJs、OpenAPI | 分布式高可用最小集群数量 | Config-Server*2+Git+MQ=5 | Config2+Admin3+Portal*2+MySql=8 | Nacos*3+MySql=4 | 通信协议 | HTTP和AMQP | HTTP | HTTP | 数据一致性 | Git保证数据一致性,Config-Server从Git读取数据 | 数据库模拟消息队列,Apollo定时读消息 | HTTP异步通知 | 单机读(tps) | 7 (限流所制) | 9000 | 15000 | 单机写(tps) | 5 (限流所制) | 1100 | 1800 | 3节点读 | 21 (限流所制) | 27000 | 45000 | 3节点写 | 5 (限流所制) | 3300 | 5600 |
从表格中可以看出Nacos所支持功能与Apollo对比几乎无差别,但性能上Nacos优于Apollo。Nacos与Spring Cloud Config对比有以下主要优点: ① Spring Cloud Config大部分场景结合Git使用,动态变更还需要依赖Spring Cloud Bus消息总线来通知所有客户端变化。 ② Spring Cloud Config不提供可视化操作界面。 ③ Nacos Config使用长轮询更新配置,一旦配置发生变动,通知Provider的过程非常的迅速,速度上秒杀Spring Cloud Config。
|