本文是做者根据官方文档以及本身平时的使用状况,对 Dubbo 所作的一个总结。若是不懂 Dubbo 的使用的话,能够参考个人这篇文章《超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务》html
Dubbo 官网:http://dubbo.apache.org/zh-cn/index.htmlvue
Dubbo 中文文档: http://dubbo.apache.org/zh-cn/index.htmljava
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。简单来讲 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。node
Dubbo 目前已经有接近 23k 的 Star ,Dubbo的Github 地址:https://github.com/apache/incubator-dubbo 。 另外,在开源中国举行的2018年度最受欢迎中国开源软件这个活动的评选中,Dubbo 更是凭借其超高人气仅次于 vue.js 和 ECharts 得到第三名的好成绩。git
Dubbo 是由阿里开源,后来加入了 Apache 。正式因为 Dubbo 的出现,才使得愈来愈多的公司开始使用以及接受分布式架构。github
咱们上面说了 Dubbo 其实是 RPC 框架,那么什么是 RPC呢?面试
什么是 RPC?算法
RPC(Remote Procedure Call)—远程过程调用,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。好比两个不一样的服务 A、B 部署在两台不一样的机器上,那么服务 A 若是想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 固然能够,可是可能会比较慢并且一些优化作的并很差。 RPC 的出现就是为了解决这个问题。数据库
RPC原理是什么?apache
我这里这是简单的提一下。详细内容能够查看下面这篇文章:
http://www.importnew.com/22003.html
下面再贴一个网上的时序图:
说了这么多,咱们为何要用 Dubbo 呢?
Dubbo 的诞生和 SOA 分布式架构的流行有着莫大的关系。SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分红服务层、表现层两个工程。服务层中包含业务逻辑,只须要对外提供服务便可。表现层只须要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。SOA架构中有两个主要角色:服务提供者(Provider)和服务使用者(Consumer)。
若是你要开发分布式程序,你也能够直接基于 HTTP 接口进行通讯,可是为何要用 Dubbo呢?
我以为主要能够从 Dubbo 提供的下面四点特性来讲为何要用 Dubbo:
另外,Dubbo 除了可以应用在分布式系统中,也能够应用在如今比较火的微服务系统中。不过,因为 Spring Cloud 在微服务中应用更加普遍,因此,我以为通常咱们提 Dubbo 的话,大部分是分布式系统的状况。
咱们刚刚提到了分布式这个概念,下面再给你们介绍一下什么是分布式?为何要分布式?
分布式或者说 SOA 分布式重要的就是面向服务,说简单的分布式就是咱们把整个系统拆分红不一样的服务而后将这些服务放在不一样的服务器上减轻单体服务的压力提升并发量和性能。好比电商系统能够简单地拆分红订单系统、商品系统、登陆系统等等,拆分以后的每一个服务能够部署在不一样的机器上,若是某一个服务的访问量比较大的话也能够将这个服务同时部署在多台机器上。
从开发角度来说单体应用的代码都集中在一块儿,而分布式系统的代码根据业务被拆分。因此,每一个团队能够负责一个服务的开发,这样提高了开发效率。另外,代码根据业务拆分以后更加便于维护和扩展。
另外,我以为将系统拆分红分布式以后不光便于系统扩展和维护,更能提升整个系统的性能。你想想嘛?把整个系统拆分红不一样的服务/系统,而后每一个服务/系统 单独部署在一台服务器上,是否是很大程度上提升了系统性能呢?
上述节点简单说明:
调用关系说明:
重要知识点总结:
图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头表明层之间的依赖关系,每一层均可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
各层说明:
先来个官方的解释。
维基百科对负载均衡的定义:负载均衡改善了跨多个计算资源(例如计算机,计算机集群,网络连接,中央处理单元或磁盘驱动的的工做负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具备负载平衡而不是单个组件的多个组件能够经过冗余提升可靠性和可用性。负载平衡一般涉及专用软件或硬件。
上面讲的你们可能不太好理解,再用通俗的话给你们说一下。
好比咱们的系统中的某个服务的访问量特别大,咱们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器均可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了不单个服务器响应同一请求,容易形成服务器宕机、崩溃等问题,咱们从负载均衡的这四个字就能明显感觉到它的意义。
在集群负载均衡时,Dubbo 提供了多种均衡策略,默认为 random
随机调用。能够自行扩展负载均衡策略,参见:负载均衡扩展。
备注:下面的图片来自于:尚硅谷2018Dubbo 视频。
<dubbo:parameter key="hash.arguments" value="0,1" />
<dubbo:parameter key="hash.nodes" value="320" />
xml 配置方式
服务端服务级别
<dubbo:service interface="..." loadbalance="roundrobin" />
客户端服务级别
<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别
<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:service>
客户端方法级别
<dubbo:reference interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>
注解配置方式:
消费方基于基于注解的服务级别配置方式:
@Reference(loadbalance = "roundrobin") HelloService helloService;
zookeeper宕机与dubbo直连的状况在面试中可能会被常常问到,因此要引发重视。
在实际生产中,假如zookeeper注册中心宕掉,一段时间内服务消费方仍是可以调用提供方的服务的,实际上它使用的本地缓存进行通信,这只是dubbo健壮性的一种提现。
dubbo的健壮性表现:
咱们前面提到过:注册中心负责服务地址的注册与查找,至关于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。因此,咱们能够彻底能够绕过注册中心——采用 dubbo 直连 ,即在服务消费方配置服务提供方的位置信息。
xml配置方式:
<dubbo:reference id="userService" interface="com.zang.gmall.service.UserService" url="dubbo://localhost:20880" />
注解方式:
@Reference(url = "127.0.0.1:20880") HelloService helloService;