【八股文】SpringCloud

1、什么是SpringCloud

        Spring Cloud是一个微服务系统架构的一站式解决方案提供的全套的分布式系统解决方案

        Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。(贼多,记住几个就行)

2、Spring Cloud 优缺点

其主要优点有:

        集大成者,Spring Cloud 包含了微服务架构的方方面面。约定优于配置,基于注解,没有配置文件。
        轻量级组件,Spring Cloud 整合的组件大多比较轻量级,且都是各自领域的佼佼者。
        开发简便,Spring Cloud 对各个组件进行了大量的封装,从而简化了开发。
        开发灵活,Spring Cloud 的组件都是解耦的,开发人员可以灵活按需选择组件。

3、Spring Cloud 的核心组件有哪些?

  • Eureka和Nacos:服务注册与发现。
  • Zuul和SpringCloudGateway:服务网关。
  • Ribbon:客户端负载均衡。
  • Feign:声明性的Web服务客户端。
  • Hystrix:断路器。
  • SpringCloudConfig或Nacos:分布式统一配置管理。

4、SpringCloud和SpringBoot的区别和关系

        SpringBoot专注于快速方便的开发单个个体微服务。
        SpringCloud关注全局的微服务协调治理框架以及一整套的落地解决方案。
        SpringBoot可以离开SpringCloud独立使用,但SpringCloud离不开SpringBoot,属于依赖关系

5、什么是微服务?

        微服务是将单体应用划分成小的服务单元微服务之间使用HTTP的API进行访问操作。每个微服务都独自运行在自己的进程中独立部署,而且每个微服务可以使用单独的语言开发以及不同的数据库存储。

6、微服务之间如何独立通讯的?

同步通信:dobbo通过 RPC 远程过程调用、springcloud通过 REST 接口json调用等。

异步通信:消息队列,如:RabbitMqActiveMKafka等消息队列。

7、什么是服务的雪崩?产生的原因?

        雪崩效应是大型互联网项目中,某个服务发生宕机,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用使相通的,这样就会将服务的不可用逐步扩大到各个服务,从而使整个项目的服务宕机崩溃。

        发生雪崩的原因:因为Tomcat默认情况只有一个线程池来维护客户端发送的所有请求,这个时候某一接口在某一时刻被大量访问就会占据tomcat线程池的所有线程,其他请求处于等待状态,无法连接到服务接口。

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

        服务熔断是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。

白话文:熔断之后,报错太难看了,那就自己本地造一个回调

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

白话文:熔断之后,报错太难看了,那就自己本地造一个回调

        熔断表示“断开”的意思,程序为了整体的稳定性,所以暂时(断开)停止服务一段时间,以保证程序可用时再被使用。 降级是指程序在出现问题时,仍能保证有限功能可用的一种机制。降级是一种退而求其次的选择,而熔断却是整体不可用。

        Hystrix相关注解@EnableHystrix:开启熔断 @HystrixCommand(fallbackMethod=”XXX”),声明一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是1000毫秒),就会执行fallback函数,返回错误提示。

9、Spring Cloud如何实现服务的注册?      

        服务发布时,指定对应的服务名,将服务注册到 注册中心(Eureka 、Zookeeper)。

        注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。

10、Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别

Zookeeper保证了CP,Eureka保证了AP。

A:高可用

C:一致性

P:分区容错性

        Zookeeper中的节点服务挂了就要选举,在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可以用,选举就是该微服务做了集群,必须有一台主机其他都是从机。
        Eureka各个节点是平等的关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。如果查询到的数据不是最新的,那是Eureka的自我保护机制导致的。
        Eureka本质上是一个工程,而Zookeeper是一个进程。
        Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,不会像Zookeeper一样使得整个注册系统瘫痪。

白话文:当节点出故障的时候,zookeeper因为强一致性,必须选好Master之后,才能用;Eureka因为高可用,一个节点挂了其他的节点顶上

11、负载均衡的意义是什么?

        负载均衡就是优化资源使用,最大吞吐量,最小化响应时间并且避免任何单一资源的过载。使用多个组件进行负载均衡,而不是单个组件可能会通过冗余来提高可靠性和可用性。负载均衡通常涉及专用软件或者硬件,例如多层交换机或者域名系统服务器进程。

白话文:让多台机子处理并发请求,并快速响应,避免单台机子压力太大而挂掉。

12、什么是hystrix?如何实现容错

什么是hystrix

        Hystrix是Netflix针对微服务分布式系统采用的熔断保护中间件,相当于电路中的保险丝。 在微服务架构下,很多服务都相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,Hystrix 通过HystrixCommand对调用进行隔离,这样可以阻止故障的连锁反应,能够让接口调用快速失败并迅速恢复正常,或者回退并优雅降级。

白话文:hystrix就是保险丝,当下游服务不可用时,快速返回失败或者进行降级操作,而不是傻傻的等待响应

如何实现容错
        Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。

  1.  包裹请求
  2.  跳闸机制:当服务错误率达到一定阈值时,自动跳闸或者手动跳闸
  3.  资源隔离:Hystrix为每个依赖都维护了一个小型的线程池,当线程池已满,会立即拒绝该依赖的请求,加速失败判定。
  4.  监控
  5.  回退机制:发生错误时,执行回退机制fallback,类似缺省值;
  6.  自我修复:断路器打开后的自动恢复机制

13、说说RPC的实现原理(非常重要)

1. 建立通信

        主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

2. 服务寻址
        要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称以及入参出参是什么。

        可靠的寻址方式(注册中心)是RPC的实现基石,比如可以采用Redis或者Zookeeper来注册服务等等。        

