其实关于Dubbo
的面试题,我觉得最好的文档应该还是官网,因为官网有中文版,照顾了很多阅读英文文档吃力的小伙伴。但是官网内容挺多的,于是这里就结合官网和平时面试被问的相对较多的题目整理了一下。
1,说说一次Dubbo
服务请求流程?
基本工作流程:
上图中角色说明:
2,说说Dubbo
工作原理
工作原理分10层:
第一层:service层,接口层,给服务提供者和消费者来实现的(留给开发人员来实现)第二层:config层,配置层,主要是对Dubbo进行各种配置的,Dubbo相关配置第三层:proxy层,服务代理层,透明生成客户端的stub和服务单的skeleton,调用的是接口,实现类没有,所以得生成代理,代理之间再进行网络通讯、负责均衡等。第四层:registry层,服务注册层,负责服务的注册与发现第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控第七层:protocol层,远程调用层,封装rpc调用第八层:exchange层,信息交换层,封装请求响应模式,同步转异步第九层:transport层,网络传输层,抽象mina和netty为统一接口第十层:serialize层,数据序列化层
这是个很坑爹的面试题,但是很多面试官有喜欢问,你真的要背么?你能背那还是不错的,我建议不要背,你就想想Dubbo
服务调用过程中应该会涉及到哪些技术,把这些技术穿起来就OK了。
面试扩散
如果让你设计一个RPC
框架,你会怎么做?其实你就把上面这个工作原理中涉及的到技术点总结一下就行了。
3,Dubbo
支持哪些协议?
还有三种就混个眼熟就行memcached
协议、redis
协议、rest协议。
上图中基本上把序列化的方式也罗列出来了。
详细请参考:Dubbo官网
4,注册中心挂了,consumer还能不能调用provider
可以,因为刚开始初始化的时候,consumer会将需要的所有提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。但是provider挂了,那就没法调用了。
关键字:consumer本地缓存服务列表
5,怎么实现动态感知服务下线的呢?
服务订阅通常有 pull 和 push 两种方式:
- pull 模式需要客户端定时向注册中心拉取配置;
- push 模式采用注册中心主动推送数据给客户端;
DubboZookeeper
注册中心采用是事件通知与客户端拉取方式。服务第一次订阅的时候将会拉取对应目录下全量数据,然后在订阅的节点注册一个 watcher。一旦目录节点下发生任何数据变化,Zookeeper
将会通过 watcher 通知客户端。客户端接到通知,将会重新拉取该目录下全量数据,并重新注册 watcher。利用这个模式,Dubbo
服务就可以就做到服务的动态发现。
注意:Zookeeper
提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除。
6,Dubbo
负载均衡策略?
- 随机(默认)- 随机来
- 轮训 - 一个一个来
- 活跃度- 机器活跃度来负载
- 一致性hash - 落到同一台机器上
7,Dubbo
容错策略
failover cluster
模式
provider 宕机重试以后,请求会分到其他的provider上,默认两次,可以手动设置重试次数,建议把写操作重试次数设置成0。
failback
模式
失败自动恢复会在调用失败后,返回一个空结果给服务消费者。并通过定时任务对失败的调用进行重试,适合执行消息通知等操作。
failfast cluster
模式
快速失败只会进行一次调用,失败后立即抛出异常。适用于幂等操作,写操作,类似于failover cluster
模式中重试次数设置为0的情况。
failsafe cluster
模式
失败安全是指,当调用过程中出现异常时,仅会打印异常,而不会抛出异常。适用于写入审计日志等操作。
forking cluster
模式
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
broadcacst cluster
模式
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
8,Dubbo
动态代理策略有哪些?
默认使用javassist
动态字节码生成,创建代理类,但是可以通过SPI
扩展机制配置自己的动态代理策略
9,说说Dubbo
与Spring Cloud的区别?
这是很多面试官喜欢问的话题,本人认为其实他们没什么关联之处,但是硬是要问区别,那就说说吧;
回答的时候主要围绕着四个来说:通信方式、注册中心、监控、断路器,其余像Spring分布式配置、服务网关肯定得知道。
通信方式
Dubbo
使用的是RPC
通信,Spring Cloud使用的是HTTP RestFul
方式
注册中心
Dubbo
使用Zookeeper
(官方推荐),还有Redis、Multicast、Simple
注册中心,但不推荐,
Spring Cloud使用的是Spring Cloud Netflix Eureka
监控
Dubbo
使用的是Dubbo
-monitor,Spring Cloud使用的是Spring Boot admin
断路器
Dubbo
在断路器这方面还不完善,Spring Cloud使用的是Spring Cloud Netflix Hystrix
分布式配置、网关服务、服务跟踪、消息总线、批量任务等
Dubbo
目前可以说还是空白,而Spring Cloud 都有相应的组件来支撑。