关于Dubbo的面试题,建议收藏
1.Dubbo是什么?能干嘛?RPC又是什么?
Dubbo是一个基于分布式的远程调用框架,通过Dubbo,开发者能像调用本地方法一样调用部署在远端机器上的方法。而RPC是Remote Procedure Call的简写,翻译成中文是远程过程调用,通过RPC,程序员能在不需要了解网络底层通讯细节的基础上调用远端服务。
关于RPC的调用方式大家可以参考下图,而Dubbo是以RPC的方式来调用远端服务。
而Dubbo的主要功能包括远程通讯,以集群的方式对外提供服务和服务治理。
- 远程通讯是指,能通过dubbo-remoting模块,提供多种基于长连接的NIO框架的通讯服务。
- 以集群方式对外提供服务是指,提供服务的方法不仅透明,而且服务方法能以分布式的方式部署,能以负载均衡的方式提供服务,当然在提供服务的过程中还支持多协议、失败容错和动态配置等功能。
- 服务治理,这和微服务里的Eureka和Nacos组件很相似,能提供基于注册中心的目录服务,从而能服务提供方能自动注册服务,而服务调用方能动态查找服务。这样做的好处是,能使服务提供方以平滑的方式扩容、迁移服务或减少服务机器。
2.结合流程图,说下Dubbo的调用过程?
调用过程如下图所示:
1.Proxy创建一个Invoker对象,通过Invoker开始整个流程,随后再通过Cluster组件进行以负载均衡的方式调用,在这过程中,如果失败可按之前配置的策略进行重试。
2.调用Directory模块,从底层配置里获取提供远程服务的Invoker列表,这些列表会在服务提供者模块启动或关机时自动更新。
3 如果Dubbo使用者配置了路由规则,根据指定路由规则取到Invoker列表,如果没有配置,则用默认的LoadBalance方法做负载均衡,总之这里需要找到一个可以供调用的Invoker对象。
4.调用的请求会经过“过滤器链“,其中每个过滤器会做处理上下文、限流或统计计数等动作,之后会用Client进行数据传输。
5.用Codec模块构造私有化协议,并同时进行序列化。而服务端收到该Request请求后,会把它分配到Dubbo组件里的ThreadPool模块中进行处理。
6.ThreadPool模块之后,会用Server来处理这些Request,当然之后会根据请求查找对应的Exporter,并经过服务提供者端的过滤器链。
7.最后在服务端,找到对应的接口,调用该接口并返回请求。
3.Dubbo 支持哪些协议?每种协议的应用场景及其优缺点?
1.dubbo协议,这是一种单一的长连接和 NIO 异步通讯协议,适合高并发小数据量的调用,也适用于消费者数量远大于提供者的场景,这种协议是最常用的,其中传输协议用到了TCP,采用异步通讯和Hessian 序列化的方式。
2.rmi协议,其中采用 JDK里的rmi 协议实现,传输参数传递时,需要传递的对象实现Serializable 接口,通讯时使用阻塞式短连接,适用于消费者和提供者个数差不多的场景,也可传输文件。
3.webservice协议,这是基于 比较老的WebService 远程调用协议,提供和原生 WebService 的操作接口。适用于多个短连接的场景,是用HTTP 传输的同步方式传输数据,适用于系统集成和跨语言调用的场景。
4.http协议是基于Http 表单提交的远程调用协议,比较适用于应用程序和浏览器 JS 之间的调用。
5.hessian协议是基于 HTTP 通讯,采用 Servlet 暴露服务,使用场景是,传入参数较大,提供者大于消费者,提供者压力较大等场景,通过该协议可文件。
6.memcache协议,这是基于memcached缓存实现的 RPC 协议。
7.redis协议,这是基于基于redis缓存实现的 RPC 协议。
总体来说,目前大多数Dubbo使用场景,都会用Dubbo协议,毕竟大多数使用场景是高并发场景,而且不大会传文件,如果真要传,那还不如用FTP等协议,就别用dubbo组件来传。
4.说下你知道的Dubbo组件中用到的设计模式?
4.1 责任链模式
Dubbo的调用链是用责任链模式串连起来的。比如上文提到的Filter链就是职责链模式,通过这种模式,能通过同一条链路上的多个Filter实现监控、写日志、和安全等方面的需求功能。
4.2 观察者模式
比较典型的例子是RegistryService。消费者在初始化调用对象时会回调subscribe方法,从而注册一个观察者,如果观察者对应的的服务地址或端口列表有变更,会通过NotifyListener通知消费者,这样就达到了动态服务治理的效果。
4.3 修饰器模式
Dubbo还用到了修饰器模式,比如ProtocolFilterWrapper类是对Protocol类的修饰。
4.4 工厂模式
比如CacheFactory类的的实现方式是用到了工厂模式。CacheFactory接口定义getCache方法,然后再定义一个AbstractCacheFactory抽象类实现CacheFactory,并将实际创建cache对象的createCache方法以抽象方法的形式提取。这样cache对象的创建工作就会通过对应的子类去完成。
4.5 适配器模式
为了能让用户自己选定日志组件,Dubbo 定义了Logger 接口,并为常见的log4j和slf4j等日志组件提供了适配器,并在此基础上用工厂模式提供一个 LoggerFactory。这样用户就能在Dubbo里定义Logger,而不用关心实际的日志组件类型。
4.6 代理模式
这是Dubbo的表现形式,比如Dubbo的消费者在使用Proxy类创建远程服务的本地代理时,在本地代理中需要实现和远程服务一样的接口方法,这样能屏蔽针对远程方法调用的网络通信细节,使得用户能像调用本地方法那样调用远程方法。
5.如何在Dubbo的provider里提供了同一方法的版本的服务?
<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"/>
当然现在用的是注解,通过注解中的相关参数也能实现类似的效果。
6.通过流程图,说明下Dubbo的服务暴露流程?
大致的流程如下所示。
1.通过ServiceConfig对象解析标签,并创建dubbo的标签解析器对象来解析dubbo标签,随后通过触发ContextRefreshEvent事件的回调方法开始暴露服务的动作。
2.通过调用proxyFactory对象的getInvoker方法,并用javassist或DdkProxyFactory来进行动态代理,把服务暴露接口封装成invoker对象,在该对象里包含需要执行的方法名、参数和对应的URL地址。
3.通过DubboProtocol的实现类,把包装后的invoker转换成exporter对象。随后启动服务器端的server来监听端口,等待服务调用的到来。
4.通过RegistryProtocol对象,保存URL地址和invoker之间的映射关系,同时把这层映射关系注册到服务中心,比如Zookeeper里。
上文中的流程如下图所示。
7.说下Dubbo的服务引用的流程。
1.Dubbo客户端根据config文件里的信息从注册中心里订阅服务,并缓存到本地,后续的服务相关信息的会动态更新到本地。
2.DubboProtocol根据provider的地址和接口连接到服务端server,开启客户端client,再创建invoker。
3.用invoker为服务接口生成代理对象,这个代理对象是用来远程调用。
相关流程如下图所示。
8.说下Dubbo的常用注册中心。
Zookeeper、Redis和Memcache等等都可以作为Dubbo的注册中心,不过目前用的最多的是Zookeeper。
9.说下Dubbo集群容错方式
1.Failover Cluster,这是失败自动切换模式,也是dubbo集群默认容错方案,即当调用失败时自动切换到其他可用的节点,其中的重试次数和间隔时间用户可配置。
2.Failback Cluster,这是失败自动恢复模式,在调用失败时通过日志记录调用信息,然后向消费者返回空结果,并通过定时任务,按一定频率(可配置,默认是5秒) 对失败的调用进行重试。
3.Failfast Cluster,即快速失败模式,只调用一次,失败后立刻抛出异常。
4.Failsafe Cluster,即失败安全模式,调用出现异常时,记录日志但不抛出异常,同时向消费者返回空结果。
5.Forking Cluster,即并行调用多个服务提供者,具体做法是通过线程池创建多个线程,并发调用多个provider,结果存到阻塞队列,只要有一个provider成功返回了结果,就会立刻返回结果,但这种容错方式是以牺牲性能的方式来确保成功率。
6.Broadcast Cluster,即广播模式,逐个调用每个provider,如果其中一台服务器报异常,就在循环调用后,抛出该异常。
10.说下Dubbo的分层
分层图如下所示。
business业务逻辑层(Biz层)是由程序员定义的接口和配置信息构成。需要说明的是,Service和Config这两层也可认为是API层,因为主要是给程序员使用。
RPC层封装了整个RPC的调用过程、负载均衡、集群容错和代理方式等底层信息。
Remoting层则封装了网络传输协议和数据转换的实现细节。
后面的是SPI层,主要提供给扩展者使用,程序员可以通过重写其中的代码和配置来进行Dubbo的二次开发。
整理了更多关于java的面试题,供大家参考,可以私信‘面试’领取~
关于Dubbo的面试题,建议收藏相关推荐
- Hadoop高频面试题(建议收藏)
一.什么是Hadoop? 这是一个看着不起眼,实则"送命题"的典型.往往大家关于大数据的其他内容准备得非常充分,反倒问你什么是Hadoop却有点猝不及防,回答磕磕绊绊,给面试官的印 ...
- Mysql经典面试题(建议收藏)
除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1:char.varcha ...
- 金三银四,50道必备的Python面试题(建议收藏)
在过去的2020年,Python赢得了年度TIOBE编程语言奖,成为过去一年最受欢迎的编程语言.在数据科学和机器学习等领域中,被广泛使用. 正值"金三银四"招聘季,小F给大家整理了 ...
- Spark高频面试题(建议收藏)
一.你是怎么理解Spark,它的特点是什么? Spark是一个基于内存的,用于大规模数据处理(离线计算.实时计算.快速查询(交互式查询))的统一分析引擎. 它内部的组成模块,包含SparkCore,S ...
- 精心整理42道计算机网络高频面试题(建议收藏)
计算机网络 1. 谈下你对五层网络协议体系结构的理解? 学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清 ...
- 最强Java面试题全部合集,涵盖BAT大厂面试必考的9大技术!-强烈建议收藏
过去2年我持续分享了BAT TMD为代表的大厂最新面试题目,特别是蚂蚁金服.天猫.淘宝.头条.拼多多等Java面试题目. 过去2年,我已经成功的帮助了部分同学进入了大厂. 2020开始,我依然会为大家 ...
- 2019最全BAT资深Java面试题答案合集,建议收藏~
马上进入求职招聘高峰,总结了一份BAT(阿里.百度等)资深Java相关的面试题答案合集给到大家. 该板块的各面试章节,后续会持续迭代更新最新一线互联网公司的面试题目,建议收藏该页面,不定期更新查看~ ...
- 建议收藏:模拟版图高频面试题,直通面试,Offer抢先拿!
模拟板图工程师在行业内是个神奇的存在,**"零基础的门槛"."岗位需求量大"."高就业薪资"**模拟版图工程师成为了行业宠儿,促使很多人跨行 ...
- 2023金3银4求职季,APP面试题放送(建议收藏)
Hi,大家好,我是小码哥.进入金3银4,很多小伙伴有被动跳槽的打算,所以更新一些APP面试题,希望能帮到大家,四千多字长文分享,建议收藏![文末免费分享面试题和软件测试学习资源] 一.Web 端测试和 ...
- 史上最全阿里Java面试题目大汇总!强烈建议收藏~
阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战(项目模拟面试) JAVA开发技术常问的问题 阿里必会知识 阿里面试范畴 阿里面试总结 一:阿里技术一面(基础掌握牢 ...
最新文章
- arcxml 中 outputmode=xml 和 outputmode=newxml 的区别
- 题目1197:奇偶校验
- 判断页面是否加载完成
- jmeter压测之 监控--nmon
- js中json的创建和解析
- 单源最短路径之迪杰斯特拉算法(C语言)
- paip.python错误解决10
- 肥学献礼——自动写诗
- 利用猜根法求解三阶行列式的特征值
- efficientNet论文心得
- 安卓实战之登录界面设计
- 怎样用Python的Numpy库求反正切
- Kruskal重构树 学习笔记
- matlab bar3 颜色,matlab中怎么控制柱状图标注的颜色?
- Excel 2010 VBA 入门 093 数据处理之建立数组
- NCBI中各个符号代表意思
- WEB基本表单及代码(HTML)
- 地图实景php,全景图展现 - 百度地图开发文档 - php中文网手册
- iOS调试Bug技巧
- 诺思格医药通过注册:年营收6亿 实控人武杰为美国籍
热门文章
- android radiobutton下划线,使用RadioGroup做简单的按钮下划线切换效果
- Oracle中EXECUTE IMMEDIATE用法
- 解决 CAP_IMAGES: can‘t find starting number (in the name of file)
- sobol灵敏度分析matlab_灵敏度分析_使用MATLAB编写.doc
- 好用免费的FTP软件工具推荐,支持中文 速来领取
- 《千与千寻》告诉产品经理什么?
- 使用jemdoc制作个人主页
- 推荐一款插件layim.js 阿里大牛贤心制作的一款webim聊天插件
- java博饼_java博饼游戏( 完善中。。。。。。。。。。。)
- Display debug(Blue Screen , fliker)