Spring Cloud 官方微服务栈(Gateway/OpenFeign/LoadBalancer/Config/Bus)

共 21 题
📑 题目列表 21 题
#
★★★

1. Spring Cloud 官方栈与 Spring Cloud Alibaba 的整体差异,Netflix 组件停维后的生态走向

Spring Cloud 官方栈与 Spring Cloud Alibaba 的整体差异是什么?Netflix 组件停维后的生态走向如何?

  • 官方栈 vs Alibaba
  • Netflix 停维
  • 生态走向

Spring Cloud 官方栈与 Spring Cloud Alibaba 差异:官方栈——Spring Cloud Gateway、OpenFeign、LoadBalancer、Config、Bus 等,由 Spring 官方维护,侧重 Spring 生态与标准;Alibaba——Nacos、Sentinel、Seata、RocketMQ 等,侧重阿里云与一体化治理(注册+配置+流控+事务)。Netflix 组件停维后的生态走向:Netflix 组件(Eureka、Ribbon、Hystrix、Zuul)停维后,官方栈用 LoadBalancer 替代 Ribbon、Gateway 替代 Zuul、CircuitBreaker(Resilience4j)替代 Hystrix;Alibaba 用 Nacos 替代 Eureka+Config、Sentinel 替代 Hystrix。走向:官方栈组件化 + 外部治理(Alibaba/Consul),Alibaba 一体化。工程上:现代项目常用官方栈(Gateway/Feign/LoadBalancer)+ Alibaba(Nacos/Sentinel)组合。

官方栈侧重 Spring 标准组件,Alibaba 侧重一体化治理。Netflix 停维后官方用 LoadBalancer/Gateway/CircuitBreaker 替代,Alibaba 用 Nacos/Sentinel。

#
★★★

2. Spring Cloud Gateway 的请求路由核心,Route/Predicate/Filter 模型与 RouteDefinition 动态刷新

Spring Cloud Gateway 的请求路由核心:Route/Predicate/Filter 模型与 RouteDefinition 动态刷新是什么?

  • Route/Predicate/Filter 模型
  • RouteDefinition
  • 动态刷新

Spring Cloud Gateway 路由模型:Route(路由)——ID、目标 URI、一组 Predicate、一组 Filter;Predicate(谓词)——匹配请求条件(Path/Header/Method);Filter(过滤器)——处理请求(鉴权/改写/限流)。RouteDefinition 动态刷新:RouteDefinition 由配置(yaml/Nacos)定义,RouteDefinitionLocator 加载,RouteRefreshListener 监听配置变更,重建路由缓存,实现动态刷新(无需重启)。动态刷新:配置中心变更 → RouteDefinition 更新 → 路由缓存重建。工程上:理解 Route/Predicate/Filter 模型,用配置中心动态刷新路由。

路由模型是"Route(目标+谓词+过滤器)"。RouteDefinition 动态刷新靠配置中心 + 监听。理解模型与刷新。

#
★★★

3. Spring Cloud LoadBalancer 的负载均衡 SPI,ServiceInstanceListSupplier 与自定义权重/亲和性

Spring Cloud LoadBalancer 的负载均衡 SPI:ServiceInstanceListSupplier 与自定义权重/亲和性是什么?

  • ServiceInstanceListSupplier
  • 权重/亲和性
  • 自定义

Spring Cloud LoadBalancer 的负载均衡 SPI:ServiceInstanceListSupplier 是核心接口,提供实例列表(从服务发现获取 + 过滤/排序),LoadBalancer 从 supplier 选实例。内置 supplier:DiscoveryClientServiceInstanceListSupplier(从 DiscoveryClient 获取)、WeightedServiceInstanceListSupplier(权重)、ZonePreferenceServiceInstanceListSupplier(区域亲和)、HealthCheckServiceInstanceListSupplier(健康检查)。自定义权重/亲和性:实现 ServiceInstanceListSupplier(组合/包装),按元数据(权重、region)过滤/排序实例。配置:spring.cloud.loadbalancer.configurations 指定 supplier 链。工程上:自定义 supplier 实现权重/亲和性/灰度路由。

