page contents

Golang tcp framework(Golang tcp框架)

一款易用高效的tcp框架 1. 简述 Golang 原生库提供对tcp支持,但使用者需要自定义协议,自主拆包解包,不同开发者对tcp的架构五花八门,群魔乱舞。tcpx是一款轻便简约的tcp框架,自备协议并...

attachments-2021-07-5X5IkJqr60de7988a413f.png

一款易用高效的tcp框架

1. 简述

Golang 原生库提供对tcp支持,但使用者需要自定义协议,自主拆包解包,不同开发者对tcp的架构五花八门,群魔乱舞。tcpx是一款轻便简约的tcp框架,自备协议并支持传统的json,xml,toml,yaml,protobuf序列方式,也支持自定义序列方式。使用tcpx后,无需考虑自主拆包解包,也无粘包问题,对tcp的使用方式,也有了一定意义上的统一,利于团队开发。

2. 协议概述

tcpx协议块分为

attachments-2021-07-FJvZkefF60de79c91d0c4.png

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服务方收到的消息进行类似如下操作:

switch messageID {
    case 1 : 
        service1()
    case 2 :
        service2()
    ...
}

tcpx自带messageID路由功能,使用时可以直接这样操作:

func main(){
    srv := tcpx.NewTcpX(tcpx.JsonMarshaller{})
   srv.AddHandler(1, service1)
 srv.AddHandler(2, service2)
 srv.ListenAndServe("tcp", ":7171");
}

基于路由功能时,可以使用强大的中间件套餐

func main(){
    srv := tcpx.NewTcpX(tcpx.JsonMarshaller{})
    srv.Use("middleware1", Middleware1)
   srv.AddHandler(1, service1)
 srv.AddHandler(2, service2)
 srv.ListenAndServe("tcp", ":7171")
}
func Middleware1(c *tcpx.Context) {
fmt.Println("I am middleware 1 exampled by 'srv.Use(\"middleware1\", Middleware1)'")
}

中间件添加方式有以下三种方式:

  1. srv.Use("middleware1", Middleware1)
  2. srv.UseGlobal(Middleware1)
  3. srv.AddHandler(2, Middleware1,service2)

传统的写法并未摒弃:

func main(){
srv := tcpx.NewTcpX(tcpx.JsonMarshaller{})
srv.OnMessage = OnMessage
srv.ListenAndServe("tcp", ":7171")
}
func OnMessage(c *tcpx.Context) {
type ServiceA struct {
Username string `json:"username"`
}
type ServiceB struct {
ServiceName string `json:"service_name"`
}
messageID, e := packx.MessageIDOf(c.Stream)
if e != nil {
fmt.Println(errorx.Wrap(e).Error())
return
}
switch messageID {
case 7:
var serviceA ServiceA
// block, e := packx.Unpack(c.Stream, &serviceA)
block, e := c.Bind(&servcieA)
fmt.Println(block, e)
c.Reply(8, "success")
case 9:
var serviceB ServiceB
// block, e := packx.Unpack(c.Stream, &serviceB)
    block, e := c.Bind(&servcieB)
fmt.Println(block, e)
c.JSON(10, "success")
}
}

3.3协议跨语言

了解了协议内容后,不同的语言构建客户端时有两种方式,一种是手动构建(#2)描述的tcpx协议块,另一种是通过http网关构建协议块。

网关程序为Go编写,支持跨平台,可在mac,linux,windows不同位上完美运行。

网关程序本地运行后,生成协议块时,只需要http调用:

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-hj3AHeBI62ad2f15859cb.jpeg


  • 发表于 2021-07-02 10:32
  • 阅读 ( 1273 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章