推薦閱讀:java
SpringCloud源碼閱讀0-SpringCloud必備知識apache
SpringCloud源碼閱讀1-EurekaServer源碼的祕密設計模式
SpringCloud源碼閱讀2-Eureka客戶端的祕密緩存
SpringCloud源碼閱讀3-Ribbon負載均衡(上)服務器
發送HTTP請求在咱們開發中是一件很是廣泛的事情。app
Socket(最基礎) 客戶端與服務器的鏈接歸根結底都是socket鏈接,在Java中就是客戶端的Socket與服務器端的ServerSocket進行鏈接.負載均衡
本身使用原生Socket,來實現。 複雜繁瑣,易出錯.框架
因而乎,就出現了咱們所說的輪子。socket
java.net.HttpURLConnection是JDK提供的訪問HTTP協議的基本功能的類。工具
java.net.HttpURLConnection繼承自java.net.URLConnection,差異在與HttpURLConnection僅僅針對Http鏈接。
java.net.HttpURLConnection 與java.net.URLConnection 都是抽象類,不能實例化。JDK中的sun.net.www.protocol.http.HttpURLConnection 繼承了java.net.HttpURLConnection,提供了對請求發送的實現。
HttpURLConnection 在處理 Session,Cookie等方面處理難度大,
HttpClient是Apache公司出的用於發送http請求的工具類。底層確定也是封裝了socket
這裏要說明的是HttpClient分兩種
org.apache.commons.httpclient.HttpClient: 已再也不更新。已被Apache HttpComponents項目HttpClient和HttpCore取代。也就是新版HttpClient,org.apache.http.client.HttpClient
org.apache.http.client.HttpClient: 新版HttpClient 。建議使用此版本。
新一代的Http訪問客戶端。相比於其餘輪子,他提供了鏈接池,gziping,緩存等功能。這裏不詳細解釋,自行百度。推薦使用OkHttpClient做爲發送http請求的工具。
還有其餘框架,就不一一介紹了。
有了各類輪子,咱們就能夠發送http請求了。可是若是項目中,每一個開發人員使用不一樣的輪子發送http請求,這樣結果確定不是咱們想要的
因而乎。
對於這種創造型的需求,咱們一般都會使用一個工廠模式來簡化對象的實例化部分,下降系統中代碼耦合度,而且加強了系統的擴展性。
創造http請求客戶端的工廠。只有一個createRequest
方法。用於建立http請求客戶端。返回一個ClientHttpRequest表明請求客戶端。
有了工廠模式,按說已經很高級。不,這還不夠。
AbstractClientHttpRequestFactoryWrapper 是對ClientHttpRequestFactory的進一步包裝. 實現類:
是否是看上去很熟悉? 裝飾器模式。回想IO中的,裝飾器的運用。
InterceptingClientHttpRequestFactory 類中有一個interceptors 屬性用來存儲攔截器。InterceptingClientHttpRequestFactory 在建立ClientHttpRequest時,會將攔截器封裝到ClientHttpRequest中去。
private final List<ClientHttpRequestInterceptor> interceptors;
複製代碼
ClientHttpRequestInterceptor:用於對請求以前的攔截處理功能。相似Filter. 會在發送請求以前先執行攔截器。
BufferingClientHttpRequestFactory:createRequest方法返回一個 BufferingClientHttpRequestWrapper
。BufferingClientHttpRequestWrapper
會將response 緩存起來,以達到緩存的目的。
第一層用法:
第二層用法:輪子
第三層用法:設計模式