本项目代码与笔记已存放在Gitee仓库 地址: 代码,笔记
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
1.维护性 2.时效性 3.安全性
springcloud config 对比
三大优势:
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件
权限控制
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更
new->module->Next->输入名字->finish
<!--NacosConfig依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
/**
* Create with IntelliT IDEA
*
* @Author: zhengmingzhe
* @Date: 2023/03/19/16:36
* @Description: 配置中心服务启动类
*/
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
String orderName = applicationContext.getEnvironment().getProperty("order.name");
String num = applicationContext.getEnvironment().getProperty("order.num");
System.out.println("order name :" + orderName + "; num: " + num);
}
}
spring:
application:
name: config-nacos
cloud:
nacos:
server-addr: 192.168.13.1:8848
username: nacos
password: nacos
config:
namespace: public
注意如果在配置里改了权限开启为true就必须得配置nacos用户名密码
此时配置未生效控制台打印为null
2023-03-19 16:55:37.480 INFO 17536 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-192.168.13.1_8848-public] [add-listener] ok, tenant=public, dataId=config-nacos, group=DEFAULT_GROUP, cnt=1
order name :null; num: null
这是因为服务名必须得和nacos里面配置的dataId保持一致
spring:
application:
name: com.zmz.order
cloud:
nacos:
server-addr: 192.168.13.1:8848
username: nacos
password: nacos
config:
namespace: public
这时配置就生效了,当然如果想服务名与dataId不一致就得手动指定dataId
控制台:[add-listener] ok, tenant=public, dataId=com.zmz.order, group=DEFAULT_GROUP, cnt=1
order name : 蔡徐坤; num: 21
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是
DEFAULT_GROUP
支持配置的动态更新
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
while(true){
//当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
String orderName = applicationContext.getEnvironment().getProperty("order.name");
String num = applicationContext.getEnvironment().getProperty("order.num");
System.out.println("order name :" + orderName + "; num: " + num);
TimeUnit.SECONDS.sleep(1);
}
}
}
ps:除了默认的配置文件, 其他dataId都要加上后缀
Nacos客户端默认是Properties类型的配置如果想使用yml需要如下配置
spring:
application:
name: com.zmz.order
cloud:
nacos:
server-addr: 192.168.13.1:8848
username: nacos
password: nacos
config:
namespace: public
file-extension: yaml
# refresh-enabled: false 客户端将无法感知配置的变化
#Nacos客户端默认是Properties类型的配置如果想使用yml需要 file-extension: yaml(只针对默认配置文件和profile格式配置文件,可以自定义配置文件)
(不同的环境不同的配置文件比如application-dev.yml )
server:
port: 8050
spring:
profiles:
active: dev
springcloudstarteralibabanacosconfig 在加载配置的时候,不仅仅加载了以 dataid 命名为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,还加载了dataid命名为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置**(除了默认的配置文件,其他配置文件必须写上后缀)**。在日常开发中如果遇到多套环境下的不 同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
但是只有默认配置文件(跟服务名相同的dataId的配置文件)可以使用profile粒度的配置
创建一个-dev的配置文件
这里会有一个配置文件生效的优先级(优先级大的会覆盖优先级小的并且互补),前提是去掉指定 file-extension: yaml配置文件后缀
profile>默认配置文件>自定义配置文件
支持自定义 namespace 的配置
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景 之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
直接修改config.namespace为指定的命名空间id就可以了
spring.cloud.nacos.config.namespace=8f46651d-94f6-4697-8054-8bc25b815165
Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和MQ_topic 配置。在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下,默认是DEFAULT_GROUP 。如果需要自定义自己的Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group= GROUP_ZMZ
Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置 集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命 名规则保证全局唯一性。此命名规则非强制。
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
String orderName = applicationContext.getEnvironment().getProperty("order.name");
String num = applicationContext.getEnvironment().getProperty("order.num");
String userConfig = applicationContext.getEnvironment().getProperty("user.config");
System.out.println("order name :" + orderName + "; num: " + num);
System.out.println("userConfig :" + userConfig);
}
}
spring:
application:
name: com.zmz.order
cloud:
nacos:
server-addr: 192.168.13.1:8848
username: nacos
password: nacos
config:
namespace: public
# namespace: 8f46651d-94f6-4697-8054-8bc25b815165
file-extension: yaml
# refresh-enabled: false 客户端将无法感知配置的变化
group: DEFAULT_GROUP
shared-configs:
- data-id: com.zdy.common.properties
refresh: true
extension-configs:
- data-id: com.extension.common.properties
refresh: true
#Nacos客户端默认是Properties类型的配置如果想使用yml需要 file-extension: yaml(只针对默认配置文件和profile格式配置文件,可以自定义配置文件)
#除了默认的配置文件,其他配置文件必须写上后缀
#profile>默认配置文件>自定义配置文件( extension-configs:>shared-configs,在下表越大优先级越大)
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${user.name}")
public String userName;
@RequestMapping("/show")
public String show() {
return userName;
}
}