WebFlux 集成

共 43 题
#

1. DataBuffer 使用引用计数时,丢弃、聚合或异常路径为何需要显式释放,泄漏日志如何定位

A 未释放的 buffer 只会浪费少量内存,无影响
B 引用计数无需管理,框架自动处理所有情况
C 引用计数归零时缓冲区才被回收到内存池,丢弃/异常路径需显式 release ✓ 正确答案
D 泄漏检测日志无法定位泄漏点
#

2. R2DBC 事务只能覆盖同一响应式连接上的操作,跨消息或远程服务时应怎样保证一致性

A 跨服务一致性需采用 Saga、Outbox 等分布式事务方案(如最终一致性) ✓ 正确答案
B 单个 R2DBC 事务可覆盖多个远程服务
C R2DBC 事务天然支持跨连接操作
D 跨服务无需事务保证
#

3. Spring Boot 使用虚拟线程后,WebFlux 是否自动转为每请求一线程,二者混用应依据什么

A 虚拟线程开关只影响 Servlet 容器,WebFlux 的 Netty 模型不受影响 ✓ 正确答案
B 开启虚拟线程后 WebFlux 自动转为每请求一线程
C 两者完全等价,可互换
D WebFlux 也基于虚拟线程模型
#

4. Spring WebFlux 6.1+ 在 Spring Boot 4.0 中是否已默认开启虚拟线程兼容模式

A WebFlux 默认自动切换到虚拟线程模型
B 框架提供虚拟线程兼容支持,但 WebFlux 默认仍用 Netty 事件循环,需显式配置才用虚拟线程 ✓ 正确答案
C 虚拟线程无法与 WebFlux 共存
D Spring Framework 6.1 不支持虚拟线程
#

5. Spring WebFlux 6.1+ 的 WebClient 与 JDK 21 HttpClient 在 Spring Boot 4.0 中的性能对比

A WebClient 是同步阻塞客户端
B WebClient 基于 Reactor + Netty,适合响应式流式请求;JDK HttpClient 支持虚拟线程,适合偏好同步写法的场景 ✓ 正确答案
C JDK HttpClient 不支持异步
D 两者性能完全一致,无差异
#

6. Spring WebFlux 6.x 中 onErrorContinue 与 onErrorResume 在微服务降级链中的取舍

A onErrorContinue
B onErrorMap
C onErrorResume ✓ 正确答案
D doOnError
#

7. Spring WebFlux 6.x 在 Spring Boot Actuator 中暴露响应式指标(/actuator/metrics)

A WebFlux 基于 Micrometer 注册 http.server.requests 等响应式指标,可通过 Actuator 暴露 ✓ 正确答案
B WebFlux 无法通过 /actuator/metrics 暴露指标
C 响应式指标与 MVC 指标完全一致
D 指标暴露无需额外配置
#

8. Spring WebFlux 与 R2DBC 在 Spring Boot 4.0 中实现全栈响应式的数据库连接池选择建议

A 应使用 HikariCP(阻塞式 JDBC 连接池)
B 响应式应用不需要连接池
C 连接池大小无所谓,越大越好
D 应使用 r2dbc-pool 响应式连接池,避免阻塞事件循环 ✓ 正确答案
#

9. Spring WebFlux 的 RouterFunction 与传统 @RequestMapping 在 Spring Boot 4.0 中的混合使用策略

A 两者不能共存于同一应用
B WebFlux 的 @RequestMapping 返回同步类型
C 两者可共存,RouterFunction 适合动态路由,注解式适合静态声明 ✓ 正确答案
D RouterFunction 只能用于 MVC
#

10. WebFlux + R2DBC 在 Spring Boot 4.0 中处理事务边界(@Transactional)

A 使用 DataSourceTransactionManager 管理响应式事务
B 使用 ReactiveTransactionManager,事务连接通过 Reactor Context 在当前响应式链传播 ✓ 正确答案
C 事务操作可在方法内任意切换线程
D 响应式事务可跨多个远程连接
#

