支援併發的http客戶端(基於tcp連線池以及netty)
阿新 • • 發佈:2019-02-03
閒來無事,將以前自己寫的一個庫放出來吧。。
有的時候會有這樣子的需求:
(1)伺服器A通過HTTP協議來訪問伺服器B
(2)伺服器A可能會併發的像B傳送很多HTTP請求
類似於上述的需求,可能並不常見。。。因為在業務中確實遇到了這樣子的場景,所以就自己動手開發了一個庫。。。
實現原理:
(1)底層IO通過netty搞
(2)維護一個tcp的長連線池,這樣子就不用每次傳送請求還要建立一個tcp連線了。。。
下面直接來看怎麼用吧:
(1)最常規的用法,向www.baidu.com傳送100次get請求:
ClientPool pool = new NettyClientPool(2, "www.baidu.com"); pool.start(); for (int i = 0; i < 100; i++) { Request re = new Request("/", Request.RequestMethod.GET); pool.request(re).addListener(new Future.Listener() { @Override public void complete(Object arg) { Response res = (Response)arg; System.out.println(res.getBody().toString(Charset.forName("utf-8"))); } @Override public void exception(Throwable t) { } }); }
這裡可以看到,其實這裡是非同步的提交的,所以需要註冊一些回撥。。。
(2)使用同步的方式傳送請求,這裡就弄成Post請求吧:
ClientPool pool = new NettyClientPool(2, "www.baidu.com"); pool.start(); Request re = new Request("/", Request.RequestMethod.POST); re.getBody().writeBytes("aaaa".getBytes(Charset.forName("utf-8"))); try { Response response = pool.requestWithTimeOut(re, 2000).sync(); System.out.println(response.getBody().toString(Charset.forName("utf-8"))); } catch (Throwable throwable) { System.out.println(throwable); } pool.stop();
這裡可以看到,提交請求的時候還帶有超時的額,也就是2000毫秒都還沒有搞完,那麼就不搞了。。
好了,就介紹這些吧,反正post和get請求都有,支援超時控制。。。
支援併發。。。至於說效能嘛。。。應該不差吧,也不知道該跟誰比較。。。。
、
最後給出github地址吧:
https://github.com/2225377fjs/HttpClientPool