目录
1.什么是Nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
其实Nacos就是第一代微服务中的注册中心Eureka和Spring Cloud Config配置中心的合体,由国内知名的Bat公司Alibaba团队开源,在第二代微服务Spring Cloud Alibaba中被广泛使用,你完全可以使用nacos替换eureka和config这两个组件。
Nacos可以实现分布式`服务注册与发现`和`分布式配置中心动态`管理
2.nacos-client搭建
2.1新建springboot项目导入
<!--nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>alibaba</artifactId>
<groupId>com.zhengyang.springcloud</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-alibaba-provider</artifactId>
<dependencies>
<!-- web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除tomcat依赖 -->
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!--undertow容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud整合nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.springboot优先级
Spring Boot 配置文件的加载顺序:依次为 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置为最高优先级 。nacos官方文档要求,指定配置文件必须放在bootstrap.properties
或者bootstrap.yml
中加载初始化,因为在整个SpringBoot应用程序中bootstrap.properties/yml
类型的文件优先级最高加载,所以我们把配置文件都放入到bootstrap.yml
中。
4.bootstrap.yml
项目启动时加载和查找配置中心文件的过程原理:
项目启动的时候,默认会去加载查找Data ID为nacos-config.yaml
的配置文件;如果你设置了多环境配置profiles.active,这个时候不仅会默认加载nacos-config.yaml
,另外还会去加载查找nacos-config-dev.yaml
这个名称的文件。多环境下会加载查找两个文件,不指定多环境下会只默认加载一个。
你可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新
5.配置连接nocos
server:
port: 8715
spring:
cloud:
nacos:
discovery:
#Nacos服务器地址
server-addr: 127.0.0.1:8848
#开启服务注册与发现
enabled: true
#配置中心配置,默认自动去Nacos中找 spring-alibaba-provider.yaml
config:
#Nacos配置中心地址
server-addr: 127.0.0.1:8848
#分组选择
group: DEFAULT_GROUP
#类型(默认加载.properties),默认指定查找当前服务名称.yaml
file-extension: yaml
application:
name: spring-alibaba-provider
6.新建配置
7.读取配置文件
controller加上
@RefreshScope
: 在所要使用配置文件参数值的类上加这个注解会自动实现动态刷新,只要nacos-server端一有文件发生变化,会动态刷新配置。
/**
* @Author: Hello World
* @Date: 2021/7/20 12:36
* @Description:
*/
@RestController
@RequestMapping("/provider")
//动态刷新配置信息
@RefreshScope
public class ProductController {
@Value("${user.name}")
String userName;
@GetMapping("/get")
public String get(){
return "服务端被访问8715";
}
@GetMapping("/name/get")
public String getUserName(){
return userName;
}
}
8.启动
启动时已经加载了nacos中的配置文件
测试访问已经加载了nacaos配置的信息
9.切换配置文件
说明:可以使用active属性切换线上的配置文件
server:
port: 8715
spring:
cloud:
nacos:
discovery:
#Nacos服务器地址
server-addr: 127.0.0.1:8848
#开启服务注册与发现
enabled: true
#配置中心配置,默认自动去Nacos中找 spring-alibaba-provider.yaml
config:
#Nacos配置中心地址
server-addr: 127.0.0.1:8848
#分组选择
group: DEFAULT_GROUP
#类型(默认加载.properties),默认指定查找当前服务名称.yaml
file-extension: yaml
application:
name: spring-alibaba-provider
profiles:
active: pro
Nacos配置中心原理总结
在长轮询的任务中,当服务端配置信息发生变更时,客户端将最新的数据获取下来之后,保存在了 CacheData 中,同时更新了该 CacheData 的md5值,所以当下次执行 checkListenerMd5 方法时,对前后两次的MD5值作比对,就会发现当前listener所持有的 md5 值已经和 CacheData 的 md5 值不一样了,也就意味着服务端的配置信息发生改变了,这时就需要将最新的数据通知给 Listener 的持有者。
至此配置中心的完整流程已经分析完毕了,可以发现,Nacos 并不是通过推的方式将服务端最新的配置信息发送给客户端的,而是客户端维护了一个长轮询的任务,定时去拉取发生变更的配置信息,然后将最新的数据推送给 Listener 的持有者。