想进大厂,先自问 Dubbo 普普通通 9 问能答出来吗!
作者 | 科技缪缪
来源 | 科技缪缪(ID:kejimiumiu)
头图 | CSDN 下载自东方IC
说说Dubbo的分层?
能说下Dubbo的工作原理吗?
-
服务启动的时候,provider和consumer根据配置信息,连接到注册中心register,分别向注册中心注册和订阅服务 -
register根据服务订阅关系,返回provider信息到consumer,同时consumer会把provider信息缓存到本地。如果信息有变更,consumer会收到来自register的推送 -
consumer生成代理对象,同时根据负载均衡策略,选择一台provider,同时定时向monitor记录接口的调用次数和时间信息 -
拿到代理对象之后,consumer通过代理对象发起接口调用 -
provider收到请求后对数据进行反序列化,然后通过代理调用具体的接口实现
为什么要通过代理对象通信?
说说服务暴露的流程?
-
在容器启动的时候,通过ServiceConfig解析标签,创建dubbo标签解析器来解析dubbo的标签,容器创建完成之后,触发ContextRefreshEvent事件回调开始暴露服务 -
通过ProxyFactory获取到invoker,invoker包含了需要执行的方法的对象信息和具体的URL地址 -
再通过DubboProtocol的实现把包装后的invoker转换成exporter,然后启动服务器server,监听端口 -
最后RegistryProtocol保存URL地址和invoker的映射关系,同时注册到服务中心
说说服务引用的流程?
-
首先客户端根据配置文件信息从注册中心订阅服务 -
之后DubboProtocol根据订阅的得到provider地址和接口信息连接到服务端server,开启客户端client,然后创建invoker -
invoker创建完成之后,通过invoker为服务接口生成代理对象,这个代理对象用于远程调用provider,服务的引用就完成了
有哪些负载均衡策略?
-
加权随机:假设我们有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3, 2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于服务器 B,[8, 10) 区间属于服务器 C。接下来通过随机数生成器生成一个范围在 [0, 10) 之间的随机数,然后计算这个随机数会落到哪个区间上就可以了。 -
最小活跃数:每个服务提供者对应一个活跃数 active,初始情况下,所有服务提供者活跃数均为0。每收到一个请求,活跃数加1,完成请求后则将活跃数减1。在服务运行一段时间后,性能好的服务提供者处理请求的速度更快,因此活跃数下降的也越快,此时这样的服务提供者能够优先获取到新的服务请求。 -
一致性hash:通过hash算法,把provider的invoke和随机节点生成hash,并将这个 hash 投射到 [0, 2^32 - 1] 的圆环上,查询的时候根据key进行md5然后进行hash,得到第一个节点的值大于等于当前hash的invoker。
-
加权轮询:比如服务器 A、B、C 权重比为 5:2:1,那么在8次请求中,服务器 A 将收到其中的5次请求,服务器 B 会收到其中的2次请求,服务器 C 则收到其中的1次请求。
集群容错方式有哪些?
-
Failover Cluster失败自动切换:dubbo的默认容错方案,当调用失败时自动切换到其他可用的节点,具体的重试次数和间隔时间可用通过引用服务的时候配置,默认重试次数为1也就是只调用一次。 -
Failback Cluster快速失败:在调用失败,记录日志和调用信息,然后返回空结果给consumer,并且通过定时任务每隔5秒对失败的调用进行重试 -
Failfast Cluster失败自动恢复:只会调用一次,失败后立刻抛出异常 -
Failsafe Cluster失败安全:调用出现异常,记录日志不抛出,返回空结果 -
Forking Cluster并行调用多个服务提供者:通过线程池创建多个线程,并发调用多个provider,结果保存到阻塞队列,只要有一个provider成功返回了结果,就会立刻返回结果 -
Broadcast Cluster广播模式:逐个调用每个provider,如果其中一台报错,在循环调用结束后,抛出异常。
了解Dubbo SPI机制吗?
SPI 全称为 Service Provider Interface,是一种服务发现机制,本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类,这样可以在运行时,动态为接口替换实现类。
Dubbo也正是通过SPI机制实现了众多的扩展功能,而且dubbo没有使用java原生的SPI机制,而是对齐进行了增强和改进。
SPI在dubbo应用很多,包括协议扩展、集群扩展、路由扩展、序列化扩展等等。
使用方式可以在META-INF/dubbo目录下配置:
key=com.xxx.value
如果让你实现一个RPC框架怎么设计?
-
首先需要一个服务注册中心,这样consumer和provider才能去注册和订阅服务 -
需要负载均衡的机制来决定consumer如何调用客户端,这其中还当然要包含容错和重试的机制 -
需要通信协议和工具框架,比如通过http或者rmi的协议通信,然后再根据协议选择使用什么框架和工具来进行通信,当然,数据的传输序列化要考虑 -
除了基本的要素之外,像一些监控、配置管理页面、日志是额外的优化考虑因素。
更多精彩推荐
☞
点分享 点点赞 点在看