Distributed System
1、服务治理
1.1 负载均衡
1.2 熔断、降级
2、服务通信
2.1 RPC
2.2 Netty
-
+
tourist
register
Sign in
RPC
## 1 含义 1. RPC,全称为 Remote Procedure Call,即**远程过程调用**。 2. 因为**两个不同服务器上的服务提供的方法不在一个内存空间**,所以**需要通过网络编程才能传递方法调用所需的参数**,并且,**方法调用的结果也需要通过网络编程来接收**,如果我们**自己手动网络编程来实现这个调用过程的话工作量是非常大的**,因为我们**需要考虑底层传输方式**(TCP 还是 UDP)、**序列化方式等方面**。 3. 通过 RPC 可以**帮助我们调用远程计算机上某个服务的方法**,**这个过程就像调用本地方法一样简单**,并且我们**不需要了解底层网络编程的具体细节**,例如,两个不同的额服务 A、B 部署在两台不同的机器上,服务 A 如果想要调用服务 B 中的某个方法的话就可以通过 RPC 来做。 4. 因此,RPC 的出现就是为了**让我们调用远程方法像调用本地方法一样简单**。 ## 2 原理 1. RPC 的核心功能可以看作是下面六个部分实现的: 1. **客户端**(服务消费端):**调用远程方法的一端**。 2. **客户端 Stub**(桩):这其实就**是一个代理类**,主要用于**把我们的调用方法**、**类**、**方法参数等信息传递到服务端**。 3. **网络传输**:网络传输就是要**把我们调用方法的信息**(比如参数)**传输到服务端**,然后**服务端执行完之后再把返回结果通过网络传输给我们传输回来**,网络传输的实现方式有很多,比如最基本的 Socket 以及封装更加优秀的 Netty。 4. **服务端 Stub**(桩):这个妆就**不是一个代理类**,主要用于**接收客户端执行方法的请求后**,去**执行对应的方法然后放回结果给客户端**。 5. **服务端**(服务提供端):**提供远程方法的一端**。 2. 具体的执行过程如下: 1. 客户端**以本地调用的方式调用远程服务**。 2. 客户端 Stub**接收到调用后**: 1. **将方法**、**参数等序列化成能够进行网络传输的消息体**(RpcRequest), 2. 然后**找到远程服务的地址**,并**将消息发送给服务提供端**。 3. 服务端 Stub**收到消息后**: 1. **将消息反序列化为 Java 对象**(RpcRequest)。 2. 然后**根据 RpcRequest 中的类**、**方法**、**方法参数等信息调用本地方法**。 3. **得到方法执行结果后将结果序列化为能够进行网络传输的消息体**(RpcResponse),并**将其发送至消费方**。 4. 客户端 Stub**接收到消息后**: 1. **将消息反序列化为 Java 对象**(RpcResponse),这样也**就得到了最终结果**。 ![](/media/202108/2021-08-17_1723310.42689801856435583.png) ## 3 常见框架 > 我们这里说的 RPC 框架指的是**可以让客户端直接调用服务端方法**,**就向调用本地方法一样简单**的框架,比如 Dubbo、Motan、gRPC 等,如果需要和 HTTP 协议打交道,解析和封装 HTTP 请求和响应,这类框架并不能算是 RPC 框架,比如 Feign。 常见的 RPC 框架主要有 Dubbo、Motan、gRPC、Thrift。 ### 3.1 Dubbo 1. Dubbo 是一款**高性能**、**轻量级的开源分布式服务框架**,**致力于提供高性能和透明化的 RPC 远程服务调用方式**,由阿里开源,后来加入了 Apache。 2. Dubbo 主要提供了**三大核心能力**: 1. **面向接口的远程方法调用**。 2. **智能容错和负载均衡**。 3. **服务自动注册发现**。 ### 3.2 Motan 1. Motan 是新浪微博于 2016 年开源的一款 RPC 框架,据说在新浪微博支撑着千亿次调用。 2. Motan 更像是一个**精简版的 Dubbo**,**设计更加精简**,**功能更加纯粹**。 ### 3.3 gRPC 1. gRPC 是 Google 开源的一个**高性能**、**通用的开源 RPC 框架**。 2. **主要面向移动应用开发**,**基于 HTTP/2 协议标准而设计**,**基于 ProtoBuf 序列化协议开发**,**支持众多开发语言**。 ### 3.4 Thrift 1. Thrift 是 Facebook 开源的**跨语言的 RPC 框架**,目前已经捐献给 Apache 基金会管理。 2. 由于其**跨语言特性**和**出色的性能**,在很多互联网公司得到应用,有能力的公司甚至会基于 Thrift 研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。 3. Thrift**支持多种不同的编程语言**,包括 C++、Java、Python、PHP、Ruby 等(相比于 gRPC 支持的语言更多)。 ### 3.5 总结 1. gRPC 和 Thrift 虽然支持跨语言的 RPC 调用,但是他们**只提供了最基本的 RPC 框架功能**,**缺乏一系列配套的服务化组件和服务治理功能的支撑**。 2. Dubbo 不论是从功能完善程度、生态系统还是社区活跃度来说都是最优秀的,最重要的是在国内有很多成功的案例,比如当当网、滴滴等,下图展示了 Dubbo 的生态系统:![](/media/202108/2021-08-17_1746170.03768661829669018.png) 3. 另外,Dubbo 也是 Spring Cloud Alibaba 里面的一个组件:![](/media/202108/2021-08-17_1747150.2327271403953749.png) 4. 但是,Dubbo 和 Motan 主要是给 Java 语言使用的,虽然 Dubbo 和 Motan 目前也能兼容部分语言,但是不太推荐,如果需要跨语言调用的话,可以考虑一下 Thrift 和 gRPC。 ## 参考文献 1. [01 什么是 RPC?原理是什么?](https://www.yuque.com/books/share/b7a2512c-6f7a-4afe-9d7e-5936b4c4cab0/ov6225) 2. [02 常见 RPC 框架介绍](https://www.yuque.com/books/share/b7a2512c-6f7a-4afe-9d7e-5936b4c4cab0/hedn92)。 3. [03 如何自己实现一个 RPC 框架?](https://www.yuque.com/books/share/b7a2512c-6f7a-4afe-9d7e-5936b4c4cab0/hc6nzg) 4. [序列化理解起来很简单](https://zhuanlan.zhihu.com/p/40462507)。 5. [04 序列化介绍以及序列化协议选择](https://www.yuque.com/books/share/b7a2512c-6f7a-4afe-9d7e-5936b4c4cab0/ibay8y)。
ricear
Aug. 28, 2021, 4:07 p.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password