Kitex Suite 擴展

2022-04-27 10:22 更新

Suite 擴展 - 封裝自定義治理模塊

Suite(套件)是一種對于擴展的高級抽象,可以理解為是對于 Option 和 Middleware 的組合和封裝。

在 middleware 擴展一文中我們有說到,在擴展過程中,要記得兩點原則:

  1. 中間件和套件都只允許在初始化 Server、Client 的時候設(shè)置,不允許動態(tài)修改。
  2. 后設(shè)置的會覆蓋先設(shè)置的。

這個原則針對 Suite 也是一樣有效的。

Suite 的定義如下:

type Suite interface {
    Options() []Option
}

這也是為什么說,Suite 是對于 Option 和 Middleware(通過 Option 設(shè)置)的組合和封裝。

Server 端和 Client 端都是通過 ?WithSuite ?這個方法來啟用新的套件。

在初始化 Server 和 Client 的時候,Suite 是采用 DFS(Deep First Search) 方式進行設(shè)置。

舉個例子,假如我有以下代碼:

type s1 struct {
    timeout time.Duration
}

func (s s1) Options() []client.Option {
    return []client.Option{client.WithRPCTimeout(s.timeout)}
}

type s2 struct {
}

func (s2) Options() []client.Option {
    return []client.Option{client.WithSuite(s1{timeout:1*time.Second}), client.WithRPCTimeout(2*time.Second)}
}

那么如果我在創(chuàng)建 client 時傳入 ?client.WithSuite(s2{})?, ?client.WithRPCTimeout(3*time.Second)?,在初始化的時候,會先執(zhí)行到 ?client.WithSuite(s1{})?,然后是 ?client.WithRPCTimeout(1*time.Second)?,接著是 ?client.WithRPCTimeout(2*time.Second)?,最后是 ?client.WithRPCTimeout(3*time.Second)?。這樣初始化之后,RPCTimeout 的值會被設(shè)定為 3s(參見開頭所說的原則)。

總結(jié)

Suite 是一種更高層次的組合和封裝,更加推薦第三方開發(fā)者能夠基于 Suite 對外提供 Kitex 的擴展,Suite 可以允許在創(chuàng)建的時候,動態(tài)地去注入一些值,或者在運行時動態(tài)地根據(jù)自身的某些值去指定自己的 middleware 中的值,這使得用戶的使用以及第三方開發(fā)者的開發(fā)都更加地方便,無需再依賴全局變量,也使得每個 client 使用不同的配置成為可能。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號