美文网首页
2.2 dubbo服务端暴露(一)

2.2 dubbo服务端暴露(一)

作者: 云养猫达人 | 来源:发表于2018-03-24 22:19 被阅读0次

dubbo服务端暴露的总体流程如下图所示:


20180312113446.png

首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。接下来就是 Invoker 转换到 Exporter 的过程。

以dubbo-demo-provider中提供的demo为例,其xml配置文件如下

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="demo-provider"/>

    <!--服务提供方使用netty4作为协议发布工具-->
    <dubbo:provider server="netty4"/>

    <!-- use multicast registry center to export service -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>

    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>

</beans>

spring通过<dubbo:service>进行服务的节点创建,并创建对应的一个ServiceBean,在ServiceBean中主要看方法onApplicationEvent(ContextRefreshedEvent event),该方法通过实现ApplicationListener接口得到,用于当ApplicationEvent发布到 ApplicationContext时,使得这个bean得到通知

 /**
     * ApplicationListener接口的方法
     *  isDelay:延迟加载  && !isExported:服务没有暴露 && !isUnexported 服务没有反注册
     * @param event
     */
public void onApplicationEvent(ContextRefreshedEvent event) {
        if (isDelay() && !isExported() && !isUnexported()) {
            if (logger.isInfoEnabled()) {
                logger.info("The service ready on spring started. service: " + getInterface());
            }
            export();//执行服务暴露
        }
    }

public synchronized void export() {
        if (provider != null) {
            if (export == null) {
                export = provider.getExport();
            }
            if (delay == null) {
                delay = provider.getDelay();
            }
        }
        if (export != null && !export) {
            return;
        }

        if (delay != null && delay > 0) {
            delayExportExecutor.schedule(new Runnable() {//延迟暴露
                public void run() {
                    doExport();
                }
            }, delay, TimeUnit.MILLISECONDS);
        } else {
            doExport();
        }
    }


protected synchronized void doExport() {
       /** ......一系列校验与参数获取.....*/
        doExportUrls();//将ref进行发布
        ProviderModel providerModel = new ProviderModel(getUniqueServiceName(), this, ref);
        ApplicationModel.initProviderModel(getUniqueServiceName(), providerModel);
}

相关文章

网友评论

      本文标题:2.2 dubbo服务端暴露(一)

      本文链接:https://www.haomeiwen.com/subject/cqlnfftx.html