國產開源庫libhv爲何能被awesome-c收錄

近日,國產開源庫libhvawesome-c所收錄,讓我們看一下這個異軍突起的libhv庫究竟有何出色之處。

libhv簡介

libhv是一個跨平臺的類似libevent、libev、libuv的非阻塞IO事件循環庫,但提供了更加簡單的API接口和更加豐富的協議(包括http、ftp、smtp、dns、icmp等)。
libhv已廣泛實用在公司的IoT平臺、HTTP API服務之中,正確性、穩定性、可擴展性、性能都有保證,完全開源,請放心使用。

項目地址:https://github.com/ithewei/libhv.git
碼雲鏡像:https://gitee.com/ithewei/libhv.git
QQ技術交流羣:739352073
libhv每日一學博文:https://hewei.blog.csdn.net/article/details/103903123

比libevent、libuv更簡單的API接口

libhv源碼目錄echo-servers中展示了asio、libevent、libev、libhv、libuv、muduo、poco7個網絡庫編寫echo-server的示例。

// libhv echo-server示例
#include "hloop.h"

void on_close(hio_t* io) {
}

void on_recv(hio_t* io, void* buf, int readbytes) {
    hio_write(io, buf, readbytes);
}

void on_accept(hio_t* io) {
    hio_setcb_close(io, on_close);
    hio_setcb_read(io, on_recv);
    hio_read(io);
}

int main(int argc, char** argv) {
    if (argc < 2) {
        printf("Usage: cmd port\n");
        return -10;
    }
    int port = atoi(argv[1]);

    hloop_t* loop = hloop_new(0);
    hio_t* listenio = create_tcp_server(loop, "0.0.0.0", port, on_accept);
    if (listenio == NULL) {
        return -20;
    }
    hloop_run(loop);
    hloop_free(&loop);
    return 0;
}

壓力測試結果圖:
echo-servers
可以發現各庫的性能上不分上下,但libhv的接口是最簡單易用的。
具體體現在:

  • 提供監聽端口即可創建TCP服務,不用寫socket底層代碼(libev、libuv中需按流程調用socket->bind->listen->accept);
  • hread_cbhio_write原型與系統調用read、write類似,無記憶和認知負擔;
  • IO讀寫異常、斷鏈等情況統一到hclose_cb中處理;
  • 不用強制提供應用層buffer,libhv事件循環中提供了一個默認的readbuf(one loop per thread,one readbuf per loop),當然你也可以調用hio_set_readbuf提供自己的buffer,避免後續的memcpy

libhv提供的httpd性能媲美nginx

git clone https://github.com/ithewei/libhv.git
cd libhv
make httpd curl

bin/httpd -h
bin/httpd -d
#bin/httpd -c etc/httpd.conf -s restart -d
ps aux | grep httpd

# http web service
bin/curl -v localhost:8080

# http indexof service
bin/curl -v localhost:8080/downloads/

# webbench (linux only)
make webbench
bin/webbench -c 2 -t 60 localhost:8080

libhv-vs-nginx

libhv是c++編寫HTTP API服務端/客戶端最簡單的庫

// HTTP API server示例
#include "HttpServer.h"

int http_api_echo(HttpRequest* req, HttpResponse* res) {
    res->body = req->body;
    return 0;
}

int main() {
    HttpService service;
    service.base_url = "/v1/api";
    service.AddApi("/echo", HTTP_POST, http_api_echo);

    http_server_t server;
    server.port = 8080;
    server.service = &service;
    http_server_run(&server);
    return 0;
}

更多用法見博文https://hewei.blog.csdn.net/article/details/104055509

跨平臺

libhv在Linux、Windows、MacOS下編譯測試通過,在不同的平臺下使用了不同的IO多路複用機制,linux=>epoll, Windows=>IOCP,MacOS=>kqueue

libhv模塊劃分清晰,代碼可讀性高,值得初學者學習

數據結構

  • array.h: 動態數組
  • list.h: 鏈表
  • queue.h: 隊列
  • heap.h: 堆

base

  • hplatform.h: 平臺相關宏
  • hdef.h: 宏定義
  • hversion.h: 版本
  • hbase.h: 基本接口
  • hsysinfo.h: 系統信息
  • hproc.h: 子進程/線程類
  • hmath.h: math擴展函數
  • htime.h: 時間
  • herr.h: 錯誤碼
  • hlog.h: 日誌
  • hmutex.h: 同步鎖
  • hthread.h: 線程
  • hsocket.h: socket操作
  • hbuf.h: 緩存類
  • hurl.h: URL轉義
  • hgui.h: gui相關定義
  • hstring.h: 字符串
  • hvar.h: var變量
  • hobj.h: 對象基類
  • hfile.h: 文件類
  • hdir.h: ls實現
  • hscope.h: 作用域RAII機制
  • hthreadpool.h: 線程池
  • hobjectpool.h: 對象池
  • ifconfig.h: ifconfig實現

utils

  • hmain.h: main_ctx: arg env
  • hendian.h: 大小端
  • iniparser.h: ini解析
  • singleton.h: 單例模式
  • md5.h
  • base64.h
  • json.hpp

event

  • hloop.h: 事件循環

iowatcher

  • EVENT_SELECT
  • EVENT_POLL
  • EVENT_EPOLL (linux only)
  • EVENT_KQUEUE (mac/bsd)
  • EVENT_IOCP (windows only)

http

  • http_client.h: http客戶端
  • HttpServer.h: http服務端

其它

  • hv.h: 總頭文件
  • Makefile.in: 通用Makefile模板

libhv API列表見博文https://hewei.blog.csdn.net/article/details/103976875或源碼目錄https://github.com/ithewei/libhv/tree/master/docs

如果你覺得該庫不錯,請githubstar支持下吧,感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章