最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 實現(xiàn)高性能HTTP客戶端

 更新時間:2021年08月26日 15:33:10   作者:Kevin Wan  
HttpClient可以實現(xiàn)所有HTTP的方法,通過API傳輸接收HTTP消息。本文詳細講解了HttpClient,以及如何運用C++實現(xiàn)HTTP客戶端,感興趣的朋友可以參考一下

一、什么是Http Client

Http協(xié)議,是全互聯(lián)網共同的語言,而Http Client,可以說是我們需要從互聯(lián)網世界獲取數(shù)據(jù)的最基本方法,它本質上是一個URL到一個網頁的轉換過程。而有了基本的Http客戶端功能,再搭配上我們想要的規(guī)則和策略,上至內容檢索下至數(shù)據(jù)分析都可以實現(xiàn)了。

繼上一次介紹用Workflow可以10行C++代碼實現(xiàn)高性能HTTP服務,今天繼續(xù)給大家用C++實現(xiàn)一個高性能的Http客戶端也同樣很簡單!

// [http_client.cc]
#include "stdio.h"
#include "workflow/HttpMessage.h"
#include "workflow/WFTaskFactory.h"

int main (int argc, char *argv[])
{
    const char *url = "https://github.com/sogou/workflow";
    WFHttpTask *task = WFTaskFactory::create_http_task (url, 2, 3,
            [](WFHttpTask * task) { 
                fprintf(stderr, "%s %s %s\r\n",
                        task->get_resp()->get_http_version(),
                        task->get_resp()->get_status_code(),
                        task->get_resp()->get_reason_phrase());
    });
    task->start();
    getchar(); // press "Enter" to end.
    return 0;
}

只要安裝好了Workflow,以上代碼即可以通過以下命令編譯出一個簡單的http_client:

g++ -o http_client http_client.cc --std=c++11 -lworkflow -lssl -lcrypto -lpthread

根據(jù)Http協(xié)議,我們執(zhí)行這個可執(zhí)行程序 ./http_client,就會得到以下內容:

HTTP/1.1 200 OK

同理,我們還可以通過其他api來獲得返回的其他Http header和Http body,一切內容都在這個 WFHttpTask 中。而因為Workflow是個異步調度框架,因此這個任務發(fā)出之后,不會阻塞當前線程,外加內部自帶的連接復用,從根本上保證了我們的Http Client的高性能。

接下來給大家詳細講解一下原理~

二、請求的過程

1. 創(chuàng)建Http任務

上述demo可以看到,請求是通過發(fā)起一個Workflow的Http異步任務來實現(xiàn)的,創(chuàng)建任務的接口如下:

WFHttpTask *create_http_task(const std::string& url,
                             int redirect_max, int retry_max,
                             http_callback_t callback);

第一個參數(shù)就是我們要請求的URL。對應的,在一開始的示例中,我們的重定向次數(shù)redirect_max是2次,而重試次數(shù)retry_max是3次。第四個參數(shù)是一個回調函數(shù),示例中我們用了一個lambda,由于Workflow的任務都是異步的,因此我們處理結果這件事情是被動通知我們的,結果回來就會調起這個回調函數(shù),格式如下:

using http_callback_t = std::function<void (WFHttpTask *)>;

2. 填寫header并發(fā)出

我們的網絡交互無非是請求-回復,對應到Http Client上,在我們創(chuàng)建好了task之后,我們有一些時機是處理請求的,在Http協(xié)議里,就是在header里填好協(xié)議相關的事情,比如我們可以通過Connection來指定希望得到建立Http的長連接,以節(jié)省下次建立連接的耗時,那么我們可以把Connection設置為Keep-Alive。示例如下:

protocol::HttpRequest *req = task->get_req();
req->add_header_pair("Connection", "Keep-Alive");
task->start();

最后我們會把設置好請求的任務,通過 task->start(); 發(fā)出。最開始的 http_client.cc 示例中,有一個 getchar(); 語句,是因為我們的異步任務發(fā)出后是非阻塞的,當前線程不暫時停住就會退出,而我們希望等到回調函數(shù)回來,因此我們可以用多種暫停的方式。

3. 處理返回結果

一個返回結果,根據(jù)Http協(xié)議,會包含三部分:消息行、消息頭header、消息正文body。如果我們想要獲取body,可以這樣:

const void *body;
size_t body_len;
task->get_resp()->get_parsed_body(&body, &body_len); 

三、高性能的基本保證

我們使用C++來寫Http Client,最香的就是可以利用其高性能。Workflow對高并發(fā)是如何保證的呢?其實就兩點:

純異步;

連接復用;

前者是對線程資源的重復利用、后者是對連接資源的重復利用,這些框架層級都為用戶管理好了,充分減少開發(fā)者的心智負擔。

1. 異步調度模式

同步和異步的模式直接決定了我們的Http Client可以有多大的并發(fā)度。為什么呢?通過下圖可以先看看同步框架發(fā)起三個Http任務,線程模型是怎樣的:

網絡延遲往往非常大,如果我們在同步等待任務回來的話,線程就會一直被占用。這時候我們需要看看異步框架是如何實現(xiàn)的:

