黑马程序员自用-Nacos、Sentinel相关面试问题

本文详细解答了关于Nacos服务注册、压力支撑、并发控制以及与Eureka的对比等面试问题,同时也探讨了Sentinel的线程隔离策略和限流机制,帮助理解两者在微服务架构中的关键作用。


一、 Nacos相关问题

1.问题:SpringCloud常见组件有哪些?
问题说明:主要考察对SpringCloud的组件基本了解
难易程度:简单
参考话术:
SpringCloud包含组件有很多,有很多功能是重复的。
其中最常用的组件包括:

  • 注册中心组件:Eureka、Nacos
  • 负载均衡组件:Ribbon
  • 远程调用组件:OpenFeign
  • 网关组件:Gateway、Zuul
  • 服务保护组件:Hystrix、Sentinel
  • 服务配置管理组件:Nacos、SpringCloudConfig

*可以通过画图来熟悉相关组件以及联系


2.问题:Nacos的服务注册表结构是怎么样的?
问题说明:考察对Nacos的数据分级结构的了解,以及Nacos源码的掌握情况
难易程度:一般

请添加图片描述

参考话术:
Nacos采用了数据的分级存储模型,最外层是Namespace,用来隔离环境;然后是Group,用来对服务进行分组。接下来是服务(Service),一个服务对应包含多个实例,但是处于不同机房,因此服务下有多个集群(Cluster),集群下是不同的实例(Instance)。
对应到Java代码,Nacos采用一个多层的嵌套Map来表示。结构为Map<String,Map<String,Service>>,最外层Map的key就是nameSpaceId,值是一个Map,内层Map的key是servicename,对应值是service对象。service内部又是一个Map,key是集群名称,对应值是集群对象。而集群对象内部维护了实例的集合。


3.问题:Nacos如何支撑数十万服务注册压力?
问题说明:考察对Nacos源码的掌握情况?
难易程度:难
参考话术:
Nacos内部接收到注册请求时,不会立即写数据,而是将服务注册的任务放入一个阻塞队列就立即响应给客户端。然后利用线程池读取阻塞队列中的任务,异步来完成实例更新,从而提高并发写能力。


4.问题:Nacos如何避免并发读写冲突问题?
问题说明:考察对Nacos源码的掌握情况?
难易程度:难
参考话术:
Nacos在更新实例列表,会采用CopyOnWrite技术,首先将旧的实力列表拷贝一份,然后更新拷贝的实例列表,再用更新后的实例列表来覆盖旧的实例列表。
这样在更新过程中,就不会对读实例列表的请求产生影响,也不会出现脏读问题了。


5.问题:Nacos与Eureka的区别有哪些?
问题说明:考察对Nacos、Eureka的底层实现的掌握情况?
难易程度:难
参考话术:
Nacos与Eureka有相同点,也有不同之处,可以从以下几点来描述:

  • 接口方式:Nacos与Eureka都对外暴露了Rest风格的API接口,用来实现服务注册、发现等功能。
  • 实例类型:Nacos的实例有永久和临时之分;而Eureka只支持临时实例。
  • 健康检测:Nacos对临时实例采用心跳模式检测,对永久实例采用主动请求来检测;Eureka只支持心跳模式。
  • 服务发现:Nacos支持定时拉取和订阅推送两种模式;Eureka只支持定时拉取模式。

几个关键词理解:
心跳模式检测:当发现某一端口挂了,就会马上从Nacos注册列表中删除此服务端口。
订阅推送:可理解为:及时更新。


6.问题:Nacos的服务拉取和订阅机制
参考话术:
Nacos的服务发现分为两种模式:

  • 服务一:主动拉取模式,消费者定期主动从Nacos拉取服务列表并缓存起来,在服务调用时优先读取本地缓存中的服务列表。
  • 模式二:订阅模式,消费者订阅Nacos中的服务列表,并基于UDP协议来接收服务变更通知。当Nacos中的服务列表发生更新时,会发送UDP广播给所有订阅者。
    与Eureka相比,Nacos的订阅模式服务状态更新更加及时,消费者更容易发现服务列表的变化,及时剔除故障服务。

二、Sentinel相关问题

7.问题:Sentinel的线程隔离与Hystix的线程隔离有什么差别?
问题说明:考察对线程隔离方案的掌握情况
参考话术:
Hytrix默认是基于线程池实现的线程隔离,每一个隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU开销,性能一般,但是隔离性更强。
Sentinel是基于信号量(计数器)实现的线程隔离,不用创建线程池,性能较好,但是隔离性一般。


8.问题:Sentinel的限流与Gateway的限流有什么区别?
限流:对应用服务器的请求做限制,避免因为过度请求导致服务器过载甚至宕机。
问题说明:考察对限流算法的掌握情况
难易程度:难
参考话术:
限流算法常见的三种实现:滑动时间窗口、令牌桶算法、漏桶算法。Gateway则采用了基于Redis实现的令牌桶算法。
而Sentinel内部比较复杂:

  • 默认限流模式是基于滑动时间窗口算法
  • 排队等待的限流模式则基于漏桶算法
  • 热点参数限流是基于令牌桶算法

*可能会问三种限流算法的原理?
*需要对Sentinel的学习更加深入?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值