专栏首页moon聊技术《面试八股文》之Dubbo17卷

《面试八股文》之Dubbo17卷


前言

虽然金三银四过了,但是金九银十马上就要到了,还不快快准备起来?

今天就开启《面试八股文》系列的第一版-RPC王者Dubbo,moon 在后续的《面试八股文》系列还将继续推出mysql,spring,并发,redis,kafka,zookeeper等一系列文章。

当然大家有什么好的建议也可以通过公众号或者个人微信和我交流。

每天一个知识点

  • 不要背,要理解,大家不要夸我内卷了

目录

  • 1.Dubbo是什么?RPC又是什么?
  • 2. Dubbo能做什么?
  • 3.能说下Dubbo的总体的调用过程吗?
  • 4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点
  • 5.Dubbo中都用到哪些设计模式?
  • 6.如果Dubbo中provider提供的服务由多个版本怎么办?
  • 7.服务暴露的流程是怎么样的?
  • 8.服务引用的流程是怎么样的?
  • 9.Dubbo的注册中心有哪些?
  • 10.聊聊Dubbo SPI机制?
  • 11.Dubbo的SPi和JAVA的SPI有什么区别?
  • 12.有哪些负载均衡策略?
  • 13.集群容错方式有哪些?
  • 14.说说Dubbo的分层?
  • 15.服务提供者能实现失效踢出是什么原理?
  • 16.为什么要通过代理对象通信??
  • 17.怎么设计一个RPC框架?

1.Dubbo是什么?RPC又是什么?

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

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底>层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络>通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发>送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为>止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户>端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。有多种 RPC模式和执行。

我们用一种通俗易懂的语言解释它,远程调用就是本地机器调用远程机器的一个方法,远程机器返回结果的过程

为什么要这么做?

主要原因是由于单台服务的性能已经无法满足我们了,在这个流量剧增的时代,只有多台服务器才能支撑起来现有的用户体系,

而在这种体系下,服务越来越多,逐渐演化出了现在这种微服务化的RPC框架。


2. Dubbo能做什么?

Dubbo的核心功能主要包含:

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

3.能说下Dubbo的总体的调用过程吗?

调用过程图:

  • 1.Proxy持有一个Invoker对象,使用Invoker调用
  • 2.之后通过Cluster进行负载容错,失败重试
  • 3.调用Directory获取远程服务的Invoker列表
  • 4.负载均衡
    • 用户配置了路由规则,则根据路由规则过滤获取到的Invoker列表
    • 用户没有配置路由规则或配置路由后还有很多节点,则使用LoadBalance方法做负载均衡,选用一个可以调用的Invoker
  • 5.经过一个一个过滤器链,通常是处理上下文、限流、计数等。
  • 6.会使用Client做数据传输
  • 7.私有化协议的构造(Codec)
  • 8.进行序列化
  • 9.服务端收到这个Request请求,将其分配到ThreadPool中进行处理
  • 10.Server来处理这些Request
  • 11.根据请求查找对应的Exporter
  • 12.之后经过一个服务提供者端的过滤器链
  • 13.然后找到接口实现并真正的调用,将请求结果返回

4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点

  • 1.dubbo 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化
  • 2.rmi 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互 操作。在依赖低版本的 Common-Collections 包,java 序列化存在安全漏洞
  • 3.webservice 基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;
  • 4.http 基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实 现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消 费者,需要给应用程序和浏览器 JS 调用
  • 5.hessian 集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输,Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
  • 6.memcache 基于 memcached 实现的 RPC 协议
  • 7.redis 基于 redis 实现的 RPC 协议

5.Dubbo中都用到哪些设计模式?

责任链模式: 责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架。Dubbo的调用链组织是用责任链模式串连起来的。责任链中的每个节点实现Filter接口,然后由ProtocolFilterWrapper,将所有Filter串连起来。Dubbo的许多功能都是通过Filter扩展实现的,比如监控、日志、缓存、安全、telnet以及RPC本身都是。

