Springcloud面试题话术

1、什么是Springcloud

Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性简化 了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。他的设计目的是为 了简化 Spring 应用的搭建和开发过程。该框架遵循==“约定大于配置”==原则,采用特定的方式进行配置,从而使开发者不用定义大量的 XML 配置。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说: Spring Cloud 提供了构建分布式系统所需的“全家桶”。核心组件:Eureka/nacos、Ribbon、Feign、 Hystrix、Zuul.

为什么要使用这个呢?因为之前的嗯项目架构都是集中式的。这就会导致一个问题在项目当中出现任何一个小问题都会让整个项目不能使用。修改完之后需要让整个项目全量更新,所以基于传统架构的这种方式,我们在这个项目当中把,架构调整了一下,采用了微服务的架构。那使用了微服务架构之后,在整体的分配任务上呀,还有扩展性上来讲,比以前的开发以及这个效率上都有很显著的提高。

我介绍一下spring cloud里边儿的一些组件吧,我们项目当中使用的。首先就是它的注册中心nacos。所有的微服务。都需要连接nacos去进行管理。它里边儿会有心跳协议,会知道每个微服务具体的一个在线状态。以及给其他调用微服务的这些去提供一些这这个微服务的基本信息

接着就是这个远程调用feign,它提供了微服务之间的远程调用的一个组件,它是基于HTTP的。然后,远程调用这个组件集成了负载均衡ribbon。它可以有效的分辨出当前注册中心当中这个为服务有多少实例,会根据内部的算法去均衡的域访问这些实例,它的算法有轮询还有随机,这个算法我们也可以自定义,它默认的算法呢是轮循去访问

接着就是。熔断器hystrix。那他这个组件儿在我们项目当中用的时候,就是在远程调用时。如果任何一个微服务响应超时或者发生异常,熔断器就会介入,把当前请求切断。然后去执行我们的回调方法,返回回调方法当中的数据。这样的话会保证我们微服务当中的请求链路不会卡死,而且,这样的话不会让用户在前台一直在等着。会有一个非常好的用户体验。

接着就是我们的网关gateway。网关在我们项目当中充当的地位就是一个所有请求的入口。所有请求进来之后,首先通过网关有网关,根据路径儿去解析,然后转发到对应的微服务上,当然这个网关还充当了一个功能,就是一个鉴权功能,我们项目当中,登陆了之后,会给用户颁发一个token。用户在访问的时候,这个token会携带在请求头当中,经过我们网关时,网关会拦截取出token。验证token的真实性。验证通过之后才会访问到我们的微服务。这就是我们项目当中微服务具体使用的一些场景以及它的组件。

2、服务注册和服务发现是什么意思,springcloud是如何实现的

在微服务项目中,我们通常会用到服务之间的相互调用,我们通常在属性文件中进行所有的需要请求的微服务的地址端口等信息。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下架,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 提供了服务注册和服务发现的功能,服务注册是让所有微服务将自己的信息注册到注册中心,服务发现是让微服务可以拉取注册中心里的服务列表,方便结合feign进行远程调用,由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找, 因此无需处理服务地点的任何更改和处理。

3、负载均衡的意义是什么

我觉得负载均衡的主要意义就是,避免单一应用由于并发等原因,导致应用宕机从而导致系统整体无法使用,多负载同时工作,可以很好的解决高并发的问题,实现服务的高可用。

在我们项目中,服务的接入层由nginx管理,用户请求经过nginx之后,根据相应的域名,转发到对应的服务器去,由于nginx只负责请求转发,没有业务逻辑处理,所以效率上非常高。

nginx支持的负载均衡策略有很多,我们在nginx.conf中配置upstream模块即可。

首先是轮询,默认的就是这种方式

第二种权重的方式,就是根据服务器的性能,配置较大的权重,nginx就会分配更多的请求

第三种是iphash的方式,nginx会根据请求的ip地址,今夕那个hash运算,然后分配相应的服务器,后续来自同一ip的请求都会分配到这个服务器上

第四种是最少连接数,把请求转发给连接数较少的后端服务器

还有就是可以根据响应时间和url hash来做处理,我们项目中配置的是权重的方式。

在我们项目的微服务架构中,feign和zuul都集成了ribbon的的功能,它是负责在微服务之间相互调用的时候,帮我们实现负载均衡的功能,我们在将微服务注册到注册中心时,如果服务名称一致,就默认为一个集群,在进行远程调用或者路由转发的时候,都可以均衡的访问响应的服务器,ribbon的负载均衡机制有轮训和随机,默认是轮训,当然也可以自定义负载均衡的策略。

