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 扩展点发现机制加强而来。
通过SPI思想,用户能够基于 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还提供服务黑白名单,来控制服务所允许的调用方。