Dubbo之服务暴露
ytao丨杨滔 人气:1
![](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 protocolConfig, List
加载全部内容