Dubbo源码分析六、服务导出(3)

本文深入分析了Dubbo服务的导出过程,从本地导出的InjvmProtocol到远程导出的RegistryProtocol。详细探讨了RegistryProtocol的export方法,包括doLocalExport、服务注册、订阅override数据以及创建DestroyableExporter。通过层层深入,揭示了DubboProtocol的openServer方法,创建ExchangeServer,并最终使用NettyTransporter启动NettyServer,完成了服务导出的关键步骤。
摘要由CSDN通过智能技术生成

现在开始看export(invoker)。

先看一下调用的主体PROTOCOL

private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

可以看到这是一个Protocol的自适应扩展实例。

具体对象在运行时由参数invoker.getUrl().getProtocol()得到。

本地导出:
private void exportLocal(URL url) {
    // 构造protocol为inJvm的url
    URL local = URLBuilder.from(url)
            .setProtocol(LOCAL_PROTOCOL)
            .setHost(LOCALHOST_VALUE)
            .setPort(0)
            .build();

    // InJvmProtocol.export
    Exporter<?> exporter = PROTOCOL.export(
            PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, local));
    exporters.add(exporter);
    logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry url : " + local);
}

此时的PROTOCOL是InjvmProtocol:

@Override
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
    // 创建 InjvmExporter
    return new InjvmExporter<T>(invoker, invoker.getUrl().getServiceKey(), exporterMap);
}

就是创建了一个InjvmExporter对象

远程导出
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);

// 导出服务,并生成 Exporter
// 由于wrapperInvoker里面的url是registryUrl 这里的PROTOCOL是一个RegistryProtocol
Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);

此时的PROTOCOL是RegistryProtocol,看一下它的export方法:

@Override
public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {

    // 获取注册中心 URL,以 zookeeper 注册中心为例,得到的示例 URL 如下:
    // zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&export=dubbo%3A%2F%2F172.17.48.52%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider
    URL registryUrl = getRegistryUrl(originInvoker);
    // url to export locally
    // 务提获取已注册的服供者 URL,比如:
    // dubbo://172.17.48.52:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello
    URL providerUrl = getProviderUrl(originInvoker);
    // 获取订阅 URL,比如:
    // provider://172.17.48.52:20880/com.alibaba.dubbo.demo.DemoService?category=configurators&check=false&anyhost=true&application=demo-provider&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello
    final URL overrideSubscribeUrl = getSubscribedOverrideUrl(providerUrl);
    // 创建监听器
    final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);
    overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);

    // 这里配置器处理一遍
    providerUrl = overrideUrlWithConfig(providerUrl, overrideSubscribeListener);
    //export invoker
    // 导出服务 DubboProtocol
    // 这里主要就是
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值