Kitex Transport Pipeline-Bound 擴(kuò)展

2022-04-27 10:39 更新

Transport Pipeline 參考 Netty ChannelPipeline,提供 Inbound 和 Outbound 接口,支持對(duì)消息或 I/O 事件擴(kuò)展。基于 In/OutboundHandler 可以擴(kuò)展實(shí)現(xiàn) TLS、限流、透?jìng)餍畔⑻幚淼?。如下圖所示,各個(gè) BoundHandler 會(huì)串行依次執(zhí)行。


接口定義

// OutboundHandler is used to process write event.
type OutboundHandler interface {
  Write(ctx context.Context, conn net.Conn, send Message) (context.Context, error)
}

// InboundHandler is used to process read event.
type InboundHandler interface {
  OnActive(ctx context.Context, conn net.Conn) (context.Context, error)

  OnInactive(ctx context.Context, conn net.Conn) context.Context

  OnRead(ctx context.Context, conn net.Conn) (context.Context, error)

  OnMessage(ctx context.Context, args, result Message) (context.Context, error)
}

默認(rèn)擴(kuò)展

  • 服務(wù)端限流 Handler

Kitex 支持連接級(jí)別和請(qǐng)求級(jí)別限流,限流是為了保障服務(wù)的可用性,當(dāng)達(dá)到閾值應(yīng)當(dāng)及時(shí)限流,放到 Transport 層可以達(dá)到及時(shí)限流的目的,實(shí)現(xiàn)見 limiter_inbound.go。

  • 連接級(jí)別限流 OnActive(), OnInactive()
  • 請(qǐng)求級(jí)別限流 OnRead()
  • 元信息透?jìng)?nbsp;Handler

元信息透?jìng)魇腔趥鬏攨f(xié)議透?jìng)饕恍?nbsp;RPC 額外的信息給下游,同時(shí)讀取傳輸協(xié)議中上游透?jìng)鞯男畔?,?shí)現(xiàn)見 transmeta_bound.go。

  • 寫入透?jìng)餍畔?nbsp;Write()
  • 讀取透?jìng)餍畔?nbsp;OnMessage()

為更明確的為使用者元信息透?jìng)鞯臄U(kuò)展能力,Kitex 單獨(dú)定義了信息透?jìng)鞯奶幚斫涌?nbsp;MetaHandler,這里會(huì)執(zhí)行 MetaHandler 進(jìn)行透?jìng)餍畔⒌奶幚怼?/p>

// MetaHandler reads or writes metadata through certain protocol.
type MetaHandler interface {
  WriteMeta(ctx context.Context, msg Message) (context.Context, error)
  ReadMeta(ctx context.Context, msg Message) (context.Context, error)
}

指定自定義的 BoundHandler 

  • 服務(wù)端

option: ?WithBoundHandler?

svr := xxxservice.NewServer(handler, server.WithBoundHandler(yourBoundHandler))

  • 調(diào)用端

option: ?WithBoundHandler?

cli, err := xxxservice.NewClient(targetService, client.WithBoundHandler(yourBoundHandler))


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)