Spring Cloud面试系列-01

2022年7月17日
大约 15 分钟

Spring Cloud面试系列-01

1. 什么是 Spring Cloud 框架?

Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

Spring Cloud的子项目,大致可分成两大类:

一类是对现有成熟框架“Spring Boot化”的封装和抽象,也是数量最多的项目;

第二类是开发一部分分布式系统的基础设施的实现,如Spring Cloud Stream扮演的是kafka, ActiveMQ这样的角色。

对于快速实践微服务的开发者来说,第一类子项目已经基本足够使用,如:

1)Spring Cloud Netflix是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等;

2)Spring Cloud Config将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件;

3)Spring Cloud Bus分布式消息队列,是对Kafka, MQ的封装;

4)Spring Cloud Security对Spring Security的封装,并能配合Netflix使用;

5)Spring Cloud Zookeeper对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用;

6)Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。注意的是从2.x起,官方不会继续开源,若需要使用2.x,风险还是有的。但是我觉得问题并不大,eureka目前的功能已经非常稳定,就算不升级,服务注册/发现这些功能已经够用。consul是个不错的替代品,还有其他替代组件,后续篇幅会有详细赘述或关注微信公众号“Java精选”,有详细替代方案源码分享。

2. Spring Cloud 框架有哪些优缺点?

Spring Cloud优点:

1)服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率,每个模块可以独立开发和部署、代码耦合度低;

2)可以更精准的制定优化服务方案,提高系统的可维护性,每个服务可以单独进行部署,升级某个模块的时候只需要单独部署对应的模块服务即可,效率更高;

3)微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量,模块专一性提升,每个模块只需要关心自己模块所负责的功能即可,不需要关心其他模块业务,专一性更高,更便于功能模块开发和拓展;

4)技术选型不再单一,由于每个模块是单独开发并且部署,所以每个模块可以有更多的技术选型方案,如模块1数据库选择mysql,模块2选择用oracle也是可以的;

5)适于互联网时代,产品迭代周期更短。系统稳定性以及性能提升,由于微服务是几个服务共同组成的项目或者流程,因此相比传统单一项目的优点就在于某个模块提供的服务宕机过后不至于整个系统瘫痪掉,而且微服务里面的容灾和服务降级机制也能大大提高项目的稳定性;从性能而言,由于每个服务是单独部署,所以每个模块都可以有自己的一套运行环境,当某个服务性能低下的时候可以对单个服务进行配置或者代码上的升级,从而达到提升性能的目的。

Spring Cloud缺点:

1)微服务过多,治理成本高,不利于维护系统,服务之间接口调用成本增加,相比以往单项目的时候调用某个方法或者接口可以直接通过本地方法调用就能够完成,但是当切换成微服务的时候,调用方式就不能用以前的方式进行调试、目前主流采用的技术有http api接口调用、RPC、WebService等方式进行调用,调用成本比单个项目的时候有所增加;

2)分布式系统开发的成本高(容错,分布式事务等)对团队挑战大

2)独立的数据库,微服务产生事务一致性的问题,由于各个模块用的技术都各不相同、而且每个服务都会高并发进行调用,就会存在分布式事务一致性的问题;

3)分布式部署,造成运营的成本增加、相比较单个应用的时候,运营人员只需要对单个项目进行部署、负载均衡等操作,但是微服务的每个模块都需要这样的操作,增加了运行时的成本;

4)由于整个系统是通过各个模块组合而成的,因此当某个服务进行变更时需要对前后涉及的所有功能进行回归测试,测试功能不能仅限于当个模块,增加了测试难度和测试成本;

总体来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的微服务框架,目前很多企业开始用微服务,Spring Cloud的优势是显而易见的。

3. Spring Cloud 断路器的作用是什么?

当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应,当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)。

断路器有完全打开状态(Open):一段时间内达到一定的次数无法调用并且多次监测没有恢复的迹象。断路器完全打开,那么下次请求就不会请求到该服务。

半开(Half-Open):短时间内有恢复迹象断路器会将部分请求发给该服务,正常调用时断路器关闭。

