dubbo的整个架构图如下
Rpc简单原理如下
dubbo实现了自己的spi,根据需要再进行加载,扩展了jdk的serviceLoader的spi加载机制
dubbo的Spi如下
dubbo定义了自己的参数模型URL,
URL 采用标准格式:protocol://username:password@host:port/path?key=value&key=value
dubbo的spi也可以看作是一个ioc容器,可以根据URL中的protocol类型来加载对应的组件.只不过这个URL有时候看起来有点绕,不是很好跟踪它的参数是什么时候变化了
dubbo的启动流程是根据自己的spi加载了springContainer容器
然后启动spring容器,spring启动过程中,会在prepareRefresh()的时候调用到XmlBeanDefinitionReader#loadBeanDefinitions()方法,然后进行自定义标签的解析,spring的xml解析过程如下
然后dubbo自己的标签解析handler是DubboNamespaceHandler
服务暴露的是new DubboBeanDefinitionParser(ServiceBean.class, true)
服务引用的是new DubboBeanDefinitionParser(ReferenceBean.class, false))
而服务暴露主要是监听了spring的contextRefresh事件,所以它实现了ApplicationListener在onApplicationEvent()方法中进行了服务暴露
远程服务暴露(可以看作是生产者的启动)要做几个事
1.先做本地暴露,所以是从RegistryProtocol#export到DubboProtocol#export在DubboProtocol
2.然后在DubboProtocol中通过DubboProtocol#openServer方法启动netty服务端,启动完成后在HeaderExchangeServer#HeaderExchangeServer的初始化方法中启动了心跳检测测,HeaderExchangeServer#startHeatbeatTimer方法主要懂了jdk的定时任务线程池来进行心跳包的检测.
3.之后就是通过spi工厂获取zookeeper的具体实现类,然后就是在ZookeeperRegistry#doRegister中创建节点
4.之后就是zookeeper节点的订阅.(主要是服务监听zk)
之后是服务引用(可以看作是消费端的启动)
这个过程要做的几件事
1.服务引用主要使用了FactoryBean,在使用服务的时候通过getObject()来装配复杂的,或者你不想在xml里面,想在代码里装配的对象.
2.同样我们也是要建立与zk的连接,然后订阅节点
3.最后就是进行代理对象的对象,因为在消费端进行请求的时候最终会通过invoke方法就行后续的调用
第三个就是消费端的请求
1.通过代理对象的invoke方法,调用到MockClusterInvoker.invoke开始加入集群
2.这里直接借用官网的一张图
首先就是从Directory中获取到可以用的服务端,如我们可以用的有0.0.0.1; 0.0.0.2 ;0.0.0.3这三台机器上的三个服务端,那我们就返回一个List
之后就是对directory返回的进行路由,也可以看作是根据某些条件进行过滤,比如说版本号啊等等
过滤完之后就是对负载均衡的使用,假如我们过滤之后返回的是0.0.0.1和0.0.0.3,我们应该怎么来调度它们呢?调度的策略其实是可以自定义的
经过负载均衡,我们才最终拿到了真正的执行者,然后执行我们的方法调用
第四个就是方法调用了
之前我们启动了netty,现在我们要通过netty来进行消息的发送了。
那这个消息时什么呢?
其实就是我们要调用的哪个接口,的哪个方法,参数是什么,返回值是什么等待
服务端接收到后,再通过反射就行调用,然后再通过netty将响应结果返回给消费端.
其次,因为netty都是异步的,所以关于响应的接收,dubbo做了以下几个处理
1.每个请求都有一个唯一id,来将请求和响应关联起来
2.使用了多线程之间的通信机制,通过DefaultFuture包装了channel,然后用了ReentrantLock的lock.newCondition()来进行等待和唤醒.
没有响应时,通过wait()方法来等待,有响应时,通过signal来进行通知
3.其次是对超时的处理,dubbo在创建DefaultFuture对象时,就会通过静态代码块来启动一个线程监听请求是否超时,请求超时时,会构造一个超时的响应对象进行返回
以上,就是对dubbo的一个小结.当然只是总结了dubbo的主要流程,感觉dubbo的核心还是集群容错和负责均衡,路由,以及自定义协议,以及它自己实现的spi的IOC容器,这几个很精髓,当然也还没时间一下就全部分析完,还待以后有时间慢慢分析,就先总结这么多吧
网友评论