观察者模式: Dubbo中使用观察者模式最典型的例子是RegistryService。消费者在初始化的时候回调用subscribe方法,注册一个观察者,如果观察者引用的服务地址列表发生改变,就会通过NotifyListener通知消费者。此外,Dubbo的InvokerListener、ExporterListener 也实现了观察者模式,只要实现该接口,并注册,就可以接收到consumer端调用refer和provider端调用export的通知。

修饰器模式: Dubbo中还大量用到了修饰器模式。比如ProtocolFilterWrapper类是对Protocol类的修饰。在export和refer方法中,配合责任链模式,把Filter组装成责任链,实现对Protocol功能的修饰。其他还有ProtocolListenerWrapper、 ListenerInvokerWrapper、InvokerWrapper等。

工厂方法模式: CacheFactory的实现采用的是工厂方法模式。CacheFactory接口定义getCache方法,然后定义一个AbstractCacheFactory抽象类实现CacheFactory,并将实际创建cache的createCache方法分离出来,并设置为抽象方法。这样具体cache的创建工作就留给具体的子类去完成。

抽象工厂模式: ProxyFactory及其子类是Dubbo中使用抽象工厂模式的典型例子。ProxyFactory提供两个方法,分别用来生产Proxy和Invoker(这两个方法签名看起来有些矛盾,因为getProxy方法需要传入一个Invoker对象,而getInvoker方法需要传入一个Proxy对象,看起来会形成循环依赖,但其实两个方式使用的场景不一样)。AbstractProxyFactory实现了ProxyFactory接口,作为具体实现类的抽象父类。然后定义了JdkProxyFactory和JavassistProxyFactory两个具体类,分别用来生产基于jdk代理机制和基于javassist代理机制的Proxy和Invoker。

适配器模式: 为了让用户根据自己的需求选择日志组件,Dubbo自定义了自己的Logger接口,并为常见的日志组件(包括jcl, jdk, log4j, slf4j)提供相应的适配器。并且利用简单工厂模式提供一个LoggerFactory,客户可以创建抽象的Dubbo自定义Logger,而无需关心实际使用的日志组件类型。在LoggerFactory初始化时,客户通过设置系统变量的方式选择自己所用的日志组件,这样提供了很大的灵活性。

代理模式: Dubbo consumer使用Proxy类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。


6.如果Dubbo中provider提供的服务由多个版本怎么办?

可以直接通过Dubbo配置中的version版本来控制多个版本即可。

比如:

<dubbo:service interface="com.xxxx.rent.service.IDemoService" ref="iDemoServiceFirst" version="1.0.0"/>
<dubbo:service interface="com.xxxx.rent.service.IDemoService" ref="iDemoServiceSecond" version="1.0.1"/>

老版本 version=1.0.0, 新版本version=1.0.1


7.服务暴露的流程是怎么样的?

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

2.通过proxyFactory.getInvoker方法,并利用javassist或DdkProxyFactory来进行动态代理,将服务暴露接口封装成invoker对象,里面包含了需要执行的方法的对象信息和具体的URL地址。

3.再通过DubboProtocol的实现把包装后的invoker转换成exporter

4.然后启动服务器server,监听端口

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


8.服务引用的流程是怎么样的?

1.首先客户端根据config文件信息从注册中心订阅服务,首次会全量缓存到本地,后续的更新会监听动态更新到本地。

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

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


9.Dubbo的注册中心有哪些?

Zookeeper、Redis、Multicast、Simple 等都可以作为Dubbo的注册中心


10.聊聊Dubbo SPI机制?

SPI(Service Provider Interface),是一种服务发现机制,其实就是将结构的实现类写入配置当中,在服务加载的时候将配置文件独处,加载实现类,这样就可以在运行的时候,动态的帮助接口替换实现类

Dubbo的SPI其实是对java的SPI进行了一种增强,可以按需加载实现类之外,增加了 IOC 和 AOP 的特性,还有自适应扩展机制。

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

Dubbo对于文件目录的配置分为了三类

  • 1.META-INF/services/ 目录:该目录下的 SPI 配置文件是为了用来兼容 Java SPI 。
  • 2.META-INF/dubbo/ 目录:该目录存放用户自定义的 SPI 配置文件。
