go-netty

高性能网络库
授权协议 Apache
开发语言 Google Go
所属分类 程序开发、 高性能网络开发库
软件类型 开源软件
地区 国产
投 递 者 支嘉祥
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

Feature (特性)

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

Documentation (文档)

GoDoc

Examples (示例)

使用

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

var bootstrap = netty.NewBootstrap()

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

bootstrap.ChildInitializer(func(channel netty.Channel) {
    channel.Pipeline().
        // 按照自定义协议解码帧(2字节的长度字段)
        AddLast(frame.LengthFieldCodec(binary.LittleEndian, 1024, 0, 2, 0, 0)).
        // 消息内容为文本格式(可自定义为 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 EchoHandlerstruct {
    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)
}
  • Exchange Transport 层用到的netty 消费者使用 NettyClient,提供者使用 NettyServer,Provider 启动的时候,会开启端口监听,使用我们平时启动 Netty 一样的方式。而 Client 在 Spring getBean 的时候,会创建 Client,当调用远程方法的时候,将数据通过 dubbo 协议编码发送到 NettyServer,然后 Nett

  •         我们都说 Netty 是一款基于异步事件驱动来设计和实现的高性能IO框架,它之所以高性能,重要的原因之一是其线程模型的设计,Netty 的线程模型是基于 Reactor 设计模式的,它主要包含两个线程池:一个是 Boss 线程池,另一个是 Worker 线程池。Boss 线程池主要负责接受客户端连接请求,并将连接请求注册到 Worker 线程池中的某个线程的 Selector 上。

  • Active NettyServerHandler -> AbstractServer -> AbstractPeer -> AbstractChannelHandlerDelegate -> HeartbeatHandler -> AllChannelHandler -> ChannelEventRunnable -> HeaderExchangeHandler -> DubboProtocol

  • Netty模型-taskQueue自定义任务 任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 package com.jl.java.web.nettyserver; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerCon

  • 代码 package main import (     "encoding/json"     "fmt"     "net/http"     "sync" ) var dirEngineChan sync.Map func main() {     dHandler := dagHandler{}     http.Handle("/v1/dagScan", dHandler)     cH

  • 客户端也就4步,上代码   public void client() throws Exception { //1.创建管道和管理 EventLoopGroup workerGroup =new NioEventLoopGroup(1); Bootstrap b=new Bootstrap(); b.group(workerGro

 相关资料
  • 问题内容: 我正在选择一个网络库来实现不能花费任何微秒时间的客户端/服务器系统。它将实现自己的协议来发送和接收消息。我正在寻找一个好的NIO框架,该框架将使我能够轻松开发服务器和客户端,而不必过多担心低层选择器的细节。每个人都向我推荐Netty,但在向团队提出框架之前,我想尝试2或3个其他选择。我不太喜欢Netty的一件事是它如何使用自己的ByteBuf实现和引用计数来处理ByteBuffer。谁

  • 我正在研究一个基于代理的流行病模型。这个想法是单个代理根据他们在网络中观察到的情况(基于距离)做出决定。我在每个代理中都有几个功能,可以动态更新受感染接触者的数量,接触者表现出特定行为等。 下面的代码用于计算代理网络中受感染的联系人。 至少还有3个这样的函数可以保持表示代理网络中其他功能的其他代理的计数。现在,当我 有没有一种计算效率更高的方法来跟踪更大人口的网络统计数据?

  • 一本关于如何使用 Google 的 Go 语言编写网络应用的电子书,你若不知道你想构建什么,就无法构建一个系统。而如果你不知道它会在何种环境下工作,也同样不行。

  • 我正在写一份棘手的申请书。该应用程序运行在64位八核linux机器上 Netty应用程序是一个简单的路由器,它接受请求(传入管道),从请求中读取一些元数据,并将数据转发给远程服务(传出管道)。 此远程服务将向传出管道返回一个或多个响应。Netty应用程序将把响应路由回发起客户端(传入管道) 会有成千上万的客户。将会有成千上万的远程服务。 我正在做一些小规模的测试(十个客户端,十个远程服务),但我没

  • 我有Spring Cloud Gateway(Greenwich)与Netty一起运行。此应用程序接收请求,然后根据路由配置向下游应用程序发送请求。 随机很少的请求会花费很多时间(>70秒)。即使下游服务器在5秒内做出了响应,但Netty线程(reactor-http-epoll-*)并没有接收到响应。我启用了调试日志来查看那些线程正在做什么。从初步分析来看,这些线程似乎正在处理其他东西,并且始终

  • 主要内容:前言,Netty客户端与服务端交互流程,1. 写一个NettyServer,2. 写一个NettyClient,     ChannelHandler ,3.  用NettyClient测试NettyServer,4. 整合netty,5.  failed to create a child event loop 报错问题前言            上篇文章写到了利用zookeeper的特性实现缓存服务地址列表,接下来我们可以借助Netty的优点对程序进行改造,使其即支持Http容器的