Dubbo技術知識總結之三——Dubbo 啓動與服務暴露、引用

接上篇《Dubbo技術知識總結之二——註冊中心》

三. Dubbo 啓動與服務暴露、引用

服務暴露:見書 5.2.2 章,文章《Dubbo服務暴露與註冊》

3.1 啓動時 dubbo 標籤解析

服務啓動時,首先解析 dubbo 的配置文件。dubbo 的配置文件是一個 Spring Bean 的 XML 配置文件,其中都是 dubbo 自定義的標籤。Spring 啓動過程中會使用 BeanDefinitionParser 解析 XML 配置文件中的 Bean,dubbo 就是提供了一個 BeanDefinitionParser 的實現類 DubboBeanDefinitionParser,其中的 parse 方法對解析 dubbo 自定義的標籤(包括 Service, Reference, Registry 等)進行解析,每種標籤對應一種 Config 文件,同時對應一種處理邏輯。
其中對 ServiceBean 標籤的解析,其中包含服務暴露的過程。

注:名稱的處理首先是在 Dubbo 的名稱空間處理器 DubboNamespaceHandler 中,將一個個 dubbo 標籤解析方法註冊,這樣在服務啓動的時候,會觸發對 XML 文件中所有 dubbo 標籤的解析。

3.2 服務暴露

服務暴露主要通過 ServiceBean 完成。ServiceBean 實現了兩個主要的 Spring 接口:InitializingBeanApplicationListener

  1. InitializingBean#afterPropertiesSet():將前面進行的標籤解析結果(包括 Application, Provider, Module, Register, Monitor, Protocol 等信息)保存起來;
  2. ApplicationListener#onApplicationEvent():註冊了 ContextRefreshEvent 事件,在 Spring 容器加載完畢後調用服務接口的暴露

從 ServiceBean 的 ApplicationListener 可以看到,服務接口的暴露是在 Spring 容器加載完畢後執行的。主要方法是通過 doExport() 方法實現的。
doExport() 方法中,會將服務的 URL 地址通過 Invoker 的形式暴露出去。在暴露的過程中 Invoker 是一種包裝,將暴露出去的 RPC 接口、接口的實現類、在註冊中心的 URL 地址等信息包裝成 Invoker。暴露時根據配置文件中的 Protocol 信息,不同的 Protocol 類型執行各自 export 方法,將 Invoker 暴露出去。通常 Dubbo 會用 RegistryProtocol 執行 Invoker 的暴露。
RegistryProtocol 將 Invoker 封裝的信息註冊到註冊中心上,同時本地記錄服務提供者、消費者的列表。主要過程有兩步:

  1. 啓動 Netty 服務器監聽:調用 DubboProtocol # export() 方法,內部調用的 openServer() 方法會讀取配置信息中的 IP 端口信息,啓動一個 Netty 服務器並監聽連接;
  2. 服務註冊RegistryProtocol # export() 方法中,將 Invoker 中的 URL 信息將服務註冊到註冊中心,同時將註冊中心的信息保存到本地。

這樣一個服務的暴露就完成了。如果我們想要調用其他的遠程服務,由於在啓動時已經將其他服務的調用信息從註冊中心上獲取並保存到了本地,所以直接本地獲取對應遠程服務的服務提供者,進行路由和負載均衡篩選出一個服務,對該服務進行遠程調用。

3.3 服務引用

服務引用與服務暴露是比較類似的,服務暴露是服務提供者對外提供暴露服務,服務引用是服務消費者對服務進行消費的過程。服務引用是通過 ReferenceBean 實現的。
ReferenceBean 實現了 FactoryBean 接口。在 ReferenceBean 通過 FactoryBean#getObject() 方法實現遠程引用對象,通過註冊中心獲取服務列表。引用通過 Protocol 執行引用,比如在 DubboProtocol, RegistryProtocol 中的 refer() 方法。
在 RegistryProtocol#refer() 方法中,訂閱了該服務的遠程服務,另外也會調用 DubboProtocol 的 refer() 方法。
DubboProtocol#refer() 方法與 DubboProtocol#export() 方法類似,它開啓了一個 Netty 客戶端,connect 對應服務的 Netty Server,也就是與其他遠程服務建立連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章