supplier 是 LoadBalancer 的 SPI 扩展点。权重/亲和性/健康检查都通过 supplier 链实现。自定义实现灰度与策略。

#
★★★

4. OpenFeign 的声明式客户端,FeignClient 注解、编解码器与契约(contract)扩展

OpenFeign 的声明式客户端:FeignClient 注解、编解码器与契约(contract)扩展是什么?

  • @FeignClient
  • 编解码器
  • contract 扩展

OpenFeign 声明式客户端:@FeignClient(name="service", url="...") 声明接口,Spring 生成实现,方法映射为 HTTP 调用。编解码器:Encoder/Decoder 处理请求/响应序列化(默认 JSON,可换 XML/Protobuf),spring.codec 或自定义 Encoder/Decoder。契约(contract):Contract 定义注解如何映射到 Feign 方法(Spring 的 SpringMvcContract 支持 Spring MVC 注解),可自定义 contract 扩展注解映射。扩展:自定义 Encoder/Decoder(序列化)、自定义 Contract(注解映射)、自定义 RequestInterceptor(请求头)。工程上:@FeignClient 声明 + 编解码器 + contract 扩展,定制 Feign 行为。

Feign 是"注解声明 + 接口映射"。编解码器管序列化,contract 管注解映射。扩展点实现定制。

#
★★★

5. Gateway 的限流,RequestRateLimiter 过滤器与 Redis 令牌桶,以及 KeyResolver 自定义限流维度

Gateway 的限流:RequestRateLimiter 过滤器与 Redis 令牌桶,以及 KeyResolver 自定义限流维度是什么?

  • RequestRateLimiter
  • Redis 令牌桶
  • KeyResolver

Gateway 的 RequestRateLimiter 过滤器实现限流:基于 Redis 令牌桶(RedisRateLimiter),用 Lua 脚本原子执行令牌补充与扣减,实现分布式限流。KeyResolver 定义限流 key(维度):默认按 IP,可自定义(按用户、API Key、参数)。配置:spring.cloud.gateway.routes[].filters[].name=RequestRateLimiterreplenishRate(令牌速率)、burstCapacity(桶容量)、key-resolver(KeyResolver Bean)。自定义维度:实现 KeyResolver 返回限流 key(低基数)。工程上:RequestRateLimiter + Redis 令牌桶 + 自定义 KeyResolver,实现多维度分布式限流。

RequestRateLimiter 用 Redis 令牌桶分布式限流,KeyResolver 决定维度。Redis 共享状态 + Lua 原子性。

#
★★

6. Spring Cloud Config Server 的配置源(Git/文件系统/Vault)与配置刷新(@RefreshScope + Bus)

Spring Cloud Config Server 的配置源(Git/文件系统/Vault)与配置刷新(@RefreshScope + Bus)是什么?

  • Config Server 配置源
  • 配置刷新
  • @RefreshScope + Bus

Spring Cloud Config Server 配置源:Git(默认,从 Git 仓库拉取配置)、文件系统(本地 VCS)、Vault(密钥管理)。Config Server 从配置源获取配置,客户端通过 spring.config.import=configserver: 拉取。配置刷新:客户端配置变更后,@RefreshScope 刷新 Bean,Spring Cloud Bus 广播 RefreshRemoteApplicationEvent 到所有实例,触发全局刷新。流程:配置变更 → Config Server 更新 → 客户端感知 → @RefreshScope 刷新(本实例)或 Bus 广播(全局)。工程上:Config Server 管配置源,@RefreshScope + Bus 实现动态刷新。

Config Server 聚合配置源(Git/Vault),@RefreshScope + Bus 全局刷新。Bus 广播让所有实例刷新。

#
★★

7. Spring Cloud Bus(Kafka/RabbitMQ)如何广播配置刷新事件与失败重试

Spring Cloud Bus(Kafka/RabbitMQ)如何广播配置刷新事件与失败重试?

  • Bus 广播
  • 刷新事件
  • 失败重试

