Spring HTTP客户端独立面试题
本页只放标准回答、追问方向和原理入口。详细原理、流程图、Demo和Runbook见Spring HTTP客户端专题。
1. Spring里常见HTTP客户端有哪些
标准回答: 存量JDK 8和Boot 2项目常见OpenFeign、RestTemplate和WebClient;Java 17 + Boot 3新项目还会遇到HTTP Interface和RestClient。OpenFeign适合Spring Cloud服务间声明式调用;RestClient是阻塞式现代HTTP客户端;WebClient是响应式非阻塞客户端;HTTP Interface用@HttpExchange接口生成代理。无论选哪个,底层仍要处理HTTP Client、连接池、超时、编解码、错误语义和观测。
2. HTTP Interface和OpenFeign有什么区别
标准回答: 二者都能用接口描述HTTP调用并生成代理。OpenFeign属于Spring Cloud OpenFeign生态,和服务发现、LoadBalancer、配置、Fallback等微服务治理集成成熟;HTTP Interface是Spring Framework原生声明式HTTP能力,通过HttpServiceProxyFactory基于RestClient或WebClient执行,更轻量,但服务发现、熔断、错误映射和观测要按项目明确组合。不能只看注解相似就认为生产治理能力完全相同。
原理:HTTP Interface怎样工作、OpenFeign内部原理。
3. RestClient和RestTemplate是什么关系
标准回答: 二者都是阻塞式HTTP客户端API。RestTemplate在Boot 2存量系统中很常见;RestClient是Spring 6.1后更现代的阻塞客户端API,链式写法更清晰。它们都不是微服务治理的全部,仍需要连接池、超时、错误映射、Trace、Token、幂等和重试边界。
原理:RestClient适合什么、JDK 8 RestTemplate Demo。
4. WebClient是不是一定比RestTemplate快
标准回答: 不是。WebClient的核心优势是非阻塞I/O和响应式组合,能用较少线程管理大量等待中的网络请求;它不保证单次请求一定更快,也不会增加下游数据库容量。如果在EventLoop里执行JDBC、文件读写或阻塞HTTP调用,反而会拖垮全站P99。
原理:WebClient线程模型。
5. HTTP客户端真正是谁发请求
标准回答: OpenFeign、RestClient、WebClient或HTTP Interface只是上层调用API和请求编排;真正建立连接并发送HTTP报文的是底层HTTP Client,例如Apache HC5、OkHttp、JDK HttpClient或Reactor Netty。服务名变成真实IP通常还要经过DiscoveryClient和Spring Cloud LoadBalancer。
6. 为什么服务名不一定能直接被RestClient识别
标准回答: http://user-service里的user-service只有在客户端接入了Spring Cloud LoadBalancer时才会按服务名选实例;否则可能被当成普通DNS主机名解析而失败。Feign在Spring Cloud体系里通常自动桥接LoadBalancer,而RestClient、HTTP Interface或手写WebClient要确认Builder是否已被负载均衡定制。
原理:HTTP Interface怎样工作、LoadBalancer内部原理。
7. 连接池等待超时和Read Timeout有什么区别
标准回答: 连接池等待超时表示调用线程在本地等可用连接,请求可能还没有发到下游;Read Timeout表示请求已发出后等待响应或读取响应超时,下游可能已经执行成功。排查时连接池等待看本地池容量和泄漏,Read Timeout看下游P99、线程池、慢SQL、锁和网络。
原理:超时、连接池和Deadline。
8. 写请求超时后能不能直接重试
标准回答: 不能。读取超时属于结果不确定,下游可能已经提交事务只是响应没回来。写请求必须使用稳定幂等键,下游用唯一约束或幂等表保证重复安全;调用方超时后先按幂等键查询事实,仍未知再进入补偿或告警,不能换一个新业务号盲目重试。
原理:JDK 8 RestTemplate Demo、超时不确定性。
9. MVC项目能不能用WebClient
标准回答: 可以,但要理解线程模型。MVC线程调用WebClient后如果直接block(),本质还是阻塞等待,只是底层I/O可能由Reactor Netty处理;如果把阻塞DB操作放进响应式链的EventLoop,会造成事件循环阻塞。MVC项目可以用WebClient做并发聚合,但必须限制并发、设置超时和隔离阻塞代码。
原理:WebClient线程模型。
10. 怎么排查HTTP客户端调用慢
标准回答: 先用Trace确认慢在哪一段,再拆连接池等待、DNS、Connect、TLS、发送、首字节、读取、解码和重试次数;同时看下游实例分布、慢实例、线程池、连接池、GC、DB连接池和慢SQL。不要只看到Feign或RestClient慢就直接调大Read Timeout。
原理:生产排查Runbook、Spring Cloud服务调用链路。
