一、Duboo基本概念解释

Dubbo是一种分布式服务框架。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现负载均衡。因此,dubbo除了可以提供服务之外,还可以实现软负载均衡。它还提供了两个功能Monitor 监控中心和调用中心。这两个是可选的,需要单独配置。

Dubbo的计数架构图如下:

我们解释以下这个架构图:

Consumer服务消费者,Provider服务提供者。Container服务容器。消费当然是invoke提供者了,invoke这条实线按照图上的说明当然同步的意思了,多说一句,在实际调用过程中,Provider的位置对于Consumer来说是透明的,上一次调用服务的位置(IP地址)和下一次调用服务的位置,是不确定的。这个地方就是实现了软负载。

服务提供者先启动start,然后注册register服务。

消费订阅subscribe服务,如果没有订阅到自己想获得的服务,它会不断的尝试订阅。新的服务注册到注册中心以后,注册中心会将这些服务通过notify到消费者。

Monitor这是一个监控,图中虚线表明Consumer 和Provider通过异步的方式发送消息至Monitor,Consumer和Provider会将信息存放在本地磁盘,平均1min会发送一次信息。Monitor在整个架构中是可选的(图中的虚线并不是可选的意思),Monitor功能需要单独配置,不配置或者配置以后,Monitor挂掉并不会影响服务的调用。

二、dubbo原理

本篇博客的内容总体上比较抽象,如果一个想马上使用dubbo的同学来说,读这篇博客效果不太好,本篇博客没有写怎么使用、配置dubbo,接下来,我再令写一篇dubbo入门包含demo的博客。

I、初始化过程细节:
上图中的第一步start,就是将服务装载容器中,然后准备注册服务。和Spring中启动过程类似,spring启动时,将bean装载进容器中的时候,首先要解析bean。所以dubbo也是先读配置文件解析服务。
解析服务:
1)、基于dubbo.jar内的Meta-inf/spring.handlers配置,spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler类。
2)、所有的dubbo标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
源码截图:
在ServiceConfig.export 或者ReferenceConfig.get 初始化时,将Bean对象转会为url格式,将所以Bean属性转成url的参数。
然后将URL传给Protocol扩展点,基于扩展点的Adaptive机制,根据URL的协议头,进行不同协议的服务暴露和引用。
暴露服务:

a、 只暴露服务端口

在没有使用注册中心的情况,这种情况一般适用在开发环境下,服务的调用这和提供在同一个IP上,只需要打开服务的端口即可。
即,当配置 or
ServiceConfig解析出的URL的格式为:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0
基于扩展点的Adaptiver机制,通过URL的“dubbo://”协议头识别,直接调用DubboProtocol的export()方法,打开服务端口。

b、向注册中心暴露服务:

和上一种的区别:需要将服务的IP和端口一同暴露给注册中心。
ServiceConfig解析出的url格式为:
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(“dubbo://service-host/com.xxx.TxxService?version=1.0.0”)

基于扩展点的Adaptive机制,通过URL的“registry://”协议头识别,调用RegistryProtocol的export方法,将export参数中的提供者URL先注册到注册中心,再重新传给Protocol扩展点进行暴露:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

引用服务:

a、直接引用服务:

在没有注册中心的,直连提供者情况下,
ReferenceConfig解析出的URL格式为:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

基于扩展点的Adaptive机制,通过url的“dubbo://”协议头识别,直接调用DubboProtocol的refer方法,返回提供者引用。

b、从注册中心发现引用服务:

此时,ReferenceConfig解析出的URL的格式为:
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)

基于扩展点的Apaptive机制,通过URL的“registry://”协议头识别,就会调用RegistryProtocol的refer方法,基于refer参数总的条件,查询提供者URL,如:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

基于扩展点的Adaptive机制,通过提供者URL的“dubbo://”协议头识别,就会调用DubboProtocol的refer()方法,得到提供者引用。
然后RegistryProtocol将多个提供者引用,通过Cluster扩展点,伪装成单个提供这引用返回。

三、远程调用细节:

服务提供者暴露一个服务的详细过程:

上图是服务提供者暴露服务的主过程:
首先ServiceConfig类拿到对外提供服务的实际类ref,然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到invoker的转化。接下来就是Invoker转换到Exporter的过程。
Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,下面我们以Dubbo和rmi这两种典型协议的实现来进行说明:
Dubbo的实现:
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由dubbo自己实现。
Rmi的实现:
RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,他通过Spring或Dubbo或JDK来实现服务,通讯细节由JDK底层来实现。

