文章目录
简介
Nacos有注册中心和配置中心的功能,先单独介绍配置中心。
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。Nacos 的获取和启动方式可以参考 Nacos 官网。
问题:
项目集成
Nacos Config 引入的方式同样也有两种,即 Aliyun Java Initializr 引入和Maven pom.xml 依赖。官方推荐使用 Aliyun Java Initializr 方式引入 Nacos Config,以便简化组件之间的依赖关系。
Pom.xml 示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.laker</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.laker.config.ConfigApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
启动Nacos Server
参考解决Nacos Server国内下载速度缓慢的问题下载启动
用户名密码默认都是:nacos
Nacos Server添加配置
- Nacos Server配置
- bootstrap.yml配置
- 代码配置
整体如下图:
常用功能介绍
仅描述如何使用,原理参考后面文章。
使用 Nacos Config 作为 Spring Cloud 分布式配置
启动类
@SpringBootApplication
public class NacosConfigSampleApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigSampleApplication.class, args
);
}
}
配置类
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${laker.name}")
private String lakerName;
@RequestMapping("/get")
public String get() {
return lakerName;
}
}
验证
浏览器访问:http://ip:port/config/get
.
使用 Nacos Config 实现 Bean 动态刷新
Nacos Confg 支持标准 Spring Cloud @ RefreshScope
特性,即应用订阅某个Nacos 配置后,当配置内容变化时,Refresh Scope Beans 中的绑定配置的属性将有条件的更新。所谓的条件是指 Bean 必须:
- 必须条件:Bean 的声明类必须标注 @
RefreshScope
- 二选一条件:
- 属性(非 static 字段)标注 @
Value
- @
ConfigurationProperties
Bean
- 属性(非 static 字段)标注 @
除此之外,Nacos Confg 也引入了 Nacos Client 底层数据变化监听接口,
即 com.alibaba.nacos.api.config.listener.Listener。下面的内容将分别讨论这三种不同
的使用场景。
Nacos Client:Nacos 客户端 API,也是 Nacos Config 底层依赖
Bean @Value 属性动态刷新
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${laker.name}")
private String lakerName;
@RequestMapping("/get")
public String get() {
return lakerName;
}
@PostConstruct
public void init() {
System.out.printf("---[init]--- laker name : %s ", lakerName);
}
}
@ConfigurationProperties Bean属性动态刷新
- 激活 @ConfigurationProperties Bean @EnableConfigurationProperties(
User.class)。 - 通过 @Autowired 依赖注入 User Bean。
@RefreshScope
@ConfigurationProperties(prefix = "laker")
public class User {
private String name;
private int age;
}
启动类
@EnableConfigurationProperties(User.class)
@SpringBootApplication
public class NacosConfigSampleApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigSampleApplication.class, args
);
}
}
使用 Nacos g Config 监听实现 Bean 属性动态刷新
前文曾提及 com.alibaba.nacos.api.config.listener.Listener 是 Nacos ClientAPI 标准的配置监听器接口,由于仅监听配置内容,并不能直接与 Spring 体系打通,因此,需要借助于 Spring Cloud Alibaba Nacos Config API NacosConfigManager
@SpringBootApplication
public class NacosConfigSampleApplication {
@Autowired
private NacosConfigManager nacosConfigManager;
public static void main(String[] args) {
SpringApplication.run(NacosConfigSampleApplication.class, args
);
}
@Bean
public ApplicationRunner runner() {
return args -> {
String dataId = "laker-dev.yaml";
String group = "DEFAULT_GROUP";
nacosConfigManager.getConfigService().addListener(dataId, group, new
AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("[Listener] " + configInfo);
}
});
};
}
}
[Listener] laker:
name: laker1222222
参考:
- Spring Cloud Alibaba从入门到实战.pdf
关注我的公众号【Java大厂面试官】,回复:100 即可下载
本系列目录