一、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原理_dubbo的底层原理相关推荐

  1. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  2. 底层原理_Spring框架底层原理IoC

    一.概述 Spring是一个轻量级的开源JavaEE框架 Spring可以解决企业应用开发的复杂性 Spring两大核心部分:IoC和AOP 特点: 方便解耦,简化开发 AOP编程支持 方便程序测试 ...

  3. synchronized原理_synchronized 关键字底层原理

    synchronized 关键字底层原理属于 JVM 层面. ① synchronized 修饰同步语句块 public class SynchronizedDemo {public void met ...

  4. java map原理_Java HashMap底层原理分析

    前两天面试的时候,被面试官问到HashMap底层原理,之前只会用,底层实现完全没看过,这两天补了补功课,写篇文章记录一下,好记性不如烂笔头啊,毕竟这年头脑子它记不住东西了哈哈哈.好了,言归正传,今天我 ...

  5. spring 学习—spring 的ioc底层原理(02)

    IOC的底层原理 1.ioc底层原理使用技术 (1) xml配置文件 (2) dom4j 解决xml (3)工厂设计模式 (4)反射 什么叫做耦合度太高了:就是关联度太紧密了 高内聚与低耦合 高内聚: ...

  6. Java集合—HashMap底层原理

    原文链接:最通俗易懂搞定HashMap的底层原理 HashMap的底层原理面试必考题.为什么面试官如此青睐这道题?HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好o ...

  7. Java CAS底层原理

    Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...

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

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

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

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

最新文章

  1. Fedora 7 播放器totem
  2. 四大主流BI工具比较
  3. 程序员最讨厌的9句话,你可有补充? 1
  4. 在Kubernetes中使用Sateful Set部署Redis
  5. oracle 11g初始段大小,Oracle 11g配置调优,一般需要注意哪些方面呢?
  6. 信息学奥赛一本通(1070:人口增长)
  7. mysql5驱动_技术分享 | MySQL 8 和 MySQL 5.7 在小型设备的内存消耗分析
  8. 四个角不是直角的四边形_同步资料人教版四上数学第五单元平行四边形和梯形5.1...
  9. 用户组培训资料和资源
  10. CRM中多张关联表join的报表
  11. Foundation框架: 6.NSString的创建和导出
  12. ARP防火墙 (防如网络执法官、网络剪刀手、局域网终结者限制本机网速)
  13. 蚂蚁课堂视频笔记思维导图-3期 十、分布式解决方案
  14. Building Trustworthy Semantic Webs
  15. 金融衍生品软件产品设计必备知识——外汇相关知识
  16. 微软商店打不开,错误代码0x80131500
  17. 黑白照片转换成彩色照片(无需任何编程)
  18. 团队开发工具之一——Wiki
  19. Teach yourself Programing in Ten Years(翻译+原文链接)
  20. 深入浅出Linux操作系统指令与目录结构(二)

热门文章

  1. 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚
  2. wps图表xy轴颠倒_用EXCEL来搞艺术之图表类型变换
  3. 使用Mac终端设置alias常用别名,以git提交为例
  4. 从零开始学keras之卷积神经网络介绍
  5. 山东大学2021-2022学年校历
  6. java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
  7. python制作物联网控制软件下载_Python+树莓派制作IoT(物联网)门控设备
  8. python制作射击游戏_零基础用Python开发的第一个小游戏——太空射击
  9. multisim高频小信号放大器_什么是放大器及其用处_光纤传感器_传感器
  10. 设计模式(二)--里氏替换原则(Java的继承规范)