分布式服务框架:

  • 高性能和透明化的RPC远程服务调用方案
  • SOA服务治理方案
  • Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况

分析源代码,基本原理如下:

  1. client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的
  2. 将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object
  3. 向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)
  4. 将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去
  5. 当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。
  6. 服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里。
  7. 监听线程接着使用synchronized获取回调对象callback的锁(因为前面调用过wait(),那个线程已释放callback的锁了),再notifyAll(),唤醒前面处于等待状态的线程继续执行(callback的get()方法继续执行就能拿到调用结果了),至此,整个过程结束。

当前线程怎么让它“暂停”,等结果回来后,再向后执行?

答:先生成一个对象obj,在一个全局map里put(ID,obj)存放起来,再用synchronized获取obj锁,再调用obj.wait()让当前线程处于等待状态,然后另一消息监听线程等到服 务端结果来了后,再map.get(ID)找到obj,再用synchronized获取obj锁,再调用obj.notifyAll()唤醒前面处于等待状态的线程。

正如前面所说,Socket通信是一个全双工的方式,如果有多个线程同时进行远程方法调用,这时建立在client server之间的socket连接上会有很多双方发送的消息传递,前后顺序也可能是乱七八糟的,server处理完结果后,将结果消息发送给client,client收到很多消息,怎么知道哪个消息结果是原先哪个线程调用的?

答:使用一个ID,让其唯一,然后传递给服务端,再服务端又回传回来,这样就知道结果是原先哪个线程的了。

下面我们用一个精简的图来说明最重要的两种Invoker:服务提供Invoker和服务消费Invoker:

转载:https://blog.csdn.net/paul_wei2008/article/details/19355681

Dubbo:基本原理机制。相关推荐

  1. Dubbo基本原理机制

    分布式服务框架: 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连接和NIO异步 ...

  2. Dubbo基本原理与超时机制

    一. dubbo基本原理 –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连 ...

  3. Dubbo SPI机制学习总结(持续更新...)

    参考文章:Dubbo的SPI机制分析 首先来看看 Java SPI 的机制 Java SPI 起初是提供给厂商做插件开发用的,例如数据库驱动java.sql.Driver,市面上各种各样的数据库,不同 ...

  4. Dubbo SPI机制(上):一个普通的扩展类是如何加载的

    这一篇我们先不讲Dubbo中的具体业务逻辑,我们来打基础,聊一聊Dubbo中的SPI机制. Dubbo SPI是干啥的 了解一个技术,得先知道它是为了解决什么问题而产生的.那么Dubbo SPI是干什 ...

  5. Dubbo基本原理与机制

    1.什么是Dubbo Dubbo 是一款高性能.轻量级的开源 RPC 框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. 2.Dubbo依赖关系 1.服务消费者 ...

  6. Dubbo超时机制导致的雪崩连接

    Bug影响:Dubbo服务提供者出现无法获取Dubbo服务处理线程异常,后端DB爆出拿不到数据库连接池,导致前端响应时间异常飙高,系统处理能力下降,核心基础服务无法提供正常服务. ​Bug发现过程: ...

  7. Dubbo源码分析系列-深入Dubbo SPI机制

    导语   在之前的博客中介绍过关于Java中SPI的机制,也简单的分析了关于Java中SPI怎么去使用.SPI的全称Service Provider Interface,是一种服务发现机制.SPI的本 ...

  8. Dubbo源码分析系列之-深入Dubbo扩展机制

    导语:   在之前的博客中分析过Java的SPI机制,其实Dubbo的扩展点加载机制也是从JDK表中的SPI(Service Provider Interface)机制中开发而来,只不过在原生的基础上 ...

  9. 【dubbo源码解析】 --- dubbo spi 机制(@SPI、@Adaptive)详解

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 注意:dubbo 要求SPI扩展点的实现类必须要有一个无参构造,除了Wrapper实现类之外 文章目 ...

最新文章

  1. 干货!神经网络原来是这样和数学挂钩的
  2. CSS之定位布局(position,relative定位布局技巧)
  3. Tomcat的下载安装以及在eclipse中的配置
  4. c语言求n到m之间的素数和
  5. jq父级绑定事件的意义_js、jq事件绑定方式总结——以click事件为例
  6. PowerShell在SharePoint 2010自动化部署中的应用(1)--代码获取
  7. Commons Collections4 简单使用
  8. excel易用宝的修复
  9. 关于Android Pie(Android 9.0),你想知道的都在这了
  10. HTML期末作业-我的大学生活网页
  11. Git!从零开始用连接远程仓库!![全平台]
  12. 一文理解 JWT、JWS、JWE、JWA、JWK、JOSE
  13. android 更换桌面名称_更改安卓软件名称 android修改应用程序名称
  14. .NET Framework 类库——C#命名空间大全
  15. yolov5-6.0/6.1加入SE、CBAM、CA注意力机制(理论及代码)
  16. android 揭示动画_揭示自动驾驶汽车第4级和第5级的真实含义
  17. 微观经济学第六周作业(需求函数,收入效应与替代效应)
  18. p2p显示kad能连接 服务器未连接,P2P连不上kad网络怎么办
  19. a problem occurred with this webpage so it was reloaded
  20. 四月三十号OCP考试失败了- -!

热门文章

  1. 华为手机网络连接不可用怎么解决_李玫瑾:孩子沉迷手机怎么办?父母别打别骂,用这3招从根上解决...
  2. C++从Excel导入数据
  3. 第一节 常用组件 之 Expression 概述
  4. oracle分析函数——keep
  5. linux系统串口透传,基于CC2540的USB虚拟串口透传方案
  6. 基于单片机的数字万用表电压、电流、电阻设计-毕业课设资料
  7. 小区物业收费管理系统的实习报告
  8. Rides:基本操作与原理
  9. 数字时代,中国1436家农商行的业务困局和破局之道
  10. c语言如何实现软件抗干扰,单片机软件系统抗干扰设计