作者 | 科技缪缪

来源 | 科技缪缪(ID:kejimiumiu)

头图 |  CSDN 下载自东方IC

Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理、负载均衡策略、容错机制、SPI机制基本就差不多了,最大的一道大题一般就是怎么设计一个RPC框架了,但是如果你工作原理分层都搞明白了这个问题其实也就相当于回答了不是吗。

说说Dubbo的分层? 

从大的范围来说,dubbo分为三层,business业务逻辑层由我们自己来提供接口和实现还有一些配置信息,RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程、负载均衡、集群容错、代理,remoting则是对网络传输协议和数据转换的封装。

划分到更细的层面,就是图中的10层模式,整个分层依赖由上至下,除开business业务逻辑之外,其他的几层都是SPI机制。

能说下Dubbo的工作原理吗? 

  1. 服务启动的时候,provider和consumer根据配置信息,连接到注册中心register,分别向注册中心注册和订阅服务

  2. register根据服务订阅关系,返回provider信息到consumer,同时consumer会把provider信息缓存到本地。如果信息有变更,consumer会收到来自register的推送

  3. consumer生成代理对象,同时根据负载均衡策略,选择一台provider,同时定时向monitor记录接口的调用次数和时间信息

  4. 拿到代理对象之后,consumer通过代理对象发起接口调用

  5. provider收到请求后对数据进行反序列化,然后通过代理调用具体的接口实现

为什么要通过代理对象通信? 

主要是为了实现接口的透明代理,封装调用细节,让用户可以像调用本地方法一样调用远程方法,同时还可以通过代理实现一些其他的策略,比如:

1、调用的负载均衡策略

2、调用失败、超时、降级和容错机制

3、做一些过滤操作,比如加入缓存、mock数据

4、接口调用数据统计

说说服务暴露的流程? 

  1. 在容器启动的时候,通过ServiceConfig解析标签,创建dubbo标签解析器来解析dubbo的标签,容器创建完成之后,触发ContextRefreshEvent事件回调开始暴露服务

  2. 通过ProxyFactory获取到invoker,invoker包含了需要执行的方法的对象信息和具体的URL地址

  3. 再通过DubboProtocol的实现把包装后的invoker转换成exporter,然后启动服务器server,监听端口

  4. 最后RegistryProtocol保存URL地址和invoker的映射关系,同时注册到服务中心

说说服务引用的流程? 

服务暴露之后,客户端就要引用服务,然后才是调用的过程。

  1. 首先客户端根据配置文件信息从注册中心订阅服务

  2. 之后DubboProtocol根据订阅的得到provider地址和接口信息连接到服务端server,开启客户端client,然后创建invoker

  3. invoker创建完成之后,通过invoker为服务接口生成代理对象,这个代理对象用于远程调用provider,服务的引用就完成了

有哪些负载均衡策略? 

  1. 加权随机:假设我们有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3, 2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于服务器 B,[8, 10) 区间属于服务器 C。接下来通过随机数生成器生成一个范围在 [0, 10) 之间的随机数,然后计算这个随机数会落到哪个区间上就可以了。

  2. 最小活跃数:每个服务提供者对应一个活跃数 active,初始情况下,所有服务提供者活跃数均为0。每收到一个请求,活跃数加1,完成请求后则将活跃数减1。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求。

  3. 一致性hash:通过hash算法,把provider的invoke和随机节点生成hash,并将这个 hash 投射到 [0, 2^32 - 1] 的圆环上,查询的时候根据key进行md5然后进行hash,得到第一个节点的值大于等于当前hash的invoker。

图片来自dubbo官方
  1. 加权轮询:比如服务器 A、B、C 权重比为 5:2:1,那么在8次请求中,服务器 A 将收到其中的5次请求,服务器 B 会收到其中的2次请求,服务器 C 则收到其中的1次请求。

集群容错方式有哪些? 

  1. Failover Cluster失败自动切换:dubbo的默认容错方案,当调用失败时自动切换到其他可用的节点,具体的重试次数和间隔时间可用通过引用服务的时候配置,默认重试次数为1也就是只调用一次。

  2. Failback Cluster快速失败:在调用失败,记录日志和调用信息,然后返回空结果给consumer,并且通过定时任务每隔5秒对失败的调用进行重试

  3. Failfast Cluster失败自动恢复:只会调用一次,失败后立刻抛出异常

  4. Failsafe Cluster失败安全:调用出现异常,记录日志不抛出,返回空结果

  5. Forking Cluster并行调用多个服务提供者:通过线程池创建多个线程,并发调用多个provider,结果保存到阻塞队列,只要有一个provider成功返回了结果,就会立刻返回结果

  6. Broadcast Cluster广播模式:逐个调用每个provider,如果其中一台报错,在循环调用结束后,抛出异常。

了解Dubbo SPI机制吗? 

SPI 全称为 Service Provider Interface,是一种服务发现机制,本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类,这样可以在运行时,动态为接口替换实现类。

Dubbo也正是通过SPI机制实现了众多的扩展功能,而且dubbo没有使用java原生的SPI机制,而是对齐进行了增强和改进。

SPI在dubbo应用很多,包括协议扩展、集群扩展、路由扩展、序列化扩展等等。

使用方式可以在META-INF/dubbo目录下配置:

key=com.xxx.value

然后通过dubbo的ExtensionLoader按照指定的key加载对应的实现类,这样做的好处就是可以按需加载,性能上得到优化。

