结论
所谓的服务导出,就是服务提供者将本地服务注册到zk集群,并且开启netty,用来接收消费者的请求,我们也可以认为:dubbo服务提供者就是一个netty服务端
对于服务导出,会进行以下几个步骤
1.进行一些校验、参数取值、赋值等(同一个参数配置的覆盖)
2.获取所有的注册中心、获取所有配置的协议
3.组装url对象,由于dubbo是基于url来完成注册的,所以,会先拼接、组装url
4.根据url和registry(注册中心)生成Invoker对象
5.将Invoker对象进行包装,然后进行真正的导出
5.1 首先会根据服务的ip和端口,开启一个netty服务
5.2 然后将url转换成zk的节点,进行注册,其实就是注册到注册中心,比如:zookeeper
5.3 监听路径信息(这里具体监听的路径需要再次确认学习)
所以,我们可以认为服务导出分为两大步
1.参数校验、组装参数
2.服务暴露到远程
在暴露到远程的时候,会分为以下几个步骤
2.1 开启一个netty服务
2.2 注册到zk
导出源码
我学习用的版本还是2.6,所以和2.7的代码会有些差别
dubbo服务导出的源码,可以理解为是从
com.alibaba.dubbo.config.spring.ServiceBean#onApplicationEvent
这行代码开始的,spring容器在启动之后,会发生一个ContextRefreshedEvent事件,dubbo在监听到该事件之后,会开始进行服务导出
具体,dubbo如何利用spring扩展点完成初始化,可以参考这篇博客 --> dubbo如何利用spring扩展点完成初始化
com.alibaba.dubbo.config.ServiceConfig#export
public synchronized void export() {
if (provider != null) {
if (export == null) {
export = provider.getExport();
}
if (delay == null) {
delay = provider.getDelay();
}
}
/**
* 1.判断是否已经导出,如果已经导出,return
* 2.判断是否是延迟导出
* 3.如果是非延迟导出,就进行服务导出
*/
if (export != null && !export) {
return;
}
if (delay != null && delay > 0) {
delayExportExecutor.schedule(new Runnable() {
@Override
public void run() {
doExport();
}
}, delay, TimeUnit.MILLISECONDS);