参考《Spring Cloud Alibaba 微服务原理与实战》
Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于解决微服务中的统一配置,它提供了一组简单易用的特性及,囊住开发者快速实现动态服务发现、服务配置、服务元数据及流量管理
Nacous支持基于 DNS和基于RPC的服务发现,服务提供者使用原生SDK,OpenApi或一个独立的AgentTODO注册Service后,服务消费者可以使用DNS或HTTP&API查找和发现服务
Nacos提供对服务实时的健康检查,阻止像不见看的主机或者服务实例发送请求
Nacos 提供了一个简洁易用的UI帮助用户管理所有服务的配置。Nacos还提供了包括配置版本跟踪、金丝雀发布、一键回滚配置及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助用户更安全地在生产环境中管理配置变更,降低配置变更带来的风险。
动态DNS支持权重路由,让开发者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制,以及数据中心内网的简单DNS解析服务。
Nacos 可以使开发者从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析,服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA及重要的metrics统计数据。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
# Spring
spring:
application:
# 应用名称
name: zcct-discovery
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
<!--Nacos Config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
# Spring
spring:
application:
# 应用名称
name: zcct-discovery
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
@Component
public class TestService {
@Value("${myName}")
String MyName;
public String getMyName() {
return MyName;
}
}
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(ZcctDiscoveryApplication.class, args);
TestService testService = (TestService)run.getBean("testService");
System.out.printf(testService.getMyName());
}
也就是修改在配置中心上的值之后,应用程序需要感知值的变化,
ConfigurableApplicationContext run = SpringApplication.run(ZcctDiscoveryApplication.class, args);
// TestService testService = (TestService)run.getBean("testService");
while (true) {
System.out.println(run.getEnvironment().getProperty("myName"));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
在前面使用的配置中心都在用默认的Namespace:public 和 Group:DFFAULT_GROUP,Nacos的数据模型Key室友三元组来进行唯一确认的,其中 Namespace 解决了多环境及多租户数据隔离问题,Group时Nacos中用来实现Data ID 分组管理机制,它可以实现不用的Service/dataid的隔离
在程序中的配置
在 Nacos 中的配置
Nacos 提供了集群架构,防止单点故障,包含一个leader节点和多个Foower节点。,他的数据一致性算法采用的是 Ralf,同样采用了该算法的中间件有 , Redis Sentinel 的Leader 选举
Nacos 机构图
服务注册的功能只要体现在:
Nacos Config,其实就是提供了配置的集中式管理功能,然后对外提供了CRUD的访问接口,是得系统可以完成配置的基本操作
当配置发生变化时,需要让相关的应用程序感知到配置的变化进而感知应用变化,
pull 模式下,需要定时拉取数据,不能够保证数据的实时性,并且数据没有变化时会做很多无效的pull
push模式下,服务端和客户端需要维持长连接,如果客户端比较多,服务端要耗费大量的内存来维护连接,并且为了检测连接的有效性,还需要心跳机制来维持每个连接的状态
Nacos 是采用Pull模式,它采用长轮询机制,他结合Push和pull两者的优势。