1. 程式人生 > >HttpClient連線池原理及一次連線時序圖

HttpClient連線池原理及一次連線時序圖

HttpClient是一個實現了http協議的開源Java客戶端工具庫,可以通過程式傳送http請求。

1.1.HttpClient傳送請求和接收響應

1.1.1.程式碼示例

Get請求為例,以下程式碼獲得google主頁內容並將返回結果打印出來。

public final static void main(String[] args) throws Exception {

HttpClient httpclient = new DefaultHttpClient();

try {

HttpGet httpget = new HttpGet("http://www.google.

com/");

System.out.println("executing request " + httpget.getURI());

// 建立response處理器

ResponseHandler<String> responseHandler = new BasicResponseHandler();

String responseBody = httpclient.execute(httpget, responseHandler);

System.out.println("----------------------------------------");

System.out.println(responseBody);

System.out.println("----------------------------------------");

} finally {

//HttpClient不再使用時,關閉連線管理器以保證所有資源的釋放

httpclient.getConnectionManager().shutdown();

}

}

1.1.2.時序圖

httpClient執行一次請求,即執行一次httpclient.execute()方法,時序圖如下:



 

1.1.3.
時序圖說明

1.1.3.1.時序圖編號說明

²1.11.21.3等均為操作1的子操作,即:操作1 execute()中又分別呼叫了操作1.1 createClientConnectionManager()、操作1.2 createClientRequestDirector()以及操作1.3 requestDirector 物件的execute()方法等,以此類推。

²按時間先後順序分別編號為1,2,3等,以此類推。

1.1.3.2.主要類說明



 

²對於圖中各物件,httpClient jar包中均提供對應的介面及相應的實現類。

²圖中直接與伺服器進行socket通訊的是最右端介面OperatedClientConnection某一實現類的物件,圖中從右到左進行了層層的封裝,最終開發人員直接使用的是介面HttpClient某一實現類的物件進行請求的傳送和響應的接收(如2.1.1程式碼示例)。

²時序圖中各物件所在類關係如下圖類圖所示(僅列出圖中所出現的各個類及方法,引數多的方法省略部分引數,其他類屬性和操作請參照原始碼):

1.1.3.2.1.介面OperatedClientConnection

²該介面對應一個http連線,與伺服器端建立socket連線進行通訊。

1.1.3.2.2.介面ManagedClientConnection

²該介面對一個http連線OperatedClientConnection進行封裝,ManagedClientConnection維持一個PoolEntry<HttpRoute, OperatedClientConnection>路由和連線的對應。提供方法獲得對應連線管理器,對http連線的各類方法,如建立連線,獲得相應,關閉連線等進行封裝。

1.1.3.2.3.介面RequestDirector

²RequestDirector為訊息的傳送執行者,該介面負責訊息路由的選擇和可能的重定向,訊息的鑑權,連線的分配回收(呼叫ClientConnectionManager相關方法),建立,關閉等並控制連線的保持。

²連線是否保持以及保持時間預設原則如下:

n連線是否保持:客戶端如果希望保持長連線,應該在發起請求時告訴伺服器希望伺服器保持長連線(http 1.0設定connection欄位為keep-alivehttp 1.1欄位預設保持)。根據伺服器的響應來確定是否保持長連線,判斷原則如下:

u檢查返回response報文頭的Transfer-Encoding欄位,若該欄位值存在且不為chunked,則連線不保持,直接關閉。其他情況進入下一步。

u檢查返回的response報文頭的Content-Length欄位,若該欄位值為空或者格式不正確(多個長度,值不是整數),則連線不保持,直接關閉。其他情況進入下一步

u檢查返回的response報文頭的connection欄位(若該欄位不存在,則為Proxy-Connection欄位)值

l如果這倆欄位都不存在,則http 1.1版本預設為保持,將連線標記為保持, 1.0版本預設為連線不保持,直接關閉。

l如果欄位存在,若欄位值為close 則連線不保持,直接關閉;若欄位值為keep-alive則連線標記為保持。

n連線保持時間:連線交換至連線管理時,若連線標記為保持,則將由連線管理器保持一段時間;若連線沒有標記為保持,則直接從連線池中刪除並關閉entry。連線保持時,保持時間規則如下:

u保持時間計時開始時間為連線交換至連線池的時間。

u保持時長計算規則為:獲取keep-alive欄位中timeout屬性的值,

l若該欄位存在,則保持時間為 timeout屬性值*1000,單位毫秒。

l若該欄位不存在,則連線保持時間設定為-1,表示為無窮。

n響應頭日誌示例:

17:59:42.051 [main] DEBUG org.apache.http.headers - << Keep-Alive: timeout=5, max=100

17:59:42.051 [main] DEBUG org.apache.http.headers - << Connection: Keep-Alive

17:59:42.051 [main] DEBUG org.apache.http.headers - << Content-Type: text/html; charset=utf-8

17:59:42.062 [main] DEBUG c.ebupt.omp.sop.srmms.SopHttpClient - Connection can be kept alive for 5000 MILLISECONDS

n若需要修改連線的保持及重用預設原則,則需編寫子類繼承自AbstractHttpClient,分別覆蓋其createConnectionReuseStrategy() createConnectionKeepAliveStrategy() 方法。

1.1.3.2.4.介面ClientConnectionManager

²ClientConnectionManager為連線池管理器,是執行緒安全的。Jar包中提供的具體實現類有BasicClientConnectionManagerPoolingClientConnectionManager。其中BasicClientConnectionManager只管理一個連線。PoolingClientConnectionManager管理連線池。

²若有特殊需要,開發人員可自行編寫連線管理器實現該介面。

²連線管理器自動管理連線的分配以及回收工作,並支援連線保持以及重用。連線保持以及重用由RequestDirector進行控制。

1.1.3.2.5.介面HttpClient

²介面HttpClient為開發人員直接使用的傳送請求和接收響應的介面,是執行緒安全的。jar包中提供的實現類有:AbstractHttpClient, DefaultHttpClient, AutoRetryHttpClient, ContentEncodingHttpClient, DecompressingHttpClient, SystemDefaultHttpClient。其中其他所有類都繼承自抽象類AbStractHttpClient,該類使用了門面模式,對http協議的處理進行了預設的封裝,包括預設連線管理器,預設訊息頭,預設訊息傳送等,開發人員可以覆蓋其中的方法更改其預設設定。

²AbstractHttpClient預設設定連線管理器為BasicClientConnectionManager。若要修改連線管理器,則應該採用以下方式之一:

n初始化時,傳入連線池,例如:

ClientConnectionManager connManager= new PoolingClientConnectionManager();

HttpClient httpclient = new DefaultHttpClient(connManager);

n編寫httpClient介面的實現類,繼承自AbstractHttpClient並覆蓋其createClientConnectionManager()方法,在方法中建立自己的連線管理器。

1.1.3.3.方法說明

²createClientConnectionManager(),建立連線池,該方法為protected。子類可覆蓋修改預設連線池。

²createClientRequestDirector(),建立請求執行者,該方法為protected。子類可覆蓋但一般不需要。

²httpClient中呼叫1.2方法所建立的請求執行者requestDirectorexecute()方法。該方法中依次呼叫如下方法:

n1.3.1呼叫連線管理器的requestConnection(route, userToken)方法,該方法呼叫連線池httpConnPoollease方法,建立一個Future<HttpPoolEntry>Futrue用法參見Java標準API。返回clientConnectionRequest

n1.3.2.呼叫clientConnectionRequestgetConnection(timeout, TimeUnit.MILLISECONDS)方法,該方法負責將連線池中可用連線分配給當前請求,具體如下:

u建立clientConnectionOperator

u執行1.3.1中建立的Future的任務,該任務獲得當前可用的poolEntry<routerOperatedClientConnection>並封裝成managedClientConnectionImpl返回。

n1.3.3. 呼叫 tryConnect(roureq, context)方法,該方法最終呼叫OperatedClientConnectionopenning方法,與伺服器建立socket連線。

n1.3.4. 呼叫 tryExecute(roureq, context)方法,該方法最終呼叫OperatedClientConnectionreceiveResponseHeader()和receiveResponseEntity()獲得伺服器響應。

n1.3.5 判斷連線是否保持用來重用,若保持,則設定保持時間,並將連線標記為可重用不保持則呼叫managedClientConnectionImplclose方法關閉連線,該方法最終呼叫OperatedClientConnectionclose()方法關閉連線。

²最終respose返回至httpClient

²傳送請求的執行緒需處理當前連線,若已被標記為重用,則交還至連線池管理器;否則,關閉當前連線。(使用響應處理器ResponseHanler)。本次請求結束。

1.2.httpClient連線池

若連線管理器配置為PoolingClientConnectionManager,則httpClient將使用連線池來管理連線的分配,回收等操作。

1.2.1.連線池結構

連線池結構圖如下,其中:


相關推薦

HttpClient連線原理連線時序

HttpClient是一個實現了http協議的開源Java客戶端工具庫,可以通過程式傳送http請求。 1.1.HttpClient傳送請求和接收響應 1.1.1.程式碼示例 以Get請求為例,以下程式碼獲得google主頁內容並將返回結果打印出

資料庫連線原理應用

1、運作原理 在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用 JDBC直接訪問資料庫中的資料,每一次資料訪問請求都必須經歷建立資料庫連線、開啟資料庫、存取資料和關閉資料庫連線等步驟,而連線並開啟資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操作,系

HttpClient4.5.2 連線原理注意事項

隨著微服務的流行,服務之間的http呼叫越來越多,遇到的問題也比較多,寫這邊文章的目的也是將自己遇到的坑和解決方案跟大家分享 一、為什麼要用Http連線池 1、降低延遲:如果不採用連線池,每次連線發起Http請求的時候都會重新建立TCP連線(經歷3次握手),用完就會關閉連線(4次揮手),如果採用連線池則減

JavaEE開發使用MySQL連線原理好處

以下為自己綜合N多 視訊/部落格 資料之後的理解: 1. 基於最原始的JDBC及JDBC-MySQL 驅動來使用MySQL資料庫時經常會使用以下程式碼: //1.驅動註冊程式 Class.forName("com.mysql.jdbc.Driver");

JDBC連線原理分析

大家好,我是IT修真院西安分院第4期的JAVA學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網Java任務1,深度思考中的知識點JDBC連線池原理 一、.背景介紹 什麼是連線池 1)連線池,首先從字面意思理解,這是一個偏正短語