Spring Cloud Bus 通过消息中间件(Kafka/RabbitMQ)广播配置刷新事件:配置变更后,某个实例发布 RefreshRemoteApplicationEvent 到 Bus,Bus 把事件广播到所有订阅实例,各实例刷新 @RefreshScope。实现:RefreshRemoteApplicationEvent 是远程事件,通过 @RemoteApplicationEventScan 扫描,Bus 的 BusAutoConfiguration 通过消息 binder 发布/订阅。失败重试:消息投递失败(Bus 依赖消息可靠性)——消息中间件持久化 + 重试;刷新失败——实例刷新失败需重试或告警。工程上:Bus 广播全局刷新,配合消息可靠性(持久化/重试)与刷新失败处理。

Bus 用消息中间件广播刷新事件。RefreshRemoteApplicationEvent 跨实例传播。可靠性依赖消息投递与重试。

#
★★

8. OpenFeign 的请求拦截器(RequestInterceptor)与统一 Header/鉴权透传

OpenFeign 的请求拦截器(RequestInterceptor)与统一 Header/鉴权透传是什么?

  • RequestInterceptor
  • Header 透传
  • 鉴权

OpenFeign 的 RequestInterceptor 在每次 Feign 请求前拦截,用于统一处理:透传 Header(用户身份、TraceID、token)、注入鉴权信息。实现:实现 RequestInterceptor,在 apply(RequestTemplate)template.header("x-xxx", value),从上下文(SecurityContext、ThreadLocal)读取并写入请求头。统一 Header/鉴权透传:把当前用户的 token、TraceID 注入 Feign 请求头,下游服务据此恢复身份与链路。工程上:RequestInterceptor 统一透传 Header/鉴权,实现跨服务身份与链路传播。注意异步场景需显式传递上下文。

RequestInterceptor 是"Feign 请求的统一拦截点"。透传 Header/鉴权/链路。统一注入避免重复代码。

#
★★

9. OpenFeign 与 Sentinel/Resilience4j 的熔断集成(feign.circuitbreaker.enabled)

OpenFeign 与 Sentinel/Resilience4j 的熔断集成(feign.circuitbreaker.enabled)是什么?

  • Feign 熔断集成
  • FeignCircuitBreaker
  • 配置

OpenFeign 熔断集成:feign.circuitbreaker.enabled=true 开启 Feign 的熔断支持,FeignCircuitBreaker 把 Feign 调用纳入 Circuit Breaker(可接 Resilience4j 或 Sentinel)。配置:spring.cloud.openfeign.circuitbreaker.enabled=true,配合 @FeignClient(fallback=...)fallbackFactory 定义降级;接 Resilience4j 用 spring-cloud-starter-circuitbreaker-resilience4j,接 Sentinel 用 feign.sentinel.enabled=true。集成效果:Feign 调用失败/熔断时用 fallback 降级。工程上:开启 feign.circuitbreaker,Feign 调用纳入熔断 + fallback 降级。

feign.circuitbreaker.enabled 开启 Feign 熔断支持。Feign 调用纳入 Circuit Breaker,fallback 降级。可接 Resilience4j/Sentinel。

#
★★

10. Spring Cloud Gateway 全局过滤器与局部过滤器的执行顺序(Ordered)

Spring Cloud Gateway 全局过滤器与局部过滤器的执行顺序(Ordered)是什么?

  • 全局 vs 局部过滤器
  • Ordered 顺序
  • 执行

Gateway 过滤器分全局(GlobalFilter,对所有路由生效)与局部(GatewayFilter,路由配置中指定)。执行顺序:通过 Order@OrderOrdered 接口)控制,order 值越小越先执行。OrderedGatewayFilter 包装局部过滤器并指定 order。执行顺序规则:所有过滤器(全局 + 局部)按 order 排序执行;RouteToRequestUrlFilter 等关键过滤器有固定 order。顺序控制:全局过滤器做横切(鉴权、日志),局部过滤器做路由级处理,通过 order 调整顺序。工程上:用 order 控制过滤器链顺序,理解全局/局部与顺序。

全局/局部过滤器按 order 排序执行。order 越小越先。OrderedGatewayFilter 控制局部顺序。理解顺序。

