Spring Cloud面试系列-02

2022年7月17日
大约 9 分钟

Spring Cloud面试系列-02

1. 什么是 Spring Cloud Zookeeper?

基于Apache Zookeeper的服务治理组件。

2. 什么是 Spring Cloud Gateway?

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

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。

使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

3. 什么是 Spring Cloud OpenFeign?

基于Ribbon和Hystrix的声明式服务调用组件,可以动态创建基于Spring MVC注解的接口实现用于服务调用,在Spring Cloud 2.0中已经取代Feign成为了优选。

4. 什么是 Hystrix?如何实现容错机制?

Hystrix是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。

通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。

5. 微服务有哪些优缺点?

优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。

缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控。

6. Eureka 和 Zookeeper 有哪些区别?

1)Zookeeper是CP原则,强一致性和分区容错性。

2)Eureka是AP原则 可用性和分区容错性。

3)Zookeeper当主节点故障时,zk会在剩余节点重新选择主节点,耗时过长,虽然最终能够恢复,但是选取主节点期间会导致服务不可用,这是不能容忍的。

4)Eureka各个节点是平等的,一个节点挂掉,其他节点仍会正常保证服务。

7. Spring Cloud 中为什么要使用 Feign?

Feign简化了RestTemplate代码,实现了Ribbon负载均衡,使代码变得更加简洁,也少了客户端调用的代码,所以Feign负载均衡是首选的。

8. 什么是雪崩效应?

分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是A系统调用B系统服务,B系统调用C系统服务等,实现方式有 Spring Boot+Dubbo实现微服务调用,以及各个公司自研的一些RPC框架等。当下游应用 C发生故障,而系统B没有服务降级的时候就可能会导致B,甚至系统A瘫痪,这种现象被称为雪崩效应。

9. 雪崩效应都有哪些常见场景?

1、硬件故障:如服务器宕机,机房断电,光纤被挖断等。

2、流量激增:如异常流量,重试加大流量等。

3、缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。

4、程序BUG:如程序逻辑导致内存泄漏,JVM 长时间 FullGC 等。

5、同步等待:服务间采用同步调用模式,同步等待造成的资源耗尽。

10. 雪崩效应有哪些常见的解决方案?

针对不同场景分别有不同的解决方案,如下所示:

1、硬件故障:多机房容灾,跨机房路由,异地多活等。

2、流量激增:采用自动扩缩容以应对突发流量,或在负载均衡器上安装限流模块。

3、缓存穿透:缓存预加载、缓存异步加载等。

4、程序BUG:修改程序bug、及时释放资源等。

5、同步等待:资源隔离、MQ解耦、不可用服务调用快速失败等。资源隔离通常指不同服务调用采用不同的线程池;不可用服务调用快速失败一般通过超时机制,熔断器以及熔断后降级方法等方案实现。

流量控制的具体措施包括:

1)网关限流。

2)用户交互限流,采用加载动画,提高用户的忍耐等待时间;提交按钮添加强制等待时间机制。

3)关闭重试。

服务调用者降级服务的措施包括:

1)资源隔离,主要是对调用服务的线程池进行隔离。

2)对依赖服务进行分类。

3)不可用服务的调用快速失败。

11. 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请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。

12. 断路器有几种熔断状态?

Close:关闭状态,所有的请求都能正常的访问。

Open:打开状态,所有的请求都会被降级。Hystrix会对请求情况进行计数,当一定时间内请求次数达到20次以上并且失败次数的阈值达到了50%,则触发熔断,断路器会被打开;所有的请求都不能正常的访问。

Half-Open:半打开状态;Open的状态不是永远的,当休眠5秒后会自动进去半打开状态;会释放部分请求通过,如果这些请求是成功的,那么就是完全关闭断路器;如果不成功,那么继续进行休眠5秒,重复流程。

13. 什么是 Spring Cloud Ribbon?

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflixf发布的开源项目,主要功能是提供醍醐的的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如:连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器。我们很容易的使用Ribbon实现自定义的负载均衡算法。

14. Load Balancer 负载均衡是什么?

简单的说就是讲用户的请求平摊分配到多个服务上,从而达到系统的HA(高可用)。

常见的负载均衡软件有Nginx、LVS,硬件有F5等。

15. Ribbon 和 Nginx 负载均衡有什么区别?

Nginx是服务器负载均衡,客户端所有请求都会交给NGINX,然后又NGINX实现转发请求。即负载均衡是有服务端实现的。

Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

16. 分布式事务是什么?

​分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务。

举例:用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。

简单来说就是分布式事务用于在分布式系统中保证不同节点之间的数据一致性。

17. spring cloud zuul 和 spring cloud gateway 有什么区别?

zuul:是Netflix的,是基于servlet实现的,阻塞式的api,不支持长连接。

gateway:是Spring Cloud自己研制的微服务网关,是基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接。

18. 【腾讯】简述一下 Spring Cloud 服务发现原理?

欢迎大家关注微信公众号: Java精选 ,专注分享前沿资讯,BATJ 大厂面试题解读,架构技术干货,微服务、高可用等架构设计,10年开发老兵帮你少走弯路,欢迎各领域程序员交流学习!

此类面试题只能在微信小程序: Java精选面试题 ,查阅全部内容,感谢支持!