Dubbo的学习总结

  • dubbo的起源

    dubbo是2011年开源,因为有阿里背书,所以在那个缺少优秀RPC框架的年代,dubbo快速受到开发者的青睐。dubbo目前在gitHub上有超过1.6万哥star和1.2多个fork。是国内影响力最大的开源框架。
    在 2014 年 10 月 30 日发布 2.4.11 版本后,Dubbo 突然停止更新(其实是在 2012 年 10 月之后就基本停止了重要升级,改为阶段性维护),具体原因未知。
    在阿里停止更新后,当当网的dubbox分支和网易考拉的dubbok分支也得到推广,这也侧面证明了dubbo已经应用到了企业级,并且影响力不小。
    在 2017年9月7日,Dubbo 悄悄的在 GitHub 发布了 2.5.4 版本,随后,没过多久,又迅速发布了 2.5.5、2.5.6、2.5.7 等版本。在 10 月举行的云栖大会上,阿里宣布 Dubbo 被列入集团重点维护开源项目,这也就意味着 Dubbo 起死回生,开始重新进入快车道。

  • RPC的理解

    RPC(Remote Procedure Call Protocol):远程过程调用:
    两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内 存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。
    说白了,就是你在你的机器上写了一个程序,我这边是无法直接调用的,这个时候就出现了一个远程服务调用的概念。

RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
在服务器端,进程保持睡眠状态直到调用信息到达为止。
当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,
最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC需要解决的问题: 
(1)通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。
连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
(2)寻址问题: A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,
这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,
还需要一个RMI Registry来注册服务的地址。
(3)序列化与反序列化:当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,
由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),
通过寻址和传输将序列化的二进制发送给B服务器。 

同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

  • dubbo特性
    1、透明化的远程方法调用,就像调本地方法一样调用远程方法,没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
    2、负载均衡及容错机制,可在内网替代nginx lvs等硬件负载均衡器。
    3、服务中心自动注册和配置管理,不需要写死接口地址,注册中心根据接口名自动查找服务IP。
    4、服务接口性能监控和治理,dubbo-admin与dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行多版本,多协议,多注册中心管理。

  • dubbo核心
    1、远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    2、集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    3、自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

  • dubbo原理

在这里插入图片描述
1、这是dubbo工作的原理,核心包括:服务提供者(Provider)、注册中心(register)、监控中心(Monitor)和服务消费者(Consumer)。
(1)节点角色说明:

   Provider: 暴露服务的服务提供方。

   Consumer: 调用远程服务的服务消费方。

   Registry: 服务注册与发现的注册中心。

   Monitor: 统计服务的调用次调和调用时间的监控中心。

   Container: 服务运行容器。

(2)调用流程

0.服务容器负责启动,加载,运行服务提供者。 
1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
  • 完成一次RPC调用过程

在这里插入图片描述

第一层:service 层,接口层,给服务提供者和消费者来实现的
第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
第四层:registry 层,服务注册层,负责服务的注册与发现
第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
第七层:protocal 层,远程调用层,封装 rpc 调用
第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
第十层:serialize 层,数据序列化层

2、服务提供者

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="demo-provider"/>

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234"/> -->
     <dubbo:registry address="zookeeper://192.168.43.33:2181"/> 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>

</beans>

其中:
1)dubbo:application标签作用是给提供者备注一个名称,这个名称一旦被取了,其他提供者就不能再用这个名称。

2)dubbo:registry标签的作用,就是讲应用注册到注册中心,原例子是在用多广播方式进行注册,可以改为注册到我们安装的zookeeper上,我的zookeeper服务地址是192.168.43.33,端口默认2181。

3)dubbo:protocol标签是标注这个本次服务的协议,暴露的端口,现在是采用dubbo协议,20880端口。

4)dubbo:service标签是声明提供者服务用的。

服务者暴露服务的细节:
提供过程

首先ServiceConfig类拿到对外提供服务的实际类ref,然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,
到这一步就完成具体服务到invoker的转化。接下来就是Invoker转换到Exporter的过程。 
Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,下面我们以Dubbo和rmi这两种典型协议的实现来进行说明:
Dubbo的实现: 
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,
通讯细节由dubbo自己实现。 
Rmi的实现: 
RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,他通过Spring或Dubbo或JDK来实现服务,通讯细节由JDK底层来实现。

