SpringCloud面试题总结

SpringCloud(5)大组件有哪些?

注册中心:Eureka (Nacos)

负载均衡:Ribbon

远程调用:Feign

服务熔断:Hystrix 服务保护(sentinel)

网关:Zuul/GateWay

配置中心SprngCloudConfig

注册中心

什么是服务注册和服务发现?服务SpringCloud如何实现服务注册发现?

服务注册:服务提供者需要把自己的信息注册到eureka,由eureka来保存这些信息,比如服务名称、ip、端口等等。

服务发现:消费者向eureka拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用。

服务监控:服务提供者会每隔30秒向eureka发送心跳,报告健康状态,如果eureka服务90秒没接收到心跳,从eureka中剔除。

eureka和nacos的区别

eureka和nacos的共同点(注册中心)

1.都支持服务注册和服务发现

2.都支持服务提供者心跳方式做健康检测

区别:

1.naocs支付服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式。

2.临时实例心跳不正常会被剔除,非临时实例则不会被剔除。

3.nacos支持服务列表变更的消息推送模式,服务列表更新更及时

4.naocs集群默认采用ap方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

nacos还支持配置中心

负载均衡Ribbon

feign的底层就是使用ribbon实现的

Ribbon负载均衡策略有哪些

1.轮询

2.按照权重来选择服务器,响应时间越长,权重越小

3.随机选择

4.选择并发数较低的

5.重试机制,发现哪个服务不能用了,就按指定的时间进行重试

6.可用性敏感策略,先过滤非健康的,再选择连接数较小的实例

7.以区域可用的服务器为基础进行服务器选择,再对同一个机房中的多个服务轮询

如何自定义负载均衡策略

可以创建类实现IRule接口,然后通过配置类或者配置文件配置即可

什么事服务雪崩,怎么解决这个问题

服务雪崩:一个服务失败,导致整条链路的服务都失败的情形。

熔断降级(解决):hystix服务熔断降级

限流(预防)

服务降级:确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在开发中与feign接口结合,编写降低逻辑。

服务熔断:默认关闭,需收到打开,如果检测到10s内请求的失败率超过50%,就会触发熔断机制,之后每隔5秒尝试请求微服务,如果不可以访问,继续熔断,如果可以访问,关闭熔断,恢复正常请求。

服务监控

skywalking

一个分布式系统的应用程序性能检测工具,提供了完善的链路追踪能力

1.skywolking主要可以监控接口、服务、物理实例的一些状态。特别是在压测的时候可以看到众多服务中哪些服务和接口比较慢,我们可以针对性的分析和优化

2.我们还在skywalking设置了告警规则,特别是在项目上线以后,如果报错,我们分别设置了可以给相关负责人发短信和发邮件,第一时间知道项目的bug情况,第一时间修复。

微服务限流

nginx限流

采用漏桶算法,让请求以固定速率处理请求,可以应对突发的流量,也可以控制并发数

网关限流

springcloudgateway主要采用的是令牌桶算法,可以设置每秒填充的平均速率,和令牌桶总容量。

CAP与BASE

CAP定理(一致性、可用性、分区容错性)

1.分布式系统节点通过网络连接,一定会出现分区问题(p)

2.当分区出现时,系统的一致性(C)和可用性(A)就无法同时满足

BASE理论

1.基本可用

2.软状态

3.最终一致

解决分布式事务的思想和模型:

1.最终一致思想:各分支事务分别执行并提交,如果有不一致的情况,再想办法恢复数据(AP)

2.强一致性思想:各分支事务执行完业务不要提交,等待彼此结果,而后统一提交或回滚(CP)

如何解决分布式系统的事务

seata | MQ

1.seata的XA模式,CP,需要互相等待各个分支事务提交,可以保留强一致性,性能差

2.seata的AT,AP,底层使用undo log实现,性能好

3.seata的TCC模式,AP,性能较好,不过需要人工编码实现

4.MQ模式实现分布式事务,在A服务写数据的时候,需要在同一个事务内发送消息到另外一个事务异步,性能最好。

分布式服务如何保证接口的幂等性

幂等:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单词调用的结果一致。

如果是新增数据,可以使用数据库的唯一索引

如果是新增或修改数据:

分布式锁,性能较低

使用token+redis来实现,性能较好。

第一次请求,生成一个唯一token存入redis,返回给前端

第二请求,业务处理,携带之前的token,到redis进行验证,如果存在,可以执行业务,删除token,如果不存在,则直接返回,不处理业务。

相关推荐
爱勇宝17 分钟前
2026一人公司生存指南:用AI大模型,90天跑出你的第一条现金流
前端·后端·架构
golang学习记19 分钟前
Go 并发编程:原子操作(Atomics)完全指南
后端
哈里谢顿1 小时前
`127.0.0.1` 和 `0.0.0.0` 有何区别?通过验证 demo来展示
后端
树獭叔叔1 小时前
08-大模型后训练的指令微调SFT:LoRA让大模型微调成本降低99%
后端·aigc·openai
苏三说技术1 小时前
我终于遇到一台真正懂程序员的显示器!
后端
Re_zero2 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
花落人散处2 小时前
流式输出——解决 HITL 难题 (SpringAIAlibaba)
后端
BingoGo3 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 小时前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Victor3563 小时前
MongoDB(18)如何向MongoDB集合中插入文档?
后端