SpringCloud 是现在面试必问的知识点了,最近群里不少人在准备面试。今年的金三银四成了不三不四了,再不准备一下,我估计很难找到满意的工作了!
下面是我总结的一些 SpringCloud 面试题,希望能够帮助到大家!
1、什么是 Spring Cloud?
- Spring Cloud 基于 Spring Boot 使得整体的开发、配置、部署都非常方便,可快速搭建基于微服务的分布式应用,Spring Cloud 相当于微服务各组件的集大成者。
- Spring Boot 和 Spring Cloud 的关系可大致理解为,Spring Boot 快速搭建基础系统,Spring Cloud 在此基础上实现分布式系统中的公共组件,如服务注册、服务发现、配置管理、熔断器、控制总线等,服务调用方式是基于 REST API,整合了各种成熟的产品和架构。
2、Spring Cloud 和 Spring 之间有什么关联关系?
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发。服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。为了解决微服务架构中服务治理而提供的具备一系列功能的开发框架,并且 Spring Cloud 是完全基于 Spring Boot 进行开发的,Spring Cloud 利用 Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。
3、Spring Cloud 实现服务注册和发现的原理是什么?
- 服务在发布时指定对应的服务名(服务名包括了 IP 地址和端口)将服务注册到注册中心(Eureka 或者 Zookeeper)这一过程是 Spring Cloud 自动实现的,只需要在 main 方法添加 @EnableDisscoveryClient 即可,同一个服务修改端口就可以启动多个实例。
- 调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用(Ribbon 和 Feign)对应的服务。
4、Ribbon 和 Feign 有什么区别?
Ribbon 和 Feign 都是用于调用其他服务的,不过方式不同。
- 启动类使用的注解不同,Ribbon 使用的是 @RibbonClient,Feign 用的是 @EnableFeignClients。
- 服务的指定位置不同,Ribbon 是在 @RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口上使用 @FeignClient 声明。
- 调用方式不同,Ribbon 需要自己构建 HTTP 请求,模拟 HTTP 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐。
Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可。不需要自己构建 HTTP 请求,不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
5、为什么要使用 Spring Cloud 熔断器,它的作用是什么?
当一个服务调用另一个服务,由于网络原因或者自身原因出现问题时 ,调用者就会等待被调者的响应,当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应,断路器就是解决这一问题的。
断路器的状态有以下几种:
- 完全打开:一定时间内,达到一定的次数无法调用,并且多次检测没有恢复的迹象,断路器完全打开,那么下次的请求不会请求到该服务。
- 半开:短时间内有恢复迹象,断路器会将部分请求发送给服务,当能正常调用时,断路器关闭。
- 关闭:服务一直处于正常状态,能正常调用,断路器关闭。
6、什么是 Hystrix?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。通常对于使用微服务架构开发的系统,涉及到许多微服务,这些微服务彼此协作, 随着微服务数量的增加,这个问题变得更加复杂。我们将使用 Hystrix 的 Fallback 方法来处理,假设由于某种原因,公开的服务接口抛出异常,我们在这种情况下使用 Hystrix 定义一个回退方法。这种后备方法应该具有与公开服务相同的返回类型,如果暴露服务中出现异常,回退方法将返回对应信息。
7、Eureka 和 ZooKeeper 有哪些区别?
- Eureka 不再从注册列表移除因长时间没收到心跳而应该过期的服务;Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用);当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性);Eureka 可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像 ZooKeeper 一样使得整个注册系统瘫痪。
- ZooKeeper 有 Leader 和 Follower 角色,Eureka 各个节点平等。ZooKeeper 采用过半数存活原则,Eureka 采用自我保护机制解决分区问题。
8、为什么要使用负载均衡?
在程序运行时,负载平衡可以改善跨计算机、计算机集群、网络链接、中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性,负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
9、Spring Cloud 实现服务注册和发现的具体流程是什么?
当我们开始一个项目时,通常在属性文件中进行所有的配置,随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化,手动更改属性可能会产生问题。Eureka 服务注册和发现可以在这种情况下提供帮助,由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。
10、为什么要使用 Spring Cloud ,它有哪些优势?
- 解决与分布式系统相关的复杂性问题,这种开销包括网络问题、延迟开销、带宽问题、安全问题。
- 服务发现—服务发现工具管理群集中的流程和服务如何查找和互相交谈,它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
- 解决分布式系统中的冗余问题。
- 负载平衡改善跨多个计算资源的工作负荷,诸如计算机、计算机集群、网络链路、中央处理单元或磁盘驱动器的分布。
11、REST 和 RPC 对比
- RPC主要的缺陷是服务提供方和调用方式之间的依赖太强,需要对每一个微服务进行接口的定义,并通过持续继承发布,严格版本控制才不会出现冲突。
- REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只需要一个约定进行规范。
12、列举一些 SpringCloud 技术栈?
- 服务开发:springboot spring springmvc
- 服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond
- 服务注册与发现:Eureka,Zookeeper
- 服务调用:Rest RPC gRpc
- 服务熔断器:Hystrix
- 服务负载均衡:Ribbon Nginx
- 服务接口调用:Fegin
- 消息队列:Kafka Rabbitmq activemq
- 服务配置中心管理:SpringCloudConfig
- 服务路由(API网关)Zuul
- 事件消息总线:SpringCloud Bus
13、简单说一下 Eureka 和 Zookeeper 的区别
- Eureka 取 CAP 的 AP,注重可用性,Zookeeper 取 CAP 的 CP 注重一致性。
- Zookeeper 在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用。
- Eureka 的自我保护机制,会导致一个结果就是不会再从注册列表移除因长时间没收到心跳而过期的服务。依然能接受新服务的注册和查询请求,但不会被同步到其他节点。不会服务瘫痪。
- Zookeeper 有 Leader 和 Follower 角色,Eureka 各个节点平等。
- Zookeeper 采用过半数存活原则,Eureka 采用自我保护机制解决分区问题。
- Eureka 本质是一个工程,Zookeeper 只是一个进程。
14、Eureka 自我保护机制是什么?
当 Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
15、Hystrix 是什么?
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
服务降级:优先核心服务,非核心服务不可用或弱可用。通过 HystrixCommand注解指定。fallbackMethod (回退函数)中具体实现降级逻辑。
: » 分享15道最新SpringCloud面试题
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/252187.html