2021 最新版 SpringCloud 高频面试题分享,【性能优化实战
6、什么是 Hystrix?它如何实现容错?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。
通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。
思考以下微服务
假设如果上图中的微服务 9 失败了,那么使用传统方法我们将传播一个异常。但这仍然会导致整个系统崩溃。
随着微服务数量的增加,这个问题变得更加复杂。微服务的数量可以高达 1000.这是 hystrix 出现的地方 我们将使用 Hystrix 在这种情况下的 Fallback 方法功能。我们有两个服务 employee-consumer 使用由 employee-consumer 公开的服务。
简化图如下所示
现在假设由于某种原因,employee-producer 公开的服务会抛出异常。我们在这种情况下使用 Hystrix 定义了一个回退方法。这种后备方法应该具有与公开服务相同的返回类型。如果暴露服务中出现异常,则回退方法将返回一些值。
7、什么是 Hystrix 断路器?我们需要它吗?
由于某些原因,employee-consumer 公开服务会引发异常。在这种情况下使用 Hystrix 我们定义了一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。
如果 firstPage method() 中的异常继续发生,则 Hystrix 电路将中断,并且员工使用者将一起跳过 firtsPage 方法,并直接调用回退方法。断路器的目的是给第一页方法或第一页方法可能调用的其他方法留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会 。
8、项目中 zuul 常用的功能
提供动态路由
提供安全、鉴权处理
跨域处理
全局动态路由的 hystrix(熔断、降级、限流)处理
9、服务网关的作用
简化客户端调用复杂度,统一处理外部请求。
数据裁剪以及聚合,根据不同的接口需求,对数据加工后对外。
多渠道支持,针对不同的客户端提供不同的网关支持。
遗留系统的微服务化改造,可以作为新老系统的中转组件。
统一处理调用过程中的安全、权限问题。
Spring Cloud 中的网关有:Zuul 和 Spring Cloud Gateway,最新版本中推荐使用后者。
10、ribbon 和 feign 区别
Ribbon 添加 maven 依赖 spring-starter-ribbon 使用 @RibbonClient(value="服务名称") 使用 RestTemplate 调用远程服务对应的方法。
feign 添加 maven 依赖 spring-starter-feign 服务提供方提供对外接口 调用方使用 在接口上使用 @FeignClient("指定服务名")
Ribbon 和 Feign 的区别:
Ribbon 和 Feign 都是用于调用其他服务的,不过方式不同。
启动类使用的注解不同,Ribbon 用的是 @RibbonClient,Feign 用的 @EnableFeignClients。
服务的指定位置不同,Ribbon 是在 @RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用 @FeignClient 声明。
调用方式不同,Ribbon 需要自己构建 http 请求,模拟 http 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐。
Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,
不需要自己构建 http 请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
11、ribbon 的负载均衡策略
RoundRobinRule: 轮询策略,Ribbon 以轮询的方式选择服务器,这个是默认值。所以示例中所启动的两个服务会被循环访问;
RandomRule: 随机策略,也就是说 Ribbon 会随机从服务器列表中选择一个进行访问;
BestAvailableRule: 最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的;
WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后在采用轮询的方式来获取相应的服务器;
AvailabilityFilteringRule: 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;
ZoneAvoidanceRule: 区域感知策略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认 1)和最小过滤百分比(默认 0),最后对满足条件的服务器则使用 RoundRobinRule(轮询方式)选择一个服务器实例。
12、简述什么是 CAP,并说明 Eureka 包含 CAP 中的哪些?
**CAP 理论:**一个分布式系统不可能同时满足 C (一致性),A(可用性),P(分区容错性).由于分区容错性 P 在分布式系统中是必须要保证的,因此我们只能从 A 和 C 中进行权衡.
Eureka 遵守 AP
Eureka 各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,神域的节点依然可以提供注册和查询服务。
而 Eureka 的客户端在向某个 Eureka 注册或查询是如果发现连接失败,则会自动切换至其他节点,只要有一台 Eureka 还在,就能保证注册服务可用(保证可用性),只不过查的信息可能不最新的不保证强一致性)。
13、Eureka 和 zookeeper 都可以提供服务注册与发现的功能,请说说两个的区别?
Zookeeper 保证了 CP(C:一致性,P:分区容错性)
Eureka 保证了 AP(A:高可用)
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接 down 掉不可用。也就是说,服务注册功能对高可用性要求比较高,但 zk 会出现这样一种情况,当 master 节点因为网络故障与其他节点失去联系时,剩余节点会重新选 leader。问题在于,选取 leader 时间过长,30 ~ 120s,且选取期间 zk 集群都不可用,这样就会导致选取期间注册服务瘫痪。在云部署的环境下,因网络问题使得 zk 集群失去 master 节点是较大概率会发生的事,虽然服务能够恢复,但是漫长的选取时间导致的注册长期不可用是不能容忍的。
Eureka 保证了可用性,Eureka 各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。而 Eureka 的客户端向某个 Eureka 注册或发现时发生连接失败,则会自动切换到其他节点,只要有一台 Eureka 还在,就能保证注册服务可用,只是查到的信息可能不是最新的。除此之外,Eureka 还有自我保护机制,如果在 15 分钟内超过 85%的节点没有正常的心跳,那么 Eureka 就认为客户端与注册中心发生了网络故障,此时会出现以下几种情况:
Eureka 不在从注册列表中移除因为长时间没有收到心跳而应该过期的服务。
Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可用)。
当网络稳定时,当前实例新的注册信息会被同步到其他节点。
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
最后,若需要完整 pdf 版,可以点赞本文后点击这里免费领取
评论