Spring Cloud常见面试题

news2024/9/20 0:42:18

1.请说说你用过Spring Cloud哪些组件?这些组件分别有什么作用?

1、注册中心:Eureka、Nacos、Zookeeper、Consul;(服务注册)

2、负载均衡:Ribbon、LoadBalancer;(客户端的负载均衡)

3、服务调用:Feign、OpenFeign、Dubbo RPC;(优雅调用远程服务)

4、配置中心:Spring Cloud Config、Nacos;(统一管理服务配置)

5、熔断降级:Hystrix、Sentinel;(急骤请求,防止服务雪崩)

6、分布式事务:Seata (跨库跨服务的事务管理)

7、服务网关:Zuul 1.x、Zuul 2.x、Spring Cloud Gateway;(系统入口门面)

8、链路追踪:Skywalking、Zipkin;(监控服务状态、协助排查问题) 

2.谈谈你对Spring Cloud的理解? 

1、微服务开发需要解决各类问题,比如:负载均衡,服务的注册与发现,服务调用,服务路由,服务熔断等等一系列问题;

2、在没有Spring Cloud之前,我们需要自己寻找各种组件并进行集成来解决一系列微服务场景下的问题,有了Spring Cloud,它帮我们把微服务面临的各类技术问题全部打包好了,我们只需要开箱即用;

3、Spring Cloud最大的贡献是为开发人员提供了一整套集成好的微服务解决方案,不再需要开发人员自行集成各类组件解决不同问题,降低了微服务开发难度,Spring Cloud提供了统一标准,功不可没;

4、Spring Cloud在天下大乱,群雄并起中,实现了一统天下;

5、Spring Cloud的出现,也为Spring生态注入了更强大的生命力; 

3.什么是服务熔断?什么是服务降级?有什么区别? 

服务熔断,当服务A调用服务B时,如果此时服务B不可用,那么上游的服务A为了保证自己不受影响,就切断调用服务B,防止发生服务雪崩,直到B服务恢复;

提前做好一种兜底措施,比如返回假的数据,或者记录数据信息到数据库、redis、文件中,后续进行补救,直到B服务恢复;

服务降级,当系统负载过高时,对非核心的业务服务进行关闭,来保证核心业务的正常运行; 关闭某些不重要的服务,或者拒绝低优先级应用的服务请求,保证核心应用正常工作;

相同: 目的相同,都是为了保证服务的可用性,防止系统整体负载过大甚至崩溃; 表现相同,都是表现出服务暂时不可用的状态;

不同: 触发原因不同,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑; 

4.你之前的项目运行得好好的,为什么项目重构时要对系统进行拆分呢? 

1、项目随着业务功能的增加,功能模块增多,业务复杂度增大,代码量也增加,在多人团队中,各开发人员为了实现自己的功能,有时候经常需要修改另一个开发人员的代码,经常会出现代码的冲突;

2、一个地方的功能修改经常导致另外一个地方的功能出现异常;

3、每次一个小小的修改,都需要测试团队对很多功能进行测试,效率非常低,测试团队也充满抱怨;

4、每次新增新的需求,开发效率都比较低下,由于所有功能都在一个项目中,导致业务代码逻辑变得非常复杂,经常陷入牵一发动全身的状态,团队成员也不敢轻易修改代码,响应新需求的速度低;

5、由于所有功能在一个项目中,代码量极大,代码的可读性可维护性可扩展性都变得很差,也导致团队成员不稳;

6、出现一些更好的新技术,也不敢轻易升级技术,升级非常困难,升级可能产生各种问题,调试和测试会消耗大量的时间和精力,团队生成力极低;

7、项目迭代上线效率低,每次上线,全体成员,技术团队、测试团队、运维团队都需要加班加点,而且常常都是胆战心惊的; 

一个几百万行、几十万行代码的系统拆分成几百个、几十个服务,每个服务就只有1~2万行代码,每个服务由1~2人负责,每个人专注自己的服务维护;

1、不会出现代码冲突;

