Spring Cloud 开发知识整理

目录

[1. 单体拆分后的典型问题与对应组件](#1. 单体拆分后的典型问题与对应组件)

[2. 一张典型微服务架构图](#2. 一张典型微服务架构图)

二、版本列车(必须先搞清楚的头等大事)

[1. Spring Cloud 与 Boot 对应关系(错配必出问题)](#1. Spring Cloud 与 Boot 对应关系(错配必出问题))

[2. 引入方式:BOM 统一管版本(不写子依赖版本号)](#2. 引入方式:BOM 统一管版本(不写子依赖版本号))

[3. 新旧组件更替(避免学到已淘汰的东西)](#3. 新旧组件更替(避免学到已淘汰的东西))

三、服务注册与发现

[1. 核心概念](#1. 核心概念)

[2. Eureka 快速搭建(入门经典)](#2. Eureka 快速搭建(入门经典))

[3. Nacos(国内生产更常见)](#3. Nacos(国内生产更常见))

[4. 统一抽象:DiscoveryClient](#4. 统一抽象:DiscoveryClient)

[四、客户端负载均衡:Spring Cloud LoadBalancer](#四、客户端负载均衡:Spring Cloud LoadBalancer)

[1. 是什么](#1. 是什么)

[2. 给 RestClient 加负载均衡](#2. 给 RestClient 加负载均衡)

[3. 自定义负载均衡策略](#3. 自定义负载均衡策略)

[4. 生产要点](#4. 生产要点)

[五、服务间调用:Spring Cloud OpenFeign](#五、服务间调用:Spring Cloud OpenFeign)

[1. 是什么/为什么](#1. 是什么/为什么)

[2. 开启与定义](#2. 开启与定义)

[3. 常用配置](#3. 常用配置)

[4. 熔断降级方法(fallback)](#4. 熔断降级方法(fallback))

六、配置中心与动态刷新

[1. Spring Cloud Config](#1. Spring Cloud Config)

[2. Nacos Config(国内常用,动态推送体验更好)](#2. Nacos Config(国内常用,动态推送体验更好))

[3. 动态刷新机制](#3. 动态刷新机制)

[4. 生产注意](#4. 生产注意)

七、熔断、限流与隔离:Resilience4j

[1. 为什么需要(雪崩效应)](#1. 为什么需要(雪崩效应))

[2. Resilience4j 核心模块](#2. Resilience4j 核心模块)

[3. 注解式使用](#3. 注解式使用)

[4. 配置示例](#4. 配置示例)

[5. 工程要点](#5. 工程要点)

[八、API 网关:Spring Cloud Gateway](#八、API 网关:Spring Cloud Gateway)

[1. 定位](#1. 定位)

[2. 三大核心概念](#2. 三大核心概念)

[3. 配置示例](#3. 配置示例)

[4. 自定义全局过滤器(鉴权/日志骨架)](#4. 自定义全局过滤器(鉴权/日志骨架))

[5. 生产要点](#5. 生产要点)

九、分布式链路追踪

[1. 现状](#1. 现状)

[2. 接入](#2. 接入)

[十、消息驱动:Spring Cloud Stream / Function](#十、消息驱动:Spring Cloud Stream / Function)

十一、一个典型服务的最小骨架

[十二、2025/2026 新变化](#十二、2025/2026 新变化)

[十三、高频踩坑 / 面试清单](#十三、高频踩坑 / 面试清单)

参考资料


定位:Spring Cloud 是一套分布式系统/微服务模式的落地工具集 ------把服务注册发现、配置管理、服务调用、负载均衡、熔断限流、网关、链路追踪等常见模式做成开箱即用的 starter。 它不是新框架,而是构建在 Spring Boot 之上的"版本列车(Release Train)" 。 本文基于 2026 年主流栈:Spring Cloud 2025.1.x (Oakwood) + Spring Boot 4.0.x/4.1.x,并兼顾 3.5.x 老系统现状。


一、微服务全景:Spring Cloud 解决什么

1. 单体拆分后的典型问题与对应组件

分布式问题 Spring Cloud 方案 说明
服务在哪、谁在线 注册中心:Eureka / Nacos / Consul 服务注册与发现
请求分摊到多实例 Spring Cloud LoadBalancer 客户端负载均衡(Ribbon 已废弃删除)
服务间怎么调 OpenFeign(声明式)/ RestClient 像调本地方法一样调远程
配置统一管理 Config Server / Nacos Config 集中配置、动态刷新
配置变更广播 Spring Cloud Bus 借助 MQ 批量刷新
统一入口、路由、鉴权 Spring Cloud Gateway 响应式 API 网关
下游故障别拖垮我 Circuit Breaker + Resilience4j 熔断、降级、隔离、限流、重试
一次请求跨了哪些服务 Micrometer Tracing + OpenTelemetry 分布式链路追踪(Sleuth 已退役)
异步消息 Spring Cloud Stream / Function 消息驱动微服务

2. 一张典型微服务架构图

复制代码
                           客户端(Web/App)
                                 │
                                 ▼
                     ┌──────────────────────┐
                     │  Spring Cloud Gateway │  路由/鉴权/限流/灰度
                     └──────────────────────┘
             ┌───────────────┬───────────────┐
             ▼               ▼               ▼
       user-service   order-service   product-service   (Boot 应用集群)
             │               │               │
             └───────┬───────┴───────┬───────┘
                     │ OpenFeign + LoadBalancer 互调
         ┌───────────▼──────────┐    │
         │  注册中心 Eureka/Nacos │◄───┘ 服务注册/发现/心跳
         └──────────────────────┘
         ┌──────────────────────┐
         │ 配置中心 Config/Nacos │◄── Bus(MQ) 动态刷新
         └──────────────────────┘
   横切:Resilience4j 熔断限流 │ Micrometer Tracing 链路追踪 │ Prometheus 监控

二、版本列车(必须先搞清楚的头等大事)

1. Spring Cloud 与 Boot 对应关系(错配必出问题)

Release Train 别名 Spring Boot 状态(2026-10)
2025.1.x Oakwood 4.0.x / 4.1.x 当前 GA(2025.1.3,2026-08)
2025.0.x Northfields 3.5.x OSS 已 2026-06-30 EOL
2024.0.x Moorgate 3.4.x 维护/陆续终止
2023.0.x Leyton 3.2/3.3 EOL
2026.0.x Paddington 4.2.x M1 里程碑(2026-09)

2. 引入方式:BOM 统一管版本(不写子依赖版本号)

复制代码
 <properties>
     <spring-cloud.version>2025.1.3</spring-cloud.version>
 </properties>
 ​
 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>${spring-cloud.version}</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
 </dependencyManagement>
 ​
 <dependencies>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
 </dependencies>

国内常用 Nacos / Sentinel / Seata 属于 Spring Cloud Alibaba,另有自己的版本对应表,选型时与 Boot 版本对齐。

3. 新旧组件更替(避免学到已淘汰的东西)

老组件(已淘汰) 现代方案
Netflix Ribbon(客户端负载均衡) Spring Cloud LoadBalancer
Netflix Hystrix(熔断) Resilience4j(经 Spring Cloud Circuit Breaker 抽象)
Netflix Zuul 1(网关) Spring Cloud Gateway
Spring Cloud Sleuth(链路追踪) Micrometer Tracing + OpenTelemetry
Eureka 仍可用(Spring Cloud Netflix 中唯一保留主力),也可选 Nacos/Consul

三、服务注册与发现

1. 核心概念

  • 服务注册:服务启动时把自己的"服务名 + IP + 端口 + 元数据"登记到注册中心;

  • 服务发现 :调用方按服务名从注册中心拉取实例列表;

  • 心跳/健康检查:定期续约,失联实例被剔除;

  • 调用方只认服务名(如 order-service),实例扩缩容、换 IP 对调用方透明。

2. Eureka 快速搭建(入门经典)

Eureka Server:

复制代码
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
 </dependency>
复制代码
 @EnableEurekaServer
 @SpringBootApplication
 public class RegistryApplication {
     public static void main(String[] args) {
         SpringApplication.run(RegistryApplication.class, args);
     }
 }
复制代码
 server:
   port: 8761
 eureka:
   client:
     register-with-eureka: false      # 单机自己不注册自己
     fetch-registry: false

Eureka Client(业务服务):

复制代码
 spring:
   application:
     name: user-service              # 服务名是发现的 key
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/
   instance:
     prefer-ip-address: true         # 容器环境推荐注册 IP

3. Nacos(国内生产更常见)

  • 一个组件同时提供注册中心 + 配置中心,AP/CP 可切换、带控制台和权重/命名空间/分组管理;

  • 客户端 spring-cloud-starter-alibaba-nacos-discovery,配置:

复制代码
 spring:
   cloud:
     nacos:
       discovery:
         server-addr: 127.0.0.1:8848
         namespace: prod

4. 统一抽象:DiscoveryClient

无论底层是 Eureka/Nacos/Consul,应用都可用 Spring Cloud Commons 的统一 API:

复制代码
 @Service
 public class InstanceService {
     private final DiscoveryClient discoveryClient;
     public InstanceService(DiscoveryClient discoveryClient) {
         this.discoveryClient = discoveryClient;
     }
 ​
     public List<ServiceInstance> list() {
         return discoveryClient.getInstances("order-service");
     }
 }

四、客户端负载均衡:Spring Cloud LoadBalancer

1. 是什么

  • 调用方本地持有实例列表,发请求前由 LoadBalancer 从列表中选一个实例;

  • 默认策略:轮询(RoundRobinLoadBalancer),可切换随机、按权重、 zone 偏好等;

  • 替代 Ribbon:新栈中不要再出现 Ribbon/IRule 的配置。

2. 给 RestClient 加负载均衡

复制代码
 @Configuration
 public class LbConfig {
     @Bean
     @LoadBalanced            // 关键:让 RestClient 识别服务名并做负载均衡
     RestClient.Builder restClientBuilder() {
         return RestClient.builder();
     }
 }
复制代码
 String body = restClient.get()
         .uri("http://order-service/api/orders/1")   // 用服务名,不用 IP
         .retrieve().body(String.class);

3. 自定义负载均衡策略

复制代码
 public class CustomLbConfig {
     @Bean
     ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
             Environment environment, LoadBalancerClientFactory factory) {
         String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
         return new RandomLoadBalancer(
                 factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
     }
 }
 ​
 @Configuration
 @LoadBalancerClient(name = "order-service", configuration = CustomLbConfig.class)
 public class OrderLbClient { }

注意 @LoadBalancerClient 的 configuration 类不要放在 @ComponentScan 能扫到的包,否则会变成全局配置。

4. 生产要点

  • 开启**实例缓存(loadBalancerCache)**并理解刷新延迟(新实例秒级才可见);

  • 配重试时区分"连接失败重试"与"业务超时",非幂等写操作不要盲目重试;

  • K8s 环境也可直接用 Service 做服务端负载均衡,二选一或组合要明确。


五、服务间调用:Spring Cloud OpenFeign

1. 是什么/为什么

  • 声明式 HTTP 客户端:定义一个 Java 接口 + 注解,Feign 自动生成实现、拼 URL、编码参数、负载均衡选实例、解码结果;

  • 比手写 RestClient 模板代码少,团队接口契约统一。

2. 开启与定义

复制代码
 @EnableFeignClients
 @SpringBootApplication
 public class UserApplication { ... }
复制代码
 @FeignClient(name = "order-service", path = "/api/orders")
 public interface OrderClient {
 ​
     @GetMapping("/{id}")
     OrderVO getById(@PathVariable("id") Long id);
 ​
     @PostMapping
     OrderVO create(@RequestBody OrderCreateDTO dto);
 ​
     @GetMapping
     Page<OrderVO> page(@RequestParam("userId") Long userId,
                        @RequestParam("page") int page,
                        @RequestParam("size") int size);
 }

使用:

复制代码
 @Service
 public class UserBizService {
     private final OrderClient orderClient;
     public UserBizService(OrderClient orderClient) { this.orderClient = orderClient; }
 ​
     public OrderVO queryOrder(Long orderId) {
         return orderClient.getById(orderId);
     }
 }

要点:

  • name 必须是注册中心里的服务名;URL 走 LoadBalancer 选实例;

  • @PathVariable/@RequestParam 必须显式写 value(老版本 Feign 不保留参数名);

  • 调外部三方(不在注册中心):@FeignClient(name="xxx", url="https://...");

  • 多参数 GET 别误用 @RequestBody;文件上传需 feign-form 扩展。

3. 常用配置

复制代码
 spring:
   cloud:
     openfeign:
       client:
         config:
           order-service:
             connect-timeout: 2000
             read-timeout: 3000
             logger-level: basic
       circuitbreaker:
         enabled: true                 # 开启后 Feign 集成熔断器(见第七节)
       compression:
         request:
           enabled: true
           mime-types: application/json
         response:
           enabled: true
  • 日志级别:NONE / BASIC / HEADERS / FULL(FULL 只建议临时排障,注意脱敏);

  • 拦截器(RequestInterceptor)统一加 traceId、鉴权头;

  • 错误解码器(ErrorDecoder)把远程错误码转成业务异常,而不是统一抛 500;

  • HTTP 底层连接池可切换(Apache HC5 / OkHttp),高并发必配连接池。

4. 熔断降级方法(fallback)

复制代码
 @FeignClient(name = "order-service", fallback = OrderClientFallback.class)
 public interface OrderClient {
     @GetMapping("/{id}")
     OrderVO getById(@PathVariable Long id);
 }
 ​
 @Component
 public class OrderClientFallback implements OrderClient {
     @Override
     public OrderVO getById(Long id) {
         return OrderVO.unavailable();   // 兜底数据/缓存
     }
 }

想区分降级原因用 fallbackFactory,可拿到触发的异常。


六、配置中心与动态刷新

1. Spring Cloud Config

Config Server(集中拉取配置,后端可放 Git/Native/Vault):

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
复制代码
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication { ... }
复制代码
spring:
  cloud:
    config:
      server:
        git:
          uri: https://git.example.com/config-repo

Client 端导入配置:

复制代码
spring:
  config:
    import: configserver:http://localhost:8888
  application:
    name: user-service
  profiles:
    active: dev

配置仓库中按 user-service-dev.yml 命名,client 自动按 应用名+profile 拉取。

2. Nacos Config(国内常用,动态推送体验更好)

复制代码
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: dev

Data ID 约定 user-service.yaml / user-service-dev.yaml,控制台改完即推送。

3. 动态刷新机制

  • 需要热更新的 Bean 加 @RefreshScope,配置变更时重建该 Bean:
复制代码
@RestController
@RefreshScope
public class FeatureController {
    @Value("${feature.new-ui:false}")
    private boolean newUi;
}
  • 手动触发单个服务:POST /actuator/refresh;

  • 批量广播:Spring Cloud Bus(接 RabbitMQ/Kafka),向 busrefresh 端点发一次请求即刷新所有节点;

  • Nacos 客户端默认长轮询/推送,配合 @RefreshScope 或 @ConfigurationProperties 自动生效。

4. 生产注意

  • 配置中心要高可用集群 ,它是启动依赖(配合 spring.cloud.config.fail-fast、重试);

  • 敏感配置加密存储(Config 加密 / Vault / KMS),不进 Git 明文;

  • 配置变更要有审批、审计、灰度和回滚,别把配置中心当随便改的在线面板。


七、熔断、限流与隔离:Resilience4j

1. 为什么需要(雪崩效应)

下游服务慢/挂 → 调用方线程被占满 → 连锁拖垮上游。解法组合:超时 + 熔断(快速失败)+ 舱壁隔离 + 限流 + 重试。

Spring Cloud 提供统一抽象 Spring Cloud Circuit Breaker ,推荐实现 Resilience4j(函数式、轻量,Hystrix 已淘汰)。

2. Resilience4j 核心模块

模块 作用
CircuitBreaker 熔断器:关闭→打开(错误率/慢调用超阈值后快速失败)→半开(试探放行)→关闭
TimeLimiter 限时,防止长时间阻塞
Bulkhead 舱壁:限制某下游的并发线程/信号量,故障隔离
RateLimiter 限流:固定周期内允许的请求数
Retry 自动重试(指数退避、抖动)

3. 注解式使用

复制代码
@Service
public class PaymentService {

    @CircuitBreaker(name = "bankApi", fallbackMethod = "payFallback")
    @TimeLimiter(name = "bankApi")
    @Bulkhead(name = "bankApi", type = Bulkhead.Type.SEMAPHORE)
    public CompletableFuture<PayResult> pay(PayRequest req) {
        return CompletableFuture.supplyAsync(() -> bankClient.invoke(req));
    }

    private CompletableFuture<PayResult> payFallback(PayRequest req, Exception e) {
        return CompletableFuture.completedFuture(PayResult.degraded("支付通道繁忙,请稍后再试"));
    }

    @RateLimiter(name = "smsApi")
    public void sendSms(String mobile) { ... }
}

4. 配置示例

复制代码
resilience4j:
  circuitbreaker:
    instances:
      bankApi:
        sliding-window-type: COUNT_BASED
        sliding-window-size: 20
        failure-rate-threshold: 50
        slow-call-rate-threshold: 60
        slow-call-duration-threshold: 2s
        wait-duration-in-open-state: 10s
        permitted-number-of-calls-in-half-open-state: 5
        minimum-number-of-calls: 10
  ratelimiter:
    instances:
      smsApi:
        limit-for-period: 10
        limit-refresh-period: 1s
        timeout-duration: 0
  timelimiter:
    instances:
      bankApi:
        timeout-duration: 3s

5. 工程要点

  • 熔断是保护自己,降级要给用户可理解的结果(缓存/默认值/稍后重试),不是吞异常;

  • 超时、重试、熔断三者参数要协调:重试总时间 < 上游超时;

  • 写操作重试必须幂等;限流要在网关 + 服务多层设防;

  • 监控熔断状态转换(Micrometer 已暴露指标),频繁 open 说明下游真有问题。


八、API 网关:Spring Cloud Gateway

1. 定位

  • 基于 Spring WebFlux + Reactor + Netty 的响应式网关,高并发非阻塞;

  • 职责:统一入口、路由转发、鉴权、限流、灰度、日志、跨域、协议转换;

  • 替代 Zuul 1 ;与 servlet 栈不同,网关模块不要混用 spring-boot-starter-web。

2. 三大核心概念

  • Route 路由:ID + 目标 URI + 一组 Predicate + 一组 Filter;

  • Predicate 断言:匹配条件(Path、Header、Host、Method、时间、权重等);

  • Filter 过滤器:对请求/响应做修改(加头、鉴权、改写路径、限流)。

3. 配置示例

复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true                 # 可按注册中心服务名自动路由
      routes:
        - id: user-route
          uri: lb://user-service        # lb:// 表示经 LoadBalancer 负载均衡
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
        - id: order-route
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
            - Header=X-Channel, \d+
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200
                key-resolver: "#{@userKeyResolver}"

KeyResolver(按用户限流):

复制代码
@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
            exchange.getRequest().getHeaders().getFirst("X-User-Id"));
}

4. 自定义全局过滤器(鉴权/日志骨架)

复制代码
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (token == null) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
    @Override public int getOrder() { return -100; }
}

5. 生产要点

  • 网关本身要无状态、多实例 + 前置 LB;限流状态存 Redis 集中共享;

  • 跨域在网关统一配(CorsWebFilter);敏感头/协议头注意可信代理白名单(2026 年有相关 CVE 修复,保持版本更新);

  • 别在网关写重业务逻辑,它只做横切;

  • 灰度发布可用权重断言(Weight)或 header 路由到灰度实例。


九、分布式链路追踪

1. 现状

  • Spring Cloud Sleuth 已退役 ;现代方案 Micrometer Tracing + OpenTelemetry(OTel);

  • Boot 3/4 已内置 Micrometer,自动给 Web、Feign、JDBC、Kafka 等埋点并透传 traceId/spanId;

  • 上报后端:OTel Collector → Tempo/Jaeger/Zipkin,日志中用同一 traceId 关联。

2. 接入

复制代码
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
management:
  tracing:
    sampling:
      probability: 0.1          # 生产按比例采样,排障时临时调到 1.0
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans

要点:traceId 自动进 MDC,结构化日志直接输出;跨线程(线程池/@Async)要包装线程池才能延续上下文。


十、消息驱动:Spring Cloud Stream / Function

  • Spring Cloud Stream 抽象 binder(Kafka/Rabbit),业务只写函数:
复制代码
@Configuration
public class OrderEventStream {

    @Bean
    Consumer<OrderCreatedEvent> orderCreated() {
        return event -> { /* 处理事件 */ };
    }

    @Bean
    Supplier<OrderPaidEvent> orderPaid() {
        return () -> new OrderPaidEvent(...);
    }
}
复制代码
spring:
  cloud:
    function:
      definition: orderCreated
    stream:
      bindings:
        orderCreated-in-0:
          destination: order.created
          group: user-service        # 消费组保证同组只消费一次
      kafka:
        binder:
          brokers: localhost:9092
  • 与 Spring Cloud Bus 的区别:Bus 是运维事件总线(刷新/广播) ,Stream 是业务消息。

十一、一个典型服务的最小骨架

user-service 的 application.yml:

复制代码
server:
  port: 8081
spring:
  application:
    name: user-service
  config:
    import: optional:nacos:user-service.yaml    # 或 configserver:...
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    openfeign:
      circuitbreaker:
        enabled: true
management:
  endpoints:
    web:
      exposure:
        include: health,prometheus
  tracing:
    sampling:
      probability: 0.1

依赖清单(按需要选):

  • spring-boot-starter-web(Boot4 可 starter-webmvc)

  • spring-cloud-starter-netflix-eureka-client 或 nacos-discovery

  • spring-cloud-starter-openfeign

  • spring-cloud-starter-loadbalancer(OpenFeign 通常已传递带入)

  • spring-cloud-starter-circuitbreaker-resilience4j

  • spring-cloud-starter-config / nacos-config

  • spring-boot-starter-actuator + micrometer-tracing

  • 网关独立服务:spring-cloud-starter-gateway(不带 web starter)


十二、2025/2026 新变化

  1. Cloud 2025.1 (Oakwood) :跟随 Spring Boot 4 / Framework 7 / Jakarta EE 11;持续安全修复(Commons、Gateway、Config 多个 CVE,保持补丁更新)。

  2. Cloud 2026.0.0-M1 (Paddington) :基于 Boot 4.2;Resilience4j 升到 2.4 、Feign 升到 13.14、Gateway 从 Reactor Addons Retry 迁移到 Framework Core Retry、Config 增加 HTTP property path notifier 与 Azure DevOps workload identity 支持。

  3. 趋势:对 Kubernetes 原生(Spring Cloud Kubernetes:服务发现、配置、istio 协同)和声明式/平台化(注册发现下沉到 K8s,应用侧更薄)的支持持续增强;HTTP Interface 与 OpenFeign 定位部分重叠,新项目可按"是否依赖注册中心生态"选择。


十三、高频踩坑 / 面试清单

  1. 版本不匹配:Cloud 与 Boot 乱搭导致启动各种 NoSuchMethod/自动配置不生效------严格按兼容表 + BOM。

  2. 服务发现拿到旧实例 :客户端缓存刷新延迟、心跳未续约;容器多网卡要配 prefer-ip-address/网卡。

  3. Feign 坑:参数注解不写 value、GET 用实体变 POST、长 URL、没配连接池、超时与上游冲突。

  4. 熔断形同虚设:没配超时/没开启 Feign circuitbreaker、fallback 里再抛异常、降级不记日志无法告警。

  5. 重试风暴:多层(Feign + Resilience4j + 网关)叠加重试把下游打挂------重试只放一层、总预算受控、保证幂等。

  6. 网关混用 MVC:Gateway 是 WebFlux,引入 spring-webmvc 导致启动/运行模型冲突。

  7. 配置不刷新 :忘了 @RefreshScope、Bus 没连同一个 MQ、namespace/group 不一致。

  8. 链路断链:异步线程、线程池、WebClient/Feign 未走埋点组件导致 traceId 丢失。

  9. 注册中心/配置中心单点:必须集群 + 失败快速失败策略;启动顺序与依赖要演练。

  10. CAP 取舍:Eureka 偏 AP(保可用、可能含过期实例,客户端需容错);配置中心/注册中心选型要理解一致性模型。


参考资料

  1. Spring Cloud 官方项目页 --- Spring Cloud

  2. Spring Cloud 2025.1.3 (Oakwood) 发布说明 --- Spring | Blog (2026-08-20)

  3. Spring Cloud 2026.0.0-M1 (Paddington) --- Spring Cloud 2026.0.0-M1 (aka Paddington) Has Been Released

  4. Spring Cloud 兼容版本表 --- Supported Versions · spring-cloud/spring-cloud-release Wiki · GitHub

  5. Spring Cloud OpenFeign 文档 --- Spring Cloud OpenFeign

  6. Spring Cloud Gateway 文档 --- Spring Cloud Gateway

  7. Spring Cloud Circuit Breaker(Resilience4j)--- Spring Cloud Circuit Breaker

  8. Resilience4j 官方文档 --- resilience4j

  9. Micrometer Tracing 文档 --- Tracing support :: Micrometer Tracing

  10. Spring Cloud Alibaba(Nacos/Sentinel/Seata)--- GitHub - alibaba/spring-cloud-alibaba: Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. · GitHub

相关推荐
闻哥2 小时前
分布式任务调度框架:XXL-Job / ElasticJob / DolphinScheduler / SchedulerX 架构对比与选型
分布式·架构·wpf
EatFan2 小时前
2026 后端 AI 工程化:Spring AI 2.0、MCP 协议与 Agent 内嵌如何收进 Java 生产系统
java·人工智能·spring·agent·spring ai·spring boot 3·mcp
栗子~~3 小时前
SpringCloud Gateway 基于 Nacos 实现动态路由
java·spring cloud·gateway
萧瑟余晖5 小时前
Spring MVC拦截器异常处理与跨域详解
java·spring·mvc
hmb↑5 小时前
高并发与高可用技术经验
java·spring
code_slave(码畜)5 小时前
微服务架构落地:消息队列架构设计(上篇)——异步解耦、削峰填谷,看懂业务事件流转本质
spring boot·spring cloud·微服务·云原生·架构
桃西西呀9 小时前
Spring AI Alibaba 之七:我没写一行 tracing 埋点,Agent 每一步却被 Micrometer 看得清清楚楚
人工智能·spring·llm
桃西西呀9 小时前
Spring AI Alibaba 之八:我让 Agent 直接执行 shell 命令,它却读到了目录里的密钥,沙箱到底防住了什么
人工智能·spring·llm