11. WebFlux 单元测试在 Spring Boot 4.0 中使用 WebTestClient 与 MockServer 的最佳实践

A WebTestClient 只能测同步 MVC 接口
B MockServer 用于测数据库
C 响应式测试无需设置超时
D 用 WebTestClient 绑定应用做响应式断言,用 MockServer 隔离外部依赖,配合 StepVerifier 验证流式结果 ✓ 正确答案
#

12. WebFlux 在 Spring Cloud Gateway 中的 Netty EventLoop 与 Spring 异步任务调度的边界

A 阻塞操作可直接放到 Netty EventLoop 上执行
B Netty EventLoop 必须保持非阻塞,阻塞任务需通过调度器迁到工作线程 ✓ 正确答案
C 网关过滤器可任意阻塞
D EventLoop 与异步任务调度无边界
#

13. WebFlux 在 Spring Cloud Sleuth + OpenTelemetry 链路追踪中的上下文传播与同步阻塞差异

A 响应式通过 ThreadLocal 传递 traceId,与同步一致
B 响应式通过 Reactor Context 传递链路上下文,跨线程切换不丢失 ✓ 正确答案
C 响应式无法传递 traceId
D 跨线程切换时 ThreadLocal 仍有效
#

14. WebTestClient 如何验证流式响应的背压、取消和超时,测试中怎样避免无限流悬挂

A 用 StepVerifier 可验证背压、取消与超时,配合 take/超时避免无限流悬挂 ✓ 正确答案
B WebTestClient 无法验证取消
C 测试无限流时无需限制
D WebTestClient 不支持 Flow 断言
#

15. boundedElastic 调度器有线程与队列上限,把所有阻塞任务迁入其中为何仍可能形成排队雪崩

A 把所有阻塞任务迁入 boundedElastic 就能彻底解决阻塞问题
B boundedElastic 的队列无限大,不会溢出
C boundedElastic 有线程与队列上限,阻塞任务积压会排队并最终拒绝,形成雪崩 ✓ 正确答案
D 阻塞任务不会占线程
#

16. retryWhen 对非幂等 HTTP 请求有什么风险,重试条件、退避和总截止时间应如何共同限制

A 非幂等请求可任意重试,无副作用风险
B 4xx 业务错误也应无脑重试
C retryWhen 只重试一次,无风险
D 需通过重试条件过滤可重试错误、指数退避+抖动分散、总截止时间兜底,必要时配合幂等键 ✓ 正确答案
#

17. @RestController 返回 Mono/Flux 的工作机制

A 框架非阻塞订阅 Mono/Flux,数据就绪后异步写入响应 ✓ 正确答案
B 框架会阻塞等待 Mono/Flux 的结果
C Mono 对应流式多值响应
D 返回 Flux 时不能流式输出
#

18. AnnotatedController 与函数式端点的对比

A 函数式端点更易让团队上手
B 注解式声明式、团队友好;函数式灵活、适合动态路由与组合 ✓ 正确答案
C 两者不能混合使用
D 函数式端点无法动态构建路由
#

19. BlockHound 能发现哪些阻塞调用,生产环境启用前为何要评估探针开销与合法白名单

A BlockHound 通过字节码注入拦截响应式线程中的阻塞调用,生产启用前需评估探针开销与白名单配置 ✓ 正确答案
B BlockHound 无法检测阻塞调用
C BlockHound 可以检测所有正常阻塞
D 生产启用无需评估开销
#

20. RouterFunction 与函数式路由

A 通过 route(...).handle(...) 定义匹配条件与处理逻辑,支持嵌套与过滤 ✓ 正确答案
B 无法嵌套或过滤路由
C 只能用于 MVC
D 函数式路由不能与注解式共存
#

21. SSE 客户端断开后 Flux 如何感知取消并清理心跳、订阅和租户资源,怎样验证无泄漏

A 客户端断开不会触发任何取消信号
B 租户上下文无需清理
C 心跳定时器无需停止
D 通过 doFinally/doOnCancel 在取消时清理心跳、订阅与租户资源,并用指标与测试验证无泄漏 ✓ 正确答案
#