2、代码逻辑变简单了,代码变清晰了;

3、测试也变得容易了;

4、响应新需求的速度也提升了;

5、升级新技术也变容易了;

6、上线发布也变容易了;

5.Eureka和Nacos都可以做注册中心,它们有什么区别? 

注册中心:Eureka、Nacos、Zookeeper、Apollo、Consul;

相同点

1、都用于服务的注册和发现;

2、都支持服务的心跳健康检查;

3、都支持高可用; 

不同点

1、Nacos支持主动对微服务状态检测,Nacos临时实例采用心跳检测,永久实例采用主动检测;

2、Nacos临时实例心跳检测不正常会从注册中心删除,永久实例不会删除;

3、Nacos支持服务列表变更时的主动消息推送,服务列表更新会更及时;

4、Nacos集群支持两种模式,默认采用AP模式,当集群中存在非临时实例时,采用CP模式,而Eureka只能采用AP模式;

5、Nacos支持注册中心、配置中心,Eureka只支持注册中心;

6、Nacos具备服务优雅上下线和流量管理,而Eureka的后台页面仅供展示,需要使用api操作上下线且不具备流量管理功能;

7、Nacos社区活跃,Eureka已经闭源了;

6. ACID、BASE理论、CAP理论的关系? 

1.ACID 是传统数据库中常用的设计理念;

1、Atomicity (原子性)

保证1-6所有步骤要么都执行,要么都不执行,一旦在执行某一步骤的过程中发生异常,就需要执行回滚操作。比如执行到第五步时,B账户突然不可用(比如被冻结或其他原因不可用),那么之前的所有操作都应该回滚到执行事务之前的状态;

2、Consistency (一致性)

在转账之前,A和B的账户中共有1000+1000=2000元钱,在转账之后,A和B的账户中共有900+1100=2000元。即数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态,并保证数据在业务意义上是正确的;

3、Isolation (隔离性)

隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行,也就是多个事务之间貌似是排队进行的。

4、Durability (持久性)

一旦转账成功(事务提交),两个账户中的金额就会发生真实变化(会把数据写入数据库持久化保存,也就是永久的保存),这就是持久性;

当然在实际应用场景中一个节点属于单点故障,所以需要增加多个副本(replica)一起来保证持久;如果做得更加完善,可以在不同地理位置的另一个数据中心做备份。

ACID它追求的是数据的强一致性模型。 

2.BASE理论支持的是大型分布式系统;

1、基本可用 (Basically Available)

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性;

2、软状态 (Soft State)

软状态指允许系统中的数据存在中间状态,允许系统在不同节点的数据副本之间进行数据同步的过程存在延时;

3、最终一致性 (Eventually Consistent)

最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一致的状态,而不需要实时保证系统数据的强一致;

BASE理论它是通过牺牲强一致性以获得高可用性。

3.CAP理论是支持分布式系统而提出的;

1、C 一致性(Consistency)

分布式系统中,所有节点的数据或状态在任何时刻都是一致的;

2、A 可用性(Availability)

分布式系统中,任何时刻都能够处理请求,都处于可用的状态;

3、P 分区容错性(Tolerance of network Partition)

分布式系统中,在遭遇网络故障时仍能继续正常工作;

分布式系统无法做到CAP,只能做到其中两项,要么CP,要么AP;

总结:

        ACID它追求的是数据的强一致性;

         CAP理论是分布式系统在一致性、可用性、分区容错性三个方面必须要做出的取舍,它针对的是互联互通并共享数据的分布式系统的读和写操作;

        BASE理论是对CAP理论的延伸和补充,它是通过牺牲强一致性以获得高可用性,虽然存在中间状态,但数据最终一致;

        ACID 和 CAP、BASE 代表了两种截然相反的设计哲学;

        在分布式系统设计中,根据不同场景的实际情况,可以把 ACID、CAP(AP、CP)、BASE 结合起来使用;

7.注册中心应该选择CP还是AP? 

CP:

