Teleport v2.5釋出,支援限制包大小與自定義包協議
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多路複用技術
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)
三、升級外掛介面
- 外掛返回值由以前的
error
改為tp.Xerror
,從而使用者可以靈活地在外掛中定義錯誤碼和錯誤描述; - 增加更多、更細、更合理的外掛位置
- 外掛執行出錯時的日誌格式更加清晰整潔
// Interfaces about plugin.
type (
Plugin interface {
Name() string
}
PostRegPlugin interface {
Plugin
PostReg(*Handler) Xerror
}
PostDialPlugin interface {
Plugin
PostDial(PreSession) Xerror
}
PostAcceptPlugin interface {
Plugin
PostAccept(PreSession) 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
}
PostDisconnectPlugin interface {
Plugin
PostDisconnect(PostSession) Xerror
}
)
四、更多細節優化
- 執行日誌中列印增加包序號
seq
,便於debug - 當收到不支援的包型別時,斷開連線並列印包詳情
tp.PullCmd
增加func (c *PullCmd) Result() (interface{}, Xerror)
方法,便於使用Session.GoPull
方法進行併發請求- 升級平滑重啟與關閉功能
- 增加對併發資源的控制,防止記憶體資源耗盡
- 一些程式碼塊的細節優化
Teleport專案地址: https://github.com/henrylee2cn/teleport
相關文章
- WireShark——IP協議包分析(Ping分析IP協議包)協議
- tshark 抓包 mysql 協議包MySql協議
- KubeKey v3.1 釋出:快速自定義離線安裝包
- netty自定義Decoder用於自定義協議Netty協議
- HTTP協議資料包HTTP協議
- 從零開始實現簡單 RPC 框架 7:網路通訊之自定義協議(粘包拆包、編解碼)RPC框架協議
- HTTP協議的請求與資料抓包HTTP協議
- UDP協議抓包分析 -- wiresharkUDP協議
- JMeter 擴充套件外掛實現對自定義協議的支援JMeter套件協議
- 讓你釋出的nuget包支援原始碼除錯原始碼除錯
- 釋出npm包流程NPM
- 測試 iris 時自定義 context 包Context
- 自定義 Composer 包 dome 小測試
- Facebook 小遊戲上傳的遊戲包有大小限制遊戲
- Wireshark中的TCP協議包分析TCP協議
- 使用WireShark抓包分析TCP協議TCP協議
- Http網路協議包 (快速理解)HTTP協議
- bili-emoji自定義表情包設定
- npm包釋出記錄NPM
- 萬彩動畫大師教程 | 釋出的視訊可以自定義大小動畫
- OpenVPN 協議解析-握手資料包分析協議
- TCP協議粘包問題詳解TCP協議
- TarsGo新版本釋出,支援protobuf,zipkin和自定義外掛Go
- 釋出nuget包的正確姿勢---cicd自動打包釋出nuget包
- Neuron 2.1.0 釋出:支援 Sparkplug B 規範,更完善的工業協議支援Spark協議
- Facebook Instant Game 小遊戲上傳的遊戲包有大小限制GAM遊戲
- Spring Boot 將jar包釋出方式改為War包Spring BootJAR
- NPM包(模組)釋出、更新、撤銷釋出NPM
- 釋出/撤銷NPM私有包NPM
- 如何釋出一個 npm 包NPM
- 如何釋出一個 Composer 包
- 如果釋出和使用npm包NPM
- Flutter包大小治理上的探索與實踐Flutter
- 如何利用 Netty 實現自定義協議通訊?Netty協議
- C++編寫自定義TCP包併傳送C++TCP
- 併發程式設計:自定義併發類:自定義非同步流(釋出與訂閱)程式設計非同步
- 支援Http3和Quic協議的Netty孵化器版本釋出HTTPUI協議Netty
- 釋出 Rafy .NET Standard 版本 Nuget 包
- 釋出Nuget包時遇到都意外