V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lesismal
V2EX  ›  分享创造

NBIO 第三弹 —— 真正的 Websocket 百万连接,以及 HTTPS 支持

  •  
  •   lesismal ·
    lesismal · 2021-03-22 12:12:19 +08:00 · 1664 次点击
    这是一个创建于 1103 天前的主题,其中的信息可能已经有所发展或是发生改变。

    NBIO 第三弹 —— 真正的 Websocket 百万连接,以及 HTTPS 支持

    上周又撸了个 Upgrader 支持 Websocket,功能已经打通,Upgrader 握手的部分是直接从 gorilla/websocket CV 大法然后修改的,感谢 gorilla/websocket ! 经过一番纠结,没有支持 Websocket 的 permessage-deflate 压缩,因为不是所有浏览器 /client 都支持该功能,所以如果 server 开启了压缩,反倒可能导致车祸。 如果需要压缩,应用层框架自己封装下发送 payload 的方法就能轻易实现,并且更能自主选择压缩算法。

    为什么叫真正的 Websocket 百万连接?

    曾经有个老外的帖子讲到单机百万 websocket 连接的优化: Going Infinite, handling 1M websockets connections in Go 对应的仓库好像是这个:1m-go-websockets

    早前就有看过这个帖子,但是没有细读该仓库的代码,刚好前阵子有人向我推荐它,我就去试了下这个仓库优化到最后一步的代码 4_optimize_gobwas 我做了个"粘包"测试,这个帖子的优化代码应该是有问题的:这个帖子和仓库的优化方式,只是把连接的 FD events 添加到了 epoll,但是并没有设置 FD 为 Non-Blocking mod,然后等到 epoll 监听可读时再读,虽然避免了每个连接一个协程,但是由于单个 FD 的阻塞,如果这个 FD 上有某个或者某些 Websocket 完整消息的数据不是一次性全部到达,这个 FD 的 websocket 读整个消息将被阻塞,从而导致这个 epoll 上的其他 FD 也要等它读到完整包。 这个"粘包"测试的详细代码在这里,有兴趣的小伙伴可以去试下: server client

    NBIO-HTTP-Websocket 是真正的异步非阻塞,所以能像其他语言的异步库那样实现单机高并发,可以避免每个连接创建一个协程,代码示例请参考: nbio-websocket-examples nbio-websocket-1m-connections-examples

    HTTPS 支持

    由于更早些时候魔改了下标准库的 TLS 已经跟 NBIO 打通,所以也就封装了下支持 HTTPS Server,用法:

    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
    if err != nil {
        log.Fatalf("tls.X509KeyPair failed: %v", err)
    }
    tlsConfig := &tls.Config{
        Certificates:       []tls.Certificate{cert},
        InsecureSkipVerify: true,
    }
    tlsConfig.BuildNameToCertificate()
    
    mux := &http.ServeMux{}
    mux.HandleFunc("/echo", onEcho)
    
    svr := nbhttp.NewServerTLS(nbhttp.Config{
        Network: "tcp",
        Addrs:   []string{"localhost:8080"},
    }, mux, nil, nil, tlsConfig)
    
    err = svr.Start()
    if err != nil {
        fmt.Printf("nbio.Start failed: %v\n", err)
        return
    }
    defer svr.Stop()
    

    完整代码请参考: https-server

    欢迎有兴趣的小伙伴关注、进行更多测试,以及 issue 、pr 、star,^_^

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3518 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:33 · PVG 18:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.