美文网首页
Dubbo之自适应拓展机制

Dubbo之自适应拓展机制

作者: 那谁319 | 来源:发表于2019-07-06 16:46 被阅读0次

什么是自适应拓展机制?

  • 1、基于Dubbo实现的拓展机制,在对拓展(接口实现类)通过SPI方式进行类加载时,有时候有些拓展并不想在框架启动阶段就被加载,而是希望在拓展方法被调用时,根据运行时指定的参数信息来进行选择加载拓展(这样就有很好的动态拓展性);
  • 2、这个想法似乎让人觉得不太容易理解,拓展没有被加载,那拓展的方法怎么能够被调用呢(不考虑静态方法),拓展的方法不能被调用,那么在希望在拓展方法被调用时,根据运行时指定的参数信息来进行选择加载拓展的想法怎么可能实现了;
  • 对于上述2,除非说是我们自己写了另外一个实现类,在自定义的实现类中,我们能拿到运行时参数信息,然后根据参数信息,选择要加载的拓展,然后调用拓展的方法,从而解决上述2的问题,支持了1的使用场景;
  • 实际上,Dubbo 的自适应拓展机制就是基于上述的目的和问题提供的解决方案。自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生成具有代理功能的代码。然后通过 javassist 或 jdk 编译这段代码,得到 Class 类。最后再通过反射创建代理类。

自适应拓展机制是为了解决什么问题?

  • 解决如何根据运行时参数信息动态选择需要加载的拓展的问题

自适应拓展机制是怎么做的,或者说怎么实现的?

  • Dubbo会为拓展接口生成具有代理功能的代码,代理实现。

1、dubbo源码Protocol接口自适应拓展实现类基于代码生成器生成的实现类

package com.alibaba.dubbo.rpc;

import com.alibaba.dubbo.common.extension.ExtensionLoader;

/**
 * dubbo源码Protocol接口自适应拓展实现类基于代码生成器生成的实现类,在此留一份存根
 */

public class Protocol$Adpative implements com.alibaba.dubbo.rpc.Protocol {
    public void destroy() {
        throw new UnsupportedOperationException("method public abstract void com.alibaba.dubbo.rpc.Protocol.destroy() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!");
    }

    public int getDefaultPort() {
        throw new UnsupportedOperationException("method public abstract int com.alibaba.dubbo.rpc.Protocol.getDefaultPort() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!");
    }

    public com.alibaba.dubbo.rpc.Invoker refer(java.lang.Class arg0, com.alibaba.dubbo.common.URL arg1) throws com.alibaba.dubbo.rpc.RpcException {
        if (arg1 == null) throw new IllegalArgumentException("url == null");
        com.alibaba.dubbo.common.URL url = arg1;
        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
        if (extName == null)
            throw new IllegalStateException("Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(" + url.toString() + ") use keys([protocol])");
        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);
        return extension.refer(arg0, arg1);
    }

    public com.alibaba.dubbo.rpc.Exporter export(com.alibaba.dubbo.rpc.Invoker arg0) throws com.alibaba.dubbo.rpc.RpcException {
        if (arg0 == null) throw new IllegalArgumentException("com.alibaba.dubbo.rpc.Invoker argument == null");
        if (arg0.getUrl() == null)
            throw new IllegalArgumentException("com.alibaba.dubbo.rpc.Invoker argument getUrl() == null");
        com.alibaba.dubbo.common.URL url = arg0.getUrl();
        String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());
        if (extName == null)
            throw new IllegalStateException("Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(" + url.toString() + ") use keys([protocol])");
        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);
        return extension.export(arg0);
    }
}

2、dubbo源码Cluster接口自适应拓展实现类基于代码生成器生成的实现类

package com.alibaba.dubbo.rpc.cluster;

import com.alibaba.dubbo.common.extension.ExtensionLoader;

public class Cluster$Adpative implements com.alibaba.dubbo.rpc.cluster.Cluster {
    public com.alibaba.dubbo.rpc.Invoker join(com.alibaba.dubbo.rpc.cluster.Directory arg0) throws com.alibaba.dubbo.rpc.RpcException {
        if (arg0 == null)
            throw new IllegalArgumentException("com.alibaba.dubbo.rpc.cluster.Directory argument == null");
        if (arg0.getUrl() == null)
            throw new IllegalArgumentException("com.alibaba.dubbo.rpc.cluster.Directory argument getUrl() == null");
        com.alibaba.dubbo.common.URL url = arg0.getUrl();
        String extName = url.getParameter("cluster", "failover");
        if (extName == null)
            throw new IllegalStateException("Fail to get extension(com.alibaba.dubbo.rpc.cluster.Cluster) name from url(" + url.toString() + ") use keys([cluster])");
        com.alibaba.dubbo.rpc.cluster.Cluster extension = (com.alibaba.dubbo.rpc.cluster.Cluster) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.cluster.Cluster.class).getExtension(extName);
        return extension.join(arg0);
    }
}

相关文章

  • Dubbo之自适应拓展机制

    什么是自适应拓展机制? 1、基于Dubbo实现的拓展机制,在对拓展(接口实现类)通过SPI方式进行类加载时,有时候...

  • dubbo 原理解析

    rpc 流程:1、dubbo spi 中的 warp 机制,实现类增强2、dubbo spi 中的自适应机制,通过...

  • Dubbo扩展点

    dubbo拓展点机制在dubbo中应用广泛,使框架中的接口与实现完全解耦,给予了dubbo强大的定制、拓展能力。 ...

  • Dubbo源码解析

    Dubbo与spring整合、SPI拓展机制、服务暴露、服务引用、容错机制、预热。 Dubbo架构图(取自dubb...

  • dubbo原理:SPI机制(二)

    在上一篇:SPI机制(一)中研究了Dubbo SPI的自适应原理;SPI机制(二)中我们来研究下Dubbo SPI...

  • dubbo自适应拓展

    在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBa...

  • Dubbo自适应拓展机制原理与实例

    JDK SPI 基本原理 java.util.ServiceLoader 加载 META-INF/services...

  • 🍎 Dubbo SPI 之扩展点自动包装 Wrapper 类

    之前的文章我们分析了 Dubbo 的扩展点自适应机制。Dubbo SPI 主要思想也是来自于 JDK 原生的 SP...

  • dubbo的SPI详解

    dubbo的SPI常用方法 //获取SPI自适应拓展点,具体哪个实现,在运行时决定ExtensionLoader....

  • Dubbo 自适应扩展机制-Adapative

    简介 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、Loa...

网友评论

      本文标题:Dubbo之自适应拓展机制

      本文链接:https://www.haomeiwen.com/subject/gkrphctx.html