不管是Dubbo仍是Dubbox,包括在以前《聊聊Dubbo(一):为什么选择》中介绍的其余框架,其本质都是远程调用框架,而对于远程调用若是没有分布式的需求,实际上是不须要用这么重的框架,只有在分布式的时候,才有Dubbo这样的分布式服务框架的需求,说白了就是个远程服务调用的分布式框架,其重点在于分布式的治理。那Dubbox这样的框架在分布式治理方面带来了哪些核心功能呢?html
对于以上的3个核心功能,Dubbo有涉及到哪些组件角色,来协做完成分布式治理的呢?算法
组件角色 | 说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次调和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明:服务器
- 服务容器Container负责启动,加载,运行服务提供者。
- 服务提供者Provider在启动时,向注册中心注册本身提供的服务。
- 服务消费者Consumer在启动时,向注册中心订阅本身所需的服务。
- 注册中心Registry返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
- 服务消费者Consumer,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
- 服务消费者Consumer和提供者Provider,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor。
上面介绍给出的都是抽象层面的组件关系,能够说是纵向的以服务模型的组件分析,其实Dubbo最大的特色是按照分层的方式来架构,使用这种方式可使各个层之间解耦合(或者最大限度地松耦合)。因此,咱们横向以分层的方式来看下Dubbo的架构,如图所示:网络
Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。架构
下面,结合Dubbo官方文档,咱们分别理解一下框架分层架构中,各个层次的设计要点:负载均衡
从上图能够看出,Dubbo对于服务提供方和服务消费方,从框架的10层中分别提供了各自须要关心和扩展的接口,构建整个服务生态系统(服务提供方和服务消费方自己就是一个以服务为中心的)。框架
根据官方提供的,对于上述各层之间关系的描述,以下所示:异步
- 在RPC中,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就能够完成非透明的RPC调用,而后在Invoker的主过程上Filter拦截点。
- 图中的Consumer和Provider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用Client和Server的缘由是Dubbo在不少场景下都使用Provider、Consumer、Registry、Monitor划分逻辑拓普节点,保持统一律念。
- 而Cluster是外围概念,因此Cluster的目的是将多个Invoker假装成一个Invoker,这样其它人只要关注Protocol层Invoker便可,加上Cluster或者去掉Cluster对其它层都不会形成影响,由于只有一个提供者时,是不须要Cluster的。
- Proxy层封装了全部接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用Proxy将Invoker转成接口,或将接口实现转成Invoker,也就是去掉Proxy层RPC是能够Run的,只是不那么透明,不那么看起来像调本地服务同样调远程服务。
- 而Remoting实现是Dubbo协议的实现,若是你选择RMI协议,整个Remoting都不会用上,Remoting内部再划为Transport传输层和Exchange信息交换层,Transport层只负责单向消息传输,是对Mina、Netty、Grizzly的抽象,它也能够扩展UDP传输,而Exchange层是在传输层之上封装了Request-Response语义。
- Registry和Monitor实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一块儿。
服务的注册与注销,是对服务提供方角色而言,那么注册服务与注销服务的时序图,如图所示:分布式
为了知足应用系统的需求,服务消费方的可能须要从服务注册中心订阅指定的有服务提供方发布的服务,在获得通知可使用服务时,就能够直接调用服务。反过来,若是不须要某一个服务了,能够取消该服务。下面看一下对应的时序图,如图所示:ide