您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

Fastnet,三步完成高性能的网络开发

时间:2022-09-05 14:05:43  来源:今日头条  作者:程序员紫龙

前言

 

Go语言里,由于其天生的支持多并发,而且非常完善的实现了比线程更轻量级的协程的支持,使得GO一直在多并发的服务端组件的开发中占有较大的优势;特别是在云原生的大势来袭下;更多的搭建在云原生框架下的底层服务都是用了GO语言进行开发;服务端的底层开发就缺少不了网络通信的开发;今天咱们这个文章要给大家介绍的就是一款GO语言实现的,能非常方便就能实现高性能网络通信的开发包工具——Fas.NET

 

Fastnet

 

Fastnet的项目的Github地址

 

http://github.com/gohutool/boot4go-fastnet

 

 

Fastnet项目的创造思想来源于在GO语言里另一个以高并发,高性能著称的项目Fasthttp;Fasthttp实现比原生GO语言提供的http包要高至少10倍性能以上的http通信服务能力,被誉为当下最快的http GO语言包;有兴趣的朋友,可以查看笔者的另一篇文章《爱上开源之boot4go-gateway和Nginx的性能测试大PK》;该文章介绍了使用fasthttp开发的一款Gateway产品,和使用Nginx作为Gateway进行性能测试的过程和PK结果;

 

Fastnet采用fasthttp提供高性能http服务的实现思路,通过协程池,缓存池,对象池等实现技巧,将GO语言在多并发,高性能的优势更近一步的进行了提升和优化,从而实现了TCP/IP网络通信的高性能实现;Fastnet也作为了笔者另一个MQTT中间件产品的网络底层通讯的支持架构

 

使用Fastnet

 

引入

 

Fastnet只支持GO语言;首先引入fastnet包

 

import (

"github.com/gohutool/boot4go-fastnet"

)

 

初始化Listener

 

作为网络通信;和http以及其他net包一样;服务端的编程都是从Listener开始; 在Listener初始化指定端口,

 

l, err := net.Listen("tcp", ":9888")
	if err != nil {
		fmt.Println("Start server error " + err.Error())
		return
	}

如上段代码所示, 初始化了一个服务端的Listener,端口指定为9888,Listener监听9888端口进行TCP/IP方式的通信;

 

实现监听业务的Server

 

Server是具体处理监听的端口的连接的对象,在监听建立成功以后,创建一个Server对象,该Server对象服务于Listener对象,当Listener对象Accept到客户端的连接以后,Server会处理该连接

 

创建Server

 

var s Server
s = NewServer(WithMaxIdleWorkerDuration(10 * time.Second),
		WithMaxPackageFrameSize(1024*10)))

上段代码,首先定义一个Server对象s; 然后通过fastnet提供的API,NewServer创建出一个Server对象,WithMaxIdleWorkerDuration是一个ServerOption对象,用来进行Server创建时的一些参数指定; 例如这里的WithMaxIdleWorkerDuration就是指定协程池的IDLE选项,10 * time.Second后如何协程没有任何处理内容,该协程将被协程池进行回收;还有更多的Options选项,可以查看github里的API文档

 

事件监听

 

fastnet通过事件的方式,将具体的处理逻辑交还给程序的开发者, fastnet封装了Accept, Read, Write,协议解析,协议封装等过程,作为开发者不需要关注这些过程,作为开发者,只需要关注在自己的具体业务上,比如解析出来的协议包具体应该去做怎样的业务处理, fastnet就是通过事件的方式,将通信中的过程封装到了内部,然后通过事件的方式,去触发具体的业务实现;

 

	
decoder, _ := codec.VariableLengthFieldFrameDecoder(
		1024*1024, 2, 0, func(variableLength uint64) uint64 {
			return 2 + variableLength
		})

onClose := OnClose(func(ctx *RequestCtx, err error) {
		if err != nil {
			fmt.Printf("%vn", err)
		}
	})
	onData := OnData(func(ctx *RequestCtx, b []byte) error {
		ctx.Write(b)
		// ctx.WriteToChannel(b)
		return nil
	})


s.ByteBufferDecoder = decoder
    	s.OnData = onData
	s.OnClose = onClose

 

上述代码是一个标准的指定业务处理的Sample代码;

在代码中指定了decoder是一个变长数据帧的协议包解析器,用来进行协议帧的解析,

接着定义了onClose的事件函数监听Close事件;

定义了onData的事件函数监听数据包的解析成功的Data事件,

然后指定给server对象,通过上面的处理,fastnet就可以知道协议的通信帧的协议格式,通过协议格式解析到一个协议包以后,就会触发onData事件,交给业务定义的onData函数进行处理;让建立的连接关闭以后,将触发OnClose事件,交个业务逻辑来处理;

 

在fastnet里内置了场景的几种协议帧的解析器

 

DelimiterBasedFrameDecoder

LineBasedFrameEncoder

FixedLengthFrameDecoder

FixLengthFieldFrameDecoder

LengthFieldBasedFrameDecoder

 

也可以通过fastnet提供的ByteBufferDecoder的扩展机制,自己来进行协议栈的扩展

 

启动服务

 

完成Server对象的初始化和设置以后,就可以启动Server对象,来完成服务端的启动了;

 

	err = s.Serve(l)

	if err != nil {
		panic(err)
	}

 

最后来看看效果

 

在fastnet的项目中,自带了一个EchoServer的实现,实现了echo服务,通过echo服务我们可以进行fastnet的性能测试,可以完全纯净的看看TCP/IP通信的性能测试;

 

使用tcpdebug进行简单的通讯测试

 

使用Jmeter压力测试


 

结束语

 

