面试专题之——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熔断策略有哪些?

慢比例调用:在设定的统计时长与统计数量内,响应时长超过超时阈值的请求数量占最大请求数的比例,大于比例阈值则熔断。熔断结束之后,若下一个请求的响应时间小于超时阈值,则关闭熔断,反之则再次熔断。

异常比例:在设定的统计时长与统计数量内,异常比例大于比例阈值则熔断。熔断结束之后,若下一个请求成功响应则关闭熔断

异常数:在设定的统计时长与统计数量内,异常数量超过阈值则进行熔断。熔断结束之后,若下一个请求成功响应则关闭熔断