1.Dubbo是什么?能干嘛?RPC又是什么?

Dubbo是一个基于分布式的远程调用框架,通过Dubbo,开发者能像调用本地方法一样调用部署在远端机器上的方法。而RPC是Remote Procedure Call的简写,翻译成中文是远程过程调用,通过RPC,程序员能在不需要了解网络底层通讯细节的基础上调用远端服务。

关于RPC的调用方式大家可以参考下图,而Dubbo是以RPC的方式来调用远端服务。

而Dubbo的主要功能包括远程通讯,以集群的方式对外提供服务和服务治理。

  1. 远程通讯是指,能通过dubbo-remoting模块,提供多种基于长连接的NIO框架的通讯服务。
  2. 以集群方式对外提供服务是指,提供服务的方法不仅透明,而且服务方法能以分布式的方式部署,能以负载均衡的方式提供服务,当然在提供服务的过程中还支持多协议、失败容错和动态配置等功能。
  3. 服务治理,这和微服务里的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的面试题,建议收藏相关推荐

  1. Hadoop高频面试题(建议收藏)

    一.什么是Hadoop? 这是一个看着不起眼,实则"送命题"的典型.往往大家关于大数据的其他内容准备得非常充分,反倒问你什么是Hadoop却有点猝不及防,回答磕磕绊绊,给面试官的印 ...

  2. Mysql经典面试题(建议收藏)

    除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1:char.varcha ...

  3. 金三银四,50道必备的Python面试题(建议收藏)

    在过去的2020年,Python赢得了年度TIOBE编程语言奖,成为过去一年最受欢迎的编程语言.在数据科学和机器学习等领域中,被广泛使用. 正值"金三银四"招聘季,小F给大家整理了 ...

  4. Spark高频面试题(建议收藏)

    一.你是怎么理解Spark,它的特点是什么? Spark是一个基于内存的,用于大规模数据处理(离线计算.实时计算.快速查询(交互式查询))的统一分析引擎. 它内部的组成模块,包含SparkCore,S ...

  5. 精心整理42道计算机网络高频面试题(建议收藏)

    计算机网络 1. 谈下你对五层网络协议体系结构的理解? 学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清 ...

  6. 最强Java面试题全部合集,涵盖BAT大厂面试必考的9大技术!-强烈建议收藏

    过去2年我持续分享了BAT TMD为代表的大厂最新面试题目,特别是蚂蚁金服.天猫.淘宝.头条.拼多多等Java面试题目. 过去2年,我已经成功的帮助了部分同学进入了大厂. 2020开始,我依然会为大家 ...

  7. 2019最全BAT资深Java面试题答案合集,建议收藏~

    马上进入求职招聘高峰,总结了一份BAT(阿里.百度等)资深Java相关的面试题答案合集给到大家. 该板块的各面试章节,后续会持续迭代更新最新一线互联网公司的面试题目,建议收藏该页面,不定期更新查看~ ...

  8. 建议收藏:模拟版图高频面试题,直通面试,Offer抢先拿!

    模拟板图工程师在行业内是个神奇的存在,**"零基础的门槛"."岗位需求量大"."高就业薪资"**模拟版图工程师成为了行业宠儿,促使很多人跨行 ...

  9. 2023金3银4求职季,APP面试题放送(建议收藏)

    Hi,大家好,我是小码哥.进入金3银4,很多小伙伴有被动跳槽的打算,所以更新一些APP面试题,希望能帮到大家,四千多字长文分享,建议收藏![文末免费分享面试题和软件测试学习资源] 一.Web 端测试和 ...

  10. 史上最全阿里Java面试题目大汇总!强烈建议收藏~

    阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战(项目模拟面试) JAVA开发技术常问的问题 阿里必会知识 阿里面试范畴 阿里面试总结 一:阿里技术一面(基础掌握牢 ...

最新文章

  1. arcxml 中 outputmode=xml 和 outputmode=newxml 的区别
  2. 题目1197:奇偶校验
  3. 判断页面是否加载完成
  4. jmeter压测之 监控--nmon
  5. js中json的创建和解析
  6. 单源最短路径之迪杰斯特拉算法(C语言)
  7. paip.python错误解决10
  8. 肥学献礼——自动写诗
  9. 利用猜根法求解三阶行列式的特征值
  10. efficientNet论文心得
  11. 安卓实战之登录界面设计
  12. 怎样用Python的Numpy库求反正切
  13. Kruskal重构树 学习笔记
  14. matlab bar3 颜色,matlab中怎么控制柱状图标注的颜色?
  15. Excel 2010 VBA 入门 093 数据处理之建立数组
  16. NCBI中各个符号代表意思
  17. WEB基本表单及代码(HTML)
  18. 地图实景php,全景图展现 - 百度地图开发文档 - php中文网手册
  19. iOS调试Bug技巧
  20. 诺思格医药通过注册:年营收6亿 实控人武杰为美国籍

热门文章

  1. android radiobutton下划线,使用RadioGroup做简单的按钮下划线切换效果
  2. Oracle中EXECUTE IMMEDIATE用法
  3. 解决 CAP_IMAGES: can‘t find starting number (in the name of file)
  4. sobol灵敏度分析matlab_灵敏度分析_使用MATLAB编写.doc
  5. 好用免费的FTP软件工具推荐,支持中文 速来领取
  6. 《千与千寻》告诉产品经理什么?
  7. 使用jemdoc制作个人主页
  8. 推荐一款插件layim.js 阿里大牛贤心制作的一款webim聊天插件
  9. java博饼_java博饼游戏( 完善中。。。。。。。。。。。)
  10. Display debug(Blue Screen , fliker)