本文介绍了GO语言开发的一款提供实现高性能TCP/IP网络编程的开发包fastnet; 文中简要地介绍了fastnet的基础用法,fastnet已经在笔者开发的mqtt的中间件产品里作为底层通讯架构的实现; fastnet不仅实现了高性能的TCP/IP通讯的开发架构,也在开发架构中提供了一些扩展的机制,包括协议栈的扩展,消息机制的扩展;更多的信息可以在github项目里查看。

 

原创不易,开源更不易;请支持原创;点赞加关注。



Tags:网络开发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Fastnet,三步完成高性能的网络开发
前言 在GO语言里,由于其天生的支持多并发,而且非常完善的实现了比线程更轻量级的协程的支持,使得GO一直在多并发的服务端组件的开发中占有较大的优势;特别是在云原生的大势来袭...【详细内容】
2022-09-05  Search: 网络开发  点击:(602)  评论:(0)  加入收藏
开源内网穿透工具,支持https,网络开发好助手
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。可以用它进行小程序开发。 将 f...【详细内容】
2020-08-01  Search: 网络开发  点击:(822)  评论:(0)  加入收藏
网络开发者必备的 9 大实用浏览器插件
作为 Web 开发者,网页浏览器可以说是吃饭的工具啦。如今,现代的浏览器都带有丰富的扩展插件,我们可以充分利用它们,让工作环境更加便捷,提高工作效率,简化工作流程。今天,我们就从...【详细内容】
2019-09-03  Search: 网络开发  点击:(707)  评论:(0)  加入收藏
▌简易百科推荐
手机就可以修改WiFi密码,进行网络提速,还能防止别人蹭网
随着网络的普及和使用频率的增加,很多人可能遇到了一些网络管理上的问题,比如忘记了WiFi密码、网络速度缓慢、或者发现有不明设备在家中蹭网。相信朋友们也曾遇到过吧?但是,你知...【详细内容】
2024-04-03  老毛桃    Tags:WiFi密码   点击:(7)  评论:(0)  加入收藏
手机WiFi信号满格却接收消息延迟?这里有妙招帮你解决!
在现代社会,手机已经成为了我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,手机都扮演着重要的角色。然而,有时我们会遇到一些令人烦恼的问题,比如明明手机WiFi信号满格...【详细内容】
2024-04-03  蔡前进    Tags:手机WiFi   点击:(6)  评论:(0)  加入收藏
SASE技术应用落地的五个关键趋势
在Gartner 最新发布的《2023网络技术成熟度曲线》报告中认为,SASE技术已经开始走出最初的技术炒作期,将逐步迈向新一轮的实用落地阶段。在Gartner发布的《Hype Cycle for Ente...【详细内容】
2024-04-01    安全牛  Tags:SASE   点击:(10)  评论:(0)  加入收藏
提示“该网站安全证书存在问题,连接可能不安全”如何解决
在你输入网址并浏览网页时,如果你的浏览器弹出一个警告,提示“网站的安全证书存在问题”,或是显示一个红色的锁标志,这些都是网站不安全的警示。这些提示通常是由HTTPS协议中的S...【详细内容】
2024-03-18  倏然间    Tags:网站安全证书   点击:(9)  评论:(0)  加入收藏
如何有效排除CAN总线错误
控制器局域网(CAN)控制器局域网(CAN)是现代车辆中电子元件无缝运行的基础。在远程信息处理领域,CAN总线系统的效率至关重要,其能够实现支撑当今汽车技术的复杂功能。然而,CAN总...【详细内容】
2024-02-20    千家网  Tags:CAN   点击:(48)  评论:(0)  加入收藏
网络连接受限或无连接怎么办?这里提供几个修复办法
可能错误提示 连接受限或无连接:连接具有有限的连接或无连接。你可能无法访问Internet或某些网络资源。 连接受限。排除和解决“连接受限或无连接”错误此错误可能由计算机上...【详细内容】
2024-02-06  驾驭信息纵横科技    Tags:网络连接受限   点击:(43)  评论:(0)  加入收藏
如何将Mac连接到以太网?这里有详细步骤
在Wi-Fi成为最流行、最简单的互联网连接方式之前,每台Mac和电脑都使用以太网电缆连接。这是Mac可用端口的标准功能。如何将Mac连接到以太网如果你的Mac有以太网端口,则需要以...【详细内容】
2024-02-03  驾驭信息纵横科技    Tags:Mac   点击:(66)  评论:(0)  加入收藏
简易百科之什么是端口映射
端口映射,也称为端口转发,是一种网络通信中的技术手段,通过将内网中的一个端口上的数据流量转发到另一个端口,使得外部网络能够访问到内部网络中的特定服务。在实现上,端口映射通...【详细内容】
2024-01-26    简易百科  Tags:端口映射   点击:(156)  评论:(0)  加入收藏
ip因频繁登陆已被禁止访问 无法显示图片 怎么办
首先,我们要明白,部分网站为了有效遏制数据爬取和非法攻击,保证访问速度和普通用户查询,会在系统中增加网络安全设备,加强安全防护机制,并提前设置安全访问规则。因此,一旦用户的行...【详细内容】
2024-01-20  何福意思    Tags:ip   点击:(63)  评论:(0)  加入收藏
电脑连上wifi却上不了网怎么办
当电脑连接上 WiFi 却无法上网时,可能会让人感到困惑和沮丧。这个问题通常会有多种可能的原因,包括网络配置问题、路由器故障、无线适配器问题等。在面对这个问题时,可以尝试以...【详细内容】
2024-01-16  编程资料站    Tags:wifi   点击:(69)  评论:(0)  加入收藏
站内最新
站内热门
站内头条