发布一个Go语言的长连接网络库

Go by 达达 at 2014-08-06

说起来这不是第一次发布长连接网络库了,去年就整过一个开源,但是后来项目需要,往里面加了一堆很针对性的优化,觉得自己的设计不够完善,跟项目实现耦合得太紧,就把那个项目干掉了。

但是一直有一个残念在那里,最近又把项目里用的网络库整理了便并开源出来了,包名叫link(彩蛋:林克,玩过塞尔达吗?),项目地址:https://github.com/funny/link

简单来讲,link包是一个用于长连接型应用的简易框架。说它是简易框架是因为它的功能很少,相应的它的约束性很低,代码量也很少,容易掌握,容易按需扩展。

之所以只做简易框架是吸取第一次失败经验,保持整个包尽量只做一件事情,之前的包就是管太多了,还给提供了一个套网关,然后那个网关为了达到高效率就做了各种恶心的优化,最后就没办法见人了。

另外我每次看到有什么开源项目代码很多的,感觉自己没办法完全驾驭的,我就宁可不用。换位思考一下,如果我是使用者,我怎么敢用一个小作坊做的,里面有一大堆不知道干什么的代码的东西来跑我最核心的业务,要是出BUG也就算了,万一BUG无从查起,岂不是整个人都要要斯巴达了。

所以,link包不高级,很简单,保证懂Go的人都能读懂代码并完全驾驭,要做二次开发也是非常容易的,但是在它职能范围内的事情,一定负责做好。

目前,link包所提供的功能如下:

  • 长连接的会话管理
  • 基于频道概念的广播机制和会话分组机制
  • 默认提供类似Erlang的{packet, N}那样的分包协议,并可以自定义分包协议实现
  • 提供一些实现通讯层的常用工具类型(不强制使用),比如Buffer类型可以用于协议封包和解包

link包的核心类型有四个:

  • PacketProtocol - 分包协议接口,它用要求分包协议需要实现哪些方法,从而做到可以自定义实现分包协议。
  • Server - 顾名思义就是服务器,它用来接收连接并把连接以Session的形式传递给应用。
  • Session - 即会话,它将原始的连接包装起来,对应用提供异步消息发送和基于消息包的请求处理等接口。
  • Channel - 频道,应用可以用频道对会话进行归类以及发送广播,频道的广播发送是经过优化的,可以避免消息的重复封包

link包对通讯的约束只到分包协议这一层,具体每个消息包的内容用什么格式是不约束的,你可以用link包结合gob或者json,也可以用自带的Buffer类型做一套消息封包和解包协议。

现在项目里还没有特别完整的大示例,只有几个小的演示程序在examples目录下,先勉强着看一下,如果有某块需求不知道怎么实现,可以提交issue,也欢迎大家做各种demo分享。