22. ServerSentEvents(SSE)与 text/event-stream

A SSE 是双向通信协议
B SSE 不支持自动重连
C SSE 使用 text/event-stream,服务端单向推送,WebFlux 用 Flux + ServerSentEvent 实现 ✓ 正确答案
D SSE 基于二进制帧
#

23. Spring WebFlux 6.x 中 ServerHttpSecurity 与 Spring Security 6.4 的反应式安全配置变化

A 使用 ServerHttpSecurity 构建 SecurityWebFilterChain,采用 lambda DSL 配置 ✓ 正确答案
B 响应式安全上下文通过 ThreadLocal 传播
C WebFlux 无法配置 OAuth2
D 安全配置必须使用旧式 XML
#

24. Spring WebFlux 与 Spring AI 2.0 流式响应(Streaming Response)

A Spring AI 只能同步返回完整结果
B WebFlux 无法与 Spring AI 集成
C Spring AI 流式 API 返回 Flux,WebFlux 按流式媒体类型逐 token 推送实现打字机效果 ✓ 正确答案
D 流式输出不支持取消
#

25. Spring WebFlux 与 Spring MVC 的取舍

A MVC 基于响应式模型,WebFlux 基于阻塞模型
B WebFlux 一定比 MVC 快
C 有阻塞式依赖(JDBC)且需求常规时 MVC 更合适;高并发 IO 密集或需要全栈响应式时考虑 WebFlux ✓ 正确答案
D 两者编程模型完全相同
#

26. Spring WebFlux 的背压(Backpressure)

A WebFlux 没有背压机制
B R2DBC 查询无法应用背压
C 背压只影响性能,不影响内存
D WebFlux 基于 Reactor 的 request(n) 信用机制,沿请求处理链传播背压 ✓ 正确答案
#

27. WebClient 与 RestTemplate 的差异

A RestTemplate 是响应式客户端,返回 Mono/Flux
B 两者完全等价
C WebClient 是非阻塞响应式客户端,支持背压与组合操作符;RestTemplate 是阻塞式 ✓ 正确答案
D WebClient 无法用于 HTTP 调用
#

28. WebClient 的 retrieve()/exchangeToMono()/exchangeToFlux()

A retrieve 暴露原始 ClientResponse
B 两者无区别
C exchange 系列响应体可无限次消费
D retrieve 自动处理状态码并解码响应体,exchangeToMono 提供底层 ClientResponse 访问 ✓ 正确答案
#

29. WebClient.exchangeToMono 自定义分支时如何确保未消费响应体被释放,遗漏会耗尽什么资源

A 不消费响应体不会有问题
B 未消费响应体必须显式释放(releaseBody),否则导致连接与内存泄漏 ✓ 正确答案
C 响应体可无限次消费,无需释放
D 连接池不会受响应体影响
#

30. WebExceptionHandler、@ControllerAdvice 与操作符 onErrorResume 各适合在哪一层转换错误

A WebExceptionHandler 负责业务异常映射,@ControllerAdvice 负责框架兜底
B 三层完全相同
C @ControllerAdvice 适合控制器/业务错误映射,onErrorResume 适合操作符内降级,WebExceptionHandler 做框架层兜底 ✓ 正确答案
D onErrorResume 用于覆盖全局错误处理
#

31. WebFlux 与 R2DBC 的整合

A WebFlux 只能配合 JDBC 使用
B 全栈响应式仍需阻塞数据库
C R2DBC 是阻塞式驱动
D R2DBC 提供响应式数据库访问,DatabaseClient/R2dbcRepository 返回 Mono/Flux,与 WebFlux 实现全栈响应式 ✓ 正确答案
#

32. WebFlux 与 Spring Cloud OpenFeign(阻塞式)

A OpenFeign 是阻塞客户端,在 WebFlux 中需用 subscribeOn 隔离到弹性线程,或改用响应式客户端 ✓ 正确答案
B 可直接在 Netty EventLoop 上调用 OpenFeign
C OpenFeign 是响应式客户端
D 阻塞客户端不会影响事件循环
#

