V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
limpo
V2EX  ›  Go 编程语言

发布一款高性能网络框架 go-netty

  •  
  •   limpo ·
    limpo1989 · 2019-12-13 14:57:07 +08:00 · 4109 次点击
    这是一个创建于 1567 天前的主题,其中的信息可能已经有所发展或是发生改变。

    GO-NETTY

    GoDoc license-Apache 2 Go Report Card Build Status Coverage Status

    Introduction (介绍)

    go-netty 大量参考了 netty 的设计并融合 Golang 本身的协程特性而开发的一款高性能网络库

    Feature (特性)

    • 可扩展多种传输协议,并且默认实现了 TCP, KCP, Websocket
    • 可扩展多种解码器,默认实现了常见的编解码器
    • 基于责任链模型的流程控制
    • 核心库零依赖

    Documentation (文档)

    GoDoc

    Examples (示例)

    Usage (使用)

    创建 bootstrap, 用于提供服务或者对外建立连接

    var bootstrap = netty.NewBootstrap()
    

    配置服务连接的处理器 (同样还有一个 ClientInitializer 对应客户端连接处理器配置)

    bootstrap.ChildInitializer(func(channel netty.Channel) {
        channel.Pipeline().
            // 按照自定义协议解码帧( 2 字节的长度字段)
            AddLast(frame.LengthFieldCodec(binary.LittleEndian, 1024, 0, 2, 0, 2)).
            // 消息内容为文本格式(可自定义为 json,protobuf 等编解码器)
            AddLast(format.TextCodec()).
            // 处理消息
            AddLast(EchoHandler{"Server"})
    })
    

    配置服务器(客户端)所使用的传输协议

    bootstrap.Transport(tcp.New())
    

    开始监听端口并开始提供服务,直到收到指定信号后退出

    bootstrap.Listen("tcp://0.0.0.0:6565").RunForever(os.Kill, os.Interrupt)
    

    LogHandler 处理器

    type EchoHandler struct {
        role string
    }
    
    func (l EchoHandler) HandleActive(ctx netty.ActiveContext) {
        fmt.Println(l.role, "->", "active:", ctx.Channel().RemoteAddr())
    
        // 给对端发送一条消息,将进入如下流程(视编解码配置)
        // Text -> TextCodec -> LengthFieldCodec   -> Channel.Write
        // 文本     文本编码      组装协议格式(长度字段)     网络发送
        ctx.Write("Hello I'm " + l.role)
    
        // 向后续的 handler 传递控制权
        // 如果是最后一个 handler 或者需要中断请求可以不用调用
        ctx.HandleActive()
    }
    
    func (l EchoHandler) HandleRead(ctx netty.InboundContext, message netty.Message) {
        fmt.Println(l.role, "->", "handle read:", message)
    
        // 向后续的 handler 传递控制权
        // 如果是最后一个 handler 或者需要中断请求可以不用调用
        ctx.HandleRead(message)
    }
    
    func (l EchoHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) {
        fmt.Println(l.role, "->", "inactive:", ctx.Channel().RemoteAddr(), ex)
    
        // 向后续的 handler 传递控制权
        // 如果是最后一个 handler 或者需要中断请求可以不用调用
        ctx.HandleInactive(ex)
    }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3221 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:39 · PVG 19:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.