1、nacos配置中心
1.1、配置中心简介
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置
1.1.1、特点
维护性
比如我有多个微服务连接的一个redis,那么多个微服务可以读取我配置中心的一个关于连接redis的配置。这样达到中心化效果。如果原来这个redis我需要更换,那么我只需要修改这一个配置类即可
时效性
修改配置类,所有服务同时生效,并在nacos能够实时更新配置类而不暂停服务
安全性
一些配置有id,账号密码,盐等信息。传统业务中需要在微服务中的配置类里面写,就会暴露在程序员眼中。
1.1.2、与Spring-cloud-config对比
三大优势:
- springcloud-config大部分场景是结合git使用的,动态变更还需要依赖Springcloud-Bug消息总线来监听客户端变化
- springcloud-config不提供可视化界面
- nacos config使用长轮询更新配置,一旦配置有变动,通知provider的过程非常迅速,也就是配置生效很快
1.2、使用配置中心
我们可以通过配置中心的命名空间,来隔离生产,线上,测试等等环境
同时,我们也可以通过权限控制,控制nacos用户对命名空间,以及配置的读写权限。
注意,我们需要开启nacos的权限校验功能,在nacos的配置类中
1.2.1、步骤
1.配置一个config
2.引入config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
我们可能会出现不存在bootstrap
这个包的情况,只有依赖了这个包才可以使用bootstrap.yaml
文件,建议加上。
3.新建bootstrap.yaml文件
在springcloud中,我们的远程配置文件会采用bootstrap.yaml(properties)的方式加载,在这里面写上我们需要连接的配置中心的配置即可,远程配置中心会进行替换成我们所配置的内容
注意:nacos中配置的data ID与这里配置的项目启动名要一致,这是主配置类的文件名,默认读取项目启动名称
spring:
application:
# 项目启动名
name: com.hy.order-nacos-config-learn
# bootstrap配置的是nacos config的信息
spring:
application:
# 配置类名称
name: com.hy.order-nacos-config-learn
cloud:
nacos:
config:
# 配置类文件扩展名
file-extension: yaml
# 命名空间
namespace: a048578c-ec50-4db1-bfd7-f8f69eb96622
# 用户名
username: nacos
# 密码
password: LM647688lx
#nacos config地址
server-addr: "lmlx66.top:8848"
4.启动测试即可
@SpringBootApplication
@RefreshScope
public class NacosConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while (true) {
String name = applicationContext.getEnvironment().getProperty("name");
System.out.println(name);
Thread.sleep(2000);
}
}
}
4.动态感知实时刷新config
我们只需要在主类上添加@RefreshScope
注解,就可以动态的感知配置类的改变
原理:nacos client每零点五毫秒就会向nacos serve发送一个请求,对比配置类的加密md5信息,如果不对应,则表示配置文件发生了改变,就会向nacos读取相对应的配置文件
当然,@RefreshScope
也可以加在bean上面,当配置文件改变的时候,会重新加载此bean
但请注意,使用@Value加载的字段,是不会动态刷新的。
1.2.2、配置文件详解
1.文件扩展名
nacos客户端默认是properties的文件拓展名,如果我们需要使用yaml,就必须在配置中声明是yaml格式
2.所有yaml配置
配置项 | key | 默认值 | 说明 |
服务端地址 | spring.cloud.nacos.config.server-addr | ||
DataId前缀 | spring.cloud.nacos.config.prefix | spring.application.name | |
Group | spring.cloud.nacos.config.group | DEFAULT_GROUP | |
dataID后缀及内容文件格式 | spring.cloud.nacos.config.file-extension | properties | dataId的后缀,同时也是配置内容的文件格式,目前只支持 properties |
配置内容的编码方式 | spring.cloud.nacos.config.encode | UTF-8 | 配置的编码 |
获取配置的超时时间 | spring.cloud.nacos.config.timeout | 3000 | 单位为 ms |
配置的命名空间 | spring.cloud.nacos.config.namespace | 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。 | |
AccessKey | spring.cloud.nacos.config.access-key | ||
SecretKey | spring.cloud.nacos.config.secret-key | ||
相对路径 | spring.cloud.nacos.config.context-path | 服务端 API 的相对路径 | |
接入点 | spring.cloud.nacos.config.endpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否开启监听和自动刷新 | spring.cloud.nacos.config.refresh-enabled | true |
3.配置隔离
配置隔离是很重要的操作
我们推荐使用namespace来隔离环境,如生产环境,线上环境,测试环境
我们推荐使用group来隔离项目配置,如生产者配置,消费者配置,注册中心配置
我们推荐DataID来隔离工程配置,如注册中心的redis配置,注册中心的mq配置
4.拓展DataID配置
我们知道,一个配置可能会多个微服务使用,多个微服务也可以使用多个配置,那么我们就可以拓展DataID配置,使用多个配置一起拼接起来
拓展DataId有两种方式,使用extension-configs和使用shared-configs
4.1.使用extension-configs
示例如下
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
可以看到:
- 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式来支持多个 Data Id 的配置。 - 通过
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。 - 通过
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的
Note | 多个 Data Id 同时配置时,他的优先级关系是spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高 |
---|
Note | spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响 |
---|
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件
4.2.使用shared-configs
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true
可以看到:
- 通过
spring.cloud.nacos.config.shared-configs[n].data-id
来支持多个共享 Data Id 的配置 - 通过
spring.cloud.nacos.config.shared-configs[n].group
来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP - 通过
spring.cloud.nacos.config.shared-configs[n].refresh
来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false
4.3.两个配置的区别
实际上,shared-configs和extension-config使用方式,包括共享都是一模一样的,只有优先级不同
而我们shared-configs其实是为了明确的告诉配置者,这么一个config是共享的,实际上extension也可以共享
优先级:shared < extension < 通过id自动生成的主配置类