nacos面试题
nacos简介
它是阿里开源的 SpringCloud Alibaba 项目下的一项技术,主要用于服务发现、服务配置和服务管理
另外还提供了动态dns功能(将服务名解析为实际的IP端口信息)
SpringCloud Alibaba说明
是阿里提供的微服务开发的一站式解决方案,此项目包含开发分布式应用微服务的必需组件
开源组件:
Sentinel :用于流量控制、熔断降级、系统负载保护等保护服务的稳定性。
Nacos :用于动态服务发现、配置管理和服务管理。
RocketMQ :分布式消息系统。
Dubbo : 高性能 Java RPC 框架。
Seata :高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具。
商业化组件:
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS : 阿里云对象存储服务。
Alibaba Cloud SchedulerX : 分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS : 短信服务。
nocos提供的功能
主要提供的功能是:
作为微服务的注册中心,提供服务的注册与发现功能
作为微服务的分布式配置中心,提供统一配置管理,动态配置修改等功能
注册中心
注册中心的概念和作用
注册中心用来记录服务实例的地址信息,主要用于服务的发现和路由。
作用:
服务注册:服务提供者在启动时将自己的信息(比如 IP 地址、端口号、服务名称等)注册到注册中心。nacos服务将这些信息保存到内存或数据库中。
服务发现:服务消费者通过向注册中心查询服务信息,获取可用的服务实例列表。才能做进一步的调用
健康检查:注册中心通过服务端临时实例定期上报或向永久实例主动调用了解服务的健康状态
注册中心的机制
- 服务实例启动时通过引用的nacos的sdk主动向注册中心登记自己的地址信息(服务名、IP地址、端口等),nacos保存这些信息(临时实例保存到内存,永久实例保存到磁盘)
- 客户端启动时从nacos获取服务端列表
- 服务实例停止运行的时候,主动让注册中心销毁自己的信息
- 服务实例不是主动停止,而是因为故障等原因死掉的,注册中心会通过心跳机制发现示例异常,对其清理
一个服务实例在调用另一个服务时,根据本地缓存的服务端列表根据负载均衡策略来选择服务端实例进行调用。
nocos服务未启动依赖nacos的服务能启动成功吗
启动不成功
nacos服务是如何判断服务状态的
对于临时实例,微服务每5秒发送一次心跳信息(服务是否正常运行、负载情况、资源消耗等)到nacos,如果超过15秒没有发送,就会标记为不健康状态
超过30秒后没有发送,就会将该服务标记为不可用状态
对于永久实例,nocos默认20s主动探知客户端健康状态,如果失败,会设置为不健康状态
实例概念
服务具有可访问网络地址(IP:Port)的进程。
权重概念
实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。
健康检查
以指定方式检查服务下挂载的实例 的健康度,从而确认该实例 是否能提供服务。根据检查结果,实例 会被判断为健康或不健康。对服务发起解析请求时,不健康的实例不会返回给客户端。
健康保护阈值
为了防止因过多实例 不健康导致流量全部流向健康实例 ,继而造成流量压力把健康实例压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例数占总服务实例数 的比例小于该值时,无论实例是否健康,都会将这个实例 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群中剩余健康实例能正常工作。
服务的发现机制概念
服务调用时必须知道目标服务实例的 IP、端口、API 接口。
而获取这些信息的逻辑原理就是服务发现机制
nacos负载均衡
基于权重的负载均衡:实例权重越大,流量越大
基于标签
配置中心
提供的功能
动态更新:可以通过操作界面或 API 进行动态更新,无需重启服务就可以应用最新的配置信息。
配置信息共享:将配置集中在配置中心中,不同的服务实例可以共享同一套配置信息。
信息追溯:支持配置版本管理、历史记录等管理功能。
分布式配置中心概念
服务的多个实例或多个服务都使用同一个配置文件,而不是每个实例或服务都使用自己独有的配置;使用分布式配置中心对于需要修改配置时,不用繁琐的修改每个配置并重启实例,直接修改一个配置文件即可。
如何基于nacos做动态配置
nacos配置管理中新建应用的配置文件如myapp-pro.yml(服务名-激活的profile名),并填写要动态更新的配置信息,如果使用@Value注入配置信息,可以在所在类上配置上@RefreshScope注解,如果使用标记有@ConfigurationProperties注解的配置类可以直接支持动态更新。
nacos配置实时更新原理
当客户端启动时,它会向Nacos服务器发送请求,以拉取初始的配置信息。
为了实现配置的动态更新,Nacos采用了长轮询机制。这意味着客户端会向服务器发起一个轮询请求,然后保持这个连接打开,等待服务器端的响应。如果服务器端的配置没有发生任何变更,这个连接会一直保持打开状态,直到配置发生变更或者连接超时为止。
当服务器端的配置信息发生变化时,Nacos服务器会通过建立的长连接主动通知客户端。因此客户端可以实时地感知到配置的变化。一旦客户端接收到配置变化的通知,它会重新从Nacos服务器获取最新的配置信息,并更新自己的运行环境。
长轮询连接的特点
当服务端有配置更新时,会立即将数据传递给客户端并断开连接。此时,客户端在接收到配置更新后会重新发起一个新的长轮询请求。
长轮询连接超时
如果一直没有数据变动,连接也会到指定时间而超时,这时客户端会重新发起长轮询请求。其他情况导致的连接中断或超时也会进行重新建立连接
nacos的注册表结构
Nacos最外层是namespace隔离环境,然后是group对服务进行分组,然后就是服务,一个服务下 有多个集群,集群下有多个实例。
对应Java代码,Map<String,Map<String,Service>>,最外层的key是namespaceId,值是map,内部map大的key是group拼接serviceName(group@@serviceName),值是service对象;service对象内部又是一个map,key是集群名称,值是Cluster对象,Cluster对象内部维护了实例对象集合。
服务调用端与nacos服务的交互
服务调用端在启动时,会向Nacos注册中心发送请求,获取所需调用的服务的注册信息,如服务的IP地址、端口号等。一旦服务调用端获取了这些信息,它就可以直接使用这些信息来构建请求,然后直接调用目标服务,而不需要再经过Nacos。
服务调用端在启动时,会订阅服务调用端的服务变化通知事件,如果服务提供端的健康状态变化,信息变化变动后,nacos会通知调用端更新本地的信息。
默认情况下服务调用端每次调用服务不会每次都去nacos查询最新的服务列表,会缓存到本地一份服务列表信息,有变动nacos通知了就进行更新,调用端也可以定期查询最新的列表更新本地信息
服务调用端启动的时候如果没有拉取到服务列表(服务提供者没有注册或其他)不会导致启动失败
如果服务提供者变为不健康状态,默认调用端就查不到该服务了,无法调用,可以配置负载均衡策略,可以降低不健康状态的权重(这种的服务调用者可以发现不健康的服务),它通常不会被服务消费者调用,或者调用的概率会大大降低。具体是否能不能被调用跟
服务端信息的获取:
定时拉取方式:客户端定时去nacos服务拉取服务端信息,性能消耗小。默认springboot采用的这种方式。
实时推送方式:客户端启动时订阅nacos消息,服务端健康状态变化nacos主动通知客户端。实时性高,需要nacos与客户端保持长连接。(默认没有采用这种方式)
一般推荐选用一种方式,避免重复更新。
负载均衡通过什么实现
Nacos实现负载均衡的底层是通过内置的Ribbon来实现的。默认的负载均衡策略是轮询,即按照顺序依次将请求分发到每个服务实例上。
提供了那些负载均衡策略:
随机:将请求随机分配到集群中的各个服务实例上。实例性能相近的情况下效果较好,能够实现较为均匀的负载分布。
轮询:按照顺序依次将请求分发到每个服务实例上。适用于服务实例性能差异不大且请求量相对稳定的情况。
hash:具有相同特征或关键字的请求能够被分配到同一台服务器上。这种策略有助于保持会话的连续性,特别是在需要会话保持的场景中。Ribbon自带的负载均衡策略中并没有直接的Hash策略。因此,你可能需要实现自定义的Hash策略类,并将其配置为负载均衡策略。并在配置文件中指定hash因子(用什么值做hash)
权重:根据服务实例的性能或其他因素为其分配不同的权重,然后根据权重进行请求的分配。这种策略能够考虑到服务实例之间的差异,实现更精确的负载均衡。
最小连接数:选择当前连接数最小的服务实例来处理请求。这种策略能够确保每个服务实例的连接数保持均衡,避免因某些实例连接数过多而导致性能下降。
最快响应速度:选择响应时间最短的服务实例来处理请求。这种策略适用于对响应速度要求较高的场景,能够确保请求得到快速处理。
Nacos支持自定义负载均衡策略。开发人员可以根据业务需求,实现自己的负载均衡算法,并通过配置使其生效。
负载均衡策略怎么配置
通过Nacos控制台调整(不需要重启nacos服务或调用或被调用方)
通过nacos提供的api进行修改,服务调用方通过调用nacos配置负载均衡策略的api,服务调用方服务启动时将负载均衡策略告诉nacos
服务调用段怎么启用负载均衡
在Spring Cloud中,使用@LoadBalanced注解可以帮助实现负载均衡。当使用@LoadBalanced注解时,Spring Cloud会创建一个支持负载均衡的RestTemplate
这个RestTemplate会利用Nacos等注册中心提供的服务发现机制,获取服务提供者的列表,并根据配置的负载均衡策略(如Hash、随机等)将请求分发到不同的服务实例上。Spring Cloud会为其添加一个LoadBalancerInterceptor拦截器,该拦截器会利用注册中心(如Nacos)提供的服务发现机制来获取服务提供者的列表,并根据配置的负载均衡策略将请求分发到不同的服务实例上。
如果没有@LoadBalanced注解,那么即使你的应用已经集成了Nacos作为服务注册与发现中心,Spring Cloud也不会自动为你处理负载均衡。在这种情况下,你可能需要自己编写代码来实现负载均衡逻辑,或者依赖于其他框架或组件来提供负载均衡功能。
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 使用@LoadBalanced注解启用负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
nacos宕机还能走负载均衡吗
服务调用端将无法正常走负载均衡,在这种情况下,服务调用端可能会尝试直接连接到服务提供者
Nacos配置中心宕机,还能读取到配置吗
可以,客户端读取到配置信息以后会缓存在本地内存,可以在内存中拿到数据
nocos客户端向注册中心续约
为了保证业务方服务的新增机器和机器下线等信息及时同步给消费者,提供者需定期向nacos服务器上报心跳包(默认5秒发送一次),告诉服务器自己还活着,如果nacos服务器15秒没有收到心跳包,就会把这个提供者标示为不健康,并通报给nacos客户端,如果服务器30秒没有收到心跳包,就会在nacos服务器上删除这个提供者,并把最新的提供者列表通过upd协议发送给nacos客户端。
nocosCAP
Nacos的 CP 和 AP 架构的选择,取决于我们配置的服务实例是临时实例还是持久实例
spring:
cloud:
nacos:
discovery:
ephemeral: false //false:持久化实例,使用 CP架构;true:临时实例,使用 AP架构
Nacos和Eureka区别
| Nacos | Eureka | |
| 服务发现 | Nacos采用定时拉取和订阅推送两种模式 | Eureka只支持定时拉取模式 |
| 实例类型 | Nacos有永久实例和临时实例两种 | Eureka 只有临时实例 |
| 健康检测 | Nacos对临时实例采用心跳检测,对永久实例采用主动请求 | Eureka 只支持心跳模式 |
临时实例与永久实例
临时实例:
临时实例是Nacos的默认注册方式。当服务以临时实例的形式注册时,它仅会存在于Nacos的内存中,而不会持久化到磁盘上。这种实例的健康检查机制采用Client模式,即客户端主动向nacos上报其健康状态。默认的心跳间隔为5秒,如果nacos在15秒内未收到来自客户端的心跳,会将其标记为“不健康”状态;而在30秒内如果收到心跳,则会重新恢复为“健康”状态。如果超过30s未收到心跳,该实例将从服务器内存中清除。
临时实例的特性使其特别适合应对流量突增的场景,服务可以进行弹性扩容,当流量过去后,服务停掉即可自动注销。
例如在容器化的环境中,实例可能在某个容器中启动,并在容器关闭时自动注销。
如果nacos是集群部署,当服务提供者注册到Nacos集群时,它会将自身的信息(如IP地址、端口号、服务名称等)存储到集群中的所有节点中,以确保信息的一致性和高可用性。
永久实例:
永久实例在被删除之前会永久存在于Nacos的注册中心。实例启动时将实例的信息注册到nacos,实例的信息会写到数据库进行存储。永久实例不会主动向注册中心上报心跳。因此,注册中心需要主动进行探活来检查其健康状态。永久实例的好处是运维人员可以实时看到实例的健康状态,便于后续的警告、扩容等操作。此外,它还可以提供阈值保护,当不健康比例超过设定阈值时,会执行熔断降权策略。
是注册到Nacos中的,它们会一直存在,除非手动从Nacos中注销。永久实例通常用于具有长期生命周期的服务,例如基于物理服务器的服务。
实例类型的配置:
可以在服务的代码或配置文件中设置实例为临时实例还是永久实例。
spring.cloud.nacos.discovery.ephemeral=true # true为临时实例,false为永久实例
对于临时实例和永久实例在nacos的管理页面都可以看到
nacos服务如何高可用
如使用集群模式部署Nacos,确保即使某个Nacos节点宕机,其他节点仍然可以提供服务。
监控Nacos服务的运行状态,及时发现并处理潜在的问题,确保服务的持续稳定运行。
nacos集群
在Nacos集群中,各个节点都是对等的,没有主从之分。
nacos集群怎么搭建
- 搭建数据库,初始化数据库表结构:Nacos默认数据存储在内嵌数据库Derby中,但生产环境下推荐使用带有主从的高可用数据库集群。这里以单点的数据库为例,可以先在数据库工具(如Navicat)中新建一个数据库,命名为nacos,然后导入Nacos所需的SQL语句来初始化数据库表结构。
- 下载Nacos安装包:从Nacos的官方网站下载对应版本的安装包。
- 配置Nacos:
- 修改cluster.conf文件:在Nacos的conf目录下找到cluster.conf文件,并添加所有Nacos节点的IP地址和端口号。
- 修改application.properties文件:同样在conf目录下,修改或添加必要的配置项,如数据库连接信息、集群模式等。
- 复制Nacos文件夹并修改配置文件:对于每个Nacos节点,需要复制一份完整的Nacos文件夹,并分别修改其配置文件以适配不同的节点。
- 启动Nacos集群:分别在每个Nacos节点的目录下启动Nacos服务。
- Nginx反向代理:官方给出的Nacos集群结构图中包含一个负载均衡器代理多个Nacos节点,这里负载均衡器可以使用Nginx。配置Nginx以实现反向代理,将外部请求分发到各个Nacos节点上。
nacos就近访问
就近访问指的是在服务间调用时,Nacos优先选择同一个集群内的实例进行调用。
这种机制是通过设置实例的cluster-name来进行划分集群,并根据cluster-name来判断两个实例是否属于同一个集群。当服务A需要调用服务B时,Nacos会首先查看服务A的实例所属的集群,并在调用服务B时,倾向于选择与服务A相同集群的服务B实例进行调用。
这种就近访问的机制有助于减少网络延迟,提高服务调用的效率。
保护阀值
保护阈值是设置集群中健康实例占比允许的最小值,它是一个0-1的浮点值,默认值为0。
当集群中的健康实例占比小于设置的保护阈值时,就会触发阈值保护功能。一旦触发此功能,Nacos在返回给客户端的实例信息时,会将所有实例(包括健康和不健康的实例)都返回给客户端,而不是仅返回健康实例。这样,客户端在调用服务时,会通过负载均衡算法在所有实例中选择一个实例进行调用,这有助于保护剩余的健康实例,防止因流量全部涌入剩余实例而造成的雪崩效应。因此,Nacos的保护阈值概念是为了确保集群中服务的高可用性和稳定性。
客户端在调用服务时就有可能调用到不健康的实例,存在调用失败的风险。
可以结合其他监控和告警机制,及时发现和处理不健康实例,确保服务的稳定性和可用性。对于关键业务场景,可以考虑使用熔断器、降级等策略来进一步保障服务的可靠性。

浙公网安备 33010602011771号