key=com.xxx.xxx
  • 3.META-INF/dubbo/internal/ 目录:该目录存放 Dubbo 内部使用的 SPI 配置文件。

11.Dubbo的SPi和JAVA的SPI有什么区别?

Java Spi

  • Java SPI 在查找扩展实现类的时候遍历 SPI 的配置文件并且将实现类全部实例化

Dubbo Spi

  • 1,对 Dubbo 进行扩展,不需要改动 Dubbo 的源码
  • 2,延迟加载,可以一次只加载自己想要加载的扩展实现。
  • 3,增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。
  • 4,Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。

12.有哪些负载均衡策略?

1.加权随机:比如我们有三台服务器[A, B, C],给他们设置权重为[4, 5, 6],然后讲这三个数平铺在水平线上,和为15。

然后在15以内生成一个随机数,0~4是服务器A,4~9是服务器B,9~15是服务器C

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

3.一致性hash

  • 首先求出memcached服务器(节点)的哈希值,并将其配置到0~2的32次方的圆(continuum)上。
  • 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
  • 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2的32次方仍然找不到服务器,就会保存到第一台memcached服务器上。

4.加权轮询:比如我们有三台服务器[A, B, C],给他们设置权重为[4, 5, 6],那么假如总共有15次请求,那么会有4次落在A服务器,5次落在B服务器,6次落在C服务器。


13.集群容错方式有哪些?

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,如果其中一台报错,在循环调用结束后,抛出异常。


14.说说Dubbo的分层?

分层图:

从大的范围来说,dubbo分为三层

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

Service和Config两层可以认为是API层,主要提供给API使用者,使用者只需要配置和完成业务代码就可以了。

后面所有的层级是SPI层,主 要提供给扩展者使用主要是用来做Dubbo的二次开发扩展功能。

再划分到更细的层面,就是图中的10层模式。


15.服务提供者能实现失效踢出是什么原理?

服务失效踢出基于Zookeeper的临时节点原理。

Zookeeper中节点是有生命周期的,具体的生命周期取决于节点的类型,节点主要分为持久节点(Persistent)和临时节点(Ephemeral) 。


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

其实主要就是为了将调用细节封装起来,将调用远程方法变得和调用本地方法一样简单,还可以做一些其他方面的增强,比如负载均衡,容错机制,过滤操作,调用数据的统计。


17.怎么设计一个RPC框架?

关于这个问题,其实核心考察点就是你对于RPC框架的理解,一个成熟的RPC框架可以完成哪些功能,其实当我们看过一两个RPC框架后,就可以对这个问题回答个七七八八了,我们来举个例子。

1.首先我们得需要一个注册中心,去管理消费者和提供者的节点信息,这样才会有消费者和提供才可以去订阅服务,注册服务。

2.当有了注册中心后,可能会有很多个provider节点,那么我们肯定会有一个负载均衡模块来负责节点的调用,至于用户指定路由规则可以使一个额外的优化点。

3.具体的调用肯定会需要牵扯到通信协议,所以需要一个模块来对通信协议进行封装,网络传输还要考虑序列化。

4.当调用失败后怎么去处理?所以我们还需要一个容错模块,来负责失败情况的处理。

5.其实做完这些一个基础的模型就已经搭建好了,我们还可以有更多的优化点,比如一些请求数据的监控,配置信息的处理,日志信息的处理等等。

这其实就是一个比较基本的RPC框架的大体思路,大家有没有get到?