关闭(Close):当服务一直处于正常状态 能正常调用。

分布式架构中断路器模式的作用基本类似的,当某个服务单元发生故障,类似家用电器发生短路后,通过断路器的故障监控,类似熔断保险丝,向调用方返回一个错误响应,不需要长时间的等待。这样就不会出现因被调用的服务故障,导致线程长时间占用而不释放,避免了在分布式系统中故障的蔓延。

4. Spring Cloud 核心组件有哪些?

Eureka:服务注册与发现,Eureka服务端称服务注册中心,Eureka客户端主要处理服务的注册与发现。

Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求。

Ribbon:负载均衡,服务间发起请求时基于Ribbon实现负载均衡,从一个服务的多台机器中选择一台。

Hystrix:提供服务隔离、熔断、降级机制,发起请求是通过Hystrix提供的线程池,实现不同服务调用之间的隔离,避免服务雪崩问题。

Zuul:服务网关,前端调用后端服务,统一由Zuul网关转发请求给对应的服务。

5. Spring Cloud 如何实现服务的注册?

1、当服务发布时,指定对应的服务名,将服务注册到注册中心,比如Eureka、Zookeeper等。

2、注册中心加@EnableEurekaServer注解,服务使用@EnableDiscoveryClient注解,然后使用Ribbon或Feign进行服务直接的调用发现。

服务发现组件的功能

1)服务注册表

服务注册表是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心。

服务注册表提供查询API和管理API,使用查询API获得可用的服务实例,使用管理API实现注册和注销;

2)服务注册

3)健康检查

6. 什么是 Spring Cloud Config?

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中分布式配置中心组件Spring Cloud Config支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持,可以方便的对微服务各个环境下的配置进行实时更新、集中式管理。

Spring Cloud Config分为Config Server和Config Client两部分。

Config Server负责读取配置文件,并且暴露Http API接口,Config Client通过调用Config Server的接口来读取配置文件。

使用方式:

1)添加pom依赖

2)配置文件添加相关配置

3)启动类添加注解@EnableConfigServer

7. Spring Cloud Eureka 自我保护机制是什么?

1)假设某一时间某个微服务宕机了,而Eureka不会自动清除,依然对微服务的信息进行保存。

2)在默认的情况系,Eureka Server在一定的时间内没有接受到微服务的实例心跳(默认为90秒),Eureka Server将会注销该实例。

3)但是在网络发生故障时微服务在Eureka Server之间是无法通信的,因为微服务本身实例是健康的,此刻本不应该注销这个微服务。那么Eureka自我保护模式就解决了这个问题。

4)当Eureka Server节点在短时间内丢失过客户端时包含发生的网络故障,那么节点就会进行自我保护。

5)一但进入自我保护模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据注销任何微服务。

6)当网络故障恢复后,这个Eureka Server节点会自动的退出自我保护机制。

7)在自我保护模式中Eureka Server会保护服务注册表中的信息,不在注销任何服务实例,当重新收到心跳恢复阀值以上时,这个Eureka Server节点就会自动的退出自我保护模式,这种设计模式是为了宁可保留错误的服务注册信息,也不盲目的注销删除任何可能健康的服务实例。

8)自我保护机制就是一种对网络异常的安全保护实施,它会保存所有的微服务,不管健康或不健康的微服务都会保存,而不会盲目的删除任何微服务,可以让Eureka集群更加的健壮、稳定。

9)在Eureka Server端可取消自我保护机制,但是不建议取消此功能。

8. 什么是服务熔断?什么是服务降级?

熔断机制

熔断机制是应对雪崩效应的一种微服务链路保护机制。

当某个微服务不可用或者响应时间过长时会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。

当检测到该节点微服务调用响应正常后恢复调用链路。

在Spring Cloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。

服务降级

服务降级一般是从整体负荷考虑,当某个服务熔断后,服务器将不再被调用,此时客户端可以准备一个本地fallback回调,返回一个缺省值。这样做目的是虽然水平下降,但是是可以使用,相比直接挂掉要强很多。

9. Spring Boot 和 Spring Cloud 之间有什么联系?

Spring Boot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务。

