Dubbo服务注册过程浅析

关于dubbo如何实现服务注册过程,本文起到抛砖引玉的作用,欢迎大家积极讨论。

首先用一张dubbo官网的图来作为本次博文的开始

一、dubbo服务注册的整体流程

  1. ProxyFactory.getInvoker(ref)得到Invoker
  2. Protocol.export(Invoker)得到Exporter
  3. Registry.createRegister(Exporter)注册到注册中心,提供服务。

二、源码解析注册流程

  1.测试main方法  

package wsd.com.dubbo_provider;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;

import wsd.com.dubbo_provider.interfaces.HelloService;
import wsd.com.dubbo_provider.interfaces.impl.HelloServiceImpl;

public class App 
{
    public static void main( String[] args ) throws InterruptedException
    {


        HelloService greetingService = new HelloServiceImpl();

        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-demo-provider");

        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("10.88.9.116:2181");
        registryConfig.setClient("zkclient");
        registryConfig.setFile("~/dubbo/registry.cache");

        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20880);
        protocolConfig.setThreadpool("cached");
        protocolConfig.setThreads(100);

        ServiceConfig<HelloService> serviceConfig = new ServiceConfig<HelloService>();
        serviceConfig.setApplication(applicationConfig);
        serviceConfig.setRegistry(registryConfig);
        serviceConfig.setProtocol(protocolConfig);
        serviceConfig.setInterface(HelloService.class);
        serviceConfig.setRef(greetingService);
        serviceConfig.setVersion("1.0.0");
        serviceConfig.setGroup("dubbo");
        serviceConfig.setTimeout(3000);
        serviceConfig.setRetries(2);
        serviceConfig.setLoadbalance("random");
        serviceConfig.setActives(10);
        serviceConfig.setOwner("wsd");
        serviceConfig.export();
        Thread.currentThread().join();

    }
}
测试开始方法

  2.ServiceConfig.export()

 public synchronized void export() {
        if (provider != null) {
            if (export == null) {
                export = provider.getExport();
            }
            if (delay == null) {
                delay = provider.getDelay();
            }
        }
        if (export != null && ! export.booleanValue()) {
            return;
        }
        if (delay != null && delay > 0) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(delay);
                    } catch (Throwable e) {
                    }
                    doExport();
                }
            });
            thread.setDaemon(true);
            thread.setName("DelayExportServiceThread");
            thread.start();
        } else {
            doExport();
        }
    }
ServiceConfig

  3. ServiceConfig.doExport().doExportUrls()

  4.ServiceConfig.doExport().doExportUrls().loadRegistries(true)

 

  5.ServiceConfig.doExport().doExportUrls()..doExportUrlsFor1Protocol(protocolConfig,RegistryUrls)  

 

 

 

 总结

关于JavassistProxyFactory.getInvoker,RegistryProtocol.export(invoker)下一篇文章在做详细解析。

posted on 2019-01-08 15:34  sunflower_wsd  阅读(375)  评论(0)    收藏  举报

导航