33. WebFlux 与 Spring Modulith 模块化架构结合时的反应式跨模块事件传播机制

A 模块间不能通过事件通信
B 事件只能同步处理
C 使用 ReactiveApplicationEventPublisher 发布响应式事件,监听器返回 Mono/Flux 实现响应式跨模块解耦 ✓ 正确答案
D Modulith 不支持响应式
#

34. WebFlux 应用优雅停机时,如何停止接收新请求并等待活动流结束,同时限制最长排空时间

A 停机时不等待活动请求
B 优雅停机无需超时限制
C 配置 server.shutdown=graceful 停止接收新请求并排空活动流,用 timeout-per-shutdown-phase 限制最长排空时间 ✓ 正确答案
D 长连接不受停机影响
#

35. WebFlux 测试(WebTestClient)

A WebTestClient 是 MVC 同步测试工具
B WebTestClient 支持 bindToServer/Controller/RouterFunction/ApplicationContext 绑定,做响应式断言 ✓ 正确答案
C WebTestClient 无法测试流式响应
D WebTestClient 只能测试静态接口
#

36. WebFlux 的 Flux<Long> 与 delayElements

A delayElements 给流中每个元素附加延迟,interval 周期性生成 Flux<Long> ✓ 正确答案
B interval 给元素加延迟,delayElements 生成周期序列
C 两者作用相同
D delayElements 不能用于限速
#

37. WebFlux 的 MediaType 与协商

A WebFlux 根据 Accept 头与控制器 produces 及返回类型协商媒体类型,Flux 配合流式媒体类型实现流式输出 ✓ 正确答案
B 协商只由返回类型决定,与 Accept 无关
C 协商失败返回 500
D 流式输出无需媒体类型
#

38. WebFlux 的过滤器(WebFilter)

A WebFilter 是同步过滤器,会阻塞
B WebFilter 只能用于 MVC
C WebFilter 无法处理请求头
D WebFilter 返回 Mono<Void>,用于认证、日志等横切逻辑,通过 @Order 排序、@Component 注册 ✓ 正确答案
#

39. WebFlux 的错误处理(@ControllerAdvice + ResponseEntityExceptionHandler)

A @ExceptionHandler 方法返回同步响应
B 异常处理只能返回 JSON
C WebFlux 不支持 @ControllerAdvice
D @ControllerAdvice + @ExceptionHandler 映射业务异常为响应式错误响应,配合全局异常处理器做兜底 ✓ 正确答案
#

40. retrieve 的 onStatus 与全局 ExchangeFilterFunction 如何分工,错误响应体只能消费一次意味着什么

A onStatus 处理特定状态码的错误映射,ExchangeFilterFunction 做全局横切,且响应体只能消费一次 ✓ 正确答案
B onStatus 是全局过滤器,ExchangeFilterFunction 是局部状态码处理
C 响应体可多次消费
D 两者无分工
#

41. 使用 Spring WebFlux 实现 SSE(Server-Sent Events)

A SSE 是双向通信
B SSE 必须使用 WebSocket
C SSE 不支持心跳
D 返回 Flux 并设置 text/event-stream 即可实现 SSE,可用 ServerSentEvent 包装事件 ✓ 正确答案
#

42. 使用 application/x-ndjson 返回流式 JSON 时,每条记录的编码失败应终止全流还是发送错误事件

A 一律终止全流
B 一律静默忽略
C 取决于业务语义:可容忍则跳过该条继续(onErrorContinue),不可容忍则终止,且需考虑已部分输出的不一致性 ✓ 正确答案
D 编码失败不影响流
#

43. 连接、响应、读取和业务总截止时间应如何组合,只有 responseTimeout 会漏掉哪些阶段

A 只配置 responseTimeout 就能覆盖所有阶段
B 需组合 connectTimeout、responseTimeout、readTimeout 与业务 timeout,覆盖连接、响应、读取停顿与整体截止时间 ✓ 正确答案
C 超时只影响连接
D 读取停滞无需超时