V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
intlinfo
V2EX  ›  C++

基于 libuv C++11 风格的网络库 采用 Reactor 模式封装

  •  
  •   intlinfo · 2021-01-28 19:30:13 +08:00 · 2620 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    基于 libuv 开发的 C++ 纯异步高性能的网络服务器,目前拥有 Tcp Queue WorkQueue Signal 4 大组件,完全继承 libuv 的优点 不同的是采用 Reactor 模式封装。

    目前可商用基于 libuv 开源的网络库不多,甚至是没有。所以我基于 uv 开发了这么一套近完善的库。

    预期实现: http-server rpc-protocol multiple-thread-curl-client

    特性如下

    1.CPU 全核利用不会浪费系统资源,并持有 Client index 复用机制。

    2.优秀的跨平台能力,一套代码封装 libuv 的 2 套代码,不用担心底层机制。

    3.服务器全过程采用纯异步非阻塞模式。

    4. 异步的信号处理,多种关闭实例的例子。

    4.接口强大简单易用非继承,采用仿函数的回调形式。

    5.除此之外,如需更新底层无需更改业务层的代码,直接替换 libuv 既可。

    6.完全继承 libuv 原生优点 windows iocp linux epoll 。

    项目地址: https://github.com/X-Crack/libuv-evpp

    欢迎各路大神 pr 一起完善,它不是一个人的,它是属于开源世界的。
    9 条回复    2021-02-08 15:39:42 +08:00
    maty
        1
    maty  
       2021-01-28 20:00:07 +08:00
    跨平台的话,期望能有个 cmake
    jdz
        2
    jdz  
       2021-01-28 20:13:41 +08:00 via Android
    用 brpc 不香吗
    intlinfo
        3
    intlinfo  
    OP
       2021-01-28 20:29:53 +08:00
    @jdz
    使用场景不一样,根据需求决定吧,每个人喜欢的库也都不同。
    intlinfo
        4
    intlinfo  
    OP
       2021-01-28 20:30:53 +08:00
    @maty
    目前还不稳定,cmake 后面在搞。
    本地开发手动搭建的跨平台环境 已经可以跨平台,但最新提交的 master 未经测试。

    开发环境是 win vs2019 c++20
    YouLMAO
        5
    YouLMAO  
       2021-02-01 01:59:36 +08:00 via Android
    @intlinfo 看了,基本对于需求方不可用,现实需要一个 client 连多个 service,比如 redis,es,都配连接池,比如 redis 开 2,es 开 20,你根本不支持嘛,单点对单点异步基本没有意义
    wlgq2
        6
    wlgq2  
       2021-02-04 17:31:54 +08:00 via Android
    https://github.com/wlgq2/uv-cpp
    我自己用了好几年了,个人觉得挺好用的。再过几年网络就要进去 C 艹标准库鸟🐦。
    intlinfo
        7
    intlinfo  
    OP
       2021-02-07 13:07:28 +08:00
    @YouLMAO 是的,目前还在各种测试状态,并没有那么完善,后面会根据不用场景的需求完成不同的场景模块代码。

    目前是不可用的状态,未来几个月内会推出稳定版。 嘿嘿!感谢大佬的支持。
    intlinfo
        8
    intlinfo  
    OP
       2021-02-07 13:08:04 +08:00
    @wlgq2 这是大佬您写的嘛。 挺不错的!
    intlinfo
        9
    intlinfo  
    OP
       2021-02-08 15:39:42 +08:00
    @YouLMAO
    仔细回想了一下您说的问题,server 对外是预留了 一个 map 的 context 可以保存各种不同的类或指针,因为是一个 any 类型,通过 loop 可以很方便的对每个线程对应的每个会话进行调用(连接各种数据库,它是一个 size_t 类型的大小)。它是绝对的线程安全的。

    如果是 client 的话,没有认真写,能用就好了。后面会一点点完善的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.