一款易用高效的tcp框架
https://github.com/fwhezfwhez/tcpx
1. 简述
golang 原生库提供对tcp支持,但使用者需要自定义协议,自主拆包解包,不同开发者对tcp的架构五花八门,群魔乱舞。tcpx是一款轻便简约的tcp框架,自备协议并支持传统的json,xml,toml,yaml,protobuf序列方式,也支持自定义序列方式。使用tcpx后,无需考虑自主拆包解包,也无粘包问题,对tcp的使用方式,也有了一定意义上的统一,利于团队开发。
2. 协议概述
tcpx协议块分为
块名 | 类型 | 含义 | 序列方式 | 大小 |
Len | int32 | 块长 | 大端拼接 | [4]byte |
MessageID | int32 | 块标识 | 大端拼接 | [4]byte |
HeaderLen | int32 | 头部长 | 大端拼接 | [4]byte |
BodyLen | int32 | 消息长 | 大端拼接 | [4]byte |
Header | map[string]interface{} | 头部内容 | json | []byte |
Body | interface{} | 消息内容 | 自定义序列化(json,xml,toml,yaml,protobuf,其它自定义) | []byte |
3. tcpx 特性
3.1 无需拆/组包
原生tcp库的net.Conn
对收发的消息内容是源源不断的,并且只保证消息的先后顺序,比如一方发送两则消息[0 11 13 99 123] 与[2 12 23 43 99 23]时,另一方只保证收到[0 11 13 99 123 2 12 23 43 99 23],接收方需要按照协议体,将其拆分成两段有效的消息内容。
因为tcpx是严格按照协议头记录的Len
长度拆组包,拆包时精准且不会出现粘包情况。
3.2 自带messageID路由与强大的中间件套餐
tcpx 的协议设计里存在messageID,便是用来对消息处理逻辑的划分的。使用者无需按照传统(当然也不反对)的方式,对tcp服务方收到的消息进行类似如下操作:
tcpx自带messageID路由功能,使用时可以直接这样操作:
基于路由功能时,可以使用强大的中间件套餐
中间件添加方式有以下三种方式:
srv.Use("middleware1", Middleware1)
srv.UseGlobal(Middleware1)
srv.AddHandler(2, Middleware1,service2)
传统的写法并未摒弃:
3.3协议跨语言
了解了协议内容后,不同的语言构建客户端时有两种方式,一种是手动构建(#2)描述的tcpx协议块,另一种是通过http网关构建协议块。
前者不多描述,后者的链接: https://github.com/fwhezfwhez/tcpx/tree/master/gateway/pack-transfer
网关程序为go编写,支持跨平台,可在mac,linux,windows不同位上完美运行。
网关程序本地运行后,生成协议块时,只需要http调用:
4. 实例
https://github.com/fwhezfwhez/tcpx/tree/master/examples/sayHello