Dubbo :是一个RPC框架,SOA框架:

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

作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!
作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并且订阅configurators,服务消费端订阅provide,configurators,routers,订阅变更时,zk会推送providers,configuators,routers,启动时注册长连接,进行通讯!proveider和provider启动后,后台启动定时器,发送统计数据到monitor(监控中心)!提供各种容错机制和负载均衡策略!!

我们解释以下这个架构图:https://yq.aliyun.com/articles/38380

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

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

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

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

netty 是什么?

“netty 是一个基于nio的客户、服务器端编程框架,netty提供异步的,事件驱动的网络应用程序框架和工具,可以快速开发高可用的客户端和服务器。

netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。

二、dubbo原理?

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

四、服务暴露和消费的详细过程

(1)服务提供者暴露一个服务的详细过程

服务提供者暴露服务的主过程:

首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过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来实现RMI服务,通讯细节这一块由JDK底层来实现,这就省了不少工作量。

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

服务消费的主过程:

首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。

接下来把Invoker转换为客户端需要的接口(如:HelloWorld)。

Spring - Dubbo的底层实现原理和机制相关推荐

  1. Dubbo的底层实现原理和机制

    Dubbo :是一个RPC框架,SOA框架: Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 作为RPC:支持各种 ...

  2. Spring框架(一) 底层核心原理解析

    感兴趣的话大家可以关注一下公众号 : 猿人刘先生 , 欢迎大家一起学习 , 一起进步 , 一起来交流吧! 说明 本系列文章以spring-framework-5.3.10为例 , 本篇文章的目的就是使 ...

  3. 面试官:兄弟,说说 Spring Cloud 的底层架构原理吧

    ❤ Java极客技术,你值得星标的公众号 分布式系统面试系列02-Spring Cloud 的底层架构原理,前面我们讲了 前面我们讲了一个以Spring Cloud 技术栈实现的分布式系统,至少得包含 ...

  4. 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象

    一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...

  5. Spring学习篇底层核心原理解析

    说明 本系列文章以spring-framework-5.3.10为例 ,本篇文章的目的就是使各位读者能在使用Spring的基础上对Spring的一些比较核心的内容有一个大概的认识,并不是特别全面,会在 ...

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

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

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

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

  8. Dubbo 原理和机制详解

    Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案.作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利. 1. Dubbo核心功能 Dubbo主要提供 ...

  9. Dubbo原理和机制详解(非常全面)

    Dubbo是一款Java RPC框架,致力于提供高性能的RPC远程服务调用方案.Dubbo 作为主流的微服务框架之一,为开发人员带来了非常多的便利. 本文我们重点详解 Dubbo 的原理机制 @mik ...

最新文章

  1. 从csv文件批量创建AD用户,带源码。
  2. 大屏难看怎么办?这份大屏制作教程请收好
  3. Towards Efficient Privacy-Preserving Inspection of TLS Encrypted Traffic
  4. yum 安装vsftp_CentOS 8.1 配置vsftp和yum
  5. 梅姐为什么没能拯救雅虎?
  6. python属于哪种类型_下列哪种类型是Python的列表类型?
  7. 最新消息:原谷歌中国副院长刘骏任职人民搜索首席科学家
  8. pc端MNIST数据集pytorch模型CNN网络转换为onnx部署树莓派4B和神经棒NCS2(使用openvino2021框架)
  9. 叶俊:从佛说法制的十大好处谈到企业的制度与人情
  10. TP5.1实现数组内容的分页和数据渲染
  11. windows 连接蓝牙耳机失败 解决方法
  12. vue中引用高德地图根据经纬度计算两地距离
  13. 用netstat -ano查看本机端口详解
  14. 3dsmax-uv展开
  15. obs多推流地址_微信小程序直播电脑端OBS推流直播教程
  16. 面向AI 的数据生态系统
  17. 微软专家教你,如何搞定树莓派 AI 服务开发
  18. 深度解析|硬盘协议大全,终于搞明白SCSI、IDE、FC、SATA……
  19. 【iHMI43 4.3寸液晶模块】demo竖屏例程(版本1.01)发布
  20. sqlyog详细安装流程

热门文章

  1. python中print格式化输出%g_python怎么格式化输出
  2. hexo 设置多级目录,相关总结
  3. “滑动窗口”算法详解
  4. 什么是DICOM以及DICOM如何运作
  5. python编写程序输出斐波那契数列的前20项_C语言 写程序,输出斐波那契数列的前20项,每行输出4个数...
  6. 开学必备清单好物大合集!超适合学生党开学的实用好物大全
  7. rides雪崩和rides穿透学习
  8. select2通过全拼及首字母匹配汉字
  9. tomcat配置详解
  10. C语言丨输出字符的ASCII码