dubbo源码 -- 服务导出

本文详细介绍了Dubbo服务导出的过程,包括服务提供者校验参数、组装URL、开启Netty服务、注册到注册中心(如Zookeeper)。通过分析源码,展示了从`doExportUrlsFor1Protocol()`方法开始的服务导出流程,包括本地服务导出和远程服务导出。最后,解释了如何通过SPI机制启动Netty服务并注册到注册中心。
摘要由CSDN通过智能技术生成

结论

所谓的服务导出,就是服务提供者将本地服务注册到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);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值