RestTemplate 深度解析

本文探讨了 RestTemplate 的重要性、优缺点,以及如何扩展以满足需求。RestTemplate 基于成熟的 HTTP Client 实现,提供消息转换等功能,但依赖 Spring 模块且默认设置存在不足。通过扩展 UriTemplateHandler 和 HeaderMapper 可解决部分问题,使其更适合普通 HTTP 服务调用。此外,文章还介绍了 RestTemplate 的工作原理,包括 HTTP Client 实现、消息写入和读取以及错误处理。
摘要由CSDN通过智能技术生成

一、概述

本文主要介绍 Spring Web 模块中的 RestTemplate 组件的原理、优缺点、以及如何扩展以满足各种需求。

在介绍 RestTemplate 之前,我们先来谈谈 HTTP Client,谈谈选择一个优秀的 HTTP Client 实现的的重要性,以及一个优秀的 HTTP Client 应该具备哪些特性。

在 Java 社区中,HTTP Client 主要有 JDK 的 HttpURLConnection、Apache Commons HttpClient(或被称为 Apache HttpClient 3.x)、Apache HttpComponents Client(或被称为 Apache HttpClient 4.x)、Square 公司开源的 OkHttp。

除了这几个纯粹的 HTTP Client 类库以外,还有 Spring 的 RestTemplate、Square 公司的 Retrofit、Netflix 公司的 Feign,以及像 Apache CXF 中的 client 组件。这些框架和类库主要是针对 Web Service 场景,尤其是 RESTful Web Service。它们往往是基于前面提到的 HTTP Client 实现,并在其基础上提供了消息转换、参数映射等对于 Web Service 来说十分必要的功能。

(当然,像 Netty、Mina 这样的网络 IO 框架,实现 HTTP 自然也不再话下,但这些框架通常过于底层,不会被直接使用)

选择一个优秀的 HTTP Client 的重要性

虽然现在服务间的调用越来越多地使用了 RPC 和消息队列,但是 HTTP 依然有适合它的场景。

RPC 的优势在于高效的网络传输模型(常使用 NIO 来实现),以及针对服务调用场景专门设计协议和高效的序列化技术。而 HTTP 的优势在于它的成熟稳定、使用实现简单、被广泛支持、兼容性良好、防火墙友好、消息的可读性高。所以在开放 API、跨平台的服务间调用、对性能要求不苛刻的场景中有着广泛的使用。

正式因为 HTTP 存在着很广泛的应用场景,所以选择一个优秀的 HTTP Client 便是十分重要的。

优秀的 HTTP Client 需要具备的特性

  • 连接池
  • 超时时间设置(连接超时、读取超时等)
  • 是否支持异步
  • 请求和响应的编解码
  • 可扩展性

连接池

因为目前 HTTP 1.1 不支持多路复用,只有 HTTP Pipeline 这用半复用的模型支持。所以,在需要频繁发送消息的场景中,连接池使必须支持的,以减少频繁建立连接所带来的不必要的性能损耗。

超时时间设置(连接超时、读取超时等)

当对端出现问题的时候,长时间的,甚至是无限的超时等待是绝对不能接受的。所以必须必须能够设置超时时间。

是否支持异步

HTTP 相关技术(服务器端和客户端)通常被人认为是性能低下的一个重要原因在于,在很长一段时间里,HTTP 的相关实现缺乏对异步的支持。这不仅指非阻塞 IO,也包括异步的编程模型。缺乏异步编程模型的后果就是,即便 HTTP 协议栈是基于非阻塞 IO 实现的,调用客户端的或者在服务端处理消息的线程有大量时间被浪费在了等待 IO 上面。所以,异步是非常重要的特性。

请求和响应的编解码

通常,开发人员希望面向对象使用各种服务(这里面自然也包括基于 HTTP 协议的服务),而不是直接面对原始的消息和响应开发。所以,透明地将 HTTP 请求和响应进行编解码是十分有必要,因为这可以很大程度地降低开发人员的工

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值