如果让你实现一个RPC框架怎么设计? 

  1. 首先需要一个服务注册中心,这样consumer和provider才能去注册和订阅服务

  2. 需要负载均衡的机制来决定consumer如何调用客户端,这其中还当然要包含容错和重试的机制

  3. 需要通信协议和工具框架,比如通过http或者rmi的协议通信,然后再根据协议选择使用什么框架和工具来进行通信,当然,数据的传输序列化要考虑

  4. 除了基本的要素之外,像一些监控、配置管理页面、日志是额外的优化考虑因素。

那么,本质上,只要熟悉一两个RPC框架,就很容易想明白我们自己要怎么实现一个RPC框架。

更多精彩推荐
☞1024程序员节重要议程曝光,开源技术英雄会聊开源“真心话”☞“我们的目标是取代物联网中的安卓” | 人物志
☞对话阿里云:开源与自研如何共处?
☞服!AI 让兵马俑“活”起来,颜值惊艳!
☞AI 还原康乾盛世三代皇帝的样貌,简直太太太好玩了!☞观点 | 回顾以太坊近期及中期扩容路线图,展望 rollup 作为中心的以太坊路线图
点分享点点赞点在看

想进大厂,先自问 Dubbo 普普通通 9 问能答出来吗!相关推荐

  1. 《我想进大厂》之Dubbo普普通通9问

    这是面试专题系列第四篇,Dubbo系列.Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理.负载均衡策略.容错机制.SPI机制基本就差不多了,最 ...

  2. mysql delete 会锁表吗_我想进大厂之 MYSQL 夺命连环13问

    来源 | 科技缪缪 想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 能说下 myisam 和 innodb 的区别吗? myisam引擎是5.1版本之前的默认引擎, ...

  3. 【我想进大厂】Redis夺命连环11问

    来源 | 科技缪缪 责编 | Jerry 说说Redis基本数据类型有哪些吧 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型.C语言的字符串不记 ...

  4. 《我想进大厂》之mysql夺命连环13问

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 1. 能说下myisam 和 innodb的区别吗? myisam引擎是5.1版本之前的默认引擎,支持全文检索.压缩 ...

  5. 听说你想进大厂?当心这13个MySQL送命题!

    想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里? 1. 能说下myisam 和 innodb的区别吗? myisam引擎是5.1版本之前的默认引擎,支持全文检索.压缩 ...

  6. 奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)

    大家好,我是冰河~~ 今天给大家带来一篇完整的并发编程学习路线,这应该是全网最全的并发编程学习路线了吧,希望能够为各位小伙伴们带来实质性的帮助. 如果这篇文章对大家有点帮助,小伙伴们点赞,收藏,评论, ...

  7. 你想进大厂吗?这份所有大厂都绕不过的MySQL宝典值得你一看

    前言: 好久没有给我的粉丝们分享过资料了,眼看着秋招就来了特意给大家总结了一份大厂秋招宝典,如今基本上所有的大厂都绕不过MySQL只要你想进大厂不管是腾讯.阿里也好还是字节百度只要你去面试就一定会问你 ...

  8. 想进大厂?看这两位就够了——敖丙/冰河|寻找C站“宝藏”

    声明:一条与两位大佬未曾谋面,也并无交流,写这篇文章更无利益可得. 只是曾在某个深夜拜读过两位大佬的文章,觉得收获良多,想让更多学编程的朋友少走弯路. 引用敖丙的一句话:"我这个人技术真不咋 ...

  9. 为什么人人都想进大厂?都是被逼的!

    创业公司人员紧张,一个人当五个人用······公司发展路线模糊,今天做这个业务,明天突然大掉头换了一个赛道·······进公司前说的天花乱坠,进来后才发现这也没有那也没有,人事调动全在老板的喜好··· ...

最新文章

  1. keras打印模型结构
  2. 51Nod - 2142身份证号排序
  3. 突破技术界限,FVS大屏编辑模式,真正让大屏做到所见即所得
  4. 基于ARM的车牌识别技术研究与实现
  5. 用与非门设计血型配对电路_利用与非门CD4011做一个防盗报警器,那些高大上就这么简单...
  6. 电脑文件太多找不到?试试这个免费搜索软件
  7. paip.Adblock屏蔽onlinedown华军软件园的4秒下载广告总结..
  8. 新中大 金蝶 用友产品技术比较
  9. 中国十大最狠的流氓网站曝光!送查杀流氓的工具
  10. Xcode8控制台不打印NSLog
  11. 300篇原创文背后的故事
  12. 李飞飞在谷歌开发者大会宣布谷歌AI中国中心正式成立
  13. 什么时候用重定向,什么时候用请求转发。
  14. Received HTTP code 404 from proxy after CONNECT
  15. Cloudflare免费CDN加速及防护
  16. 7个跑步易犯的错误和解决办法
  17. 计算机视觉之目标检测一之SSD
  18. JSP连接数据库实现查询
  19. 计算机组成原理——篇三
  20. linux下的定时工具有哪些,Linux中使用crond工具创建定时任务的方法

热门文章

  1. GTK+图形化应用程序开发学习笔记(一)—概述
  2. Linux下通过jstat命令查看jvm的GC情况
  3. RenderMonkey 练习 第一天 【opengl 纹理】
  4. Linxu入门(一)
  5. 关于获取安卓设备的mac地址
  6. iOS中将后台JSON数据转化为模型的总结
  7. Android之常见问题集锦Ⅰ
  8. [翻译]超炫列表动画的实现
  9. Python MySQLdb 学习总结
  10. linux在电子信息工程行业中的应用,电子信息工程概述论文