|
| 1 | +# 01-分布式技术面试实战 |
| 2 | + |
| 3 | +## 分布式技术面试实战 |
| 4 | + |
| 5 | +如果跟面试官聊到了 `分布式` 这方面的内容,该怎么去聊呢,或者说是面试官会去问哪些内容呢,下面对分布式面试内容进行分析 |
| 6 | + |
| 7 | +目前主流的微服务框架主要就是两个 `Dubbo`、 `Spring Cloud`,可能有些项目使用 Dubbo,有些使用 Spring Cloud |
| 8 | + |
| 9 | +其实两者最主要的区别就在于 `生态`,Spring Cloud 的生态很丰富,提供了注册中心、网关、服务熔断、服务限流等等很完善的一系列组件,功能比 Dubbo 丰富很多,而 Dubbo 设计的目的主要是作为一个 `RPC 服务框架` 使用,专注于服务注册、服务发现、负载均衡等服务治理的功能 |
| 10 | + |
| 11 | +简单来说,就是 Dubbo 主要是为了高性能的服务调用,而 Spring Cloud 是为了提供一套完整的微服务解决方案,而 Spring Cloud Alibaba 则整合了 Spring Cloud 和阿里巴巴的一些开源组件,如 Nacos、Dubbo、Sentinel 等等,通过 Spring Cloud Alibaba 可以迅速的将 Spring Cloud 接入阿里中间件,搭建分布式系统 |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +### 技术选型 |
| 16 | + |
| 17 | +那么先来思考第一个问题:你们公司微服务框架选用了哪一种,为什么这样选择呢? |
| 18 | + |
| 19 | +简单来说,可以从 `公司的需求` 和 `对哪一种微服务框架更加熟悉` 这两方面来说,就比如说,我对 Dubbo 更加熟悉,那么肯定使用 Dubbo,这样对于前期生产成本以及后期维护成本都是大大降低了,其实选用哪一种技术,也不用说的很天花乱坠,只要说明需求即可 |
| 20 | + |
| 21 | +其次,可以去 Dubbo 官网,Dubbo 在官网也有与 Spring Cloud 的比较 |
| 22 | + |
| 23 | +如 Spring Cloud 存在了一些问题如下,而这些问题也就是 Dubbo 的优势: |
| 24 | + |
| 25 | +- 落地成本以及后期维护成本大 |
| 26 | +- 欠缺服务治理功能,尤其负载均衡、流量路由方面较弱 |
| 27 | +- 基于 HTTP 进行通信,性能不如 RPC 框架 |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | + |
| 33 | +### 技术原理 |
| 34 | + |
| 35 | +那么假如说,微服务框架选择了 Dubbo,那面试官肯定是要问问你有没有看过 Dubbo 的源码呢?原理了解吗? |
| 36 | + |
| 37 | +这里我就以 Dubbo 来举例,如果你使用 Spring Cloud 或 Spring Cloud Alibaba,问题都是类似的,你一定要对这个问题,画一个原理的流程图,可以和面试官清晰的讲解出来,Dubbo 整理的流程图我也画出来了,如下图,流程我也写成文字: |
| 38 | + |
| 39 | +1. 每个服务提供者都会去注册中心注册自己,包括自己的地址(ip+port) |
| 40 | +2. 服务消费者去消费时,从注册中心(Dubbo 使用 ZooKeeper 作为注册中心)中拉取服务列表 |
| 41 | +3. 消费者会去为远程代理对象创建一个动态代理对象,通过动态代理来拦截方法的执行 |
| 42 | +4. 在代理对象的拦截中,会去执行一系列的操作 |
| 43 | + 1. 负载均衡,选择一台机器进行通信 |
| 44 | + 2. 选择一种通信协议:Dubbo 提供了自定义的高性能 rpc 通信协议 |
| 45 | + 3. 将请求进行封装,并且序列化 |
| 46 | + 4. 通过网络通信框架,将远程调用请求传给 Dubbo 服务提供者 |
| 47 | +5. Dubbo 服务提供者收到后,也会进行一系列操作解析请求,最后调用本地服务,将执行结果返回给服务消费者 |
| 48 | + |
| 49 | + |
| 50 | + |
| 51 | + |
| 52 | + |
| 53 | +### 由面到点 |
| 54 | + |
| 55 | +整体的一个 Dubbo 原理说完之后,肯定会从 Dubbo 某一个具体的功能切入,比如说一下 Dubbo 底层的网络通信机制原理,这其实考察的就是 Dubbo 底层网络通信框架 Netty 的原理,只要讲一下 Netty 如何进行网络通信,以及 Netty 的线程模型是怎样的就可以了 |
| 56 | + |
| 57 | +具体的技术细节就不说了,这里主要说一下面试的逻辑,只有熟悉面试官的逻辑之后,才可以更好的去准备面试 |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +### 系统设计层面 |
| 62 | + |
| 63 | +并且对于一个技术,可以多去看一下它的官网,看一下官网怎么说这个技术的优点,以及它的架构设计! |
| 64 | + |
| 65 | +Dubbo 在系统设计层面,如何实现了它的高度可扩展能力呢?使用了 SPI 来实现 |
| 66 | + |
| 67 | +Dubbo 中将核心的组件全部接口化,组件和组件之间的调用全部依托于接口,之后再动态去寻找配置的实现类,如果没有配置,就去使用默认的实现类 |
| 68 | + |
| 69 | +并且 Dubbo 提供了配置自己实现的组件的功能,如果你自己实现了一个组件,通过配置,可以在 Dubbo 运行的时候,直接使用你的组件而不是默认的组件 |
| 70 | + |
| 71 | +Dubbo 提供了很多的 SPI 扩展实现,如: |
| 72 | + |
| 73 | +- 协议扩展 |
| 74 | +- 调用拦截扩展 |
| 75 | +- 集群扩展 |
| 76 | +- ... |
| 77 | + |
| 78 | +更多细节可以查看 Dubbo 官方文档 |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | +### 自己设计 |
| 87 | + |
| 88 | +如果面试官让你自己设计一个 RPC 框架,你该从哪些方面来设计呢? |
| 89 | + |
| 90 | +这个东西,其实也没法简简单单说清楚,其实也就是问你 Dubbo 底层的原理,只不过,让你自己设计,可能并不需要太复杂的功能,你需要可以从整体流程来说一下 RPC 框架需要哪些功能部分,那么接下来我就简单从各个功能来说一下: |
| 91 | + |
| 92 | +- `注册中心`:RPC 框架是需要服务之间进行调用,那么一定要有一个地方去存储服务的地址,可以进行 `服务注册` 和 `服务发现` 的功能的,注册中心使用 ZooKeeper 实现 |
| 93 | +- `动态代理`:RPC 框架中,服务消费者肯定是没有服务提供者的一个实例对象的,因为他们分布在不同机器上,所以需要去创建动态代理对象 |
| 94 | +- `负载均衡`:这个是在消费方实现的,消费者从注册中心拉取到服务提供者的地址,可以根据多个地址进行负载均衡 |
| 95 | +- `序列化、网络通信`:消费者最终会将调用请求发送到服务提供者去,最终服务提供者执行完本地方法,再将执行结果给返回,这其中通信框架可以使用 Netty(高性能网络通信),并且需要将调用请求序列化为二进制的字节数组,才可以通过网络发送出去 |
| 96 | + |
| 97 | +我自己也写过一个 RPC 框架,这里将流程图给出来,可以看一下整体的 rpc 调用流程是怎样的: |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | + |
0 commit comments