dubbo 2.6.2サービス露出プロセス

6992 ワード

dubboカスタムタグを使用したnamespaceはhttp://dubbo.apache.org/schema/dubbo
springはカスタムラベルを使うために、classipathディレクトリの下にMETA-INFディレクトリにspring.handersを追加してnamespace解析器を追加する必要があります。
org.apache.dubbo.co fig.spring.schema.Dubbo Namespace Handlerを見つけました。
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
以上は各タブを登録した解析です。
ですから、サービス露出はServiceBeanという種類を使っています。(解析プロセスは紹介しません。)
ServiceBean   spring   ApplicationListener                onApplicationEvent
サービスとは、この方法で露出して大量のパラメータ配置過程です。
export();-->doExport();-->doExportUrls();
List registryURLs = loadRegistries(true);//                    :registry://localhost:2181/org.apache.dubbo.registry.RegistryService?application=sp1&dubbo=2.0.2&pid=14140&registry=zookeeper&timestamp=1535640116290
ここのprotocolsは配置された暴露サービスプロトコルの配置です。
for(Protocol Config protocolConfig:protocols){doExport Urls For 1 Protocol(protocolConfig、registryURLs)}
doExport Urls For 1 Protocol(Protocol Config protocolConfig、List registryURLs)
本機のipとサービスポート番号と登録構成パラメータを取得してサービスのURLオブジェクトを以下のようにします。
URL url = new URL(name, host, port, (contextPath == null || contextPath.length() == 0 ? "" : contextPath + "/") + path, map); //    :dubbo://169.254.38.78:20880/com.zzz.dubbodemo.api.service.DemoService?anyhost=true&application=sp1&bind.ip=127.0.0.1&bind.port=20880&dubbo=2.0.2&generic=false&interface=com.zzz.dubbodemo.api.service.DemoService&methods=add&pid=14140&side=provider&timestamp=1535640387238
 
if (registryURLs != null && !registryURLs.isEmpty()) {
    for (URL registryURL : registryURLs) {
        url = url.addParameterIfAbsent(Constants.DYNAMIC_KEY, registryURL.getParameter(Constants.DYNAMIC_KEY));
        URL monitorUrl = loadMonitor(registryURL);
        if (monitorUrl != null) {
            url = url.addParameterAndEncoded(Constants.MONITOR_KEY, monitorUrl.toFullString());
        }
        if (logger.isInfoEnabled()) {
            logger.info("Register dubbo service " + interfaceClass.getName() + " url " + url + " to registry " + registryURL);
        }

        // For providers, this is used to enable custom proxy to generate invoker
        String proxy = url.getParameter(Constants.PROXY_KEY);
        if (StringUtils.isNotEmpty(proxy)) {
            registryURL = registryURL.addParameter(Constants.PROXY_KEY, proxy);
        }

        Invoker> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);

        Exporter> exporter = protocol.export(wrapperInvoker);
        exporters.add(exporter);
    }
}
循環登録センターに各露出サービスを登録する。
registryURL.addParameter AndEncocded(Contstants.EXPORTUKEY,url.toFulStering()//サービスURLを登録URLパラメータに追加して、exportに新しいURLを取得します。
spiで得られたproxyFactoryを使って、インタフェースの実現類の対象とインターフェースと新しいURLをinvoker(詳しい過程は私の別のブログを見ます)に入手して、DelegateProvider MetaData Invokerを作成します。 wrapper Invokerオブジェクトは、このinvokerとサービスの設定情報オブジェクトを含む。
プロトコール.exportを使用します。サービスのリリースを行い、Exportに戻ります。 
wrapper Invokerに含まれているURLは登録URLですので、protocol.export(wrapper Invoker);最終的にはRegistryProtocol.export(wrapper Invoker)に実行されます。 (Dubo SPIの詳細理解)
//                  netty     (   ) originInvoker    URL        URL   export           URl
final ExporterChangeableWrapper exporter = doLocalExport(originInvoker);
final Invoker> invokerDelegete = new InvokerDelegete(originInvoker, getProviderUrl(originInvoker));
exporter = new ExporterChangeableWrapper((Exporter) protocol.export(invokerDelegete), originInvoker);
//get Provider Urlとは、後でoriginInvokerにURLパラメータexportに対応する文字列を登録し、URLの静的な方法でURLオブジェクトに変換してプロバイダサービスのURLを取得することです。
そして、Invokerを作成しました。invoker Delegeteには、私たちが具体的に実現するクラスのオブジェクトに実行できるinvokerとプロバイダサービスのURLが含まれています。
プロトコール.exportを実行します。invoker Delegeteに含めるべきURLは提供者のサービスです。デフォルトはDuboプロトコルです。
いくつかのwrapperを経てDubboProtocol.export(Invoker invoker)に実行されます。
String key=serviceKey(url)//言い訳の種類にローカルサーバのポート番号を追加します。例えば、comp.zz.dubodemo.appi.service.DemoService:20880
DubboExporter exporter = new DubboExporter(invoker, key, exporterMap);
exporterMap.put(key, exporter);
DubboExportオブジェクトを作成し、キャッシュを追加して、keyとexport MapオブジェクトをDubboExportに送るのは、自分でキャッシュを削除するのに便利です。
openServer(url);//   URL                        
プロバイダのサービス配置はどうやってサービスセンターに登録しますか?
RegistryProtocol..export(wrapperInvoker)メソッドの一つは、doLocal Export(originging Invoker)を呼び出してサービスURLをnettyサーバに投稿することです。もう一つは登録URLを登録センターに登録することです。
 
URL provider Url=get Provider Url //invokerの中のurlのパラメータ「dynamic」「enabled」を削除します。 のフルー属性
 
また削除します。removeParameeter(Conts.MONITORKY)
                .removeParameeter(Contstants.BIND_IPuKEY)
                .removeParameeter(Contstants.BIND_PORT_KEY)
                .removeParameter(QOsmove ENABLE)
                .removeParameeter(QOsmouPORT)
                .removeParameter(ACCEPT_FOREGN_UIP)
とドットで始まるパラメータ
これらのパラメータが新たに得られたURLがregistedProvider Urlです。
register(registryUrl, registeredProviderUrl);
Registry registry = registryFactory.getRegistry(registryUrl);
registry.register(registedProviderUrl);
registryUrlのデフォルトプロトコルはzookeeperですのでregistry  つまりZookeeper RegisterはFailbackRegistryに引き継がれます。
super.register(url); //registered.add(url); url       
doRegister(url);
zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));
そして登録センターに登録しました。