hystrix介绍

hystrix在微服务架构中充当熔断器的功能,它提供了资源隔离、限流、熔断、降级、运维监控等功能,

在微服务架构中通常会有多个微服务之间相互调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,直接执行回调方法,返回回调方法中的友好数据或者缓存数据,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费 CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经、修正,应用程序会再次尝试调用操作。

当 Hystrix Command 请求后端服务失败数量超过一定比例(默认 50%),断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认 5 秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况,如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix 的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。

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

1、ZooKeeper保证的是CP,就是一致性和容错,Eureka保证的是AP,就是可用性和容错。

ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的,只有等到选举结束之后,所有数据同步之后才能使用。

Eureka各个节点是平等关系,只要有一台Eureka就可以保证服务可用,而查询到的数据并不是最新的,自我保护机制会导致Eureka不再从注册列表移除因长时间没收到心跳而应该过期的服务。Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用),当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性)

Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper一样使得整个注册系统瘫痪

2、ZooKeeper有Leader和Follower角色,Eureka各个节点平等

3、ZooKeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题

4、Eureka本质上是一个微服务的一个模块,而ZooKeeper是一个进程,需要单独安装

6、SpringCloudAlibaba组件

在这里插入图片描述

注册中⼼:Nacos,实现服务的注册与发现,完成服务的管理
配置中⼼:Nacos,实现项⽬中动态数据的统⼀管理,项⽬⾃动获取最新的数据信息
⽹关中⼼:Gateway,聚合后端服务,实现请求过滤
远程调⽤:OpenFeign,实现服务之间的通信,完成远程调⽤
熔断降级:Sentinel,实现请求的流量可视化控制,和接⼝的熔断降级
链路跟踪:Sleuth+Zipkin,实现服务的调⽤链路跟踪,通过记录⽇志的形式完成
nacos:服务注册时在服务端本地会通过轮询注册中⼼集群节点地址进⾏服务得注册,在注册中⼼上,即Nacos
Server上采⽤了Map保存实例信息,当然配置了持久化的服务会被保存到数据库中,在服务的调⽤⽅,
为了保证本地服务实例列表的动态感知,Nacos与其他注册中⼼不同的是,采⽤了 Pull/Push同时运作
的⽅式。
gateway:
1.使⽤
作⽤:1.路由匹配,⽀持多种⽅式,⼀般都是使⽤路径匹配 2.请求过滤,⽀持全局过滤器和局部过滤器
2.路由匹配流程
(1) Gateway 接收客户端请求。
(2) 客户端请求与路由信息进⾏匹配,匹配成功的才能够被发往相应的下游服务。路径匹配
(3) 请求经过 Filter 过滤器链,执⾏ pre 处理逻辑,如修改请求头信息等。
(4) 请求被转发⾄下游服务并返回响应。
(5) 响应经过 Filter 过滤器链,执⾏ post 处理逻辑。
(6) 向客户端响应应答。
在这里插入图片描述
OpenFeign
最核⼼的作⽤是为 HTTP 形式的 Rest API提供了⾮常简洁⾼效的 RPC 调⽤⽅式
1.使⽤
2个注解:1.@EnableFeignClients2.@FeignClient
2.问题解决
1.⽂件上传
2.请求消息头传递
3.负载均衡
OpenFeign实现服务的负载均衡调⽤是基于:loadbalancer实现的,⽀持的负载均衡算法:2种:1.轮询-默认 2.随机
如果调⽤的服务提供者是⼀个集群,那么我们就需要使⽤负载均衡的形式进⾏调⽤,默认轮询

RoundRobinLoadBalancer //轮询
RandomLoadBalancer//随机