如果选择CP(一致性),当我们向注册中心注册实例或删除实例时,都需要等待注册中心集群中的数据达到一致后才算注册或删除成功,在同步数据时,影响服务发现及服务调用;随着应用规模增大,应用实例频繁注册或删除,必将影响注册中心服务注册与发现的效率; AP:

如果选择AP(可用性),注册中心集群各节点不管数据是否同步一致了都可以提供服务,优先保证服务可用性,比如拉取到了一个已经下线了的服务节点,但是微服务框架一般都提供了服务容错和重试功能,也影响不大,对于注册中心而言不需要消耗时间和资源来实时地保证数据一致性,保证最终一致性即可,这样将减轻注册中心的压力,提升注册中心服务注册与发现的效率; 

8.什么是接口幂等性?哪些场景需要幂等性?如何设计来保证接口幂等性? 

幂等,英文idempotent [aɪ'dɛmpətənt]

幂等这个词源自数学,是数学中的一个概念,常见于抽象代数中,表达的是N次变换与1次变换的结果相同,在计算机的各个领域都借用了该概念;

幂等函数或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数;

简单来说就是如果方法调用一次和多次产生的效果是相同的,不会导致系统数据出错,那么它就具有幂等性; 

幂等性衍生到我们系统中, 它的语义是指函数/接口可以使用相同的参数重复执行, 不应该影响系统状态, 也不会对系统造成改变;

也就是任意多次执行所产生的影响均与一次执行所产生的影响相同;

如果用户对同一操作发起的一次请求或多次请求所产生的影响是一样的,不会因为多次调用(点击)而产生了副作用,那么这就是幂等的;

第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用,这里的副作用是指不会对结果产生破坏或者产生不可预料的结果; 即 幂等性 = 多次执行无副作用;

1、因网络波动,可能会引起重复请求;

2、用户重复操作,用户可能会无意的触发多次下单多次交易,甚至没有响应而有意触发多笔交易;

3、应用使用了失败或超时重试机制(如RPC重试、业务层重试等)

4、第三方平台的接口(如:支付成功回调接口),因为异常导致多次回调;

5、中间件/应用服务根据自身的特性,也有可能进行重试;

6、用户双击提交按钮;

7、用户页面重复刷新;

8、使用浏览器后退按钮重复之前的操作,导致重复提交表单;

9、使用浏览器历史记录重复提交表单;

10、浏览器重复的HTTP请求;

11、定时任务重复执行;

1、使用唯一索引防止幂等性问题

        此方案可以限制重复插入数据,当数据重复时,插入数据库会抛异常,保证不会出现脏数据,这也是一种简单粗暴的办法;

2、Token+Redis的幂等方案

        这种方式分成两个阶段:申请token阶段和业务操作阶段; 以支付为例: 第一阶段,在进入到提交订单页面之前,需要订单系统根据用户信息向支付系统发起一次申请token的请求,支付系统将token保存到Redis缓存中,为第二阶段支付使用; 第二阶段,订单系统拿着申请到的token发起支付请求,支付系统会检查Redis中是否存在该token,如果存在,表示第一次发起支付请求,开始支付逻辑处理,处理完逻辑后删除redis中的token; 当重复请求时候,检查缓存中token不存在,表示非法请求;

3、防重表实现幂等性 需要增加一个表,这个表叫做防重表(防止数据重复的表) 使用唯一主键去做防重表的唯一索引,比如使用订单号orderNo做为防重表的唯一索引,每次请求都根据订单号向去重表中插入一条数据,第一次请求查询订单支付状态,当然订单没有支付,然后进行支付操作,支付前先向防重表中插入该支付的订单号,插入成功说明可以支付,然后进行支付操作,支付操作执行完后更新订单状态为成功或失败或其他状态,然后再删除防重表中的数据,所以在支付的过程中,另一个请求如果也请求支付则因为防重表中唯一索引而插入失败,则返回操作失败,直到第一次的请求操作完成(成功或失败),可以看出防重表作用是加锁的功能;(基于数据库的分布式锁)

9.你在项目中是否遇到分布式事务问题,分布式事务怎么解决? 

常见的分布式解决方案:  

1、2PC;

2、3PC;  

3、TCC;  

4、本地消息异步确认;  

5、可靠消息最终一致性;  

6、最大努力通知;  

7、RocketMQ解决分布式事务;  

8、阿里巴巴的Seata解决分布式事务; 

10.分布式环境下如何进行服务的限流? 

计数器法

        它是限流算法中最简单粗暴,也最容易的一种算法,比如我们要求某一个接口1分钟内的请求不能超过60次,我们可以在开始时设置一个计数器,每次请求,该计数器+1;如果该计数器的值大于60并且与第一次请求的时间间隔在1分钟内,那么说明请求过多,如果该请求与第一次请求的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器; 

漏桶算法

        维基百科:https://en.wikipedia.org/wiki/Leaky_bucket   漏桶算法的思路,水(请求)先进入到漏桶里,漏桶以恒定的速度流出,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

        有一个固定容量的漏桶,按照常量固定速率流出水滴; 如果漏桶是空的,则不需流出水滴; 可以以任意速率流入水滴到漏桶; 如果流入水滴超出了桶的容量,则流入的水滴溢出了(也就是请求被丢弃),而漏桶容量是不变的。

令牌桶算法

        维基百科:https://en.wikipedia.org/wiki/Token_bucket 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

Guava框架提供了令牌桶算法实现(Google),可直接拿来使用,使用 Guava框架的RateLimiter类即可创建一个令牌桶限流器,比如设置每秒放置令牌数为5个,那么RateLimiter对象就可以保证1秒内不会放入超过5个令牌,并且以固定速率进行放置令牌,达到平滑输出的效果。

1、Nginx 限流; Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制请求速率; limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=2r/s;

2、OpenResty 限流;

3、Sentinel 限流;

4、Redis+Lua 限流;

5、Spring Cloud Gateway 限流;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件误删危机应对:数据恢复全解析

文件误删:数字化时代的隐形挑战 在数字化的浪潮中,文件已成为我们工作、学习和生活中不可或缺的一部分。它们记录着我们的思想、成果与回忆,是连接现实与虚拟世界的桥梁。然而,这份便捷与高效背后,却隐藏着文件误删这…

集群聊天服务器项目【C++】(三)muduo库的简单介绍

在上一讲中介绍了Json库的相关知识,本次接着介绍muduo库的相关内容,这些知识在本项目中都会使用到。 1.muduo库简介 muduo库顶层就是epoll(IO复用技术) Linux的pthread多线程,所以只能安装在Linux系统中。此外它依赖…

Transformer学习(4):位置编码 Positional Encoding

为什么需要位置编码 在自注意力编码中,所有 a a a的计算都并行同时执行得到对应的 b b b,可以并行就代表着 a a a之间是不存在先后顺序关系的,这存在问题。 在不使用位置编码时,将 a 2 a_2 a2​与 a 3 a_3 a3​的顺序打乱&#…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息。 项目简介: 疫情下图书馆管理系…

实景三维赋能低空经济:探索天空之城的未来图景

在数字化转型的大潮中,低空经济作为新兴业态正逐渐崭露头角,它不仅拓宽了航空业的边界,也为智慧城市、应急救援、物流配送、旅游观光等领域带来了前所未有的发展机遇。而实景三维技术,作为地理信息与遥感领域的前沿科技&#xff0…

java环境配置 | 基础铺垫

cmd命令 dir : 罗列目录下所有的文件展示出来cd xx : 进入xx文件夹cd … 返回上一级cls : 清除屏幕内容exit : 退出命令提示窗口环境变量 就是存储某个应用路径的变量,通过这个变量可以快速访问到某个应用exe 为什么要配置环境变量? 我们想要在任意的目录下都可以打开指…

小琳AI课堂:o1系列模型

大家好,这里是小琳AI课堂!今天我们一起来探索OpenAI最新发布的o1系列模型,这可是AI领域的一大突破哦! OpenAI o1系列模型技术大揭秘 o1系列模型是基于强化学习(RL)训练的,包括o1-preview和o1-…

彩漩科技亮相企业出海峰会,展示智能办公新力量

近日,在北京市海淀区商务局的指导下,由中关村东升科技园联合创新企业科普联盟共同举办的企业出海峰会于北京成功举办。本次峰会以“出海新征程,企业新高度”为核心议题,深入探讨全球化背景下科技企业出海面临的机遇与挑战。通过汇…

IntelliJ IDE 插件开发 | (十二)自定义项目脚手架(上)

系列文章 本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。 前言 在开发创建一个新项目的时候,我们一般都会使用平台自带的脚手架,如下图所示: 或者是使用网页版: 尽管平台已经…

GoogleDrive中上传文件,Java整合操作

GoogleDrive使用ServiceAccount的授权方式:(科学上网) 1.在Google Cloud中查看自己的项目:Dashboard – My First Project – Google Cloud console,没有的话新建项目。默认名称:My First Project 2. 创建…

基于 WeChatFerry 的 Python 机器人框架WeChatRobot

WeChatRobot 一个基于 WeChatFerry 的 Python 机器人框架。 微信机器人,接入Gemini、ChatGPT、ChatGLM、讯飞星火、Tigerbot;成语接龙、天气预报、新闻摘要、定时任务 克隆项目: git clone https://github.com/lich0821/WeChatRobot.git …

计算机毕业设计 沉浸式戏曲文化体验系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

百年病态集论的症结:3000年不识伪≌直线段

黄小宁 公元前1100年中国人商高同周公的一段对话谈到了勾股定理说明人类认识几何学的直线段起码已有3000多年。 直角三角形⊿的斜边c~水平直角边a,即c经旋转和均匀压缩变换可变为a~c。3000年不识伪≌直线段使数学认定a经刚体运动变为附着在c…

rk3399 的 HDMI 热插拔的问题

问题: 客户的3399 的板子上,烧写ubuntu 发现, 没有热插拔。 测试情况: 系统在第一次烧写完成之后,是有热插拔的,但是第二次启动就没有了。 还有一个情况,就是 ,如果我一开始 上电的…

[论文精读]Polarized message-passing in graph neural networks

论文网址:Polarized message-passing in graph neural networks - ScienceDirect 论文代码:he-tiantian/PMP-GNNs:极化消息传递图神经网络的 Pytorch 实现,发表在 Artificial Intelligence,2024 年。 (github.com) 英…

红日靶场通关

初始准备 首先是网络配置,看教程来的,我配置完的效果如下 windows7:(内:192.168.52.143 / 外:192.168.154.136) windows2003:(内:192.168.52.141)windows2008:(内:192.…

运算放大器选型的关键参数

上图中的顺序是从左上到右下进行选型,小信号看带宽,大信号看压摆率。一般选用电压反馈型的运放,但是涉及到高频特性的时候也会选择电流反馈型的运放。精密运放选用失调电压比较小的运放,一般失调电压在1mv左右。低功耗的情况下需要…

极越造车2.0:01销量回暖,07杀出血路,ASD抢跑FSD

‍‍‍作者 |张马也 编辑 |德新 9月13日,极越公布其第二款车型极越07上市48小时内,订单超过5000台。 对这家造车4年多的车企来说,这意味着新车取得了初步的成功。 懂车帝的数据显示,7月极越01销量1143台,8月销量则翻…

Linux 入门:简单的基础操作

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言Linux 入门:从基础操作到 WSL2 安装文章有误敬请斧正 不胜感恩!1. 什么是 Linux?2. Linux 和其他系统有啥不同?3. Linux 的主要组成4. 常见 Linux 发行版5. 基本…

openstack之cinder介绍

概念 cinder 为虚拟机提供管理块存储服务。支持的文件系统:lvm、iscsi、nfs、san、RBD 组件构成及功能介绍 cinder api:在控制节点运行,管理服务的接口,被命令行、其他组件调用; cinder scheduler:类似n…