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返回。
    
    
    
  • 相关阅读:
    SPOJ SAMER08A
    SPOJ TRAFFICN
    CS Academy Set Subtraction
    CS Academy Bad Triplet
    CF Round 432 C. Five Dimensional Points
    CF Round 432 B. Arpa and an exam about geometry
    SPOJ INVCNT
    CS Academy Palindromic Tree
    身体训练
    简单瞎搞题
  • 原文地址:https://www.cnblogs.com/cr1719/p/8320675.html
Copyright © 2011-2022 走看看