近日,國產開源庫libhv爲awesome-c和awesome-cpp所收錄,這個異軍突起的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、poco
7個網絡庫編寫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;
}
壓力測試結果圖:
可以發現各庫的性能上不相上下,但libhv的接口是最簡單易用的。
具體體現在:
- 提供監聽端口即可創建TCP服務,不用寫socket底層代碼(libev、libuv中需按流程調用
socket->bind->listen->accept
); hread_cb
,hio_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借鑑了nginx的master-workers
多進程模型,併發數、吞吐量甚至隱隱超過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
如果你覺得該庫不錯,請github上star
支持下吧,感謝!