实测 OpenFeign 的超时、重试与错误解码:read-timeout 在 client.config 下按客户端名覆盖 default,超时异常是 RetryableException;默认永不重试,Retryer$Default 会对读超时的 GET 和 POST 都重试 5 次、对带 Retry-After 的 503 间隔 1 秒重试、对 500 不重试;404 默认抛 FeignException$NotFound,dismiss404 会把错误 JSON 当返回值解码而失败。
实测 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 全局过滤器的顺序:pre 按 order 从小到大、post 倒序;路由过滤器按位置从 1 编号并与全局过滤器一起排序,同为 1 时全局过滤器在前;default-filters 与路由自己的过滤器各自从 1 编号,默认的先执行;内置全局过滤器的 order(RouteToRequestUrlFilter 10000、NettyRoutingFilter 最后);不调用 chain.filter 即可短路。
实测 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 的 RequestRateLimiter(Redis 令牌桶):burstCapacity 5、replenishRate 2 时连续 10 个请求放行 5 个并带 X-RateLimit 头;Redis 里的键带路由 id;没有 KeyResolver 返回 403;requestedTokens 加权;多实例共享计数;Redis 挂掉时默认请求卡住,配 spring.data.redis.timeout 才会放行。
实测 Spring Cloud Config Server 与 spring.config.import:配置按「应用名-profile、应用名、application」优先级合并,拼错应用名也返回 200;远程配置覆盖本地 application.properties 的同名 key;optional:configserver 连不上就悄悄用本地值,去掉 optional 才会启动失败;git 提交后服务端立即读到新值,运行中的客户端不变;{cipher} 在服务端解密后明文发给客户端。
实测 Spring Cloud 的 @RefreshScope:POST /actuator/refresh 之后只有 @RefreshScope 的 bean 和 setter 绑定的 @ConfigurationProperties 看到新值,普通单例、构造时复制值的单例、record 绑定的 @ConfigurationProperties 仍是旧值;每次刷新都销毁所有 @RefreshScope bean,哪怕什么都没改;刷新后第一个访问它的请求承担重建的耗时(400 ms 的构造函数实测 408 ms)。
实测 Spring Cloud CircuitBreaker + Resilience4j 的配置粒度:默认窗口 100、最少 100 次调用,30 次全失败也不打开;默认 TimeLimiter 只等 1 秒;configureDefault 与按 id 的 configure 逐项覆盖;先向注册表要实例会让 Customizer 失效;OPEN 后不再调用 supplier;业务异常默认也算失败;resilience4j.* 属性同样生效;每个请求一个 id 会留下 1000 个熔断器。
实测 Alibaba Sentinel 1.8.9 的限流与熔断:QPS 限流用最近 1 秒的滑动窗口;线程数限流、匀速排队与预热的行为;慢调用比例熔断;异常比例不调用 Tracer.trace 就不会记录;统计窗口内请求数不足最少请求数时不会熔断;Spring 接口被拦返回 429,用 blockHandler 则是 200。
实测 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 Stream(Kafka 绑定器):函数式绑定名 in-in-0 默认就是 topic 名;不配 group 是匿名组,每个实例收全量,配 group 才分摊分区;新的具名组从最早消息读,匿名组只读新消息;处理失败默认重试 3 次后丢弃,enableDlq 转存到 error.<topic>.<group>;多个函数 bean 不写 spring.cloud.function.definition 则一个都不绑定。
实测 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 互相隔离。