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,如果不存在,则直接返回,不处理业务。

相关推荐
g***72701 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
r***86981 小时前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
android·前端·后端
AskHarries1 小时前
收到第一封推广邮件:我的 App 正在被看见
前端·后端·产品
n***27191 小时前
SpringCloud 微服务框架
spring·spring cloud·微服务
w***H6501 小时前
SpringBoot项目如何导入外部jar包:详细指南
spring boot·后端·jar
r***R2891 小时前
【spring】Spring事件监听器ApplicationListener的使用与源码分析
java·后端·spring
小周在成长1 小时前
Java `this` 关键字深度解析
后端
自由生长20241 小时前
C++折叠表达式完全指南:从打印函数到空包处理的深入解析
c++·后端
啊哈灵机一动1 小时前
玩转 ESP32-S3 N16R8:PlatformIO 配置 PSRAM 并验证使用
后端