-
Notifications
You must be signed in to change notification settings - Fork 1.3k
A:
- libevent最为古老、有历史包袱,bufferevent虽为精妙,却也难以上手;
- libev可以说是libevent的简化版,代码极为精简,但宏定义用的过多,代码可读性不强,且在Windows上实现不佳;
- libuv是nodejs的c底层库,最先也是由libevent+对Windows IOCP支持,后来才改写自成一体,同时实现了管道、文件的异步读写,很强大,但结构体比较多,封装比较深;
- libhv本身是参考了libevent、libev、libuv的实现思路,它们的核心都是事件循环(即在一个事件循环中处理IO、定时器等事件),但提供的接口最为精简,API接近原生系统调用,最容易上手;
- 具体这几个库的写法比较见https://github.com/ithewei/libhv/tree/master/echo-servers
- 当然这几个库的性能是接近的,都将非阻塞IO多路复用用到了极致
- 更详细介绍见国产开源库libhv为何能被awesome-c和awesome-cpp收录
A:精妙小巧跨平台,简单实用易上手
- base封装了很多跨平台的代码,如hatomic原子操作、hthread线程、hmutex线程同步,当然这都是基于
configure
/cmake
自动生成的hconfig.h
和hplatform.h
两个头文件中提供的平台宏、编译器宏等实现的; - event模块则实现了事件循环(包括IO、timer、idle),不同的平台有不同的实现,如
Linux
使用epoll
,Windows
使用IOCP
、Mac
使用kqueue
、Solaris
使用evport
,感兴趣的可以读一读event下的源码; - http模块则基于event模块实现了本世纪最为通用的应用层协议http协议,包括http服务端和客户端,libhv中examples下提供的httpd,性能可媲美nginx服务;
- 不妨勇敢的说,libhv是c++编写HTTP API服务端/客户端最简单的库,没有之一
A:基于event模块实现更多的常见应用层协议,如websocket
、MQTT
、redis
等;
A:上面说了,libhv、libevent、libev、libuv几个库是性能是接近的,它们都将非阻塞IO多路复用用到了极致,可使用echo-servers下提供的benchmark.sh简单做个压力测试,在我个人开发机上QPS都在28K左右,不存在量级差距; 此外libhv中提供的httpd QPS甚至略微超过nginx;
A:libhv自2018年5月创建,至今已有两年多迭代,300+提交,广泛用于公司IoT和HTTP API服务中,此外QQ群里也是有不少水友成功用在各种项目中,反馈很好; 请放心使用,开源且保证长期维护,QQ群里也有很多大神积极解答。
A:
- 建议先从运行项目根目录下
getting_started.sh
脚本开始, 你会被libhv的httpd所展示的便利性所吸引; - 看
unittest
和examples
下的示例代码; - 源码阅读推荐路线
base->event->http
;
A:libhv可通过Makefile
或cmake
编译出动态库和静态库,make install
后包含相关头文件(base模块下头文件比较分散,可直接#include "hv.h"
)和链接库文件即可使用;当然libhv模块划分清晰,低耦合,你也可以直接把源文件拿到自己项目中去编译,如日志功能hlog.h
和hlog.c
就可以直接拿去用。
A:Windows下编译libhv请先使用cmake
生成VS工程。
cmake基本已是c/c++项目跨平台构建标配,但为了方便广大VS同胞,还是提供了vs2015工程文件夹,直接使用2015以上VS打开hv.sln
即可。
附VS各版本下载地址VS2008 ~ VS2019下载地址
A:Windows下VS编译最低要求VS2015(包括VS2015)版本,这是因为http模块中使用了一个modern c++ JSON解析库nlohmann::json,该json库使用方法见https://github.com/nlohmann/json。
如果你想在VS低版本下编译,需要加WITHOUT_HTTP_CONTENT
预编译宏以屏蔽body和结构化数据转化功能,自己解析和构建body
内容(例如使用其它的json解析库)。
当然c++11是必要的,所以VS2012以下编译libhv全模块是行不通的,事实上,c++11现在也是标配,VS2015也是现在各大厂SDK使用的标准。
A:请在工程-->属性-->c/c++
-->预处理器-->预处理器定义中添加HV_STATICLIB
预编译宏,以屏蔽hexport.h
头文件中动态库导入宏
#define HV_EXPORT __declspec(dllimport)
使用curl静态库类似加CURL_STATICLIB
预编译宏
A:libhv中已集成了openssl已支持SSL/TSL加密通信,通过打开config.mk
或CMakeList.txt
中WITH_OPENSSL
选项,编译即可。
此外在etc/httpd.conf
配置文件中修改ssl=on
开启https功能。
当然你也可以用nginx做https代理。
A:上传文件推荐使用Content-Type: multipart/form-data
,服务端示例见examples/httpd/http_api_test.h
中的/upload
,客户端测试见getting_started.sh
中的bin/curl -v localhost:8080/v1/api/upload -F "file=@LICENSE"
(使用json传输二进制文件需要使用base64编码成可打印文本,3字节变4字节增加了负载;对于大文件分片可自行百度HTTP头Range
使用)
下载文件就不用多说了,web服务器本身就是文件服务器,httpd中已实现了web服务器,类似于curl http://ip:port/index.html
,下载文件curl http://ip:port/path/to/filename
响应中的body即是文件内容