第一章 Nacos实现配置中心
第二章 Nacos实现注册中心
目录
系列文章目录
前言
一、什么是 Nacos?
二、使用步骤
1.下载Nacos
2.单机启动Nacos
3.快速开始
4.支持配置的动态更新
5.支持自定义 namespace 的配置
6.@RefreshScope的使用
总结
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
。
下载地址:
https://github.com/alibaba/nacos/releases
# Standalone means it is non-cluster Mode.
$ sh startup.sh -m standalone
适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
org.springframework.boot spring-boot-starter-web 2.3.2.RELEASE com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2.2.5.RELEASE
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:
bootstrap.properties
spring.application.name=nacos-test spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.file-extension=yaml
在 Nacos 的控制台新增一个dataId为yaml为扩展名的配置,如下所示:
Data ID: nacos-test
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: user.name: nacos-config-yaml
user.age: 68
启动这个 Example,可以看到如下输出结果:
user name :nacos-config-yaml; age: 68
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.out.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
如下所示,当变更user.name时,应用程序中能够获取到最新的值:
user name :nacos-config-yaml; age: 68
2023-02-16 11:55:37.866 INFO 12843 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : [fixed-106.39.203.147_8848] [polling-resp] config changed. dataId=nacos-test, group=DEFAULT_GROUP
2023-02-16 11:55:37.867 INFO 12843 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[nacos-test+DEFAULT_GROUP]
2023-02-16 11:55:37.887 INFO 12843 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : [fixed-106.39.203.147_8848] [data-received] dataId=nacos-test, group=DEFAULT_GROUP, tenant=null, md5=0a99e396565f0a06fa2118431bbf60c1, content=user.name: nacos-test-yaml
user.age: 30, type=yaml
首先看一下 Nacos 的 Namespace 的概念
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境test和生产环境prod的资源(如配置、服务)隔离等。
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置。
通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新:
SysConfig 配置类代码
@Data
@Component
@RefreshScope
public class SysConfig {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private Integer age;
}
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
SysConfig sysConfig = applicationContext.getBean(SysConfig.class);
while (true) {
System.out.println("user name :" + sysConfig.getName() + "; age: " + sysConfig.getAge());
TimeUnit.SECONDS.sleep(1);
}
}
}
启动这个 Example,可以看到如下输出结果:
user name :nacos-test-yaml; age: 30
2023-02-16 13:38:08.638 INFO 12961 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : [fixed-106.39.203.147_8848] [polling-resp] config changed. dataId=nacos-test, group=DEFAULT_GROUP
2023-02-16 13:38:08.645 INFO 12961 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[nacos-test+DEFAULT_GROUP]
2023-02-16 13:38:08.665 INFO 12961 --- [39.203.147_8848] c.a.n.client.config.impl.ClientWorker : [fixed-106.39.203.147_8848] [data-received] dataId=nacos-test, group=DEFAULT_GROUP, tenant=null, md5=4473c96879b428cea2afb15141524c7e, content=user.name: nacos-test
user.age: 20, type=yaml
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 · alibaba/spring-cloud-alibaba Wiki · GitHub