在服務調用時候spring-web已經為我們封裝好了2個client模闆:
- 同步調用的 RestTemplate
- 支援異步調用的AsyncRestTemplate
本文簡單概述這2種模版的使用方式, 涉及相關細節後面的文章逐漸講解
RestTemplate描述
首先來開RestTemplate ,先看一下這個類的關系圖1-1
圖1-1
從中可以看到RestTemplate 開放出來可供使用者操作的一些操作口子
-
requestFactory: 這個是用于建立request的工廠. 預設為SimpleClientHttpRequestFactory();
-
interceptors:這個是在送出請求前個使用者一個可以切入操作的地方. 預設為空
-
messageConverters: 在post請求和resp回來時對資料的處理轉化; 對messageConverter的選擇是基于請求header中的Content-Type
-
errorHandler: 處理失敗的handler.
RestTemplate請求處理
RestTemplate中提供了GET/POST/HEAD/PUT/PATCH/DELETE 方法(差別建wiki), 但最後都彙聚到doExecute這個方法
protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
ResponseExtractor<T> responseExtractor) throws RestClientException {
.......
ClientHttpRequest request = createRequest(url, method); //1.擷取request
if (requestCallback != null) {
requestCallback.doWithRequest(request); //2.處理request
}
response = request.execute(); //3.執行
handleResponse(url, method, response); //4.錯誤處理
if (responseExtractor != null) {
return responseExtractor.extractData(response); //5.解析response
}
else {
return null;
}
........
}
- 擷取request: 是通過
requestFactory.createRequest(url, method), 下圖(1-2,1-3)為spring-web提供的factory 和對應建立ClientHttpRequest類圖;選擇很多看具體業務需求
- 處理request: 根據requestCallback 類型
AcceptHeaderRequestCallback: 對于GET請求使用B隻處理header中的Accept類型 HttpEntityRequestCallback(繼承AcceptHeaderRequestCallback): 對于其他請求使用A處理設定header, 還要對請求資料進行convert處理
- 執行: 使用上面建立的具體ClientHttpRequest對伺服器請求----這個地方以後展開細說
- 錯誤處理: 如果傳回的http code是4xx或者5xx時, 會使用errorHandler進行處理
- 解析response: 有3種實作
HeadersExtractor 對HEAD請求傳回的resp處理提取需要的header ResponseEntityResponseExtractor 傳回ResponseEntity HttpMessageConverterExtractor 根據responseType選擇需要messageConverter把http傳回封包轉化為預定義的類型
圖1-2
圖1-3
AsyncRestTemplate描述
圖1-4
和同步的Template類似,但AsyncRestTemplate中持有一個RestTemplate的執行個體,在構造方法中建立的. AsyncRestTemplate将messageConvert相關的處理委托給RestTemplate處理(包括請求封包和傳回封包)
AsyncRestTemplate處理
提供請求處理的方法也是類似的,隻不過調用後會立即傳回一個ResponseExtractorFuture, 使用者需要為ResponseExtractorFuture添加必須的callback,
void addCallback(ListenableFutureCallback<? super T> callback);
和
void addCallback(SuccessCallback<? super T> successCallback, FailureCallback failureCallback);
當請求傳回時會觸發使用者的callback進行相應處理.
doExecute關鍵代碼如下:
AsyncClientHttpRequest request = createAsyncRequest(url, method); //1.建立request
if (requestCallback != null) {
requestCallback.doWithRequest(request); //2.request處理
}
ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync(); //3.執行
return new ResponseExtractorFuture<T>(method, url, responseFuture, responseExtractor); //4.傳回
- 建立request: 是通過
requestFactory.createAsyncRequest(url, method) 下圖(1-5,1-6)為spring-web提供的異步AsyncRequestFactory 和對應建立AsyncClientHttpRequest類圖;選擇很多看具體業務需求
- 處理request: 委托RestTemplate處理, 同RestTemplate的處理邏輯
- 執行: AsyncClientHttpRequest的具體實作類進行處理, 傳回future
- 包裝成ResponseExtractorFuture傳回
圖1-5
這些factory大部分都同時實作同步和異步接口,
圖1-5
這個裡面Netty4ClientHttpRequest是同時實作同步和異步的request, 後面會對此詳細分析