博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo 源码分析
阅读量:6082 次
发布时间:2019-06-20

本文共 2375 字,大约阅读时间需要 7 分钟。

hot3.png

Dubbo 源码分析

实现了自己的SPI,为什么不用java默认的spi机制?

1.因为java spi机制必须一次性加载所有配置信息,所有的扩展实现类都加载,不管是否用到。

    dubbo扩展文件中是通过key=类全名来指定具体实现类,实现加载指定的实现类

2.因为java spi机制不支持对扩展实现类进行IOC,AOP操作。

------------------------------------------------------------------------------

Dubbo SPI 目的获得一个实现类的对象。

途径:ExtensionLoader.getExtension(String name)

实现路径:

getExtensionLoader(Class<T> type)就是为接口直接new一个ExtensionLoader,然后缓存起来

getAdaptiveExtension() 获得一个扩展装饰类的对象,这个类有一个规则,如果它没有@Adaptive注解,就动态创建一个装饰类,例如Protocol$Adaptive对象.

getExtension(String name) 获取一个对象。

-----------------ExtensionLoader.getExtensionLoader(Class<T> type)-------------------

ExtensionLoader.getExtensionLoader(Container.class)

  -->new ExtensionLoader(Container.class)

    -->this.type = Container.class

    -->objectFactory=ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()

 

 

执行上面的代码完成了2个属性的初始化

1.每个ExtensionLoader都包含2个值 type 和objectFactory

    Class<?> type://构造器初始化时要得到的接口名

    ExtensionFactory objectFactory//构造器初始化时AdaptiveExtensionFactory[SpiExtensionFactory,SpringExtensionFactory]

2.new 一个ExtensionLoader存储在ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS

关于这个objectFactory的一些细节:

1.objectFactory就是ExtensionFactory,它也是通过ExtensionLoader.getExtensionLoader(ExtensionFactory.class)类实现的,但是它的objectFactory是null

2.objectFactory的作用,是为dubbo的IOC提供所有对象。

 

------------------------------------------------------------------------------

proxyFactory:是为了获取一个接口的代理类。例如获取一个远程接口的代理。

    它有两个方法,代表2个作用:

        a.getInvoker:针对server端。将服务对象如DemoServiceImpl包装成一个Invoker对象。

        b.getProxy  :针对client端。创建接口的代理对象。例如DemoService的接口。

Wrapper:它类似spring的BeanWrapper,它就是包装类一个接口或一个类,可以通过Wrapper对实例对象进行赋值,取值以及制定方法的调用

Invoker:是一个可以执行的对象。能够根据方法的名称,参数得到相应的执行结果。

    它有个很重要的方法Result invoker(Invocation invocation)

    Invocation是包含类需要执行的方法和参数等重要信息,目前它有2个实现类RpcInvocation MockInvocation 

    它有3中类型的Invoker

        1.本地执行类的Invoker

        2.远程通信类的Invoker

        3.多个远程通信执行类的Invoker聚合成集群版的Invoker

Protocol

    1.export:暴露远程服务(用于服务端),就是将proxyFactory.getInvoker创建的代理类invoker对象。通过协议暴露给外部。

    2.refer:引用远程服务(用户客户端),通过proxyFactory.getProxy来创建远程的动态代理类,例如创建DemoService的远程动态接口

exporter:维护invoker的生命周期。

 

http://www.cnblogs.com/java-zhao/category/1090034.html

http://zhaoshijie.iteye.com/blog/2090049#bc2398159

http://blog.csdn.net/u010311445/article/category/2745121

http://blog.csdn.net/MrZhangXL/article/category/7039221

http://blog.csdn.net/akfly/article/details/53740894

转载于:https://my.oschina.net/u/3705388/blog/1549210

你可能感兴趣的文章
fcitx要设定local才能用~~
查看>>
linux ls命令详解
查看>>
磁盘-使用fdisk格式化硬盘
查看>>
VMware KEY
查看>>
用递归实现的二分查找
查看>>
snmp启动失败
查看>>
Window.Open参数详解
查看>>
linux负载均衡总结性说明;四层负载和七层负载有什么区别
查看>>
转帖-Centos修改时区时间日期
查看>>
IPv4地址
查看>>
MongoDB——第五天 主从复制
查看>>
mysql常用命令操作
查看>>
学习笔记2:java中Thread类与线程的创建
查看>>
php 不支持 curl 的终极解决方案
查看>>
安装mantis 2.11.1
查看>>
zabbix 3.4监控zookeeper3.4
查看>>
mysql 环境变量配置
查看>>
Openstack 之 使用disk-image-builder(DIB)制作镜像
查看>>
看看我最关心的动态库中到底有多少函数 - winmm.dll
查看>>
OpenStack企业私有云
查看>>