Teleport v2.5釋出,支援限制包大小與自定義包協議

henrylee2cn發表於2017-11-15

Teleport v2.5(簡稱tp v2.5)今日釋出啦!它是一個通用、高效、靈活的TCP Socket框架。可用於Peer-Peer對等通訊、RPC、長連線閘道器、微服務、推送服務,遊戲服務等領域。這次升級新增了自定義通訊協議、包大小限制等一些新特性,並作了一系列深度優化。

tp v2.5 特性變化:

  • 【新增】支援設定讀取包的大小限制(如果超出則斷開連線)
  • 【新增】支援定製通訊協議
  • 【升級】支援外掛機制,可以自定義認證、心跳、微服務註冊中心、統計資訊外掛等
  • 【優化】無論伺服器或客戶端,均支援優雅重啟、優雅關閉
  • 支援實現反向代理功能
  • 【優化】日誌資訊詳盡,支援列印輸入、輸出訊息的詳細資訊(狀態碼、訊息頭、訊息體)
  • 伺服器和客戶端之間對等通訊,兩者API方法基本一致
  • 底層通訊資料包包含HeaderBody兩部分
  • 支援單獨定製HeaderBody編碼型別,例如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(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
    }
)

四、更多細節優化

  1. 執行日誌中列印增加包序號seq,便於debug
  2. 當收到不支援的包型別時,斷開連線並列印包詳情
  3. tp.PullCmd增加func (c *PullCmd) Result() (interface{}, Xerror)方法,便於使用Session.GoPull方法進行併發請求
  4. 升級平滑重啟與關閉功能
  5. 增加對併發資源的控制,防止記憶體資源耗盡
  6. 一些程式碼塊的細節優化

Teleport專案地址: https://github.com/henrylee2cn/teleport

相關文章