
Nacos介绍
nacos是一个构建云原生应、开源的动态服务发现、配置管理和服务管理平台。
nacos支持多种注册中心和配置管理器,包括SpringCloud Discovery、Dubbo、Kubernetes和Apache ServiceComb等。
nacos提供了REST、gPRC 和 Java SDK 等多种API,使得开发人员可以轻松地与Nacos进行交互。
Nacos提供的主要功能
服务发现与服务健康检查:使服务更容易注册,并通过DNS或HTTP接口发现其他服务,提供实时健康检查,防止向不健康的主机或服务实例发送请求。
**动态配置管理:**允许在所有环境中以集中和动态的方式管理所有服务的配置,消除在更新配置时重新部署应用程序的需求,使配置更改更加高效和灵活。
**动态DNS服务:**提供基于DNS协议的服务发现能力,支持异构语言的服务发现,方便三方应用查阅和发现。
服务和元数据管理:从微服务平台建设的视角管理数据中心的所有服务以及元数据,包括服务描述、生命周期、静态依赖分析、健康状态、流量管理、路由和安全策略。
Nacos两大组件
|--------------|-------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 组件 | 描述 | 功能 |
| Nacos Server | Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。 | 1. Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。 2. Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。 |
| Nacos Client | Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 | 1. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。 2. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。 |

数据模型(配置和服务的组织形式)
Nacos 数据模型 key 由三元组唯一确认。NameSpace默认是空串,公共命名空间(public)。分组默认是DEFAULT_GROUP。

命名空间(Namespace)
Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境(dev)和生产环境(pro)的资源(如配置、服务)隔离等。
可以隔离开发环境------测试环境和生产环境,因为它们的配置可能各不相同;
可以隔离不同的用户------不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或配置集。
配置分组(group)
Nacos 中的一组配置集,一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集,默认采用 DEFAULT_GROUP 。
配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
配置集/配置集ID(Service/DataId)
配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。每个配置集都可以被一个有意义的名称标识------配置集 ID (Data ID)。
Nacos 实现原理

注册中心的原理

服务注册方法:
以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。涉及到了心跳机制。

配置中心管理

Nacos服务注册和订阅的完整流程
Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。
SpringCloud集成nacos
Nacos 融合 Spring Cloud,成为注册配置中心
Nacos动态DNS服务
Nacos支持基于DNS的服务发现模式。传统的DNS服务可以解析服务名到服务实例的IP地址,Nacos提供了类似的功能,允许服务通过DNS方式动态解析服务的地址。相比于传统的DNS服务,Nacos的DNS支持动态更新,能够反映服务实例的变动(新增、删除、健康检查等)
Nacos 心跳检测
为了保证服务状态是否可用,鼓舞提供者需要定期向Nacos发送心跳包。如果Nacos在一定时间内没有收到某个服务者的心跳,则会认为这个服务不可用,并将其从服务列表中进行删除。在Nacos中,默认情况下,服务提供者每5秒发送一次心跳包。如果超过15秒没有收到心跳指令,nacos会将还服务实例的健康状态标记为不健康;如果超过30秒没有收到心跳,Nacos会直接将服务实例从服务列表中剔除。当服务实例恢复正常并重新发送心跳时,Nacos会重新将其进行上线到服务列表中。
@RefreshScope 用于实现热插拔和动态刷新配置
@RefreshScope 注解修饰的类,可以保证修改完nacos之后,可以不用重启,获取的配置是修改之后的内容。
javapackage com.hb.config.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/config") @RefreshScope // 用于实现热插拔和动态刷新配置 public class ConfigController { @Value("${city.address}") // 获取的事 appliaction.yml 中 的配置 public String address; @Value("${user.name}") // 获取的是 nacos中的配置 public String username; @RequestMapping("/show") public String show(){ System.out.println("address = " + address); System.out.println("username = " + username); return username; } }
Nacos面试
1.Nacos是什么?有哪些核心功能?
Nacos是一个由阿里巴巴开源的、面向云原生应用的、高度可扩展的服务发现、配置管理和动态DNS服务平台、Nacos的核心功能包括:
服务发现:Nacos支持多种服务发现方式,如DNS方式、Http和RPC方式,帮助应用快速发现并连接到其他服务。
配置管理:Nacos提供了一个集中式的配置管理平台,使得应用可以通过配置文件的方式获取动态配置,无需重启应用即可生效。
动态DNS服务:Nacos提供了一个类似DNS的服务,用于解决服务之间的命名和寻址问题
2.Nacos的服务发现原理是什么?
Nacos的服务发现主要基于DNS方式。当一个应用需要发现其他服务时,它会向Nacos的DNS服务器发起请求。Nacos的DNS服务器会根据服务名称解析出对应的服务IP地址,并将结果返回给应用。
3.Nacos的配置管理原理是什么?
Nacos的配置管理分为两种模式:文件模式和控制台模式。文件模式下,应用通过读取Nacos提供的配置文件来获取动态配置;控制台模式下,应用可以通过控制台直接修改配置,Nacos会实时推送配置变更到应用。无论哪种模式,应用都不需要重启即可生效。
4.Nacos的动态DNS服务原理是什么?
Nacos 的动态 DNS 服务原理类似于传统 DNS 服务。当一个应用需要注册到 Nacos 时,它会向 Nacos 的 DNS 服务器发起请求。Nacos 的 DNS 服务器会根据应用提供的服务名称创建一个相应的 DNS 记录,并将该记录存储在 Nacos 的 DNS 解析中。当其他应用需要查询该服务的 IP 地址时,它可以通过 Nacos 的 DNS 服务器来获取结果。
5.Nacos 如何实现负载均衡?
Nacos 的负载均衡主要依赖于其服务发现功能。当一个应用需要负载均衡时,它可以通过 Nacos 的服务发现功能获取到所有可用的服务实例。然后,应用可以根据一定的策略(如轮询、最少连接数等)选择一个可用的服务实例进行请求。
6.Nacos 如何保证数据的一致性?
Nacos 提供了强一致性和最终一致性两种数据一致性保障策略。强一致性要求 Nacos 的所有节点必须保证数据的实时同步,适用于对数据一致性要求较高的场景;最终一致性则允许 Nacos 的节点在一段时间内数据不一致,但最终会达到一致状态,适用于对数据一致性要求不高的场景。
7.Nacos 如何实现高可用?
Nacos 提供了多种高可用策略,如主从复制、数据分片、多活等。主从复制策略下,Nacos 的所有数据都会在主节点和从节点之间实时同步,从而保证主节点故障时,从节点可以接管服务;数据分片策略下,Nacos 的数据会被切分成多个片段,存储在不同的节点上,从而提高数据的可用性;多活策略下,Nacos 支持多个节点同时对外提供服务,进一步提高服务的可用性。
8.Nacos服务是如何判定服务实例的状态?
通过发送心跳包,5秒发送一次,如果15秒没有回应,则说明服务出现了问题,
如果30秒后没有回应,则说明服务已经停止。
9.服务消费方是如何调用服务提供方的服务的?
通过创建RestTemplate对象来实现。
10.@LoadBalanced的作用是什么?
描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。
底层实现:
- 拦截 RestTemplate 的请求
- 去 Nacos 拉取这个服务名对应的所有可用实例 IP 列表
- 用内置
LoadBalancer负载均衡规则(轮询 / 随机等)挑一个实例- 把服务名自动替换成真实 IP + 端口,发起调用