#
★★

11. Gateway 的 WebSocket/SSE 代理与长连接超时配置

Gateway 的 WebSocket/SSE 代理与长连接超时配置是什么?

  • WebSocket/SSE 代理
  • 长连接超时
  • 配置

Gateway 代理 WebSocket/SSE(Server-Sent Events):WebSocket 通过 WebsocketRoutingFilter 处理 Upgrade;SSE 是 HTTP 长连接(流式响应),需配置响应超时避免中断。长连接超时配置:spring.cloud.gateway.httpclient.response-timeout(响应超时)、websocket 相关(帧大小、超时)、spring.codec 的缓冲。SSE 代理需注意 response-timeout 不能过短(流式响应长),需配置足够超时或禁用。WebSocket 需处理 Upgrade 与心跳。工程上:配置 WebSocket/SSE 的长连接与超时,避免流式中断。

WebSocket 升级代理,SSE 流式响应。长连接超时配置关键(response-timeout 不能过短)。WebSocket 需 Upgrade 与心跳。

#
★★

12. LoadBalancer 与 Nacos/Eureka 服务发现的数据源适配(DiscoveryClientServiceInstanceListSupplier)

LoadBalancer 与 Nacos/Eureka 服务发现的数据源适配(DiscoveryClientServiceInstanceListSupplier)是什么?

  • DiscoveryClientServiceInstanceListSupplier
  • 数据源适配
  • 服务发现

Spring Cloud LoadBalancer 通过 DiscoveryClientServiceInstanceListSupplier 适配服务发现(Nacos/Eureka/Consul):DiscoveryClient 是 Spring Cloud 的服务发现抽象,各注册中心(Nacos/Eureka)实现 DiscoveryClient;LoadBalancer 的 DiscoveryClientServiceInstanceListSupplierDiscoveryClient 获取实例列表,作为负载均衡的数据源。适配:Nacos 的 NacosDiscoveryClient、Eureka 的 EurekaDiscoveryClient 实现 DiscoveryClient,LoadBalancer 统一通过它获取实例,屏蔽注册中心差异。工程上:服务发现差异由 DiscoveryClient 屏蔽,LoadBalancer 统一消费实例。

DiscoveryClient 是服务发现抽象,各注册中心实现。LoadBalancer 通过 supplier 消费实例,屏蔽差异。解耦。

#
★★

13. Sleuth 退役后 Micrometer Tracing + OpenTelemetry 在官方栈中的链路透传

Sleuth 退役后 Micrometer Tracing + OpenTelemetry 在官方栈中的链路透传是什么?

  • Sleuth 退役
  • Micrometer Tracing + OTel
  • 链路透传

Sleuth 退役后,Spring Cloud 官方用 Micrometer Tracing + OpenTelemetry 实现链路追踪:Micrometer Tracing 提供统一追踪 API(TracerSpan),OpenTelemetry 作为后端/传播器(W3C Trace-Context)。链路透传:各组件(Web、Feign、RestClient、消息)自动生成 span 并传播 TraceID(通过 traceparent 头),实现跨服务链路。透传机制:Feign/WebClient 通过 Observation 自动注入 traceparent,下游服务解析并继续 trace。Sleuth 的 @SpanName 等被 Micrometer Tracing 替代。工程上:Micrometer Tracing + OTel 统一链路,官方栈自动透传 TraceID。

Sleuth 退役后 Micrometer Tracing + OTel 接管。统一 API + W3C 传播,组件自动透传 TraceID。链路贯通。

#
★★

14. Spring Cloud Stream 的 binder 抽象与函数式编程模型(Function/Kafka binder)

Spring Cloud Stream 的 binder 抽象与函数式编程模型(Function/Kafka binder)是什么?

  • binder 抽象
  • 函数式模型
  • Kafka binder

