Dubbo之服務暴露
阿新 • • 發佈:2020-03-21
![](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