首页 > 其他分享 >GO语言开发高性能网络通信服务

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

时间:2022-10-04 10:38:33浏览次数:48  
标签:网络通信 netty err 实现 fastnet 高性能 OnData GO


 

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进行简单的通讯测试

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

使用Jmeter多次加压测试

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

GO语言开发高性能网络通信服务_封装_04

 更高级的使用

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

标签:网络通信,netty,err,实现,fastnet,高性能,OnData,GO
From: https://blog.51cto.com/u_9748604/5731039

相关文章

  • 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin
    原文链接我是一名五六年经验的前端程序员,现在准备学习一下Golang的后端框架gin。以下是我的学习实战经验,记录下来,供大家参考。https://github.com/gin-gonic/gin1.......
  • go for range 遍历
    forrange中会为i,v申请各申请一块内存地址存储临时变量,遍历的时候后面的值会覆盖前面的例子:packagemainimport("fmt")funcmain(){m:=make(ma......
  • 配置Django实现数据库读写分离
    配置Django实现数据库读写分离django在进行数据库操作的时候,读取数据与写数据(增、删、改)可以分别从不同的数据库进行操作。1.在配置文件中增加slave数据库的配置DATABA......
  • Django中六个常用的自定义装饰器
    Django中六个常用的自定义装饰器 目录装饰器作用Django装饰器GroupRequiredAnonymousrequiredSuperuserrequiredAjaxrequiredTimeit自定义功能......
  • 常见问题汇总 --- Google Chrome浏览器翻译失败
    打开C:\Windows\System32\drivers\etc·目录下的hosts文件。添加下面两行203.208.40.66translate.google.com203.208.40.66translate.googleapis.com使用win+R键运行......
  • Django 出现 frame because it set X-Frame-Options to deny 错误
    一、背景使用django3进行开发时,由于项目前端页面使用iframe框架,浏览器错误提示信息如下Refusedtodisplay'http://127.0.0.1:8000/'inaframebecauseitset'X-F......
  • 【Golang】go语言中如何控制goroutine的数量
    一、现状在Go语言中,goroutine的创建成本很低,调度效率高,Go语言在设计时就是按以数万个goroutine为规范进行设计的,数十万个并不意外,但是goroutine在内存占用方面确实具有有......
  • Django3.2前后端分离(配置)
    创建工程项目1.初始化项目步骤一:安装Django框架,安装前应确保Django的版本为LTS版,关于版本的描述见Django版本文档pipinstalldjango==3.2步骤二:创建django项目,通过d......
  • GOPATH的配置(WIN)
    配置GOPATH环境变量project文件夹在project文件夹新建3个文件夹src存放go语言源码pkg存放编译好的包对象文件bin存放链接好的可执行文件新建项目在src文件夹......
  • Django 框架
    目录​​Django框架​​​​django-restframework框架​​ Django框架 ​​Django框架简介​​​​Django简介以及安装​​​​Django如何自定义漂亮的404页面​​​​Dja......