一、Dubbo的设计角色

(1)系统角色
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。1
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
(2)调用关系
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
二、Dubbo是如何架构的

Dubbo的总体架构如图所示:

框架分层架构中,各个层次的设计要点:
服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。
远程调用层(Protocol):封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
三、Dubbo的底层实现

(1)协议支持
Dubbo支持多种协议,如下所示:
Dubbo协议 Hessian协议
HTTP协议 RMI协议
WebService协议
Thrift协议 Memcached协议 Redis协议
在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。
(2)默认使用Dubbo协议
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串
使用场景:常规远程服务方法调用
从上面的适用范围总结,dubbo适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。
(3)Dubbo源码模块图
Dubbo以包结构来组织各个模块,各个模块及其关系,如图所示:

可以通过Dubbo的代码(使用Maven管理)组织,与上面的模块进行比较。简单说明各个包的情况:
dubbo-common 公共逻辑模块,包括Util类和通用模型。
dubbo-remoting 远程通讯模块,相当于Dubbo协议的实现,如果RPC用RMI协议则不需要使用此包。
dubbo-rpc 远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
dubbo-cluster 集群模块,将多个服务提供方伪装为一个提供方,包括:负载均衡、容错、路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。
dubbo-registry 注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。
dubbo-monitor 监控模块,统计服务调用次数,调用时间的,调用链跟踪的服务。
dubbo-config 配置模块,是Dubbo对外的API,用户通过Config使用Dubbo,隐藏Dubbo所有细节。
dubbo-container 容器模块,是一个Standalone的容器,以简单的Main加载Spring启动,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。
四、服务暴露和消费的详细过程

(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)。
注:加群要求 学习交流群:450936584

群内每天会分享最新的视频和资料,可以免费领取学习视频和资料

1、想学习JAVA这一门技术, 对JAVA感兴趣,想从事JAVA工作的。
2、工作0-5年,感觉自己技术不行,想提升的
3、如果没有工作经验,但基础非常扎实,想提升自己技术的。
4、还有就是想一起交流学习的。
5、小号加群一律不给过,谢谢。
转发此文章请带上原文链接,否则将追究法律责任!

2017年------阿里大神带你详解Dubbo架构设计相关推荐

  1. HDFS详解(架构设计、副本放置策略、读写流程、进程、常用命令等)

    前言:当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并存储到若干台单独的计算机上.管理网络中跨多台计算机存储的文件系统成为分布式文件系统(distrib ...

  2. win8音频服务器未响应,大神为你详解win8系统右键点击文件提示“未响应”的解决教程...

    近日有使用电脑的用户跟小编反映说win8系统右键点击文件提示"未响应"的问题,据小编了解,不是所有的用户都会解决win8系统右键点击文件提示"未响应"的问题,针 ...

  3. win7 更新android sdk,大神为你详解win7系统android sdk manager无法更新的处理对策

    随着电脑的使用率越来越高,我们有时候可能会遇到win7系统android sdk manager无法更新问题,如果我们遇到了win7系统android sdk manager无法更新的问题,要怎么处理 ...

  4. win7做成文件服务器拒绝,大神为你详解win7系统qq提示服务器拒绝了您发送离线文件的恢复步骤...

    win7系统是计算机学员最喜欢使用的电脑系统,却有一些学员在操作过程中应该会面临对win7系统qq提示服务器拒绝了您发送离线文件进行布置的情景.几乎所有的初学者计算机知识还很薄弱,关于win7系统qq ...

  5. 王者荣耀10连胜,竟然也有人不相信,猎游大神带菜鸡玩家10连胜

    如果一局游戏一个人头都没有获得,甚至还送了几个人头,这一局游戏大家知道是胜利还是惨败?很多玩家都知道遇到这样的情况,这一局游戏基本上没有戏了,那就是根本不可能有太大的可能再获得胜利,特别是前期敌人顺风 ...

  6. 大神带飞————动态生成对象并绑定父对象(绑定对象池中的对象使自己成为对象池中对象的子对象)

    实例代码 using System.Collections; using System.Collections.Generic; using UnityEngine; public class New ...

  7. SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本. create table t0718 (idx in ...

  8. EFLS开源 | 阿里妈妈联邦学习解决方案详解

    ▐ 项目背景 移动互联网时代出于隐私保护和数据安全,APP 之间的开放与互联越来越少,使大量的信息孤岛逐渐形成,限制了信息技术更好地服务广大用户的能力.2016年 Google 提出了以保护终端隐私为 ...

  9. 斯坦福NLP名课带学详解 | CS224n 第15讲 - NLP文本生成任务(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

最新文章

  1. 微信小程序----调用用户信息
  2. ApiCloud云端管理平台(v.20151022)
  3. ZOJ 3829 Known Notation(贪心)题解
  4. SSIS中的容器和数据流—调试工具数据视图
  5. Tengine HTTPS原理解析、实践与调试
  6. 转:在RHEL5系统中搭建iSCSI存储服务器
  7. node --- 使用koa-router,让后端模块化
  8. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇
  9. 给你安利一款国产良心软件uTools
  10. 微信公众号开发之配置开发服务器
  11. 【网页设计自习室#005】网页页面中banner海报设计
  12. (转)loff_t *ppos是什么东东
  13. Get rid of annoying security alerts in Microsoft Outlook!
  14. 记录-吴军《硅谷来信》有感
  15. SAP - MM - 第2篇 - 物料主数据维护
  16. 561.Array Partition I--Python
  17. 小小Python爬虫一
  18. 我所参加的最贵的培训
  19. 【signal】傅里叶分析和FFT蝶形算法
  20. 计算机组装与维修教材分析,《计算机的硬件组成》说课稿.doc

热门文章

  1. Spring 2.X 中AOP的简明教程
  2. Drupal 使用 Views 模块时,提示 Requires: Ctools (missing) 解决办法
  3. 吴恩达深度学习笔记(四)—— 正则化
  4. socket.io 中文手册 socket.io 中文文档
  5. 洛谷P2342-叠积木
  6. Java中的三目运算符可能出现的问题
  7. Nginx初体验(一):nginx介绍
  8. DP专题训练之HDU 1087 Super Jumping!
  9. 关于MySQL相关的查看显示信息:
  10. windows PHP Cli模式下配置