官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务端和客户端支持。使用Spring Cloud Alibaba Nacos Config,您可以在Nacos Server集中管理你Spring Cloud应用的外部属性配置。
与springcloud config 对比
三个大优势:
1》springcloud config大部分场景结合git使用,动态变更还需要依赖Spring Cloud Bus消息总线来通过所有的客户端变化。
2》springcloud config不提供可视化界面。
3》nacos config使用长轮询更新配置,一旦配置有变动后,通知Provider的过程非常的迅速,从速度上秒杀springcloud原来的config。
对比项/配置中心 | spring cloud config | apollo | 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-Server2+Git+MQ | Config2+Admin3+Portal*2 + Mysql | Nacos*3 + Mysql = 4 |
配置格式校验 | 不支持 | 支持 | 支持 |
通信协议 | HTTP和AMQP | HTTP | HTTP |
数据一致性 | Git保证数据一致性,Config-Server从Git读取数据 | 数据库模拟消息队列,Apollo定时读取消息 | HTTP异步通知 |
单机读(tps) | 7(限流所制) | 9000 | 15000 |
单机写 | 5(限流所制) | 1100 | 1800 |
3节点读 | 21(限流所制) | 27000 | 45000 |
3节点写 | 5(限流所制) | 3300 | 5600 |
Nacos配置参数说明:https://nacos.io/zh-cn/docs/concepts.html
配置集 ID:
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
配置分组:
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
开启权限服务配置:
修改nacos的application.properties配置文件。
### If turn on auth system: nacos.core.auth.enabled=true
1.启动Nacos Server。
2.启动好Nacos之后,在Nacos添加如下的配置:
注意:dataid是以properties(默认的文件扩展名方式)为扩展名。
3.客户端使用方式
如果要在您的项目中使用Nacos来实现应用的外部化配置,使用group ID为 com.alibaba.cloud 和 artifact ID为 spring-cloud-alibaba-nacos-config的starter。
<!--Nacos config 的依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
4.创建一个Spring Boot应用
@SpringBootApplication public class ConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args); String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.out.println("user name:" + userName + ";age:" + userAge); } }
5.在运行此Example之前,必须使用bootstrap.yml配置文件来配置Nacos Server地址
spring: application: # 会自动根据服务名拉取dataid对应的配置文件, 如果dataid跟服务名不一致就需要手动指定dataid。 name: com.mu.order cloud: nacos: server-addr: 192.168.175.1:8848 username: nacos password: nacos config: namespace: public
6.验证
最佳实践:
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX学校项目,XX电商项目
DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件
1.支持profile粒度的配置
application.yml文件内容:
server: port: 8050 spring: profiles: active: dev # 在配置中心: 可以通过profile进行设置, # 只有默认的配置文件才能结合profile进行使用 # 对应的Dataid: ${spring.application.name}-${profile}.${file-extension:properties} # profile的后缀必须跟随默认配置文件的格式来
bootstrap.yml文件内容:
spring: application: # 会自动根据服务名拉取dataid对应的配置文件, 如果dataid跟服务名不一致就需要手动指定dataid。 # 跟服务名相同的dataid的配置文件,称之为默认的配置文件 # 除了默认的配置文件,其他配置文件必须写上后缀 name: com.mu.order cloud: nacos: server-addr: 192.168.175.1:8848 username: nacos password: nacos config: namespace: public # Nacos客户端默认Properties的文件扩展名 # 一旦修改成了非Properties格式,则必须通过file-extension进行设置 file-extension: yaml # nacos客户端将无法感知配置的变化 #refresh-enabled: false # 配置文件的优先级(优先级大的覆盖优先级小的,并且会形成互补) # profile > 默认配置文件
nacos中的配置:
测试:
2.支持自定义namespace的配置
用于进行租户粒度的配置隔离,不同的命名空间下,可以存在相同的Group 或 Data ID 的配置。namespace的常用场景之一是不同环境配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定${spring.cloud.nacos.config.namespace}配置的情况下,默认使用的是Nacos上Public这个namespace,如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring: application: # 会自动根据服务名拉取dataid对应的配置文件, 如果dataid跟服务名不一致就需要手动指定dataid。 # 跟服务名相同的dataid的配置文件,称之为默认的配置文件 # 除了默认的配置文件,其他配置文件必须写上后缀 name: com.mu.order cloud: nacos: server-addr: 192.168.175.1:8848 username: nacos password: nacos config: namespace: dev # Nacos客户端默认Properties的文件扩展名 # 一旦修改成了非Properties格式,则必须通过file-extension进行设置 file-extension: yaml
注意:该配置必须放在bootstrap.properties文件中。此外 spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在Nacos的控制台获取。并且在添加配置时注意不要选择其他的namespace,否则将会导致读取不到正确的配置。
3.支持自定义Group的配置
Group是组织配置的维度之一。通过一个有意义的字符串(如Buy 或 Trade)对配置集进行分组,从而区分Data ID相同的配置集。当您在nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如database_url配置和MQ_topic配置。
在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认是DEFAULT_GROUP。如果需要自定义自己的Group,可以通过以下配置来实现:
spring: application: # 会自动根据服务名拉取dataid对应的配置文件, 如果dataid跟服务名不一致就需要手动指定dataid。 # 跟服务名相同的dataid的配置文件,称之为默认的配置文件 # 除了默认的配置文件,其他配置文件必须写上后缀 name: com.mu.order cloud: nacos: server-addr: 192.168.175.1:8848 username: nacos password: nacos config: namespace: dev group: mu # Nacos客户端默认Properties的文件扩展名 # 一旦修改成了非Properties格式,则必须通过file-extension进行设置 file-extension: yaml
注意:该配置必须放在bootstrap.properties文件中。并且在添加配置时Group的值一定要和spring.cloud.nacos.config.group的配置值一致。
4.支持自定义扩展的Data Id配置
Data ID是组织划分配置的维度之一。Data ID通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID通常采用类Java包(com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
通过自定义扩展的Data Id配置,记可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
spring: application: # 会自动根据服务名拉取dataid对应的配置文件, 如果dataid跟服务名不一致就需要手动指定dataid。 # 跟服务名相同的dataid的配置文件,称之为默认的配置文件 # 除了默认的配置文件,其他配置文件必须写上后缀 name: com.mu.order cloud: nacos: server-addr: 192.168.175.1:8848 username: nacos password: nacos config: #namespace: public namespace: dev group: mu shared-configs: - dataId: com.mu.common.properties refresh: true group: mu # 默认是Default-group #extension-configs[0]: #dataId: com.mu.common1.properties #refresh: true #group: mu # Nacos客户端默认Properties的文件扩展名 # 一旦修改成了非Properties格式,则必须通过file-extension进行设置 file-extension: yaml # nacos客户端将无法感知配置的变化 # refresh-enabled: false # 配置文件的优先级(优先级大的覆盖优先级小的,并且会形成互补) # profile > 默认配置文件 >extension-configs(下标越大优先级就越大)> shared-configs(下标越大优先级就越大)
可以看到:
1》通过spring.cloud.nacos.config.extension-config[n].data-id的配置方式来支持多个Data id的配置。
2》通过spring.cloud.nacos.config.extension-config[n].group的配置方式自定义Data Id所在的组,不明确配置的话,默认是DEFAULT_GROUP。
3》通过spring.cloud.nacos.config.extension-config[n].refresh的配置方式来控制该Data Id在配置变更时,是否支持应用中的可动态刷新,感知到最新的配置值。默认是不支持的。
注意:
多个Data Id同时配置时,它的优先级关系是spring.cloud.nacos.config.extension-config[n].data-id其中n的值越大,优先级越高。
spring.cloud.nacos.config.extension-config[n].data-id的值必须带文件扩展名,文件扩展名即可支持properties,又可以支持yaml/yml。此时spring.cloud.nacos.config.file-extension的配置对自定义扩展配置的Data Id文件扩展名没有影响。
5.@RefreshScope
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${user.name}") public String userName; @RequestMapping("/show") public String show(){ return userName; } }