美文网首页
dubbo小结

dubbo小结

作者: 知止9528 | 来源:发表于2019-01-13 11:29 被阅读15次

    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容器,这几个很精髓,当然也还没时间一下就全部分析完,还待以后有时间慢慢分析,就先总结这么多吧

    相关文章

      网友评论

          本文标题:dubbo小结

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