Dubbo分层

Dubbo框架运行主要分如下九层:

  1. 配置层:config
  2. 服务代理层:proxy
  3. 注册中心层:registry
  4. 路由层:cluster
  5. 监控层:monitor
  6. 远程调用层:protocol
  7. 信息交换层:exchange
  8. 网络传输层:transport
  9. 数据序列化层: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框架梳理的更多相关文章

  1. (转)dubbo框架基本分析

    原文地址: https://my.oschina.net/zhengweishan/blog/698591 Dubbo架构基本分析 1. dubbo简单介绍 1.1 dubbo是什么 dubbo是一个 ...

  2. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  3. 基于dubbo框架下的RPC通讯协议性能测试

    一.前言 Dubbo RPC服务框架支持丰富的传输协议.序列化方式等通讯相关的配置和扩展.dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC ...

  4. dubbo框架----探索-大型系统架构设计(图解)

    对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...

  5. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  6. [转载] 基于Dubbo框架构建分布式服务

    转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...

  7. Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例

    上三篇文章主要是解决了概念性的补充和学习,充分结合实战来深入理解 入门实例解析 第一:provider-提供服务和相应的接口 创建DemoService接口 package com.unj.dubbo ...

  8. 【Dubbo篇】--Dubbo框架的使用

    一.前述 Dubbo是一种提供高性能,透明化的RPC框架.是阿里开源的一个框架. 官网地址:http://dubbo.io/ 二.架构 组件解释: Provider: 提供者.发布服务的项目.Regi ...

  9. 基于Dubbo框架构建分布式服务(集群容错&负载均衡)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

随机推荐

  1. (九)会话跟踪技术之Cookie

    --部分摘自孤傲苍狼博客~ 一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再 ...

  2. 【已解决】HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

    [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (Http ...

  3. iOS面试-assign与retain

    assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等.        此标记说明设置器直接进行赋值,这也是默认值.在 ...

  4. Pychar调用远程编译器的环境配置

    版本:2019最新专业版

  5. vue中的.passive修饰符

    一.passive作用 详情请参考MDN(https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener)中 ...

  6. apache-phoenix-5.0.0-HBase-2.0-bin 登陆报错

    1.Error: org.apache.hadoop.hbase.DoNotRetryIOException: java.io.IOException: Unable to load configur ...

  7. springboot与shiro在html中使用shiro标签

    上一章讲环境搭建 springboot与shiro和mybatis和mysql 现在讲html中怎么使用shiro标签,这里是基于上一章讲的 在pom文件引入依赖 <dependency> ...

  8. 关于verilog实例化的介绍

    概念 当我们完成一个比较完整的系统的时候,通常需要编写一个Testbench来验证自己的设计的功能能否满足设计要求.在这个系统中通常会有一个top模块来连接那些小的模块,verilog通过实例化的方式 ...

  9. 一个简单的一个sql表遍历

    简单的一个sql表遍历 一般我们写储存过程或者其他sql语句的时候都会用到循环遍历数据,最常用的两种就是 1.游标 2.临时表+while 下面贴出示例代码 DECLARE @MinReLogID I ...

  10. 20191011-构建我们公司自己的自动化接口测试框架-Util的htmlreport模块

    生成htmlreport的模块是我在网上随意找的一个版本,主要生成的report包括接口名称,接口url,请求数据,响应数据,断言词,断言结果等 具体的htmlreport代码如下: # -*- en ...