目录
传送门
Spring Cloud Alibaba系列之nacos:(1)安装
Spring Cloud Alibaba系列之nacos:(2)单机模式支持mysql
Spring Cloud Alibaba系列之nacos:(3)服务注册发现
由于之前已经有了springboot项目,并把它改造为了spring cloud,集成nacos做了服务注册发现。
这里在使用一下nacos的配置管理功能
Nacos config
看一下官方对它的功能描述
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
尝试对它做一个总结
- nacos config用做分布式配置管理
- 是用于替代Spring cloud组件中的config组件的
对于应用程序来说,一般配置文件都是必不可少的,不论是系统配置文件,比如
- jdbc连接信息,redis连接信息,nacos server地址等
- 外部系统调用地址,域名等
还是业务配置,比如
- 系统黑白名单,灰度策略等
- 功能开关等
- 甚至是一些营销显示方案等
这些既可以放在系统工程中,跟着程序打包部署,也可以放在外部配置,比如db或者git上面。
而系统配置放在什么地方,也是随着系统的演进及特点不断变化
配置放在系统工程中
最开始是单体系统时,在单机部署情况下,系统配置可以放在系统工程中,比如就是一个java的properties配置文件,里面配置了db等连接信息,应用程序启动时,将配置文件读取进程序中
但是这样会带来一个问题时,如果要改动配置信息会比较麻烦,需要重新打包部署
配置放在系统外部
单体系统时,在单机部署情况下,如果要更改配置信息,这个时候需要重新打包部署,所以可以把配置文件到系统外部,比如db或单独的配置文件,系统运行时,动态读取,甚至做成外部的配置服务,通过接口调用来获取,这样更新就不会导致应用重新打包部署
分布式带来的配置管理问题
等系统如果单机支撑不了的时候,往往会用集群部署。这个时候,如果需要更新配置文件,需要在每一个节点都要进行更新;并且伴随着服务化,应用会越来越多,配置也成倍增加。所以需要一个统一的分布式配置管理系统来集中管理配置。比如开源的diamond,apollo,以及spring cloud config。
而Spring Cloud Alibaba的nacos也提供了类似服务
快速开始
还是以上一节的代码为例,进行集成nacos config
版本选择
引入maven版本
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
Nacos 服务端初始化
先在nacos sever控制台新增一个配置文件,相关信息
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: user.name=nacos-config-properties
user.age=90
添加好了之后,如下
注意dataid是以 properties(默认的文件扩展名方式)为扩展名。
客户端使用方式
必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:
bootstrap.properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
然后在启动时,获取一下配置信息并打印
@SpringBootApplication
@EnableDiscoveryClient
public class AuthApplication
{
public static void main(String[] args)
{
SpringApplication.run(AuthApplication.class, args);
ConfigurableApplicationContext applicationContext = SpringApplication.run(AuthApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
}
}
可以在控制台查看,具体有哪些客户端应用在读取这分文件
支持yaml文件
spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。这个时候只需要完成以下两步:
- 在应用的 bootstrap.properties 配置文件中显示的声明 dataid 文件扩展名
如下所示bootstrap.properties
spring.cloud.nacos.config.file-extension=yaml
在 Nacos 的控制台新增一个dataid为yaml为扩展名的配置,如下所示:
Data ID: auth.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: user.name: nacos-config-yaml
user.age: 68
添加好了之后,如下
然后在启动时,获取一下配置信息并打印,跟上面效果对比五。
这里要解释一下下面这个格式配置,表示指定配置文件是什么格式,如果是yaml文件则为yaml
spring.cloud.nacos.config.file-extension
那上面的properties文件为什么不用指定呢?因为默认是properties文件的,所以可以不指定
支持配置的动态更新
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,创建一个controller来测试一下
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
/**
* http://localhost:8080/config/get
*/
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
在刚才的配置文件里面加上useLocalCache: true
请求一下http://localhost:8080/config/get,会显示true,然后控制台修改useLocalCache: false,再次请求,会发现值显示为false了,表示动态修改配置文件刷新了
如果修改配置之后,要做业务自定义处理,比如黑白名单刷新之后,要刷新缓存之类,还可以通过Nacos的监听器来实现
你可以通过配置spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新
支持自定义 namespace 的配置
首先看一下 Nacos 的 Namespace 的概念, Nacos 概念
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
所以现在建一个 namespace,比如dev,
并且建立对应的配置文件,同上
bootstrap.properties 文件中配置
spring.cloud.nacos.config.namespace=f9018f1d-daf7-4a8f-aa1c-927f60992cb7
重启应用,看下日志打印即可
该配置必须放在 bootstrap.properties 文件中。此外
spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。