2.1 从服务提供者的角度看:       

        当服务提供者启动的时候,需要将自己提供的服务注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找;

        当服务提供者由于各种原因致使提供的服务停止时,需要向注册中心注销停止的服务;

        服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳,则认为该服务提供者已经停止服务,将该服务从注册中心上去掉

        

2.2 从调用者的角度看:
        服务调用者启动时根据自己订阅的服务向服务注册中心查找服务提供者的地址等信息;

        当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者;

        服务调用者下线的时候,则取消订阅。

3. 网络传输
3.1 序列化
        当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。

3.2 反序列化
        当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。

4. 服务调用
        B机器进行本地调用(通过代理Proxy和反射调用)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理,一般是业务逻辑处理操作。

14、Eureka的自我保护机制

        Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

白话文:服务实例注册到eureka之后,会和eureka维持心跳,当心跳低于一定阈值(85%)的时候,本来应该是删除这个实例的,但实际上eureka会有自我保护机制,留了一个假的实例,调用者还是可以调用的,只不过调用会触发熔断和降级

自我保护机制的意义

        它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。这种模式旨在避免因网络分区故障导致服务不可用的问题。例如,两个客户端实例 C1 和 C2 的连通性是良好的,但是由于网络故障,C2 未能及时向 Eureka 发送心跳续约,这时候 Eureka 不能简单的将 C2 从注册表中剔除。因为如果剔除了,C1 就无法从 Eureka 服务器中获取 C2 注册的服务,但是这时候 C2 服务是可用的。

白话文:为了高可用,避免网络抖动,导致服务提供者莫名其妙下线(冤死)

15、Eureka怎么实现高可用?

        Eureka是一个服务注册与发现的工具,通过Eureka可以将服务提供者的信息注册到EurekaServer,并且服务消费者可以从EurekaServer获取可用的服务提供者列表。

        保证高可用性,可以采取以下措施:

        EurekaServer集群:通过部署多个EurekaServer实例 组成集群,提高EurekaServer的可用性。再EurekaClint注册时,需要将注册地址设置为多个EurekaServer的地址;这样即使某些EurekaServer宕机,客户端仍然可以发现服务实例。
        负载均衡:对于EurekaServer集群,可以使用负载均衡分摊请求负载,在请求EurekaServer时自动选择一台可用的服务器进行响应。
        备份注册中心:可以将EurekaServer注册信息备份到其他存储设备(数据库或文件),避免注册信息丢失。当EurekaServer宕机,可用快速恢复。

16、什么是网关?网关的作用?

        网关相当于网络服务架构的入口,所有的网络请求必须通过网关转发到具体的服务。网关可用统一管理微服务请求,权限控制,负载均衡,路由转发,监控,安全控制黑名单和白名单等。

17、说说你对Spring Cloud Gateway的理解

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

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

18、什么是Ribbon

        Ribbon是一个有负载均衡功能的http客户端(基于HTTP和TCP),它不像 spring cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个 spring cloud 微服务中。包括 feign 提供的声明式服务调用也是基于该 Ribbon实现的。(feign内置了ribbon)

19、Ribbon的负载均衡算法

ribbon 默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义的负载均衡算法。

20、什么是Feign

Feign 运行在消费者端的,使用 Ribbon 进行负载均衡,所以 Feign 直接内置了 Ribbon

Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端

Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

Feign本身不支持Spring MVC的注解,它有一套自己的注解(和OpenFeign的区别)

21、什么是OpenFeign

OpenFeign在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

22、Ribbon和Feign的区别

调用方式不同
        Ribbon 和 Feign 都是用于调用其他服务的,但调用方式不同,Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致;Ribbon需要自己构建 http 请求,模拟 http 请求然后使用RestTemplate 发送给其他服务

白话文:ribbon调用需要自己构建httpRibbon ,feign将要调用的方法定义成接口,并加个注解(就像我们调用自己本地的方法一样)

【八股文】SpringCloud全家桶

一天吃透SpringCloud面试八股文

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个基于Spring Framework的开源框架,用于构建分布式系统和微服务架构。它提供了一系列的工具和框架,帮助开发人员快速构建、部署和管理微服务应用。 下面是Spring Cloud的八股文要点: 1. 服务注册与发现:Spring Cloud使用Eureka或Consul等组件来实现服务注册与发现,使得服务能够自动注册和发现其他服务。 2. 负载均衡:Spring Cloud通过集成Ribbon或Feign等组件来实现负载均衡,可以根据一定的策略将请求分发到多个服务实例上。 3. 服务调用:Spring Cloud通过Feign或RestTemplate等组件来实现服务之间的调用,使得服务能够方便地进行通信。 4. 配置中心:Spring Cloud提供了Config Server来实现集中式的配置管理,可以动态刷新配置,避免了重新部署应用。 5. 熔断器:Spring Cloud通过Hystrix来实现熔断器功能,可以防止服务之间的级联故障,提高系统的容错性。 6. 服务网关:Spring Cloud通过Zuul或Gateway等组件来实现服务网关,可以统一对外暴露API接口,并进行路由、过滤等功能。 7. 分布式追踪:Spring Cloud集成了Zipkin或Sleuth等组件,可以实现分布式系统的请求链路追踪和监控。 8. 消息总线:Spring Cloud通过集成Kafka或RabbitMQ等消息中间件,实现了消息总线功能,可以方便地进行消息的发布和订阅。 这些是Spring Cloud的核心功能和组件,通过它们可以快速搭建和管理分布式系统和微服务架构。同时,Spring Cloud还提供了一系列的插件和扩展,使得开发人员能够更加方便地进行开发和运维工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值