1. 历史原因和向后兼容性
RestTemplate
是 Spring 框架中早期用于发起 REST 请求的主流方式,很多现有的 Spring Cloud 项目已经广泛使用 RestTemplate
。为了保持向后兼容性,Spring Cloud 保留了对 RestTemplate
的负载均衡支持。
当 Spring Cloud 负载均衡模块(如 Ribbon)最初引入时,WebClient
还没有成为主流,开发者更多地使用 RestTemplate
,因此优先提供了 RestTemplate
的负载均衡支持。
2. 同步 vs. 异步编程模型
RestTemplate 是一种基于同步阻塞的客户端调用方式,适合简单的请求/响应场景,且当它成为主流时,异步编程模型还没有广泛普及。
WebClient 是基于 Spring WebFlux 的异步非阻塞 HTTP 客户端,提供了更强的反应式编程支持。它在后来的 Spring 5.x 版本中引入,目的是支持响应式编程模型。由于它是后期加入的,因此早期的 Spring Cloud 没有将 WebClient
作为首选的负载均衡实现工具。
3. 负载均衡的实现
在 RestTemplate
中,通过 @LoadBalanced
注解,Spring Cloud 会自动配置负载均衡的拦截器,这样 RestTemplate
可以通过服务名(如 http://service-name
)进行请求,然后由 Ribbon 或 Spring Cloud LoadBalancer 实现客户端负载均衡。
WebClient
的负载均衡支持也是可以通过 @LoadBalanced
实现的。实际上,WebClient
是现代 Spring 应用程序的推荐使用方式,因为它支持异步和反应式的特性,特别是在高并发和大规模微服务场景中。
4. WebClient 的推荐使用
虽然 RestTemplate
仍然被支持,但 Spring 官方自 Spring 5.x 以来,更加推荐使用WebClient
,因为它更现代化并支持非阻塞和响应式编程,这对提升性能和效率非常重要。在新的 Spring Cloud 版本中,也为 WebClient
提供了和 RestTemplate
一样的负载均衡功能支持。