本文分享自微信公众号 - moon聊技术(onetraveller_llxz),作者:moon聊技术

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《面试八股文》之Zookeeper12卷

    Zookeeper 是一个开源的,是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务。

    moon聊技术
  • 《面试八股文》之 Redis 16卷

    redis 作为我们最常用的内存数据库,很多地方你都能够发现它的身影,比如说登录信息的存储,分布式锁的使用,其经常被我们当做缓存去使用。

    moon聊技术
  • 《面试八股文》之 Kafka 21卷

    大家好,我是 moon,作为在消息中间件中拥有神一样地位的 kafka,你真的了解它吗?

    moon聊技术
  • 《面试八股文》之网络19卷

    HTTP 协议是基于 TCP 协议实现的,它是一个超文本传输协议,其实就是一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响...

    moon聊技术
  • 《面试八股文》之 Java 基础 34 卷

    「《面试八股文》之 Java 基础 34卷」 它来了,本文总共针对基础给了 34 个问题,又是小小 1W 字,理解它,看透它~

    moon聊技术
  • 太卷了!面试前背面经,这是八股文么?

    大家好,最近分享了一些内推的渠道,后台有小伙伴问我,现在准备大公司的面试是不是都要靠背面经?甚至网上还有很多人把面试前的准备戏称为背八股文。

    TechFlow-承志
  • 面试八股文——Redis篇

    今天给大家分享一下 Redis 面试常考的题目,答案也整理好了,非常贴心有木有,快来看看你能答对几个。

    程序员大彬
  • 面试八股文:你写过自定义任务调度器吗?

    官方推荐使用Task.Run方法启动基于计算的任务, 当需要对长时间运行、基于计算的任务做精细化控制时使用Task.Factory.StartNew。

    有态度的马甲
  • 背完这套Java面试八股文,自动解锁面试牛逼症被动技能

    国内的互联网面试,恐怕是现存的、最接近科举考试的制度。很多人对八股文都嗤之以鼻,认为无法衡量出一个程序员的真是水平。还有一部分人则是深恶痛绝,因为实在太难背了。

    北游
  • 给几位小朋友面试辅导后,我发现了一些问题!

    不知不觉,高考结束有一段时间了,今天也揭榜了,祝愿各位考生能金榜题名,考上自己的理想大学,然后开始卷起来~

    九灵
  • 你知道Python很火!那你知道它有哪些好玩的库吗?

    Python现在可谓是一股风潮来袭!很多这样的文章,小学生学Python,高考即将纳入高考,甚至还有一张试卷,确实现在Python的势头是非常的火,那么Pyth...

    企鹅号小编
  • 运营不知KPI,走遍天下也枉然

    KPI的完整形式是Key Performance Indicator,用中文解释是一个非常高大上的词汇,叫做“关键绩效指标”。通俗一点地解释,就是选取关系到公司...

    葆宁
  • 文本分类实战--从TFIDF到深度学习CNN系列效果对比(附代码)

    数据集中主要包含下面几个文件,可见数据集很小也很简单,只需要使用training.csv文件进行训练我们的文本分类模型,使用testing.csv进行预测并提交...

    机器学习AI算法工程
  • 文言文编程?算了吧!不过是一个想家华裔的一厢情愿

    Github在trending页面,增设spoken language筛选项,我想用意已经很明显了,地址来自中国的无聊项目扰乱视听。

    程序员小助手
  • 10篇精选报告(最新):大起大落,保持冷静!

    最近在全球股市波动的情况下,想必大家的心情是不稳定的,越是这样,我们越要有一个良好的心态,下面是公众号最近看到的几篇比较有意思的报告,分享给各位读者,希望你冷静...

    量化投资与机器学习微信公众号
  • 告别RNN,迎来TCN!将深度学习应用于股市预测

    金融时间序列(FTS)建模历史悠久,20 世纪 70 年代初它首次革新了算法交易。FTS 分析包括两类:基础分析和技术分析。但这两种分析方法都受到有效市场假说(...

    计算机视觉联盟
  • 终于找全了:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论

    1、蝴蝶效应: 上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶翅膀偶尔振动,也许两周后就会引起美国得克萨斯州的一场龙卷...

    小莹莹
  • 八年phper的高级工程师面试之路八年phper的高级工程师面试之路

    最近半个月时间,经过几次面试,差不多已经对自己有了定位————距离腾讯T3岗位还是有一点距离。

    码农编程进阶笔记
  • 深度学习词汇表(四)

    Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能...

    AiTechYun

扫码关注云+社区

领取腾讯云代金券