发表时间: 2020-03-27  |  分类: dubbo  |  标签: dubbo rpc

Dubbo 2.7.5 服务暴露源码解析

以官方的demo为例:

public class Application {
    public static void main(String[] args) throws Exception {
        ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
        service.setInterface(DemoService.class);
        service.setRef(new DemoServiceImpl());

        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap
                .application(new ApplicationConfig("dubbo-demo-api-provider"))
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
                .service(service)
                .start()
                .await();
    }
}
阅读
发表时间: 2020-03-26  |  分类: dubbo  |  标签: dubbo rpc

Dubbo Config层

AbstractConfig类

该类包含了一些工具方法,这些方法的主要作用是解析配置并将其赋值给相关的对象。

refresh方法

构造出CompositeConfiguration对象,该对象内部包含了一些列的配置数据源,当获取某个配置时,会按照顺序从这个写数据源中获取,实现配置数据源的优先级语义,其优先级有两种情况:

实际上,系统变量总是优先级最高的,其次是环境变量(2.7.6-SNAPSHOT)。

配置中心优先

  1. 系统变量:以System.getProperty方式获取系统变量
  2. 环境变量:以System.getenv方式获取环境变量
  3. 应用外部配置:如果有配置appConfigFile,则会解析该配置对应的文件,否则解configFile配置对应的文件,默认为dubbo.property
  4. 外部配置:默认会解析dubbo.properties文件
  5. AbstractConfig:当前AbstractConfig实现类所配置的属性
  6. PropertyConfiguration,这个内部优先使用系统 变量 获取,如果没有的话,在尝试使用共享外部配置获取

然后遍历实现类的所有方法,找出其setter方法和setParameters方法,并从CompositeConfiguration中获取与之对应的配置,如果存在则将值覆盖。

阅读
发表时间: 2020-03-25  |  分类: dubbo  |  标签: dubbo rpc

Dubbo Proxy层

ProxyFactory

该接口有一个@SPI("javassist")注解,表示这是一个扩展接口,默认使用javassist实现,另一个实现是jdk动态代理。

ProxyFactory中声明了三个带@Adaptive注解的接口方法,表明这三个接口都需要dubbo自动代理的逻辑代码,在运行时根据URL选择要使用的扩展。

AbstractProxyFactory

实现了ProxyFactory接口,该抽象类主要实现的一个功能是在调用getProxy方法时,计算出代理类需要实现的接口,计算方法如下:

  1. 从url的参数中获取interfaces参数的值,这些值指定了代理类需要实现的接口
  2. 如果是需要泛化,那么代理了还需要实现GenericService接口;并且还需要实现url的参数中interface参数指定的接口,这个接口即为真正的接口。
  3. 被代理的接口
  4. 内部添加的两个内部接口:EchoServiceDestroyable
阅读
关闭