3、服务消费者

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="demo-consumer"/>

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
   <!--  <dubbo:registry address="multicast://224.5.6.7:1234"/>
 -->
      <dubbo:registry address="zookeeper://192.168.43.33:2181"/> 
 
     <dubbo:protocol name="dubbo" port="20880"/>
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"/>

</beans>

用dubbo:reference来标明自己要调用提供者的那个服务,响应名称又跟提供者对应

消费者消费服务的细节:
在这里插入图片描述
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口

  • 负载均衡策略
    在这里插入图片描述
(1)RandomLoadBalance:按权重随机调用,这种方式是dubbo默认的负载均衡策略,源码如下:
		实现思路很简单:如果服务多实例权重相同,则进行随机调用;如果权重不同,按照总权重取随机数
	根据总权重数生成一个随机数,然后和具体服务实例的权重进行相减做偏移量,然后找出偏移量小于0的,
	比如随机数为10,某一个服务实例的权重为12,那么10-12=-2<0成立,则该服务被调用,
	这种策略在随机的情况下尽可能保证权重大的服务会被随机调用。
(2)RoundRobinLoadBalance:轮询,按公约后的权重设置轮询比率
		实现思路:首先计算出多服务实例的最大最小权重,如果权重都一样(maxWeight=minWeight),则直接取模轮询;
	如果权重不一样,每一轮调用,都计算出一个基础的权重值,然后筛选出权重值大于基础权重值得invoker进行取模随机调用。
(3)LeastActiveLoadBalance:最少活跃次数,dubbo框架自定义了一个Filter,用于计算服务被调用的次数
		最小活跃次数思路:首先查找最小活跃数的服务并统计权重和出现的频次,如果最小活跃次数只出现一次,直接使用该服务;
	如果出现多次且权重不相同,则按照总权重数随机;如果出现多次且权重相同,则随机调用。
(4)ConsistentHashLoadBalance:一致性hash
		一致性Hash负载均衡涉及到两个主要的配置参数为hash.arguments 与hash.nodes。
	    hash.arguments : 当进行调用时候根据调用方法的哪几个参数生成key,并根据key来通过一致性hash算法来选择调用结点。

  • FAQ汇总
 1、注册中心挂了,还可以继续通信吗?
    可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。
    (1).启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用。
	(2).注册中心对等集群,任意一台宕掉后,会自动切换到另一台 。
	(3).注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯 。
	(4).服务提供者无状态,任一台 宕机后,不影响使用 。
	(5).服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复 。
 2、Forbid consumer 127.0.0.1 access service com.mall.api.service.MallService from registry localhost:2181 use dubbo 	version 2.9.2-SNAPSHOT, Please check registry access list (whitelist/blacklist)
    这个错误一般表面上说禁止消费服务,实际上开发人员并没有做任何限制。其实,这个问题一般由两种情况引起的
    	(1)第一种情况:没有provider提供对应的服务
    	(2)第二种情况:消费者消费的服务的“版本号 version”和生产者提供的服务的“版本号 version”不一致,或者没有显式说明版本号。
    ⚠️ group及version:
    	group:用于对服务进行隔离,这里可以实现灰度功能的作用。
    	version:当一个接口的实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
 3、当dubbo超时,返回的结果会为null。
 4、dubbo如果报异常了,dubbo不会返回错误码,因此需要在对外提供的接口处利用参数传递错误码、错误信息。
 5、在dubbo的provider和consumer的配置文件中,如果都配置了timeout的超时时间,dubbo默认以consumer中配置的时间为准。
 6、dubbo是用的什么协议?
 7、Dubbo在安全机制方面是如何解决的 ?
   Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。
   参考:https://blog.csdn.net/qq_28834183/article/details/80605264
 

其他问题汇总参考:https://blog.csdn.net/weixin_34384915/article/details/85887638
超时重试机制参考:https://www.cnblogs.com/xuwc/p/8974709.html

  • 感谢
    1、https://blog.csdn.net/u010682330/article/details/79542665
    2、https://blog.csdn.net/u010682330/article/details/79542665
    3、https://blog.csdn.net/weixin_34384915/article/details/85887638
    4、https://blog.csdn.net/qq_28834183/article/details/80605264
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值