GO语言开发高性能网络通信服务

 

前言

轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子。

昨天的文章,介绍了boot4go-fastnet的实现的初衷,是给自己的物联网中间件产品作为网络通信底层的支持框架,并且还对比了epoll和其他网络库的性能对比,在简单的实现方式情况下,还能支持到不错的网络性能。 今天就来看看一个最简单的网络通信的例子。

作为性能测试的例子是EchoServer,这个Echoserver里没有太多的处理逻辑,一般都拿来作为网络框架的性能测试。 我们就一起来看看用fastnet需要多少行代码就能实现这个功能了。通过这个例子我们也来介绍一下fastnet的一些不同于其他网络库的特性

Let's GO

第一步 引入包

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的实现一样,看是否能加入一些心跳处理的工具包,这样在使用的过程中,几行代码就实现非业务功能的星跳检查。

猜你喜欢

转载自blog.csdn.net/inthirties/article/details/126919555