4.⼯作原理
1.通过 @EnableFeignCleints 触发 Spring 应⽤程序对 classpath 中 @FeignClient 修饰类的扫描
2.解析到 @FeignClient 修饰类后, Feign 框架通过扩展 Spring Bean Deifinition 的注册逻辑, 最终注册⼀个 FeignClientFacotoryBean 进⼊ Spring 容器
3.Spring 容器在初始化其他⽤到 @FeignClient 接⼝的类时, 获得的是 FeignClientFacotryBean 产⽣的⼀个代理对象 Proxy.
4.基于 java 原⽣的动态代理机制, 针对Proxy 的调⽤, 都会被统⼀转发给 Feign 框架所定义的⼀个InvocationHandler , 由该 5.Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的⼯作
在这里插入图片描述
== Sentinel==
1.应⽤
1.限流:可视化,完成接⼝的流量现在,⽀持:1.单机阈值(1.线程数 2.QPS) 2.集群阈值(1.均摊 2.总量)
2.熔断降级:保护核⼼接⼝,⼀旦接⼝出现故障,可以根据熔断条件,进⾏⾃动降级处理,熔断机制:1.RT 2.异常数 3.异常⽐例
2.原理
调⽤链路是Sentinel的⼯作主要流程,是由各种Slot插槽组成的,将不同的Slot按照⼀定的顺序串在⼀起(其实就是责任链模式),从⽽将不同的功能组合在⼀起
在Sentinel中,其实所有资源都对应的资源名称,也就是resourceName,每次访问资源都会创建⼀个对应的Entry对象,在创建Entry的同时,还会创建⼀系列的功能插槽(slot chain),这些槽会组成⼀个责任链,并且每⼀个的职责还不⼀样,具体如下
1、NodeSelectorSlot:负责收集资源的调⽤路径,以梳妆结构存储调⽤栈,⽤于根据调⽤路径来限流降级
2、ClusterBuilderSlot:负责创建以资源名维度统计的集群节点ClusterNode,⼀级创建每个ClusterNode下按调⽤来源prigin划分的StatisticNode
3、LogSlot:在出现限流、熔断、系统保护时负责记录⽇志
4、AuthoritySlot:权限控制,⽀持⿊名单和⽩名单两种策略
5、SystemSlot:控制总的⼊⼝流量,限制条件依次是总QPS、总线程数、RT阈值、操作系统当前load、操作系统当前CPU利⽤率
6、FlowSlot:根据限流规则和各个Node中的同级数据进⾏限流判断
7、DegradeSlot:根据熔断规则和各个Node中的统计数据进⾏服务降级
8、StatisticSlot:统计不同维度的请求数、通过数、限流数、线程数等runtime信息,这些数据存储在DefaultNode、OriginNode和ClusterNode中。

7、Nacos和Eureka的区别

设计理念与功能特性
Nacos是由阿里巴巴开源的,旨在为构建原生应用提供动态服务发现、配置管理和服务管理平台。它不仅支持服务注册发现,还集成了配置管理功能,支持多种语言和生态。
Eureka是Netflix开源的服务发现框架,作为Spring Cloud生态的一部分,专注于提供基于REST的服务注册发现机制,适用于Java构建的微服务架构。
服务发现机制
Nacos支持定时拉取和订阅推送两种服务发现模式,而Eureka仅支持定时拉取模式。
Nacos中的注册中心会定时向消费者主动推送信息,保持数据的准时性,而Eureka需要定时向注册中心拉取服务。
健康检测方式
Nacos对临时实例采用心跳模式检测,对永久实例采用主动请求来检测。Eureka只支持心跳模式进行健康检测。
Nacos将服务分为临时服务和非临时服务。对于临时服务,Nacos采取的策略与Eureka相同;对于非临时服务,Nacos不会对其进行心跳检测,而是主动调用该服务查看是否正常。
连接类型
Nacos使用Netty进行通信,建立长连接;Eureka则是短连接,通过定时发送与服务进行联系。
一致性保证
Nacos在集群中默认采用AP方式,当存在非临时实例时,采用CP模式。Eureka则采用AP方式。
自我保护模式
Nacos的阈值是针对某个具体Service的,而Eureka的自我保护阈值是针对所有服务的。

8、自定义负载均衡策略如何实现

可以自己创建类实现IRule接口 , 然后再通过配置类或者配置文件配置即可 ,通过定义IRule实现可以修改负载均衡规则,有两种方式:
1,创建类实现IRule接口,可以指定负载均衡策略(全局)
2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略(局部)

9、什么是服务雪崩,怎么解决这个问题?

服务雪崩:一个服务失败,导致整条链路的服务都失败的情形
服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与feign接口整合,编写降级逻辑
服务熔断:默认关闭,需要手动打开,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求

10、分布式配置中心能干嘛

(1)集中管理配置文件不同环境不同配置,动态化的配置更新,分环境部署比如
dev/test/prod/beta/release
(2)运行期间动态调整,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
(3)当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置将配置信息以REST接口的形式暴露

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值