如圖所示,只要任務發(fā)出之后,線程即可做其他事情,我們傳入了一個回調函數(shù)做異步通知,因此等任務的網絡回復收完之后,再讓線程執(zhí)行這個回調函數(shù)即可拿到Http請求的結果,期間多個任務并發(fā)出去的時候,線程是可以復用的,輕松達到幾十萬的QPS并發(fā)度。

2. 連接復用

我們剛才有提到,只要我們建立了長連接,即可提高效率。為什么呢?因為框架對連接有復用。我們先來看看如果一個請求就建立一個連接,會是什么樣的情況:

很顯然,占用大量的連接是對系統(tǒng)資源的浪費,而且每次都要做connect以及close是非常耗時的,除了TCP常見的握手以外,許多應用層協(xié)議建立連接的過程也會相對復雜。但使用Workflow就不會有這樣的煩惱,Workflow會在任務發(fā)出的時候自動查找當前可以復用的連接,如果沒有才會自動創(chuàng)建,完全不需要開發(fā)者關心連接如何復用的細節(jié):

3. 解鎖其他功能

當然,除了以上的高性能以外,一個高性能的Http Client往往還有許多其他的需求,這里可以結合實際情況與大家分享:

  • 1.結合workflow的串并聯(lián)任務流,實現(xiàn)超大規(guī)模并行抓??;
  • 2.按順序或者按指定速度請求某個站點的內容,避免請求過猛被封禁;
  • 3.Http Client遇到redirect可以自動幫我做跳轉,一步到位請求到最終結果;
  • 4.希望通過proxy代理訪問HTTPHTTPS資源;

以上這些需求,要求框架對于Http任務的編排有超高的靈活性,以及對實際需求(比如redirect、ssl代理等功能)有非常接地氣的支持,這些Workflow都已經實現(xiàn)。

項目地址

https://github.com/sogou/workflow

到此這篇關于C++ 實現(xiàn)高性能HTTP客戶端的文章就介紹到這了,更多相關C++ 實現(xiàn)HTTP客戶端內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用C語言實現(xiàn)2048小游戲的方法

    利用C語言實現(xiàn)2048小游戲的方法

    2048是比較流行的一款數(shù)字游戲,相信對大家來說都不陌生,這篇文章給大家分享了利用C語言實現(xiàn)2048小游戲的方法,對大家學習理解C語言具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • C++?自增自減運算符的實現(xiàn)示例

    C++?自增自減運算符的實現(xiàn)示例

    本文主要介紹了C++?自增自減運算符的實現(xiàn)示例,自增和自減運算符在C++中主要用于循環(huán)語句中,使循環(huán)變量的值自動+1或者-1,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 一文搞懂C語言static關鍵字的三個作用

    一文搞懂C語言static關鍵字的三個作用

    這篇文章主要介紹了C語言static關鍵字的三個作用,本文通過實例代碼圖文相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • VC程序設計中CreateProcess用法注意事項

    VC程序設計中CreateProcess用法注意事項

    這篇文章主要介紹了VC程序設計中CreateProcess用法注意事項,需要的朋友可以參考下
    2014-07-07
  • QT TCP實現(xiàn)簡單的通信示例

    QT TCP實現(xiàn)簡單的通信示例

    這篇文章主要為大家詳細介紹了QT TCP簡單的通信示例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++位圖的實現(xiàn)原理與方法

    C++位圖的實現(xiàn)原理與方法

    位圖(bitset)是一種常用的數(shù)據(jù)結構,常用在給一個很大范圍的數(shù),判斷其中的一個數(shù)是不是在其中。這篇文章主要給大家介紹了關于C++位圖以及位圖的實現(xiàn)原理與方法,需要的朋友可以參考下
    2021-05-05
  • C++控制臺實現(xiàn)簡單人機對弈井字棋

    C++控制臺實現(xiàn)簡單人機對弈井字棋

    這篇文章主要為大家詳細介紹了C++控制臺實現(xiàn)簡單人機對弈井字棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c++?qt自定義搜索編輯框的實現(xiàn)方法

    c++?qt自定義搜索編輯框的實現(xiàn)方法

    這篇文章主要介紹了c++?qt自定義搜索編輯框,通過自定義QLineEdit,在編輯框里添加布局,將按鈕設置在右邊,當點擊按鈕搜索按鈕時發(fā)送信號到主界面做相應的操作,需要的朋友可以參考下
    2022-03-03
  • C++ 標準模板庫 STL 順序容器詳解

    C++ 標準模板庫 STL 順序容器詳解

    這篇文章主要介紹了C++ 標準模板庫 STL 順序容器詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C++依賴倒轉原則和里氏代換原則有什么好處

    C++依賴倒轉原則和里氏代換原則有什么好處

    設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設計模式七大原則之一的依賴倒轉原則
    2023-02-02

最新評論

怀宁县| 泉州市| 海城市| 永顺县| 甘孜| 崇仁县| 深水埗区| 博湖县| 正镶白旗| 平顺县| 广宗县| 吴川市| 望城县| 上杭县| 定兴县| 宝兴县| 三明市| 辽宁省| 花莲市| 麻栗坡县| 唐河县| 策勒县| 西畴县| 西畴县| 井研县| 嵊泗县| 双鸭山市| 庆云县| 临沧市| 溆浦县| 三原县| 龙岩市| 米易县| 临清市| 浮山县| 河西区| 科技| 台前县| 临高县| 洛扎县| 五大连池市|