服务消费者消费一个服务的详细过程

上图是服务消费的主过程:
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口即可。

dubbo的底层原理相关推荐

  1. cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...

    前言 平常我们在构建分布式系统的时候,一般都是基于 Dubbo 技术栈或者是SpringCloud 技术栈来做.早期其实最先比较流行的是Dubbo,我记得我们当时有个部分的老大就是用的是Dubbo 来 ...

  2. dubbo底层原理解析及安装应用

    0.dubbo安装 1.dubbo简介 2-0.Dubbo标签 2-1.xml方式配置dubbo 2-2.注解方式配置dubbo 2-3.Api方式配置Dubbo 2-4.springboot方式配置 ...

  3. Dubbo底层原理架构图

    今天和大家分享一下Dubbo底层原理的架构分析 首先看一张dubbo经典图: 简单分析流程图如下: 1.首先服务提供者会启动服务,然后将服务注册到服务注册中心. 2.服务消费者会定时拉取服务提供者列表 ...

  4. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  5. 拜托,面试请不要再问我 Spring Cloud Alibaba 底层原理

    大家好,今天给大家介绍一个非常热门的技术,同时也是面试的时候面试官特别喜欢问的一个话题,那就是SpringCloudAlibaba的底层原理. 现在大家都知道,SpringCloudAlibaba 风 ...

  6. 拜托,面试请不要再问我 SpringCloudAlibaba 底层原理

    大家好,今天给大家介绍一个非常热门的技术,同时也是面试的时候面试官特别喜欢问的一个话题,那就是SpringCloudAlibaba的底层原理. 小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+ ...

  7. 一直想学的Synchronized,原来是这样的底层原理

    Synchronized 不论是面试还是在日常的工作中都占据非常重要的位置,也是每个 Java程序猿在并发编程道路上必须迈过的坎.Synchronized往浅了问是一个简单的基础面试题,往深了问就是一 ...

  8. 底层原理计划--Java连环问之空城计

    核心 rocketmq redis 集合有哪些,有什么区别 ArrayList LinkedList Vector HashSet TreeSet HashMap LinkedHashMap Tree ...

  9. 没有与参数列表匹配的 重载函数 getline 实例_面试题:方法重载的底层原理?...

    前语:微信改版后,大量读者还没养成点赞的习惯,如写得好,望大家阅读后在右下边"好看"处点个赞,以示鼓励!长期坚持原创真的很不容易,多次想放弃,坚持是一种信仰,专注是一种态度. 关于 ...

最新文章

  1. 1、IO输入输出流 简介
  2. 分布式环境下的并发问题
  3. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的实现原理
  4. CSS样式表初始化代码
  5. vc6.0垃圾文件清理工具_干货 | 电脑清理宝典
  6. T-SQL DML学习笔记
  7. centos 下 r graphics绘图如何保存_如何选购一台合适的商务笔记本电脑
  8. CNSA与CASC和CASIC的区别
  9. 如何在TypeScript的`window`上显式设置新属性?
  10. 获取FileUpload上传的文件大小
  11. php mysql 模型_ThinkPHP数据库与模型
  12. 推荐几个不错的技术公众号
  13. k中心点聚类算法伪代码_数据分析之二分K均值聚类算法
  14. 计算单词的长度C++
  15. Eclipse频繁未响应
  16. QT从下载到安装的具体教程
  17. Week of 3.28
  18. 【Linux学习】权限
  19. 《途客圈创业记:不疯魔,不成活》一一2.12 Nanfang离职
  20. Mac下的plist纹理图切图工具(命令行)

热门文章

  1. C#中悲观锁和乐观锁
  2. mca允许安装任何来源
  3. 如何使用Redis实现电商系统的库存扣减
  4. [JSTL]标签的使用
  5. Python中的base64、base32实例
  6. 透明导航 html,导航栏(Nav) 全透明效果的一种另类实现
  7. 2022-2028年中国质量检验检测行业市场全景调查及投资潜力研究报告
  8. 如何用java让坦克发射子弹_java怎么制作坦克大战
  9. java基本语法——helloword
  10. QWERTY,QWERTZ和AZERTY