dubbo自适应拓展

在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。
自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生成具有代理功能的代码,(拓展接口所定义的方法会在开始时就加载)然后通过 javassist 或 jdk 编译这段代码,得到 Class 类,有点像CGLIB。

一、Adaptive注解

该注解可作用在注解上或方法上,主要是作用在接口方法上,拓展的加载逻辑可由框架自动生成。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Adaptive {
    String[] value() default {};
}

通过URL来获取需要实例化的对象

  1. 首先生成接口类的代码
  2. 编译为class文件
  3. 通过反射进行实例化(运行时获取新的对象)

你可能感兴趣的:(dubbo自适应拓展)