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