Netty原始碼研究筆記(2)——Bootstrap系列
1. Netty原始碼研究筆記(2)——Bootstrap系列
顧名思義,Bootstrap
是netty提供給使用者的腳手架,類似於Spring的ApplicationContext
,通過Bootstrap
我們使用一些自定義選項,將相關的元件打包起來,從而快速的啟動伺服器、客戶端。
Bootstrap
分為:Bootstrap
、ServerBootstrap
兩種,其中前者用於構建客戶端、後者用於構建服務端。
Bootstrap
的實現使用的是典型的建造者模式,使用這種模式的好處是使得構造物件時可讀性更好,更不容易出錯(相比於使用建構函式而言),並且可以在構造的時候進行校驗。
Bootstrap
系列還包含相關的BootstrapConfig
BootstrapConfig
的實現類似外觀模式,只暴露其內部持有Bootstrap
的配置資訊。(配置資訊實際放在Bootstrap
中)。
1.1. 繼承關係
1.2. AbstractBootstrap
注意:bind
方法定義在AbstractBoostrap
中。
在使用點對點的傳輸時,一般在Server端使用bind
,在Client端使用connect
。
如果bind
方法不是通過ServerBootstrap
使用,那麼對應的是無連線的傳輸場景,比如:UDP。
AbstractBootstrap
是一個泛型類,它的泛型引數是其實現類,這樣便可以使其鏈式呼叫方法返回的型別其具體的實現類。
忽略EMPTY_OPTION_ARRAY
EMPTY_ATTRIBUTE_ARRAY
,這兩者用於提供泛型方法的型別入參,從而指示其返回型別,沒有實際意義。
我們可以看到在AbstractBootstrap
中需要配置:
- 關聯的EventLoopGroup(必選)
- 監聽的local socket address:對於端到端的server必選,對於無連線的也必選
- channel handler:必選,一般是channel initializer,負責將需要的channel handler新增到channel pipeline中。
- channel option(可選)
- channel attribute(可選)
- channel factory:一般使用預設的channel factory,它使用反射機制來建立channel
bind
、connect
方法在前文已經分析過了,這裡我們看未談到的validate
、init
方法。
validate:
AbstractBootstrap
只校驗了EventLoopGroup
。
init:
子類中實現。
1.3. ServerBootstrap
在ServerBootstrap
需要配置:
- child channel option:可選,表示和客戶端建立的傳輸通道的配置項。
- child channel attibute:可選,表示和客戶端建立的傳輸通道的屬性項。
- child channel handler:必填,一般是channel initializer,表示對客戶端請求的處理邏輯
- child event loop group:可選,表示客戶端請求處理器的執行執行緒組。
validate:
校驗child channel handler
init:
ServerBootstrap::init
方法給channel pipeline 新增使用者指定的channel handler,以及一個ServerBootstrapAcceptor
型別的channel handler,它使得服務端可以和客戶端建立端到端的連線。
ServerBootstrapAcceptor
以後再談。
1.4. Bootstrap
validate:
驗證channel handler是否存在,即判斷對server的response的處理器是否定義了。
init:
給channel pipeline新增使用者指定的channel handler。
1.5. AbstractBootstrapConfig、ServerBootstrapConfig、BootstrapConfig
AbstractBootstrapConfig:
ServerBootstrapConfig:
BootstrapConfig: