轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子。
昨天的文章,介绍了boot4go-fastnet的实现的初衷,是给自己的物联网中间件产品作为网络通信底层的支持框架,并且还对比了epoll和其他网络库的性能对比,在简单的实现方式情况下,还能支持到不错的网络性能。 今天就来看看一个最简单的网络通信的例子。
作为性能测试的例子是EchoServer,这个Echoserver里没有太多的处理逻辑,一般都拿来作为网络框架的性能测试。 我们就一起来看看用fastnet需要多少行代码就能实现这个功能了。通过这个例子我们也来介绍一下fastnet的一些不同于其他网络库的特性
第一步 引入包
import (
"github.com/gohutool/boot4go-fastnet"
"net"
)
第二步,初始化Listener
l, err := net.Listen("tcp", ":9888")
if err != nil {
fmt.Println("Start server error " + err.Error())
return
}
初始化了9888的端口进行tcp的监听
第三步, 构造server
s := NewServer(WithMaxIdleWorkerDuration(10 * time.Second))
构造server的options可以查看项目, 这里的option指定了后台的空闲协程的清理时长,10秒内没有任何调用的协程会被回收
第四步,给server注册事件
OnClose := OnClose(func(ctx *RequestCtx, err error) {
if err != nil {
fmt.Printf("%v\n", err)
}
})
handler := OnData(func(ctx *RequestCtx, nread int) error {
nread = len(ctx.Bytebuffer.Bytes())
if nread > 0 {
n, _ := ctx.Bytebuffer.Compact(ctx.c, 0)
}
return nil
})
s.OnData = handler
s.OnClose = OnClose
server提供消息的回调机制,支持OnConnect,OnError, OnClose, OnData分别对应着客户端连接成功, 通讯出错,通讯关闭,和收到通讯数据时的回调。
最后一步,启动服务
err = s.Serve(l)
if err != nil {
panic(err)
}
以上代码,就完成了EchoServer的实现。 昨天文章里进行性能测试的通讯服务就是这个服务。
看看效果
使用tcpdebug进行简单的通讯测试
使用Jmeter多次加压测试
更高级的使用
在fastnet的通讯框架中,封装了协程池,读写buffer的缓冲池,池的维护,和读取数据通信的功能都在底层进行了封装,对于一个TCP应用的开发,更多的关注在自己的协议解析和相应的协议业务功能上,在OnData的回调里进行实现就可以了,完全不需要任何对网络通信的额外代码,只要有数据通信发生过来就会回调到OnData方法。OnData回调的参数是requestContext和获取到的数据字节。 在OnData负责解析即可
在使用java的netty的时候,里面的pipeline以及channel的Handle机制非常的好用,所以在fastnet里对常用的codec进行封装,用过netty里的,就知道这里常见的几个:
DelimiterBasedFrameDecoder LineBasedFrameEncoder FixedLengthFrameDecoder FixLengthFieldFrameDecoder LengthFieldBasedFrameDecoder
最后的这个LengthFieldBasedFrameDecoder是完全对等netty里的功能实现的,不过在性能和代码量上比netty里的实现更优化,代码量更少,有兴趣的可以看看源码。
以上的Decoder都是使用go的泛型的方式实现的,希望学习golang的泛型的也可以研究一下。
在这里都是封装成了易用的编码解码器的方式,并没有类同netty的以channel的方式进行调用, 这里的考虑主要是基于性能上的考虑,封装成channel以AddFirst和AddLast的方式进行调用,在调用上更方便,但是其实一般的业务上,不会有太长的channel,而且,channel的方式调用会有一些反射的动作, 所以在这块没有过度的去进行实现,一切以简化为主,专注于性能。
尾声
这个项目还会类似netty的实现一样,看是否能加入一些心跳处理的工具包,这样在使用的过程中,几行代码就实现非业务功能的星跳检查。