面试题-----Spring Cloud
Spring Cloud
1.Spring Cloud 5大组件有哪些?
一、传统 Spring Cloud 组件
- Eureka(注册中心):负责服务的注册与发现,服务提供者启动时向 Eureka 注册自身信息(如服务地址、端口等 ),服务消费者可从 Eureka 获取所需服务的实例列表,实现服务的动态管理与调用。
- Ribbon(负载均衡 ):在服务消费者调用服务提供者时,从多个可用的服务实例中,按照一定策略(如轮询、随机等 )选择一个实例进行调用,将请求合理分配,提升系统的可用性和稳定性,减轻单个实例压力。
- Feign(远程调用 ):基于接口和注解的声明式 HTTP 客户端,让开发者可以像调用本地方法一样调用远程服务,简化了服务间远程调用的代码编写,自动集成了 Ribbon ,具备负载均衡能力。
- Hystrix(服务熔断 ):当服务调用出现故障(如超时、服务不可达等 )时,开启熔断机制,直接返回一个 fallback (降级 )结果,避免故障在服务调用链中蔓延,保障系统整体的容错性和稳定性。
- Zuul/Gateway(网关 ):作为系统的统一入口,拦截所有外界对系统内部服务的请求,可实现路由转发(将请求转发到对应的服务 )、请求过滤(如鉴权、限流、日志记录等 ),对系统内部服务起到保护和统一管控的作用。
二、结合 Spring Cloud Alibaba 的组件
- Nacos(注册中心 / 配置中心 ):兼具服务注册发现和配置管理功能。服务注册发现功能类似 Eureka ,让服务能注册自身并被发现;配置中心功能可集中管理不同环境、不同服务的配置信息,实现配置的动态更新与推送 。
- Ribbon(负载均衡 ):作用和传统 Spring Cloud 里的 Ribbon 一致,在服务调用时进行负载均衡,选择合适的服务实例,保障请求合理分配 。
- Feign(服务调用 ):和传统 Spring Cloud 中功能相同,以声明式方式简化服务间远程调用流程,让开发者更便捷地实现跨服务交互 。
- Sentinel(服务保护 ):提供流量控制、熔断降级、系统负载保护等功能,比 Hystrix 具备更丰富的规则配置和更细致的流量管控能力,当服务面临高并发、异常等情况时,保障服务稳定运行,防止系统被压垮 。
- Gateway(服务网关 ):功能同传统 Spring Cloud 里的 Zuul/Gateway 类似,作为系统对外的统一访问入口,进行路由、过滤等操作,对系统内部服务进行防护和统一调度 。
2.服务注册和发现是什么意思?Spring Cloud如何实现服务注册发现?
- 我们当时项目采用的 eureka 作为注册中心,这个也是 spring cloud 体系中的一个核心组件
- 服务注册:服务提供者需要把自己的信息注册到 eureka,由 eureka 来保存这些信息,比如服务名称、ip、端口等等
- 服务发现:消费者向 eureka 拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用
- 服务监控:服务提供者会每隔 30 秒向 eureka 发送心跳,报告健康状态,如果 eureka 服务 90 秒没接收到心跳,从 eureka 中剔除
3.nacos与eureka的区别?
- Nacos 与 eureka 的共同点(注册中心)
- ① 都支持服务注册和服务拉取
- ② 都支持服务提供者心跳方式做健康检测
- Nacos 与 Eureka 的区别(注册中心)
- ① Nacos 支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- ② 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- ③ Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
- ④ Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka 采用 AP 方式
- Nacos 还支持了配置中心,eureka 则只有注册中心,也是选择使用 nacos 的一个重要原因
4.你们项目负载均衡如何实现的?
在我们项目里,负载均衡是借助 Ribbon 组件实现的,流程如下:
- 当
order - service
发起如http://userservice/user/1
这样的请求时,请求先到达 Ribbon 负载均衡模块。 - Ribbon 会向注册中心拉取
userservice
对应的服务列表,注册中心返回包含localhost:8081
、localhost:8082
等实例的服务列表 。 - Ribbon 依据配置的负载均衡策略(此处示例为轮询策略 ),从服务列表里选一个实例(比如本次轮询选到
8081
),然后将请求转发给该实例,以此实现负载均衡,合理分配请求到不同的user - service
实例上。
5.Ribbon负载均衡策略有那些?
RoundRobinRule(轮询策略 )
按顺序依次从服务列表中选择服务器,比如服务列表有实例 A、B、C ,则按照 A→B→C→A→B→C… 的顺序循环选择,实现简单的请求均摊,是最基础常用的策略。WeightedResponseTimeRule(加权响应时间策略 )
根据服务器的响应时间动态调整权重,响应时间越长,被选中的概率越低(权重越小 )。会持续统计各服务器响应时间,自动计算权重,让响应快的服务器承担更多请求,优化整体响应效率。RandomRule(随机策略 )
完全随机地从可用服务列表中挑选一个服务器,不考虑服务器负载、响应时间等因素,简单易实现,在服务实例性能差异小的场景,能起到基本的负载分散作用。ZoneAvoidanceRule(区域感知策略 )
先按 “区域(Zone ,可理解为机房、机架等 )” 对服务器分类,优先选择健康、可用区域,再在区域内对服务实例做轮询。可减少跨区域调用延迟,优先保障同区域内服务调用,提升稳定性和效率,适合多机房部署场景。
6.如果想自定义负载均衡策略如何实现?
提供了两种方式:
1,创建类实现 IRule 接口,可以指定负载均衡策略(全局)
2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略(局部)
7.什么是服务雪崩,怎么解决整个问题?
- 服务雪崩:一个服务失败,导致整条链路的服务都失败的情形
- 服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与 feign 接口整合,编写降级逻辑
- 服务熔断:默认关闭,需要手动打开,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求