Dubbo专题

image

ZERO

    持续更新 请关注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/12/28/1546004534620

背景

    本文主要是记录在学习 Java - Dubbo 过程中的一些知识点备忘!

一、基本概念

1、Dubbo

Dubbo是一款高性能、轻量级的开源Java RPC框架,具有三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

dubboarchitecturepng

注意:该dubbo架构图,需要可以自己手写画出来

说明:

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

2、RPC

RPC远程过程调用:是一种通过网络从远程计算机程序上请求服务,且不需要了解底层网络技术的通信机制;也即,RPC是主要是解决远程通信间的问题!

RPC调用流程图(即RPC框架如dubbo解决的是第2~8步)


imagepng

OR 另一种流程图

imagepng

注意:该RPC调用流程图,需要可以自己手写画出来

  • step1:服务消费方client调用,以本地调用方式调用服务

  • ----以下是RPC框架client功能部分封装的

  • step2:client stub在接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(在java中即是序列化过程)

  • step3:client stub找到服务地址,并将消息发送给服务端

  • ----以下是RPC框架server功能部分封装的

  • step4:server stub收到消息后进行解码(在java中即是反序列化过程)

  • step5:server stub根据解码结果调用本地的服务

  • step6:本地服务执行并将结果返回给server stub

  • step7:server stub将返回结果打包成消息(在java中即是序列化过程)并发送至消费方

  • ----以下是RPC框架client功能部分封装的

  • step8:client stub接收到消息,并进行解码(在java中即是反序列化过程)

  • step9:服务消费方最终得到结果

另外,一个时序图如下

imagepng

RPC框架:即负责屏蔽掉底层的传输方式(TCP或者UDP)、序列化方式以及通信细节!如阿里的HSF、Dubbo,其核心目标是解决分布式系统中服务之间的调用问题

3、RPC框架技术

3.1 建立通信

在客户端和服务端之间建立TCP连接,远程过程调用的所有交换的数据都是在这个连接里传输

3.2 服务寻址
  • 服务注册:将服务注册到服务注册中心,注册中心存储该服务的IP、端口、调用方式(协议、序列化协议)等(ZK,即是在ZK中创建一个znode节点进行信息的存储)
  • 服务发现:消费者在第一次调用服务时,会通过注册中心寻找相应服务的IP地址列表并缓存在本地,然后直接通过负载均衡算法从IP地址列表中取一个服务提供者的服务器调用服务
3.3 网络传输

数据传输采用什么协议,数据该如何序列化及反序列化

3.4 NIO通信

大部分RPC框架如Dubbo、HSF、Avro,都是基于Netty这个IO通信框架的(Netty是业界流行的 NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的)

3.5 服务调用

二、Dubbo原理

    dubbo共分为10层,其中service和config层为API,其余各层均为SPI(API application programming interface是给使用者用的,SPI service provider interface是给扩展者使用的)

  • 第一层:service-接口层,即服务提供者和消费者的实现
  • 第二层:config-配置层,主要是对dubbo进行各种配置的
  • 第三层:proxy-服务接口透明代理层,生成消费者端Stub和提供者者端Skeleton
  • 第四层:registry-服务注册层,负责服务的注册和发现
  • 第五层:cluster-集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
  • 第六层:monitor-监控层,对rpc接口的调用次数和调用时间进行监控
  • 第七层:protocol-远程调用层,封装rpc调用
  • 第八层:exchange-信息交换层,封装请求响应模式,同步转异步
  • 第九层:transport-网络传输层,抽象mina和netty为统一接口
  • 第十层:serialize-数据序列化层,以支持网络传输(默认hessian2)

三、Dubbo负载均衡

    dubbo提供多种负载均衡策略,默认为random随机调用策略

1、 基于权重的随机负载均衡机制 Random LoadBalance(默认)

  • 随机,根据权重设置随机概率
  • 在一个截面上碰撞的概率很高,但是调用量越大分布越均匀,且按概率使用权重后也比较均匀,有利于动态调整提供者权重

2、基于权重的轮询负载均衡机制 RoundRobin LoadBalance(不推荐)

  • 轮询,按公约后的权重设置轮询比率
  • 存在慢的提供者累积请求的问题

3、最少活跃调用数 LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大

4、一致性Hash ConsistentHash LoadBalance

  • 一致性Hash,相同参数的请求总是发到同一提供者(如果需要的不是随机负载均衡,而是要一类请求到一个节点,则应该采用一致性hash策略)
  • 当一台提供者挂掉时,原本发往该提供者的请求,基于虚拟节点,会平摊到其他提供者,不会引起剧烈变动
  • 一致性hash算法:https://crossoverjie.top/JCSprout/#/algorithm/Consistent-Hash
  • 缺省时只对第一个参数hash,若需要修改,可配置<dubbo:parameter key="hash.arguments" value="0,1" />
  • 缺省时用160份虚拟节点,若需要修改,可配置<dubbo:parameter key="hash.nodes" value="320" />

5、配置方式

  • xml配置方式:服务端服务级别(dubbo:service loadbalance)、客户端服务级别(dubbo:reference loadbalance)、服务端方法级别(dubbo:service dubbo:method loadbalance)、客户端方法级别(dubbo:reference dubbo:method loadbalance)
  • 注解配置方式:@Service @Reference

四、Dubbo注册中心zk

在实际生产中,如果zk注册中心宕掉,在一段时间内服务消费方还是能够调用提供方的服务的;这是因为实际上它是使用的本地缓存列表中的服务地址列表信息进行调用的,这也是dubbo健壮性的一个方面

dubbo的健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

五、相关问题

Dubbo协议

  • 连接个数:单连接
  • 连接方式:长连接
  • 传输协议:TCP
  • 传输方式:NIO异步传输
  • 序列化:Hessian
  • 适用范围:入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容