Spring Cloud专注于解决各个微服务之间的协调与配置,整合并管理各个微服务,为各个微服务之间提供配置管理、服务发现、断路器、路由、事件总线等集成服务。

Spring Cloud是依赖于Spring Boot,而Spring Boot并不依赖与Spring Cloud。

Spring Boot专注于快速、方便的开发单个的微服务个体,Spring Cloud是关注全局的服务治理框架。

10. 你都知道哪些微服务技术栈?

微服务描述技术名称
服务开发Springboot、Spring、SpringMVC
服务配置与管理Netflix公司的Archaius、阿里的Diamond等
服务注册与发现Eureka、Consul、Zookeeper等
服务调用REST、RPC、gRPC
服务熔断器Hystrix、Envoy等
负载均衡Ribbon、Nginx等
服务接口调用(客户端调用服务发简单工具)Feign等
消息队列kafka、RabbitMQ、ActiveMQ等
服务配置中心管理SpringCloudConfig、Chef等
服务路由(API网关)Zuul等
服务监控Zabbix、Nagios、Metrics、Spectator等
全链路追踪Zipkin、Brave、Dapper等
服务部署Docker、OpenStack、Kubernetes等
数据流操作开发包SpringCloud Stream(封装与Redis,Rabbit、Kafka等发送接收消息)
事件消息总线Spring Cloud Bus

11. 什么是微服务?

单个轻量级服务一般为一个单独微服务,微服务讲究的是专注某个功能的实现,比如登录系统只专注于用户登录方面功能的实现,讲究的是职责单一,开箱即用,可以独立运行。

微服务架构系统是一个分布式的系统,按照业务进行划分服务单元模块,解决单个系统的不足的问题并满足越来越复杂的业务需求。

马丁福勒(Martin Fowler)

就目前而言,对于微服务业界并没有一个统一的、标准的定义。

但通常而言,微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。

每个服务运行在其独立的自己的进程中服务之间相互配合、相互协调,为用户提供最终价值。

服务之间采用轻量级通信。

每个服务都围绕具体业务进行构建,并能够独立部署到生产环境等。另外应尽量避免统一的、集中的服务管理机制。

通俗的来讲:

微服务就是一个独立且职责单一的服务应用程序。在IntelliJ IDEA工具中可以使用maven管理工具开发每个独立的module组件,具体就是使用Spring boot框架开发一个功能模块,该功能模块只处理单一专业的业务逻辑。

12. 微服务通信方式有哪几种?

同步通讯

RPC、REST等,比如Dobbo通过RPC远程过程调用;Spring Cloud通过REST接口json调用等。

异步通讯

消息队列,考虑消息的可靠传输、高性能,以及编程模型的变化等,比如:RabbitMq、ActiveMq、Kafka等。

13. 什么是微服务架构?

微服务架构是指对微服务进行管理整合应用的。

微服务架构依赖于微服务,是在微服务基础之上的。

举例:医院中每一个科室都是一个独立的微服务,那么这个医院就是一个大型的微服务架构,就类似院长可以对下面的科室进行管理。微服务架构主要就是这种功能。

14. 什么是 Spring Cloud Netflix?

Netflix OSS开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件。

Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;

Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;

Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;

Feign:基于Ribbon和Hystrix的声明式服务调用组件;

Zuul:API网关组件,对请求提供路由及过滤功能。

15. 什么是 Spring Cloud Bus?

用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置。

16. 什么是 Spring Cloud Consul?

基于Hashicorp Consul的服务治理组件。

17. 什么是 Spring Cloud Security?

安全工具包,对Zuul代理中的负载均衡OAuth2客户端及登录认证进行支持。

18. 什么是 Spring Cloud Sleuth?

Spring Cloud应用程序的分布式请求链路跟踪,支持使用Zipkin、HTrace和基于日志(例如ELK)的跟踪。

19. 什么是 Spring Cloud Stream?

轻量级事件驱动微服务框架,可以使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。

20. 什么是 Spring Cloud Task?

用于快速构建短暂、有限数据处理任务的微服务框架,用于向应用中添加功能性和非功能性的特性。