dubbo框架梳理
Dubbo分层
Dubbo框架运行主要分如下九层:
- 配置层:config
- 服务代理层:proxy
- 注册中心层:registry
- 路由层:cluster
- 监控层:monitor
- 远程调用层:protocol
- 信息交换层:exchange
- 网络传输层:transport
- 数据序列化层:serialize
下面对于其中一些层结合provider和consumer进行讲解
1.配置层:config

Provider端:
由服务配置类ServiceConfig进行初始化工作及服务暴露
ServiceConfig.export();
Consumer端:
所有的dubbo引用服务均由ReferenceConfig进行服务的引用
ReferenceConfig.get();-->ReferenceConfig.init();
2.服务代理层:proxy
服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
Consumer端:
ReferenceConfig.get();-->ReferenceConfig.init();-->ReferenceConfig.createProxy(map)-->AbstractProxyFactory.getProxy(invoker)-->JavassistProxyFactory.getProxy(invoker,interfaces)生成客户端的代理
Provider端:
ServiceConfig.doExport();-->ServiceConfig.doExportUrls()-->ServiceConfig.doExportUrlsFor1Protocol()-->ServiceConfig.exportLocal(url)-->StubProxyFactoryWrapper.getInvoker(proxy,type,url)-->JavassistProxyFactory.getInvoker(proxy,type,url),生成服务端的代理
3.注册中心层:registry
封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。

Provider和consumer端都会将数据注册到zookeeper上
数据目录如下:

根目录为dubbo
子目录为服务目录
服务目录下面分为4个子目录
Consumers:存储所有的消费者的信息,如下以URLEncode进行编码,包括服务接口名,组名,消费者的地址,所有的方法信息等
consumer%3A%2F%2F10.128.31.78%2Fcom.pajk.unicorn.api.service.PageService%3Fapplication%3Dteemo%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.5.3.6%26interface%3Dcom.pajk.unicorn.api.service.PageService%26methods%3DgetPitById%2CupdatePage%2CupdatePit%2CgetModulesByNameAndType%2CgetSecKillPageById%2CgetPageByName%2CgetModuleById%2CcopyModule%2CgetModuleByIds%2CgetPitsByModuleId%2CgetPages%2CgetPageById%2CupdateModule%26pid%3D29900%26retries%3D0%26revision%3DPROD%26side%3Dconsumer%26timeout%3D5000%26timestamp%3D1471569139207%26version%3DPROD
providers:存储所有的服务提供者的信息,如下以URLEncode进行编码,包括服务接口名,组名,服务提供者的地址,所有的方法信息等
dubbo%3A%2F%2F10.128.22.36%3A20880%2Fcom.pajk.unicorn.api.service.PageService%3Fanyhost%3Dtrue%26application%3Dunicorn%26dubbo%3D2.5.3.6%26interface%3Dcom.pajk.unicorn.api.service.PageService%26methods%3DgetPitById%2CupdatePage%2CgetModulesByNameAndType%2CupdatePit%2CgetSecKillPageById%2CgetPageByName%2CgetModuleById%2CgetModuleByIds%2CcopyModule%2CgetPitsByModuleId%2CgetPageById%2CgetPages%2CupdateModule%26pid%3D23597%26retries%3D0%26revision%3D1.2.3%26side%3Dprovider%26timestamp%3D1473343882590%26version%3DPROD
routers:路由目录,是存储的所有的路由信息,同样以URLEncode进行编码
路由目前有如下两种形式分别是条件路由、脚本路由
条件路由地址如下:condition://0.0.0.0/com.pajk.unicorn.api.service.PageService
脚本路由地址如下:script://0.0.0.0/com.pajk.unicorn.api.service.PageService
Configurators:是存在的一些配置信息,比如服务接口的禁用信息,服务的降级信息等,这些信息是通过dubbo控制台进行服务治理时(服务的降级,禁用,服务的mock等)生成的一些信息会写入到该目录下
Consumer端:
ReferenceConfig.createProxy()-->RegistryProtocol.refer()-->RegistryProtocol.doRefer()-->FailbackRegistry.register(url);首先注册consumer的信息到zookeeper上
RegistryProtocol.doRefer()-->FailbackRegistry.subscribe();向服务器发送订阅请求
Provider端:
ServiceConfig.doExport();-->ServiceConfig.doExportUrls()-->ServiceConfig.doExportUrlsFor1Protocol()-->RegistryProtocol.export(originInvoker)-->FailbackRegistry.register(url);注册provider的信息到zookeeper上
下面讲一下zookeeper的通知:
ZkclientZookeeperClient.stateChanged(state)通知所有的监听
下面以FailbackRegistry描述一下通知
FailbackRegistry.notify(url, listener, urls)-->AbstractRegistry.notify()-->RegistryDirectory.notify();会根据的通知内容,进行router、configurator、invokerUrl的刷新
RegistryDirectory.notify()-->RegistryDirectory.refreshInvoker(invokerUrls),该方法会判断是否需要销毁当前的调用,或者根据下发的override规则或者route规则进行引用的重新刷新,并且关闭未使用的invoker
4.路由层:cluster(集群)
封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。

