本文来说下Dubbo常见面试题。Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理、负载均衡策略、容错机制、SPI机制基本就差不多了,最大的一道大题一般就是怎么设计一个RPC框架了,但是如果你工作原理分层都搞明白了这个问题其实也就相当于回答了不是吗。
文章目录
- 什么是Dubbo
- 为什么要使用Dubbo
- Dubbo提供了哪3个关键功能
- Dubbo服务的关键节点有哪些
- 说一下Dubbo服务注册流程
- 能画一下服务注册流程图吗
- Dubbo架构的特点
- 对jdk的最小版本需求
- 注册中心的选择
- Dubbo的核心配置和用途
- 配置优先级规则
- 如何用代码方式绕过注册中心点对点直连
- Dubbo配置来源有几种?分别是
- 如何禁用某个服务的启动检查
- Dubbo负载均衡策略?默认是
- 上线兼容老版本
- 开发测试环境,想绕过注册中心如何配置
- 集群容错几种方法
- Dubbo有几种配置方式
- Dubbo有哪些协议?推荐
- Dubbo使用什么通信框架
- dubbo协议默认端口号?http协议默认端口?hessian?rmi?
- Dubbo默认序列化框架?其他的你还知道
- 一个服务有多重实现时,如何处理
- Dubbo服务调用默认是阻塞的?还有其他的
- Dubbo服务追踪解决方案
- io线程池大小默认
- dubbo://协议适合什么样的服务调用
- 自动剔除服务什么原理
- 从 2.0.5 版本开始,dubbo支持通过x命令来进行服务治理
- 如何用命令查看服务列表
什么是Dubbo
Dubbo是基于Java的高性能轻量级的RPC分布式服务框架,现已成为Apache基金会孵化项目。
为什么要使用Dubbo
背景:
随着互联网的快速发展,Web应用程序的规模不断扩大,最后我们发现传统的垂直体系结构(整体式)已无法解决。分布式服务体系结构和流计算体系结构势在必行,迫切需要一个治理系统来确保体系结构的有序发展。
- 开源免费
- 一些核心业务被提取并作为独立的服务提供服务,逐渐形成一个稳定的服务中心,这样前端应用程序就可以更好地响应变化多端的市场需求
- 分布式框架能承受更大规模的流量
- 内部基于netty性能高
Dubbo提供了哪3个关键功能
- 基于接口的远程调用
- 容错和负载均衡
- 自动服务注册和发现
Dubbo服务的关键节点有哪些
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
说一下Dubbo服务注册流程
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
能画一下服务注册流程图吗
Dubbo架构的特点
连通性、健壮性、伸缩性、以及向未来架构的升级性。
对jdk的最小版本需求
jdk1.6+
注册中心的选择
一般来说选中Zookeeper更稳定更合适。
除了Zookeeper还有Redis注册中心、Multicast注册中心、Simple注册中心。
Dubbo的核心配置和用途
配置优先级规则
优先级从高到低:
- JVM -D参数,当你部署或者启动应用时,它可以轻易地重写配置,比如,改变dubbo协议端口;
- XML, XML中的当前配置会重写dubbo.properties中的;
- Properties,默认配置,仅仅作用于以上两者没有配置时。
如何用代码方式绕过注册中心点对点直连
// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>();
// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,
// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService");
Dubbo配置来源有几种?分别是
4种
- JVM System Properties,-D参数
- Externalized Configuration,外部化配置
- ServiceConfig、ReferenceConfig等编程接口采集的配置
- 本地配置文件dubbo.properties
如何禁用某个服务的启动检查
<dubbo:reference interface = "com.foo.BarService" check = "false" />
Dubbo负载均衡策略?默认是
- 随机负载平衡(默认)
- RoundRobin负载平衡
- 最小活动负载平衡
- 一致的哈希负载平衡
上线兼容老版本
多版本号(version)
开发测试环境,想绕过注册中心如何配置
xml
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
.properties
com.alibaba.xxx.XxxService=dubbo://localhost:20890
集群容错几种方法
Dubbo有几种配置方式
- Spring
- Java API
Dubbo有哪些协议?推荐
dubbo://(推荐)
rmi://
hessian://
http://
webservice://
thrift://
memcached://
redis://
rest://
Dubbo使用什么通信框架
dubbo使用netty
dubbo协议默认端口号?http协议默认端口?hessian?rmi?
dubbo:20880
http:80
hessian:80
rmi:80
Dubbo默认序列化框架?其他的你还知道
dubbo协议缺省为hessian2
rmi协议缺省为java
http协议缺省为json
一个服务有多重实现时,如何处理
可以用group分组,服务提供方和消费放都指定同一个group。
Dubbo服务调用默认是阻塞的?还有其他的
默认是同步等待结果阻塞的,同时也支持异步调用。
Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
Dubbo服务追踪解决方案
Zipkin
Pinpoint
SkyWalking
io线程池大小默认
cpu个数 + 1
dubbo://协议适合什么样的服务调用
采用单一长链接和NIO异步通讯,适用于小数量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
自动剔除服务什么原理
zookeeper临时节点,会话保持原理。
从 2.0.5 版本开始,dubbo支持通过x命令来进行服务治理
telnet
如何用命令查看服务列表
telnet localhost 20880
进入命令行。然后执行 ls相关命令:
- ls: 显示服务列表
- ls -l: 显示服务详细信息列表
- ls XxxService: 显示服务的方法列表
- ls -l XxxService: 显示服务的方法详细信息列表