SpringBoot2.x預設連線hikaridruid連線

    在SpringBoot2.x的預設連線池是hikari。我們可以通過spring-boot-starter-jdbc的依賴發現。但是HikariCP應該是目前速度最快的連線池了。 1.hikari連線池使用 pom.xml中jdbc的三座標 <depen

HikariCP 的Java資料庫連線介紹配置

HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 原文地址:http://blog.csdn.net/clementad/article/details/46928621 官網:https://github.com/brettwooldridge/Hi

物件、資料庫連線原理

一、一點說明: (本文的知識點來自C#執行緒參考手冊) 物件池在企業軟體中非常常見,為了提供應用的效能,必須控制物件例項的建立。比如建立資料庫連線物件,每一次建立的代價非常高昂,每一次使用資料庫都需要連線資料庫,代價非常高昂,因此有了資料庫連線池,每一次一個連線被建立之後不是就馬上釋放,下一次使用的時候重

C#(.net)中的連線資料庫執行多條sql語句(兩種方法)

第一種方法: string str="server=.;uid=sa;pwd=111111;database=text_db";//連線字串 SqlConnection SCON = null;//連線物件 SqlCommand SCom=new SqlCommand();/

k8s環境下由predis初始化連線緩慢引起的問題排查

背景 最近業務上在做同城雙中心。原本的機房使用的是swarm叢集,新機房使用的是k8s叢集。業務遷移到新機房的主要工作集中在: 庫、redis、es等底層服務的遷移; redis由原來的vip單點模式,切換為redis-cluster,由於phpredis1官方版本暫時

Android多執行緒操作sqlite資料庫連線框架的種設計思路

我們在Android應用程式開發當中經常會用到資料庫,一般在有兩種主要開發思路。 第一種:每次需要對資料庫操作的時候建立連線,操作完成後,馬上關閉連線。 這個方式一般用於不怎麼頻繁操作資料庫的情況,用完後馬上關閉達到節省系統資源的目的。 第二種:應用程式一

Redis連線設定測試結果

設定redis連線池分為如下幾步: 1. 首先在nginx.conf檔案中的http節點下新增如下upstream節點  upstream redis_pool {           server 127.0.0

Java資料庫連線原理與簡易實現

1、什麼是資料庫連線池     我們現在在開發中一定都會用到資料庫,為了提高我們的系統的訪問速度,資料庫優化是一個有效的途徑。我們現在開發中使用資料庫一般都要經歷以下的四個步驟:(1)載入資料庫的驅動類,(2)建立資料庫連線,(3)進行資料操作,(4)關閉資料庫連線;在這四步中建立資料庫連線是一個比較耗時的操

Java中的資料庫連線原理

連線池的基本工作原理 1、基本概念及原理 我們知道,對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配?釋放所造成的問題。資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連

Java中資料庫連線原理機制的詳細講解

連線池的基本工作原理   1、基本概念及原理   由上面的分析可以看出,問題的根源就在於對資料庫連線資源的低效管理。我們知道,對於共享資源,有一個很著名的設計模式:資源池 (Resource Pool)。該模式正是為了解決資源的頻繁分配?釋放所造成的問題。為解決上述問

Java資料庫連線比較使用場景

我們在連線資料庫的時候,由於建立資料庫連線代價很大(銷燬連線的代價也很大),需要消耗很多資源,因此引入資料庫連線池。資料庫連線池是一種池化技術,預先建立好資料庫連線,儲存在記憶體中,當需要連線時,從中取出即可,使用完後放回連線池。 下面我們介紹Java中常用的

j2ee資料庫連線原理分析

最近我作了JSP資料庫的頻繁連線,在此給出資料庫連線池的必要性,對於JSP來說一個很好的J2EE伺服器是很必要的,JBOOS,WebLogic都是很好的解決方案。 一般情況下,在使用開發基於資料庫的WEB程式時,傳統的模式基本是按以下步驟: 1. 在主程式(如Serv

PHP連線實現的種想法

雖然現在名義上是PHP開發,不過做這資料分析的事,平時工作大部分用的是JAVA。C語言出身,學的語言比較多,JAVA還算熟悉,不過之前一直都沒用連線池。第一次遇到連線池是在學校的時候女朋友用連線池出現問題了,找我,我看了下覺得沒必要,直接就刪了。那時候用的是第三方擴充套件,

淺析資料庫連線原理分析與實現

1 動機在專案初期對於資料庫的使用就是開啟一個連線並進行使用,使用過後關閉連線釋放資源,並且在後臺簡單測試中,並沒有出現問題。但是在與前端對接之後,發現頻繁地開啟和關閉連線會對效能造成很大的影響,而且之前假設的情況是接受的請求都是同步的,但是前端可能傳送非同步請求,當兩個請求

mybatis連線原理

補充說明: 1.pooleddatasourc中包含一個poolstate物件,這個物件包含了兩個集合,idleConnections(儲存連線池中空閒的執行緒),activeConnections(儲存連線池中活動的執行緒) 2.建立新執行緒  PooledConnec