`
starbhhc
  • 浏览: 657823 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

dubbo学习篇(一)

 
阅读更多

Dubbo的简介

 

Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000多个服务提供30多亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

 

产生背景

(1)当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。

并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

(2)当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

(3)接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?等等…

 

为了解决这些问题:

第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

 

 核心部分:

 

远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

 

能做什么?

 

透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容,详见后面描述。

总体架构

Dubbo的总体架构,如图所示:
dubbo-architecture
Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。
下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:

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

从上图可以看出,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实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。

从上面的架构图中,我们可以了解到,Dubbo作为一个分布式服务框架,主要具有如下几个核心的要点:

服务定义
服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。

服务注册
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:

  • Multicast注册中心
  • Zookeeper注册中心
  • Redis注册中心
  • Simple注册中心

服务监控
无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。

远程通信与信息交换
远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:

  • Mina
  • Netty
  • Grizzly

服务调用
下面从Dubbo官网直接拿来,看一下基于RPC层,服务提供方和服务消费方之间的调用关系,如图所示:
dubbo-relation
上图中,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。上述图所描述的调用流程如下:

  1. 服务提供方发布服务到服务注册中心;
  2. 服务消费方从服务注册中心订阅服务;
  3. 服务消费方调用已经注册的可用服务

接着,将上面抽象的调用流程图展开,详细如图所示:
dubbo-extension

注册/注销服务
服务的注册与注销,是对服务提供方角色而言,那么注册服务与注销服务的时序图,如图所示:
dubbo-export

服务订阅/取消
为了满足应用系统的需求,服务消费方的可能需要从服务注册中心订阅指定的有服务提供方发布的服务,在得到通知可以使用服务时,就可以直接调用服务。反过来,如果不需要某一个服务了,可以取消该服务。下面看一下对应的时序图,如图所示:
dubbo-refer

协议支持
Dubbo支持多种协议,如下所示:

  • Dubbo协议
  • Hessian协议
  • HTTP协议
  • RMI协议
  • WebService协议
  • Thrift协议
  • Memcached协议
  • Redis协议

在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。

参考补充
Dubbo以包结构来组织各个模块,各个模块及其关系,如图所示:
dubbo-modules
可以通过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容器去加载服务。

 

 

 

分享到:
评论

相关推荐

    dubbo精品课程-基础篇

    《Dubbo精品课程-基础篇》是一门专为IT专业人士设计的深度学习课程,主要针对Apache Dubbo这一高性能、轻量级的Java RPC框架。Dubbo是阿里巴巴开源的一款优秀服务框架,广泛应用于分布式系统开发中,它能有效地解决...

    Dubbo高级视频教程

    - **Dubbo简介**:Dubbo是一款高性能、轻量级的开源Java RPC框架,旨在为服务治理提供简单、全面的解决方案。 - **分布式系统概念**:分布式系统是由多台计算机组成的系统,这些计算机通过网络进行通信并协同完成...

    Dubbo视频教程--高级篇--第24节--简易版支付系统介绍

    ### Dubbo视频教程--高级篇--第24节--简易版支付系统介绍知识点 #### 1. Dubbo框架与分布式系统架构 Dubbo是一款高性能、轻量级的Java RPC框架,由阿里巴巴开源。它提供了高可用的服务治理能力,在分布式系统中尤为...

    Dubbo学习专题.pdf

    【Dubbo学习专题】 Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心功能:服务治理、远程调用、集群容错。本篇将详细讲解Dubbo的一些关键知识点。 1. **Zookeeper作为注册中心** 当Dubbo使用...

    Java学习之Dubbo+ZooKeeper分布式服务Demo

    在之前的一个《Java学习之SpringBoot整合SSM Demo》分享中说到搭建ZooKeeper和Dubbo分布式框架中遇到了一些技术问题没能成功,只分享了其中的一个中间产物,那就是大家看到的《Java学习之SpringBoot整合SSM Demo》...

    dubbo高可用架构篇代码

    本压缩包文件“dubbo高可用架构篇代码”提供了关于如何实现Dubbo集群,以及通过ActiveMQ集群和Redis实现session共享的示例代码,这对于理解和实践相关技术非常有价值。 首先,我们来深入探讨Dubbo的高可用性架构。...

    Dubbo视频教程--基础篇源代码6-10

    通过这四节视频教程,学习者可以逐步了解和掌握Dubbo的基本用法,包括服务提供、服务消费、部署和监控,从而为后续深入学习Dubbo的高级特性打下坚实的基础。同时,了解Maven、Linux和Tomcat的相关知识,也对提升Java...

    dubbo的.xsd文件分享

    本篇文章将深入探讨`dubbo.xsd`文件及其在Dubbo中的作用,旨在帮助读者理解Dubbo的服务治理机制。 首先,`dubbo.xsd`是Dubbo项目的核心配置文件之一,它定义了Dubbo服务的各种配置元素和属性。通过这个文件,开发者...

    dubbo博客资源文件

    【标题】"dubbo博客资源文件"所对应的...总之,这篇博客深入浅出地介绍了Dubbo的核心概念和使用方法,并结合相关资源文件提供了一个实践性的学习路径,对于想要了解和掌握Dubbo的开发者来说,是非常有价值的参考资料。

    Dubbo视频教程--高可用架构篇

    【标签】"Dubbo视频"表示这是一个以视频形式呈现的教程,更直观地展示了Dubbo的使用方法和实践案例,适合希望通过实战操作来学习和理解Dubbo的开发者。 【压缩包子文件的文件名称列表】中,我们可以看到以下几个...

    Dubbo视频教程--基础篇--第02节--使用Dubbo对传统工程进行服务化改造.rar

    在本节"Dubbo视频教程--基础篇--第02节--使用Dubbo对传统工程进行服务化改造"中,我们将深入探讨如何利用Dubbo这一强大的Java开源框架来重构和优化传统的软件工程项目,使其具备微服务架构的优势。Dubbo是阿里巴巴...

    Dubbo视频教程--基础篇--第01节--使用Dubbo对传统工程进行服务化改造的思路介绍--工程源码

    在本节"Dubbo视频教程--基础篇--第01节"中,我们将深入探讨如何使用Dubbo这一流行的Java微服务框架对传统的工程进行服务化改造。这个教程将为初学者提供一个清晰的思路,帮助他们理解如何有效地利用Dubbo来解耦应用...

    dubbo基础到高级全篇

    Dubbo分布式服务基础入门、高级进阶,ZooKeeper注册中心集群,提供教程中的所有文档、源码,并有学员群提供学习交流和技术服务支持

    win下dubbo环境

    本篇将详细介绍在Windows 10系统中如何配置和使用Dubbo环境,以及如何利用提供的dubbo-admin管理控制台进行服务管理。 首先,我们需要理解Dubbo的基本架构。Dubbo由服务提供者(Provider)、服务消费者(Consumer)、...

    dubbo基础篇

    现在分布式技术比较潮流,面试、开发工作中都会被问到或者被用到,这里分享dubbo基础篇视频教程的百度云下载链接,方便大家学习。高级篇另外分享。

    我的dubbo demo

    【标题】"我的dubbo demo" 是一个个人保留的Dubbo示例项目,它旨在帮助开发者更好地理解和使用Dubbo框架。Dubbo是中国阿里巴巴开源的一款高性能、轻量级的服务治理框架,它提供了服务注册、服务发现、调用链路监控、...

    dubbo应用实例源码工程

    【描述】中的链接指向了CSDN博主penguhao的一篇文章,该文章详细解释了这个dubbo应用实例的具体实现和使用方法。通过阅读这篇文章,开发者可以学习到如何配置和启动Dubbo服务,以及如何进行服务调用和服务治理。 在...

    2018最新Dubbo视频教程

    根据提供的文件信息,本篇文章将围绕“2018最新Dubbo视频教程”这一主题进行深入探讨,并结合其描述及部分标签内容展开详细介绍。 ### Dubbo简介 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了一整套...

    Dubbo调用java接口程序

    本篇文章将深入讲解如何使用Dubbo进行Java接口的调用。 首先,理解Dubbo的核心概念: 1. **服务(Service)**:服务是业务逻辑的封装,它定义了服务的接口和协议,如`HelloService`,包含了一组`sayHello`这样的...

    Dubbo入门---搭建一个最简单的Demo框架

    【描述】:这篇博客通过一个简单的实例,引导读者了解如何入门Dubbo框架的使用。它可能是以创建一个包含服务提供者和服务消费者的基本项目为背景,逐步讲解了Dubbo的配置与运行流程。 【标签】:“源码”和“工具”...

Global site tag (gtag.js) - Google Analytics