跳至主要內容

Dubbo

代码小郭...大约 4 分钟技术题库Dubbo

Dubbo

1、解释一下RPC

RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。

2、说说对dubbo的了解

从历史发展的角度来答:阿里巴巴开源的一个基于 Java 的 RPC 框架,在2017年重新开始维护,并且在 2018 年和当当的 Dubbox 进行了合并,进入 Apache 孵化器,在 2019 年毕业正式成为 Apache 顶级项目。 Dubbo 社区主力维护的是 2.6.x 和 2.7.x 两大版本,2.6.x 版本主要是 bug 修复和少量功能增强为准,是稳定版本。最新的 3.0 版本往云原生方向上探索着。

从总体架构的角度维护:分为如下角色节点

节点角色说明
Consumer需要调用远程服务的服务消费方
Registry注册中心
Provider服务提供方
Container服务运行的容器
Monitor监控中心

3、说下服务暴露和引用的流程?

Dubbo的服务暴露和引用流程主要分为下面的步骤:

  • Provider(提供者)绑定指定端口并启动服务;
  • 指供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储;
  • Consumer(消费者),连接注册中心,并发送应用信息、所求服务信息至注册中心;
  • 注册中心根据消费者所求服务信息匹配对应的提供者列表发送至Consumer应用缓存;
  • Consumer在发起远程调用时基于缓存的消费者列表择其一发起调用;
  • Provider状态变更会实时通知注册中心、在由注册中心实时推送至Consumer。

源码层面服务暴露的流程如下:

服务暴露主要流程
服务暴露主要流程

服务暴露的底层代码实现层面则是主要下面两个步骤:

  • 将持有的服务实例通过代理转换为Invoker对象(它的实现可能是本地、远程、集群这三种)

  • 将Invoker通过具体的协议(比如Dubbo框架中的Dubbo协议)转换为Exporter

源码层面服务发现的流程如下:

服务暴露主要流程
服务暴露主要流程

服务暴露的底层代码实现层面分为下面两个步骤:

  • 通过持有的远程服务实例来生成Invoker,即远程代理对象
  • 把Invoker通过动态代理转换成实现用户接口的动态代理引用

4、Dubbo中的SPI机制

Dubbo 中的扩展能力是从 JDK 标准的 SPI 扩展点发现机制加强而来。

dubbo的SPI流程
dubbo的SPI流程

通过SPI思想,用户能够基于 Dubbo 提供的扩展能力,很方便基于自身需求扩展其他协议、过滤器、路由等。

dubbo的扩展点能力
dubbo的扩展点能力

Dubbo 扩展能力使得 Dubbo 项目很方便的切分成一个一个的子模块,实现热插拔特性。用户完全可以基于自身需求,替换 Dubbo 原生实现,来满足自身业务需求。

Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下。

5、如何设计一个RPC框架

可以从底层向上开始说起

首先需要实现高性能的网络传输,可以采用 Netty 来实现,不用自己重复造轮子,然后需要自定义协议,毕竟远程交互都需要遵循一定的协议,然后还需要定义好序列化协议,网络的传输毕竟都是二进制流传输的。

然后可以搞一套描述服务的语言,即 IDL(Interface description language),让所有的服务都用 IDL 定义,再由框架转换为特定编程语言的接口,这样就能跨语言了。

此时最近基本的功能已经有了,但是只是最基础的,工业级的话首先得易用,所以框架需要把上述的细节对使用者进行屏蔽,让他们感觉不到本地调用和远程调用的区别,所以需要代理实现。

然后还需要实现集群功能,因此要服务发现、注册等功能,所以需要注册中心,当然细节还是需要屏蔽的。

最后还需要一个完善的监控机制,埋点上报调用情况等等,便于运维。

这样一个 RPC 框架的雏形就差不多了。

6、Dubbo的安全机制

Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。

Dubbo还提供服务黑白名单,来控制服务所允许的调用方。

原文链接open in new window

你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3