拿offer必须掌握的最全SpringCloud⾯试题(含答案)
今天公司的项⽬⽐较忙,远程开会和办公的沟通效率总是差那么⼀点,为了节约点时间,就不介绍SpringCloud了,我想只要是⼀名Java 开发程序员,提到微服务,⼀定对SpringCloud的⼤名如雷贯⽿,我们直接来看它的⾼频⾯试题吧。
1、什么是Spring Cloud?
Spring cloud 流应⽤程序启动器是基于 Spring Boot 的 Spring 集成应⽤程序,提供与外部系统的集成,更专注于服务治理。Spring cloud Task,⼀个⽣命周期短暂的微服务框架,⽤于快速构建执⾏有限数据处理的应⽤程序。
2、Spring Cloud和Dubbo的区别
Dubbo关注的领域是Spring Cloud的⼀个⼦集。Dubbo专注于服务治理,其在服务治理、灰度发布、流量分发⽅⾯⽐Spring Cloud 更全⾯。Spring Cloud覆盖整个微服务架构领域。
Dubbo使⽤RPC调⽤效率⾼⼀些,Spring Cloud使⽤HTTP调⽤效率低,使⽤更简单。
3、REST和RPC的区别
REST风格的系统交互更⽅便,RPC调⽤服务提供⽅和调⽤⽅式之间依赖太强。
REST调⽤系统性能较低,RPC调⽤效率⽐REST⾼。
REST的灵活性可以跨系统跨语⾔调⽤,RPC只能在同语⾔内调⽤。
REST可以和Swagger等⼯具整合,⾃动输出接⼝API⽂档。
4、SpringCloud如何实现服务的注册和发现
1. 服务在发布时 指定对应的服务名(服务名包括了IP地址和端⼝) 将服务注册到注册中⼼(eureka或者zookeeper)。
2. 这⼀过程是springcloud⾃动实现 只需要在main⽅法添加@EnableDisscoveryClient  同⼀个服务修改端⼝就可以启动多个实例。
3. 调⽤⽅法:传递服务名称通过注册中⼼获取所有的可⽤实例 通过负载均衡策略调⽤(ribbon和feign)对应的服务。
5、什么是服务熔断和服务降级?
熔断机制是应对雪崩效应的⼀种微服务链路保护机制。当某个微服务不可⽤或者响应时间太长时,会进⾏服务降级,进⽽熔断该节点微服务的调⽤,快速返回“错误”的响应信息。当检测到该节点微服务调⽤响应正常后恢复调⽤链路。在SpringCloud框架⾥熔断机制通过Hystrix实现,Hystrix会监控微服务间调⽤的状况,当失败的调⽤到⼀定阈值,缺省是5秒内调⽤20次,如果失败,就会启动熔断机制。
服务降级,⼀般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调⽤,此时客户端可以⾃⼰准备⼀个本地的fallback回调,返回⼀个缺省值。这样做,虽然会出现局部的错误,但可以避免因为⼀个服务挂机,⽽影响到整个架构的稳定性。
Hystrix相关注解:
@EnableHystrix:开启熔断
@HystrixCommand(fallbackMethod=”XXX”):声明⼀个失败回滚处理函数XXX,当被注解的⽅法执⾏超时(默认是1000毫秒),就会执⾏fallback函数,返回错误提⽰。
6、什么是Hystrix?它如何实现容错?
Hystrix是⼀个延迟和容错库,旨在隔离远程系统,服务和第三⽅库的访问点,当出现故障是不可避免的故障时,停⽌级联故障并在复杂的分布式系统中实现弹性。
通常对于使⽤微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。
思考以下微服务
假设如果上图中的微服务9失败了,那么使⽤传统⽅法我们将传播⼀个异常。但这仍然会导致整个系统崩溃。
随着微服务数量的增加,这个问题变得更加复杂。微服务的数量可以⾼达1000.这是hystrix出现的地⽅ 我们将使⽤Hystrix在这种情况下的Fallback⽅法功能。我们有两个服务employee-consumer使⽤由em
ployee-consumer公开的服务。springcloud难学吗
简化图如下所⽰
现在假设由于某种原因,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都是⽤于调⽤其他服务的,不过⽅式不同。
1. 启动类使⽤的注解不同,Ribbon⽤的是@RibbonClient,Feign⽤的@EnableFeignClients。
2. 服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象⽅法的接⼝中使⽤@FeignClient声明。
3. 调⽤⽅式不同,Ribbon需要⾃⼰构建http请求,模拟http请求然后使⽤RestTemplate发送给其他服务,步骤相当繁琐。
Feign则是在Ribbon的基础上进⾏了⼀次改进,采⽤接⼝的⽅式,将需要调⽤的其他服务的⽅法定义成抽象⽅法即可,
不需要⾃⼰构建http请求。不过要注意的是抽象⽅法的注解、⽅法签名要和提供服务的⽅法完全⼀致。
11、ribbon的负载均衡策略
1. RoundRobinRule: 轮询策略,Ribbon以轮询的⽅式选择服务器,这个是默认值。所以⽰例中所启动的两个服
务会被循环访问;
2. RandomRule: 随机策略,也就是说Ribbon会随机从服务器列表中选择⼀个进⾏访问;
3. BestAvailableRule: 最⼤可⽤策略,即先过滤出故障服务器后,选择⼀个当前并发请求数最⼩的;
4. WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进⾏加权处理,然后在采⽤轮询
的⽅式来获取相应的服务器;
5. AvailabilityFilteringRule: 可⽤过滤策略,先过滤出故障的或并发请求⼤于阈值的⼀部分服务实例,然后再以
线性轮询的⽅式从过滤后的实例清单中选出⼀个;
6. 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:⾼可⽤)
1. 当向注册中⼼查询服务列表时,我们可以容忍注册中⼼返回的是⼏分钟以前的信息,但不能容忍直接down掉不可⽤。也就是说,服务
注册功能对⾼可⽤性要求⽐较⾼,但zk会出现这样⼀种情况,当master节点因为⽹络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取leader时间过长,30 ~ 120s,且选取期间zk
集都不可⽤,这样就会导致选取期间注册服务瘫痪。在云部署的环境下,因⽹络问题使得zk集失去master节点是较⼤概率会发⽣的事,虽然服务能够恢复,但是漫长的选取时间导致的注册长期不可⽤是不能容忍的。
2. Eureka保证了可⽤性,Eureka各个节点是平等的,⼏个节点挂掉不会影响正常节点的⼯作,剩余的节点仍然可以提供注册和查询服
务。⽽Eureka的客户端向某个Eureka注册或发现时发⽣连接失败,则会⾃动切换到其他节点,只要有⼀台Eureka还在,就能保证注册服务可⽤,只是查到的信息可能不是最新的。除此之外,Eureka还有⾃我保护机制,如果在15分钟内超过85%的节点没有正常的⼼跳,那么Eureka就认为客户端与注册中⼼发⽣了⽹络故障,此时会出现以下⼏种情况:
Eureka不在从注册列表中移除因为长时间没有收到⼼跳⽽应该过期的服务。
Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可⽤)。
当⽹络稳定时,当前实例新的注册信息会被同步到其他节点。
因此,Eureka可以很好的应对因⽹络故障导致部分节点失去联系的情况,⽽不会像Zookeeper那样使
整个微服务瘫痪。
14、什么是 Spring Cloud Bus?我们需要它吗?
Spring Cloud Bus通过轻量消息代理连接各个分布的节点。这会⽤在⼴播状态的变化(例如配置变化)或者其他的消息指令。Spring Cloud Bus的⼀个核⼼思想是通过分布式的启动器对Spring Boot应⽤进⾏扩展,也可以⽤来建⽴⼀个多个应⽤之间的通信频道。
考虑以下情况:我们有多个应⽤程序使⽤ Spring Cloud Config 读取属性,⽽ Spring Cloud Config 从GIT 读取这些属性。
下⾯的例⼦中多个员⼯⽣产者模块从 Employee Config Module 获取 Eureka 注册的财产。