1. 程式人生 > >Dubbo之服務暴露

Dubbo之服務暴露

![](https://img2020.cnblogs.com/other/1850167/202003/1850167-20200321113334029-1603461641.png) # 前言 本文 Dubbo 使用版本`2.7.5` Dubbo 通過使用`dubbo:service`配置或`@service`在解析完配置後進行服務暴露,供服務消費者消費。 Dubbo 的服務暴露有兩種: - 遠端暴露 - 本地暴露 可以通過`scope `顯式指定暴露方式: - none 不暴露 - remote 遠端暴露 - local 本地暴露 # 服務暴露流程 下面是一個服務暴露的流程圖: ![](https://img2020.cnblogs.com/other/1850167/202003/1850167-20200321113334262-1859890876.jpg) **ProxyFactory** 是動態代理,用來建立 Invoker 物件,實現代理使用`JavassistProxyFactory`和`JdkProxyFactory`。 **Invoker** 是一個服務物件例項,Dubbo 框架的實體域。它可以是一個本地的實現,一個遠端的實現或一個叢集的實現,可以向它發起 Invoker 呼叫。 **Protocol** 是服務域,負責 Invoker 的生命週期管理,是 Invoker 暴露和引用的主要功能入口,對應該類的`export`和`refer`方法。 **Exporter** 是根據不同協議暴露 Invoker 進行封裝的類,它會根據不同的協議頭進行識別(比如:`registry://`和`dubbo://`),呼叫對應`XXXProtocol`的`export()`方法。 從上圖中可以看到,Dubbo 中服務暴露分為兩個大步驟:第一步通過代理將服務例項轉換成 Invoker,這就是通過我們常用的反射實現。第二步將 Invoker 根據具體的協議轉換成 Exporter,這是就是我們要分析的核心。從這裡可以看到 Dubbo 服務物件都是圍繞 Invoker 進行工作。 # 遠端暴露 服務遠端暴露從字面上理解,就是將服務跨網路進行遠端通訊,並非同一 JVM 中的服務進行呼叫。 服務最後都是轉換成`org.apache.dubbo.config.spring.ServiceBean`,它的UML類圖: ![](https://img2020.cnblogs.com/other/1850167/202003/1850167-20200321113334445-241942270.png) `ServiceBean`繼承自`ServiceConfig`,服務在`ServiceConfig#doExportUrls`根據不同協議進行暴露。 ![](https://img2020.cnblogs.com/other/1850167/202003/1850167-20200321113334630-2006530680.png) 通過獲取所有註冊中心例項(registryURLs)後,進行依次暴露,暴露操作在`doExportUrlsFor1Protocol`中。 ```java private void doExportUrlsFor1Protocol(ProtocolConfig protocolConf