知其然,知其所以然
Spring 全家桶 2026-10-22

Feign 的超时、重试与错误解码

实测 OpenFeign 的超时、重试与错误解码:read-timeout 在 client.config 下按客户端名覆盖 default,超时异常是 RetryableException;默认永不重试,Retryer$Default 会对读超时的 GET 和 POST 都重试 5 次、对带 Retry-After 的 503 间隔 1 秒重试、对 500 不重试;404 默认抛 FeignException$NotFound,dismiss404 会把错误 JSON 当返回值解码而失败。

Spring Cloud OpenFeign 超时 重试 ErrorDecoder 真实验证 动画演示
Spring 全家桶 2026-10-22

Spring Cloud Gateway:Route、Predicate 与 Filter

实测 Spring Cloud Gateway(WebFlux 版)的 Route、Predicate 与 Filter:谓词是「与」关系,StripPrefix / PrefixPath / SetPath / RewritePath 改后端收到的路径;默认不加 Forwarded / X-Forwarded-* 也丢掉客户端自带的,要配 trusted-proxies;order 越小越靠前;连不上后端是 500、响应超时是 504;旧属性前缀不报错但路由不生效;gateway 端点要同时配 exposure 与 access。

Spring Cloud Gateway Route Predicate Filter 真实验证 动画演示
Spring 全家桶 2026-10-22

Gateway 全局过滤器的顺序

实测 Spring Cloud Gateway 全局过滤器的顺序:pre 按 order 从小到大、post 倒序;路由过滤器按位置从 1 编号并与全局过滤器一起排序,同为 1 时全局过滤器在前;default-filters 与路由自己的过滤器各自从 1 编号,默认的先执行;内置全局过滤器的 order(RouteToRequestUrlFilter 10000、NettyRoutingFilter 最后);不调用 chain.filter 即可短路。

Spring Cloud Gateway GlobalFilter 过滤器顺序 Order 真实验证 动画演示
Spring 全家桶 2026-10-22

Gateway 的响应式模型:阻塞调用的坑

实测 Spring Cloud Gateway 过滤器里的阻塞调用:2 个事件循环线程下 20 个并发请求,Thread.sleep(200) 要 2.06 秒,Mono.delay 与 boundedElastic 只要 0.22 到 0.23 秒;Mono.block() 直接抛 IllegalStateException 返回 500;默认线程数等于 CPU 核数,64 个并发请求 1.47 秒对 0.23 秒。

Spring Cloud Gateway WebFlux 响应式 阻塞 事件循环 真实验证 动画演示
Spring 全家桶 2026-10-22

Gateway 限流:RequestRateLimiter 与 Redis

实测 Spring Cloud Gateway 的 RequestRateLimiter(Redis 令牌桶):burstCapacity 5、replenishRate 2 时连续 10 个请求放行 5 个并带 X-RateLimit 头;Redis 里的键带路由 id;没有 KeyResolver 返回 403;requestedTokens 加权;多实例共享计数;Redis 挂掉时默认请求卡住,配 spring.data.redis.timeout 才会放行。

Spring Cloud Gateway 限流 RequestRateLimiter Redis 真实验证 动画演示
Spring 全家桶 2026-10-22

Config Server 与 spring.config.import

实测 Spring Cloud Config Server 与 spring.config.import:配置按「应用名-profile、应用名、application」优先级合并,拼错应用名也返回 200;远程配置覆盖本地 application.properties 的同名 key;optional:configserver 连不上就悄悄用本地值,去掉 optional 才会启动失败;git 提交后服务端立即读到新值,运行中的客户端不变;{cipher} 在服务端解密后明文发给客户端。

Spring Cloud Config Server spring.config.import 配置中心 真实验证 动画演示
Spring 全家桶 2026-10-22

@RefreshScope 的原理与代价

实测 Spring Cloud 的 @RefreshScope:POST /actuator/refresh 之后只有 @RefreshScope 的 bean 和 setter 绑定的 @ConfigurationProperties 看到新值,普通单例、构造时复制值的单例、record 绑定的 @ConfigurationProperties 仍是旧值;每次刷新都销毁所有 @RefreshScope bean,哪怕什么都没改;刷新后第一个访问它的请求承担重建的耗时(400 ms 的构造函数实测 408 ms)。

Spring Cloud RefreshScope 刷新 ConfigurationProperties 真实验证 动画演示
Spring 全家桶 2026-10-22

Spring Cloud CircuitBreaker 与 Resilience4j:配置粒度

实测 Spring Cloud CircuitBreaker + Resilience4j 的配置粒度:默认窗口 100、最少 100 次调用,30 次全失败也不打开;默认 TimeLimiter 只等 1 秒;configureDefault 与按 id 的 configure 逐项覆盖;先向注册表要实例会让 Customizer 失效;OPEN 后不再调用 supplier;业务异常默认也算失败;resilience4j.* 属性同样生效;每个请求一个 id 会留下 1000 个熔断器。

Spring Cloud CircuitBreaker Resilience4j 熔断器 TimeLimiter 真实验证 动画演示
Spring 全家桶 2026-10-22

Sentinel:规则、统计窗口与降级

实测 Alibaba Sentinel 1.8.9 的限流与熔断:QPS 限流用最近 1 秒的滑动窗口;线程数限流、匀速排队与预热的行为;慢调用比例熔断;异常比例不调用 Tracer.trace 就不会记录;统计窗口内请求数不足最少请求数时不会熔断;Spring 接口被拦返回 429,用 blockHandler 则是 200。

Spring Cloud Sentinel 限流 熔断降级 统计窗口 真实验证 动画演示
Spring 全家桶 2026-10-22

Micrometer Tracing:链路 ID 进日志与跨服务传播

实测 Spring Boot 4 + Micrometer Tracing 1.6.7:只加 bridge-otel 依赖没有任何效果,要用 spring-boot-starter-opentelemetry;日志里出现 traceId-spanId,服务间用 W3C traceparent 传播,默认采样 10%;只有注入的 RestClient.Builder 才会传播,RestClient.create() 与 new RestTemplate() 链路会断;换线程后 traceId 丢失,加 ContextPropagatingTaskDecorator 才能传播。

Spring Cloud Micrometer Tracing 链路追踪 traceparent 日志关联 真实验证 动画演示
Spring 全家桶 2026-10-22

Spring Cloud Stream:绑定器与消费组

实测 Spring Cloud Stream(Kafka 绑定器):函数式绑定名 in-in-0 默认就是 topic 名;不配 group 是匿名组,每个实例收全量,配 group 才分摊分区;新的具名组从最早消息读,匿名组只读新消息;处理失败默认重试 3 次后丢弃,enableDlq 转存到 error.<topic>.<group>;多个函数 bean 不写 spring.cloud.function.definition 则一个都不绑定。

Spring Cloud Stream Kafka 绑定器 消费组 死信 真实验证 动画演示
Spring 全家桶 2026-10-22

Nacos 的注册与配置集成(Spring Cloud Alibaba)

实测 Spring Cloud Alibaba 2025.1.0.0 + Nacos 3.1.1:实例默认是临时实例,SIGTERM 与 SIGKILL 都在 0.6 秒内摘除;引入 nacos-config 但不写 spring.config.import 应用直接启动失败;远程配置覆盖本地同名 key;Nacos 推送让 @RefreshScope 与 @ConfigurationProperties 约 0.1 秒内生效而普通单例不变;不同 group 的同名 dataId 互相隔离。

Spring Cloud Alibaba Nacos 服务注册 配置中心 热刷新 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号