zoukankan      html  css  js  c++  java
  • dubbo服务暴露

     想熟悉dubbo源码,首先要知道dubbo extensionLoader,而dubbo的这种扩展机制,是根据java spi衍生而来。

    这是基础,但是我放在后面说明。

    一:dubbo demo provider在启动过程中,主要做了:

    1.暴露本地服务

    2.暴露远程服务

    3.启动netty

    4.链接zookeeper

    5.到zookeeper注册

    6.zookeeper事件通知

    下面多图预警:

    官网的两个图拿来:

    1.服务提供者暴露一个服务的过程

    2.暴露时序服务

    入口就在serviceConfig里,我一步步走,代码运行到:

    private void doExportUrls() {
    List<URL> registryURLs = loadRegistries(true);
    for (ProtocolConfig protocolConfig : protocols) {
    doExportUrlsFor1Protocol(protocolConfig, registryURLs);
    }
    }

    这里遍历的主要原因就是dubbo对多协议的支持。

    //配置不是remote的情况下做本地暴露 (配置为remote,则表示只暴露远程服务)
    if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
    exportLocal(url);
    }

    本地暴露的细节:本地服务暴露是暴露在jvm中,不需要远程通信。
    @SuppressWarnings({"unchecked", "rawtypes"})
    private void exportLocal(URL url) {
    if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
    URL local = URL.valueOf(url.toFullString())
    .setProtocol(Constants.LOCAL_PROTOCOL)
    .setHost(LOCALHOST)
    .setPort(0);
    Exporter<?> exporter = protocol.export(
    proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
    exporters.add(exporter);
    logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry");
    }
    }

    关注一下proxyFactory怎么定义的:

    private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();

    这里就用到了dubbo的扩展机制。

    proxyFactory动态编译,无法看到生成的代码,但是可以调整log4j的日志级别debug级别,具体代码定位在:

    ExtensionLoader中的

    createAdaptiveExtensionClassCode()方法

    根据控制台打印的code信息,我新建了一个ProxyFactory$Adaptive,截图如下:

    最终执行到

    JavassistProxyFactory的getInvoker()方法

    到这里我已经把具体服务到invoker的转换调通了,分割线下就是主要的逻辑:从invoker到exporter的过程,也是重点。

    =============================================================分割线==============================================================

    一:本地服务的暴露
    用相同的方法,控制台打印了Protocol$Adaptive code 代码块,我新建了类,截图如下:

    二:远程服务的暴露
    dubbo远程服务暴露,设计到的知识点太多了,netty io、线程模型,zookeeper分布式锁等等

    这是dubbo官方图,图中标红的就是远程服务暴露过程,但是这张图是从consumer--》provider的过程,所以实际上provider是反过来的。

     流程如下:

    跟本地暴露的流程一样,一步步断点,最终执行到:

     

    这里invoker转换成了exporter,最终保存在exporterMap中。这个map是用来干什么的???

    已经到了dubbo protocol,我们继续走,开始关联到server部分。

    Exchange:按照网络通信的理解,这个exchange可以对应到交换层的意思。

    那么,dubbo 的 exchange 究竟起了什么作用?

    这里要设计到另外一个重要的知识点,transporter传输层。

    看到了把,这里的netty和mina都是有名的nio框架,继续走下去:

    父类主要处理了一下timeout,connectiontimeout和codec等一些基础设置,最终我们走到了netty server doOpen()方法,

    看到这个图,感觉一切都清晰了吧?重新回到了netty上。并把最终的exporter返回。
    
    
    
  • 相关阅读:
    JS中级二
    JS中级一
    JS入门八
    JS入门七
    JS入门六
    JS入门五
    JS入门四
    JS入门三
    JS入门二
    JS入门1
  • 原文地址:https://www.cnblogs.com/cr1719/p/8320675.html
Copyright © 2011-2022 走看看