1、什么是Nacos?
Nacos是Dynamic Naming and Configuration Service(动态命名和配置服务)的首字母简称,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos由阿里巴巴开源,致力于帮助用户发现、配置和管理微服务。
Nacos提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。它是构建以“服务”为中心的现代应用架构(如微服务范式、云原生范式)的服务基础设施。
2、CAP理论
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分区容错性(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
3、BASE理论
- Basically Available(基本可用)
- Soft state(软状态)
- Eventually consistent(最终一致性)
- BASE理论是对CAP中一致性和可用性权衡的结果, 是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
4、Nacos 服务注册需要具备的能力?
- 服务提供者把自己的协议地址注册到Nacos server
- 服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称)
- Nacos Server需要感知到服务提供者的上下线的变化
- 服务消费者需要动态感知到Nacos Server端服务地址的变化
5、Nacos运行原理
Nacos注册概括来说有6个步骤:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
5.1、注册中心原理
每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败,则认为实例不健康,如果30秒内健康检查失败,则移除实例。
5.2、配置中心原理
5.3、Nacos配置文件每次更新了配置,服务器都要重启才能拉取到最新的配置。有没有方法更新了配置后就能拿到?
首先要知道当项目启动是怎么去加载配置的,和我们修改配置后会怎样?以下是大概流程
加载配置
修改配置
使用以下注解搭配
- @NacosValue 注解用于从 Nacos 配置中心注入配置属性到 Spring Bean 中。虽然它可以自动刷新配置,但需要 autoRefreshed = true,并且通常还需要 @RefreshScope 来确保 Bean 重新加载
- @NacosValue(value = "${my.config.value}", autoRefreshed = true)
- @NacosConfigListener 注解用于监听 Nacos 配置的变化,当指定的配置属性发生变化时,会触发对应的方法。你可以在这个方法中手动刷新相关的配置或触发其他刷新机制
- @NacosConfigListener(dataId = "my-config.yaml", groupId = "DEFAULT_GROUP")
public void onChange(String newConfig) {
System.out.println("Configuration changed: " + newConfig);
// 在这里处理配置变更,例如刷新缓存
}
- @ConfigurationProperties 注解用于将配置属性绑定到 Java 对象的字段中。要实现动态刷新,需要结合 @RefreshScope
- @ConfigurationProperties(prefix = "my.config")
- @RefreshScope:用于动态刷新 Spring Bean,确保应用最新的配置
6、Nacos 服务发现产品对比
7、面试题思考
- 为什么要将服务注册到nacos?
- 在Nacos中服务提供者是如何向Nacos注册中心续约的?
- 对于Nacos服务来讲它是如何判定服务实例的状态?
- 服务启动时如何找到服务启动注册配置类?
- 服务消费方是如何调用服务提供方的服务的?
- Nacos中的负责均衡底层是如何实现的?
- Ribbon 是什么?
- Ribbon 可以解决什么问题?
- Ribbon 内置的负载策略都有哪些?
- 我们可以自己定义负载均衡策略吗?