首先是初始时会先从zookeeper读取路由信息
ReferenceConfig.createProxy()-->RegistryDirectory.init()-->-AbstractDirectory().init()-->AbstractDirectory.setRouters()
调用时,会进行路由匹配
MockClusterInvoker.invoker()-->AbstractClusterInvoker.invoke(invocation)-->AbstractCluster.list(invocation)
5.监控层:monitor
RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。
主要是通过filter过滤每一个请求,并且进行信息采集,并且汇总一分钟内的数据,定时发送给监控服务
6.远程调用层:protocol
封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
Provider端:
ServiceConfig.doExport();-->ServiceConfig.doExportUrls()-->ServiceConfig.doExportUrlsFor1Protocol()-->RegistryProtocol.export(originInvoker)-->RegistryProtocol.doLocalExport()-->DubboProtocol.export()-->DubboProtocol.openServer()-->DubboProtocol.createServer(url)这里会进行服务的创立
Consumer端:
ReferenceConfig.createProxy()-->RegistryProtocol.refer()-->RegistryProtocol.doRefer()-->DubboProtocol.refer()-->DubboProtocol.getClients()-->DubboProtocol.getSharedClient(),默认配置,这里是获取共享连接,公用一个通道
7信息交换层:exchange
封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
在这一层主要有两个类HeaderExchangeServer和HeaderExchangeClient,进行消息的发送和接收
8.网络传输层:transport
抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
Provider:
ServiceConfig.doExport();-->ServiceConfig.doExportUrls()-->ServiceConfig.doExportUrlsFor1Protocol()-->RegistryProtocol.export(originInvoker)-->RegistryProtocol.doLocalExport()-->DubboProtocol.export()-->DubboProtocol.openServer()-->DubboProtocol.createServer(url)-->NettyTrasporter.bind(),生成一个NettyServer
另对于provider端的线程池是FixedThreadPool,默认线程是200
Consumer:
ReferenceConfig.createProxy()-->RegistryProtocol.refer()-->RegistryProtocol.doRefer()-->DubboProtocol.refer()-->DubboProtocol.getClients()-->DubboProtocol.getSharedClient()-->NettyTransporter.connect(),生成一个NettyClient()
另对于consumer端的线程池是CachedThreadPool,默认线程存活时间是1分钟
在这一层是利用的第三方框架netty
9.数据序列化层:serialize
可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
序列化层统一用的是第三方序列化框架hession。
dubbo框架梳理的更多相关文章
- (转)dubbo框架基本分析
原文地址: https://my.oschina.net/zhengweishan/blog/698591 Dubbo架构基本分析 1. dubbo简单介绍 1.1 dubbo是什么 dubbo是一个 ...
- 基于Dubbo框架构建分布式服务(一)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- 基于dubbo框架下的RPC通讯协议性能测试
一.前言 Dubbo RPC服务框架支持丰富的传输协议.序列化方式等通讯相关的配置和扩展.dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC ...
- dubbo框架----探索-大型系统架构设计(图解)
对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...
- 基于Dubbo框架构建分布式服务
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- [转载] 基于Dubbo框架构建分布式服务
转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
上三篇文章主要是解决了概念性的补充和学习,充分结合实战来深入理解 入门实例解析 第一:provider-提供服务和相应的接口 创建DemoService接口 package com.unj.dubbo ...
- 【Dubbo篇】--Dubbo框架的使用
一.前述 Dubbo是一种提供高性能,透明化的RPC框架.是阿里开源的一个框架. 官网地址:http://dubbo.io/ 二.架构 组件解释: Provider: 提供者.发布服务的项目.Regi ...
- 基于Dubbo框架构建分布式服务(集群容错&负载均衡)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
随机推荐
- 123456123456#0#-----com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
- SUBMIT标准程序取ALV数据
示例1: 调用J3RFLVMOBVEDH ,取物料的期初/ 期末庫存数.金额 FORM frm_call_j3rflvmobvedh. DATA: lr_bukrs TYPE RANGE OF buk ...
- js 加法
使用Number()函数可以解决这个问题,如下 var c = Number(a) + Number(b) 这样c得出来的解果是3,
- vmware安装centos7.5、配置网卡、环境配置
1.vmware安装centos7.5虚拟机 参考连接: https://blog.csdn.net/guo_ridgepole/article/details/78973763 可能遇到的问题 ...
- iOS面试题超全!
之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Cat ...
- Ext.jsTree 向子节点添加叶子节点
// 定义搜索节点树结构Store const nodeStore = Ext.create('Ext.data.TreeStore', { autoLoad : true, id : 'nodeSt ...
- 【VS开发】【C++开发】const在函数前与函数后的区别
const在函数前与函数后的区别 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b = ...
- 【VS开发】【CUDA开发】如何在MFC中调用CUDA
如何在MFC中调用CUDA 有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序.我们参考罗振东iylzd@163.com ...
- windows下进程与线程
windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行.进程是应用程序的运行实例,可以理解为应用程序的一次动态执行:而线程是CPU调度的单位,是进程的一个执 ...
- Andrew Ng机器学习课程14
Andrew Ng机器学习课程14 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言:主要介绍了当数据量不足,利用EM算法对混合高斯模型进行建模时数据量比 ...