Spring Cloud Stream 的 binder 抽象:统一消息中间件(Kafka/RabbitMQ/RocketMQ)的绑定,binding 把应用与消息中间件解耦,Binder 封装生产/消费。函数式编程模型:Function/Consumer/Supplier 定义消息处理(@Bean Function<String,String>),spring.cloud.function 配置绑定(in-0/out-0)。Kafka binder:spring-cloud-stream-binder-kafka 支持 Kafka 生产/消费,用 KafkaBinder 绑定。模型:函数式 Function 处理消息 + binder 适配中间件,配置绑定(destination/group)。工程上:函数式模型(Function)+ binder(Kafka)实现消息处理,解耦中间件。

binder 抽象解耦中间件,函数式模型(Function)定义处理逻辑。Kafka binder 绑定 Kafka。配置灵活。

#
★★

15. OpenFeign 的重试与超时,默认不重试的坑、连接/读取超时与重试放大

OpenFeign 的重试与超时:默认不重试的坑、连接/读取超时与重试放大是什么?

  • Feign 默认不重试
  • 超时配置
  • 重试放大

OpenFeign 默认不重试(feign.Retryer 默认 NEVER_RETRY),这是"坑":网络抖动/超时不会自动重试,需显式配置 RetryerDefault 或自定义)。坑:开发者误以为有重试,实际失败即抛。超时:连接超时(connectTimeout)与读取超时(readTimeout)分别配置,读取超时过长掩盖下游慢。重试放大:Feign 重试 × LoadBalancer 重试叠加导致请求放大,需限定重试层与次数。工程上:显式配置 Retryer(重试)、合理超时(连接/读取)、避免重试放大(限定层数)。

Feign 默认不重试是坑,需显式 Retryer。超时分连接/读取。重试放大需限定层与次数。

#
★★

16. Gateway 基于 WebFlux/Netty 的线程模型,事件循环线程与业务线程池配置对网关调优的意义

Gateway 基于 WebFlux/Netty 的线程模型:事件循环线程与业务线程池配置对网关调优的意义是什么?

  • WebFlux/Netty 线程模型
  • 事件循环线程
  • 调优

Gateway 基于 WebFlux/Netty 响应式模型:事件循环线程(event loop)处理 IO 事件(非阻塞),业务处理也在事件循环上(响应式回调)。线程模型:事件循环线程数(默认可用核数×2),无独立业务线程池(响应式回调)。调优意义:事件循环线程数影响并发处理能力;避免在事件循环做阻塞操作(阻塞会阻塞整个事件循环);server.netty 配置 event loop 线程数、连接 backlog。调优:合理设置事件循环线程数、避免阻塞、监控线程利用率。工程上:调优事件循环线程(基于核数/并发),避免阻塞事件循环,提升网关吞吐。

Gateway 事件循环线程处理 IO,非阻塞。调优核心是"避免阻塞事件循环 + 合理线程数"。无独立业务线程池。

#
★★

17. Config Server 的加密,对称/非对称密钥、{cipher} 前缀与解密时机,以及密钥管理实践

Config Server 的加密:对称/非对称密钥、{cipher} 前缀与解密时机,以及密钥管理实践是什么?

  • 配置加密
  • {cipher} 前缀
  • 密钥管理

Config Server 配置加密:敏感配置用 {cipher} 前缀标记密文,Config Server 用密钥解密后下发。对称/非对称:对称加密(encrypt.key,同一密钥加解密)简单;非对称(encrypt.keyStore,RSA 公私钥)更安全(公钥加密、私钥解密)。解密时机:Config Server 从配置源获取 {cipher} 密文,返回客户端时用私钥解密(或客户端解密)。密钥管理实践:密钥不存配置,用环境变量/密钥管理(KMS/Vault)注入;非对称密钥私钥保护;轮换密钥。工程上:{cipher} 加密配置,非对称加密更安全,密钥集中管理。

{cipher} 标记密文,Config Server 解密。对称/非对称权衡,密钥管理(KMS/Vault)保护。加密保障敏感配置。

#

18. Feign 的性能优化,HTTP/2、连接池(Apache HC5/OkHttp)与日志级别

Feign 的性能优化:HTTP/2、连接池(Apache HC5/OkHttp)与日志级别是什么?

  • HTTP/2
  • 连接池
  • 日志级别

