发布于 2017-11-15 15:22:35 | 120 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

Teleport Golang高并发SocketAPI框架

Teleport是一款适用于分布式系统的高并发API框架,它采用socket全双工通信,实现S/C对等工作,支持长、短两种连接模式,支持断开后自动连接与手动断开连接,支持身份验证,内部数据传输格式为JSON。


Teleport v2.5(简称tp v2.5)今日发布啦!它是一个通用、高效、灵活的TCP Socket框架。可用于Peer-Peer对等通信、RPC、长连接网关、微服务、推送服务,游戏服务等领域。这次升级新增了自定义通信协议、包大小限制等一些新特性,并作了一系列深度优化。

tp v2.5 特性变化:

  • 【新增】支持设置读取包的大小限制(如果超出则断开连接)

  • 【新增】支持定制通信协议

  • 【升级】支持插件机制,可以自定义认证、心跳、微服务注册中心、统计信息插件等

  • 【优化】无论服务器或客户端,均支持优雅重启、优雅关闭

  • 支持实现反向代理功能

  • 【优化】日志信息详尽,支持打印输入、输出消息的详细信息(状态码、消息头、消息体)

  • 服务器和客户端之间对等通信,两者API方法基本一致

  • 底层通信数据包包含Header和Body两部分

  • 支持单独定制Header和Body编码类型,例如JSON Protobuf string

  • Body支持gzip压缩

  • Header包含状态码及其描述文本

  • 支持推、拉、回复等通信模式

  • 支持设置慢操作报警阈值

  • 底层连接使用I/O缓冲区

  • 端点间通信使用I/O多路复用技术

teleport


tp v2.5 升级详情:

一、增加对自定义通信协议的支持,通过实现socket.Protocol接口来定制:

// Protocol socket communication protocol type Protocol interface { // WritePacket writes header and body to the connection. WritePacket(          packet *Packet,          destWriter *utils.BufioWriter,          tmpCodecWriterGetter func(string) (*TmpCodecWriter, error), isActiveClosed func() bool,      ) error // ReadPacket reads header and body from the connection. ReadPacket(          packet *Packet,          bodyAdapter func() interface{},          srcReader *utils.BufioReader,          codecReaderGetter func(byte) (*CodecReader, error), isActiveClosed func() bool, checkReadLimit func(int64) error,      ) error }

然后,可以通过以下任意方法指定自己的通信协议:

func SetDefaultProtocol(socket.Protocol) func (*Peer) ServeConn(conn net.Conn, protocol ...socket.Protocol) Session func (*Peer) DialContext(ctx context.Context, addr string, protocol ...socket.Protocol) (Session, error) func (*Peer) Dial(addr string, protocol ...socket.Protocol) (Session, error) func (*Peer) Listen(protocol ...socket.Protocol) error

二、新增限制通信包大小

在读取包时可以限制包的大小,如果超出最大值则会主动断开连接。全局设置函数:

func SetReadLimit(maxPacketSize int64)

三、升级插件接口

  1. 插件返回值由以前的error改为tp.Xerror,从而用户可以灵活地在插件中定义错误码和错误描述;

  2. 增加更多、更细、更合理的插件位置

  3. 插件执行出错时的日志格式更加清晰整洁

// Interfaces about plugin. type (      Plugin interface {          Name() string }      PostRegPlugin interface {          Plugin          PostReg(*Handler) Xerror      }      PostDialPlugin interface {          Plugin          PostDial(ForeSession) Xerror      }      PostAcceptPlugin interface {          Plugin          PostAccept(ForeSession) Xerror      }      PreWritePullPlugin interface {          Plugin          PreWritePull(WriteCtx) Xerror      }      PostWritePullPlugin interface {          Plugin          PostWritePull(WriteCtx) Xerror      }      PreWriteReplyPlugin interface {          Plugin          PreWriteReply(WriteCtx) Xerror      }      PostWriteReplyPlugin interface {          Plugin          PostWriteReply(WriteCtx) Xerror      }      PreWritePushPlugin interface {          Plugin          PreWritePush(WriteCtx) Xerror      }      PostWritePushPlugin interface {          Plugin          PostWritePush(WriteCtx) Xerror      }      PreReadHeaderPlugin interface {          Plugin          PreReadHeader(ReadCtx) Xerror      }      PostReadPullHeaderPlugin interface {          Plugin          PostReadPullHeader(ReadCtx) Xerror      }      PreReadPullBodyPlugin interface {          Plugin          PreReadPullBody(ReadCtx) Xerror      }      PostReadPullBodyPlugin interface {          Plugin          PostReadPullBody(ReadCtx) Xerror      }      PostReadPushHeaderPlugin interface {          Plugin          PostReadPushHeader(ReadCtx) Xerror      }      PreReadPushBodyPlugin interface {          Plugin          PreReadPushBody(ReadCtx) Xerror      }      PostReadPushBodyPlugin interface {          Plugin          PostReadPushBody(ReadCtx) Xerror      }      PostReadReplyHeaderPlugin interface {          Plugin          PostReadReplyHeader(ReadCtx) Xerror      }      PreReadReplyBodyPlugin interface {          Plugin          PreReadReplyBody(ReadCtx) Xerror      }      PostReadReplyBodyPlugin interface {          Plugin          PostReadReplyBody(ReadCtx) Xerror      }  )

四、更多细节优化

  1. 运行日志中打印增加包序号seq,便于debug

  2. 当收到不支持的包类型时,断开连接并打印包详情

  3. tp.PullCmd增加func (c *PullCmd) Result() (interface{}, Xerror)方法,便于使用Session.GoPull方法进行并发请求

  4. 升级平滑重启与关闭功能

  5. 增加对并发资源的控制,防止内存资源耗尽

  6. 一些代码块的细节优化



历史版本 :
Teleport 2.4 版本发布,先进的 SSH 服务器
Teleport v2.5发布,支持限制包大小与自定义包协议
Teleport 2.0 一个 Golang TCP Socket 的全新框架
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务