面试专题之——Spring Cloud
Eureka注册中心
服务者注册时保存的数据结构是什么?
服务者启动时,会根据配置文件决定是否注册到Eureka中,默认就是注册的,注册成服务时,会向Eureka发送REST请求,并携带自己的信息,Eureka会把这些信息保存到一个双层Map的结构中。
第一层Map的key就是服务的id,一般是spring.application.name属性
第二层Map是服务的实例id,一般由 Host + 服务名称 + 端口
组成
value则是服务的实例对象
消费者如何拉取服务消费?
消费者默认30秒一次根据服务名称从Eureka注册中心拉取对应服务的集群列表,消费服务时通过Ribbon负载均衡策略拿取要调用服务的ip和端口
如果Eureka注册中心宕机,会不会影响服务的调用?
不会,但是会影响服务列表的更新拉取,因为消费者拉取服务之后会在本地缓存一份。
Nacos和Eureka的共同点和不同点
AP:强一致性
CP:强可用性
- 共同点:
- 都是注册中心
- 都是保存ip和端口号
- 不同点:
- Eureka只能作为注册中心,而Nacos还可以作为配置中心
- Nacos可以进行环境的隔离(命名空间),Eureka不行
- Eureka是AP模式,Nacos可以AP/CP切换
- Nacos是阿里巴巴的,Eureka是网飞公司的
- Nacos服务消费者会建立长链接,从注册表获取服务信息并缓存到本地,这样更加有实时性
Nacos和Eureka消费者拉取服务时的区别?
Eureka是CP的(默认30秒拉取一次服务),并且不支持切换模式
Nacos却不同,它可以转换成AP的
Eureka服务者保持注册状态机制?
服务者默认30秒一次向注册中心发送心跳,超过90秒没有发送心跳至注册中心则认为该节点失效,会标记宕机,并且有可能会进行剔除。
Eureka启动后会每60秒扫描一次已经宕机的服务,如果扫描到了则进行剔除
如果超过15分钟以内超过85%的客户端节点都没有正常的心跳,则认为可能网络异常,进入自我保护机制,不再剔除没有心跳的客户端
Ribbon负载均衡
Ribbon负载均衡算法的实质是?
通过不同算法从List集合中获取一个具体的服务实例,它的默认算法是轮询。
Ribbon的负载均衡方式有多少种?常见的负载均衡方式的原理是怎么样的?
7种,分别为:轮询、随机、轮询重试、过滤、响应时间、最小并发、性能可用性
常用的3种:轮询、随机、轮询重试
轮询:在实现了IRule接口的RoundRobinRule类中的构造方法会初始化一个AtomicInteger原子计数器对象,该对象能保证在多线程的情况下的所有操作都是原子性的。在Ribbon使用该负载均衡方式时会调用choose方法,该方法有一个count计数变量用于记录获取下一个服务实例的次数,默认超过10次还没获取成功则报错。获取下一个服务实例的核心方法叫做incrementAndGetModulo,该方法传入所有服务实例List集合的size()值,然后通过原子计数器对象获取当前服务实例索引值存放在current变量中,再让current + 1与所有服务实例List集合的size()值求余计算出下一个服务实例的索引值next,最后给原子计数器赋值next,赋值成功结束,赋值失败则重新上述操作。
随机:在实现了IRule接口的RoundomRule类中实现了choose方法,该方法首先获取所有负载均衡对象列表,然后通过ThreadLocalRandom.current().nextInt()方法获取随机数,随机数的值在0和负载均衡对象列表最大值之间,获取到之后根据索引获取负载均衡实例,如果一直没有获取到则会一直重复上述操作
轮询重试:在其内部还定义了一个IRule对象,实现类是轮询的实现类,而在choose方法中则实现了反复调用轮询策略,如果始终得不到负载均衡实例,并且还超过了结束时间则直接返回null
如何修改Ribbon负载均衡方式?
创建一个Bean,返回IRule接口类型,实例化它的实现对象即可
Feign远程调用
Feign如何配置?
1、在main方法上打上注解@EnableFeignClients开启扫描feign
2、创建一个接口打上FeignClient注解让Feign动态代理上
3、复制SpringMvc中的后端接口配置进该类中
Feign的本质是什么?
Feign本质是通过动态代理的方式实现该接口,并且底层还是使用Ribbon负载均衡,只是做了个包装
Gateway网关
Gateway网关限流算法有哪些?
令牌桶算法:准备一个令牌桶,固定容量一般为服务并发上限,按照固定速率生成令牌,每次请求先获取令牌,只有拿到了令牌才能进行访问
漏桶算法:类似于生活中的桶,进来的请求就是水,桶下面有一个洞均匀的出水,当水达到了桶的上限那么后续的水就进不来了
计数器算法:设置一个QPS数量值(每秒查询率),当请求数达到这个值之后不允许后续访问,下一秒又重新计算
Sentinel系统保护
什么是服务雪崩?
例如当前系统有三个服务分别为A、B、C,并且服务A调用服务B,服务B调用服务C,当服务C宕机就会导致服务B等待,进而导致服务A等待,最终的结果就是导致整个系统瘫痪,这就是服务雪崩
Sentinel流量控制有哪些参数?
资源名称、针对来源(服务名称)、阈值类型(QPS或并发线程数)、单机阈值(限流阈值)、流控模式、流控效果
Sentinel阈值类型有哪些?
QPS:每秒查询数
并发线程
Sentinel流量控制模式有哪些?
直连模式:默认该模式,针对某个资源直接操作,到达阈值直接触发
关联模式:资源A关联资源B,当资源B触发规则,则资源A触发流控效果
链路模式:对某一条链路的访问进行控制
Sentinel流量控制效果有哪些?
快速失败:默认,当达到限流规则后,则不允许访问
Warm Up:预热,当突然出现大量请求时,不直接把所有请求放行,而是通过预热的方式让系统请求量在一定时间内慢慢达到最大值
排队等待:让请求均速地访问系统
Sentinel熔断状态有哪些?
sentinel1.6之前没有探测状态,之后有了
开启状态:开启熔断,服务不可访问
关闭状态:关闭熔断,服务可以访问
探测状态:熔断时长结束之后,进入探测状态,在此状态下如果策略达标则关闭熔断
Sentinel熔断策略有哪些?
慢比例调用:在设定的统计时长与统计数量内,响应时长超过超时阈值的请求数量占最大请求数的比例,大于比例阈值则熔断。熔断结束之后,若下一个请求的响应时间小于超时阈值,则关闭熔断,反之则再次熔断。
异常比例:在设定的统计时长与统计数量内,异常比例大于比例阈值则熔断。熔断结束之后,若下一个请求成功响应则关闭熔断
异常数:在设定的统计时长与统计数量内,异常数量超过阈值则进行熔断。熔断结束之后,若下一个请求成功响应则关闭熔断