Feign 性能优化:HTTP/2——启用 HTTP/2(多路复用)减少连接数、提升吞吐;连接池——用 Apache HC5 或 OkHttp 作为 Feign 客户端,配置连接池(最大连接数、连接超时、空闲回收),复用连接减少握手;日志级别——Feign 日志级别(logging.level)控制请求日志(NONE/BASIC/HEADERS/FULL),生产用 BASIC/NONE 减少日志开销,调试用 FULL。优化:HTTP/2 + 连接池复用 + 合理日志级别。工程上:HTTP/2/连接池提升性能,日志级别控制开销。

Feign 优化是"HTTP/2 + 连接池 + 日志级别"。连接池复用减少握手,HTTP/2 多路复用,日志级别控开销。

#

19. Spring Cloud 官方栈的 API 网关与 BFF 模式,按客户端拆分的路由组织

Spring Cloud 官方栈的 API 网关与 BFF 模式:按客户端拆分的路由组织是什么?

  • BFF 模式
  • 按客户端拆分
  • 路由组织

BFF(Backend for Frontend)模式:为不同客户端(Web、移动端、IoT)提供专属后端网关,按客户端优化接口。Spring Cloud Gateway 实现 BFF:按客户端拆分路由——为每个客户端定义独立的 Gateway 路由/配置(路径前缀、过滤、鉴权),或部署多个 Gateway 实例(每客户端一个)。路由组织:按客户端分(/web/**/mobile/**)路由到对应聚合服务,后端聚合接口适配客户端。BFF 价值:客户端专属接口(避免过度聚合)、独立演进、按客户端治理。工程上:Gateway 按客户端拆分路由,实现 BFF。

BFF 是按客户端分网关。Gateway 按客户端路由组织,适配客户端需求。独立演进与治理。

#

20. Bus 的远程事件机制,RefreshRemoteApplicationEvent 如何跨服务传播,自定义远程事件需满足的条件

Bus 的远程事件机制:RefreshRemoteApplicationEvent 如何跨服务传播?自定义远程事件需满足的条件是什么?

  • 远程事件机制
  • RefreshRemoteApplicationEvent 传播
  • 自定义远程事件条件

Spring Cloud Bus 远程事件机制:RefreshRemoteApplicationEvent 是远程事件,通过 Bus 在服务间传播。传播:某实例发布事件 → Bus 发布到消息中间件(Kafka/RabbitMQ)→ 其他实例订阅并消费 → 触发本地处理(刷新配置)。@RemoteApplicationEventScan 扫描远程事件。自定义远程事件需满足条件:继承 RemoteApplicationEvent、提供 @RemoteApplicationEventScan 扫描、提供构造函数(含 source 与 originService)、事件需可序列化(通过消息传递)。工程上:RefreshRemoteApplicationEvent 通过 Bus 传播,自定义远程事件继承 RemoteApplicationEvent 并扫描。

远程事件通过 Bus 消息传播。自定义需继承 RemoteApplicationEvent + 扫描 + 可序列化。传播靠消息中间件。

#

21. Gateway 的跨域 CORS,全局 CORS 与路由级 CORS 的合并规则,以及预检请求的处理

Gateway 的跨域 CORS:全局 CORS 与路由级 CORS 的合并规则,以及预检请求的处理是什么?

  • 全局 vs 路由级 CORS
  • 合并规则
  • 预检请求

Gateway 的 CORS 配置:全局 CORS(spring.cloud.gateway.globalcors)作用于所有路由,路由级 CORS(spring.cloud.gateway.routes[].meta 或过滤器)作用于特定路由。合并规则:路由级 CORS 与全局 CORS 合并(路由级优先/覆盖),globalcorsadd-to-simple-url-handler-mapping 等。预检请求(Preflight):浏览器发送 OPTIONS 预检,Gateway 处理 OPTIONS 请求返回 CORS 头(Access-Control-Allow-*),globalcors 处理预检。工程上:统一全局 CORS,路由级覆盖,正确处理预检(OPTIONS)。

全局与路由级 CORS 合并(路由级覆盖),预检 OPTIONS 由 globalcors 处理。理解合并与预检。