|
1 | | -<https://www.jianshu.com/p/2accc2840a1b> |
| 1 | + |
2 | 2 |
|
3 | | -## RPC是个啥玩意 |
| 3 | +> 说起 rpc,肯定要提到分布式 |
| 4 | +> |
| 5 | +> 能说下rpc的通信流程吗 |
| 6 | +> |
| 7 | +> 如果没有rpc框架,你怎么调用另外一台服务器上的接口呢 |
4 | 8 |
|
5 | | -**远程过程调用**(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程,区别于本地过程调用。 |
| 9 | +## 一、RPC是个啥玩意 |
6 | 10 |
|
| 11 | +**远程过程调用**(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程,区别于本地过程调用。 |
7 | 12 |
|
8 | 13 |
|
9 | | -**RPC要解决的两个问题:** |
10 | 14 |
|
11 | | -1. **解决分布式系统中,服务之间的调用问题。** |
12 | | -2. **远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。** |
| 15 | +远程过程调用,自然是相对于本地过程调用来说的,如果是个单体应用,内部之间,本地函数调用就可以了,因为在**同一个地址空间**,或者说在同一块内存,所以通过方法栈和参数栈就可以实现。 |
13 | 16 |
|
| 17 | +随着应用的升级,单体应用无法满足发展,我们改造成分布式应用,将很多可以共享的功能都单独拎出来组成各种服务 |
14 | 18 |
|
| 19 | +这时候有同学会说了,服务之间通过 http,调用 Restful 接口就行 |
15 | 20 |
|
| 21 | +对了,我们外部 API 一般都是这样,每次构造 http 请求和 body 这些 |
16 | 22 |
|
| 23 | +可是我们是内部系统,希望可以像本地调用那样,去发起远程调用,让使用者感知不到远程调用的过程呢,像这样: |
17 | 24 |
|
18 | | -更通俗的解释:[如何给老婆解释什么是RPC](<https://www.jianshu.com/p/2accc2840a1b> ) |
| 25 | +```java |
| 26 | +@Reference |
| 27 | +private Calculator calculator; |
19 | 28 |
|
| 29 | +... |
20 | 30 |
|
| 31 | +calculator.add(1,2); |
21 | 32 |
|
| 33 | +... |
22 | 34 |
|
| 35 | +``` |
23 | 36 |
|
24 | | -<https://www.cnblogs.com/LBSer/p/4853234.html> |
| 37 | +这时候,有同学就会说,用**代理模式**呀!而且最好是结合Spring IoC一起使用,通过Spring注入calculator对象,注入时,如果扫描到对象加了@Reference注解,那么就给它生成一个代理对象,将这个代理对象放进容器中。而这个代理对象的内部,就是通过httpClient来实现RPC远程过程调用的。 |
25 | 38 |
|
26 | | -<https://juejin.im/entry/57c866230a2b58006b204712> |
| 39 | +可能上面这段描述比较抽象,不过这就是很多RPC框架要解决的问题和解决的思路,比如阿里的Dubbo。 |
27 | 40 |
|
28 | | -## 如何调用他人的远程服务? |
| 41 | +总结一下,RPC 的作用体现在两个方面 |
29 | 42 |
|
30 | | - 由于各个服务部署在不同机器,服务间的调用涉及到网络通信过程,如果服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅使用复杂而且极易出错。 |
| 43 | +1. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑 |
| 44 | +2. 解决分布式系统中,服务之间的调用问题。隐藏底层网络通信的复杂性,让我们更专注于业务 |
31 | 45 |
|
32 | | -如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。 |
33 | 46 |
|
34 | | -我们首先看下一个RPC调用的具体流程: |
35 | 47 |
|
36 | | - |
| 48 | +实际情况下,RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢,我为什么不直接使用**二进制传输**?比如直接用Java的Socket协议进行传输? |
37 | 49 |
|
38 | | -1)服务消费方(client)调用以本地调用方式调用服务; |
| 50 | +不管你用何种协议进行数据传输,**一个完整的RPC过程,都可以用下面这张图来描述**: |
39 | 51 |
|
40 | | -2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体; |
| 52 | + |
41 | 53 |
|
42 | | -3)client stub找到服务地址,并将消息发送到服务端; |
| 54 | +以左边的Client端为例,Application就是rpc的调用方,Client Stub就是我们上面说到的代理对象,也就是那个看起来像是Calculator的实现类,其实内部是通过rpc方式来进行远程调用的代理对象,至于Client Run-time Library,则是实现远程调用的工具包,比如jdk的Socket,最后通过底层网络实现实现数据的传输。 |
43 | 55 |
|
44 | | -4)server stub收到消息后进行解码; |
45 | | - |
46 | | -5)server stub根据解码结果调用本地的服务; |
| 56 | +这个过程中最重要的就是**序列化**和**反序列化**了,因为数据传输的数据包必须是二进制的,你直接丢一个Java对象过去,人家可不认识,你必须把Java对象序列化为二进制格式,传给Server端,Server端接收到之后,再反序列化为Java对象。 |
47 | 57 |
|
48 | | -6)本地服务执行并将结果返回给server stub; |
49 | 58 |
|
50 | | -7)server stub将返回结果打包成消息并发送至消费方; |
51 | 59 |
|
52 | | -8)client stub接收到消息,并进行解码; |
53 | | - |
54 | | -9)服务消费方得到最终结果。 |
55 | | - |
56 | | -**RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。** |
57 | | - |
58 | | - |
59 | | - |
60 | | -RPC仅仅是一种技术,为什么会与微服务框架搞混呢? |
61 | | - |
62 | | -因为随着RPC的大量使用,必然伴随着服务的发现、服务的治理、服务的监控这些,这就组成了微服务框架。 |
63 | | - |
64 | | -RPC仅仅是微服务中的一部分。 |
65 | 60 |
|
66 | 61 |
|
| 62 | +> 大概知道了 RPC 是个啥,可是又说不上来他和 HTTP 或者 RMI 的区别,我们接着聊 |
| 63 | +> |
| 64 | +>  |
67 | 65 |
|
68 | | - |
69 | | - |
70 | | -维度 RPC REST |
71 | | -耦合性 强耦合 松散耦合 |
72 | | -消息协议 二进制thrift、protobuf、avro 文本型XML、JSON |
73 | | -通讯协议 TCP为主,也可以是HTTP HTTP/HTTP2 |
74 | | -性能 高 一般低于RPC |
75 | | -接口契约IDL Thrift、protobuf idl Swagger |
76 | | -客户端 强类型客户端、一般自动生成,可支持多语言客户端 一般http client可访问,也可支持多语言 |
77 | | -案例 dubbo、motan、tars、grpc、thrift spring boot/mvc、Jax-rs |
78 | | -开发者友好 客户端比较方便,但是二进制消息不可读 文本消息开发者可读、浏览器可直接访问查看结果 |
79 | | -对外开放 需要转换成REST/文本协议 直接对外开放 |
80 | | - |
| 66 | +## 二、RPC 再了解 |
81 | 67 |
|
82 | 68 | ### RPC VS HTTP |
83 | 69 |
|
@@ -130,23 +116,78 @@ RMI 是 Java 提供的一种访问远程对象的协议,是已经实现好了 |
130 | 116 |
|
131 | 117 |
|
132 | 118 |
|
133 | | -## **一、RPC架构简介** |
| 119 | +## 三、RPC框架原理 |
134 | 120 |
|
135 | | -RPC的全称是Remote Procedure Call,它是一种进程间通信方式。允许像调用本地服务一样调用远程服务,它的具体实现方式可以不同,例如Spring的 HTTP Invoker,Facebook的 Thrift二进制私有协议通信。 |
| 121 | +> 如何调用他人的远程服务? |
136 | 122 |
|
137 | | -RPC概念术语在上世纪80年代由 Bruce Jay Nelson提出,在他的论文中对RPC进行了如下总结。 |
138 | 123 |
|
139 | | -1)简单:RPC概念的语义十分清晰和简单,这样建立分布式计算就更容易。 |
140 | 124 |
|
141 | | -2)高效:过程调用看起来十分简单而且高效。 |
| 125 | +RPC框架的目标就是让远程过程(服务)调用更加简单、透明, |
| 126 | + |
| 127 | +既然是一个远程调用,那肯定就需要网络来传输数据 |
| 128 | + |
| 129 | +RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式( XML/JSON/二进制)和通信细节。 |
| 130 | + |
| 131 | +框架使用者只需要了解谁在什么位置提供了什么样的远程服务接口即可,开发者不需要关心底层通信细节和调用过程。 |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | +由于各个服务部署在不同机器,服务间的调用涉及到网络通信过程,如果服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅使用复杂而且极易出错。 |
| 138 | + |
| 139 | +如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。 |
| 140 | + |
| 141 | +我们首先看下一个RPC调用的具体流程: |
| 142 | + |
| 143 | + |
| 144 | + |
| 145 | +1)服务消费方(client)调用以本地调用方式调用服务; |
| 146 | + |
| 147 | +2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体; |
| 148 | + |
| 149 | +3)client stub找到服务地址,并将消息发送到服务端; |
| 150 | + |
| 151 | +4)server stub收到消息后进行解码; |
| 152 | + |
| 153 | +5)server stub根据解码结果调用本地的服务; |
| 154 | + |
| 155 | +6)本地服务执行并将结果返回给server stub; |
| 156 | + |
| 157 | +7)server stub将返回结果打包成消息并发送至消费方; |
| 158 | + |
| 159 | +8)client stub接收到消息,并进行解码; |
| 160 | + |
| 161 | +9)服务消费方得到最终结果。 |
| 162 | + |
| 163 | +**RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。** |
| 164 | + |
| 165 | + |
| 166 | + |
| 167 | +RPC仅仅是一种技术,为什么会与微服务框架搞混呢? |
| 168 | + |
| 169 | +因为随着RPC的大量使用,必然伴随着服务的发现、服务的治理、服务的监控这些,这就组成了微服务框架。 |
| 170 | + |
| 171 | +RPC仅仅是微服务中的一部分。 |
| 172 | + |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | + |
| 177 | +维度 RPC REST |
| 178 | +耦合性 强耦合 松散耦合 |
| 179 | +消息协议 二进制thrift、protobuf、avro 文本型XML、JSON |
| 180 | +通讯协议 TCP为主,也可以是HTTP HTTP/HTTP2 |
| 181 | +性能 高 一般低于RPC |
| 182 | +接口契约IDL Thrift、protobuf idl Swagger |
| 183 | +客户端 强类型客户端、一般自动生成,可支持多语言客户端 一般http client可访问,也可支持多语言 |
| 184 | +案例 dubbo、motan、tars、grpc、thrift spring boot/mvc、Jax-rs |
| 185 | +开发者友好 客户端比较方便,但是二进制消息不可读 文本消息开发者可读、浏览器可直接访问查看结果 |
| 186 | +对外开放 需要转换成REST/文本协议 直接对外开放 |
142 | 187 |
|
143 | | -3)通用:在单机计算中过程往往是不同算法和APl,跨进程调用最重要的是通用的通信机制。 |
144 | 188 |
|
145 | | -2006年之后,随着移动互联网的发展,各种智能终端的普及,远程分布式调用已经成为主流,RPC框架也如雨后春笋般诞生,开源和自研的RPC框架的普及标志着传统垂直应用架构时代的终结。 |
146 | 189 |
|
147 | | - |
148 | 190 |
|
149 | | -## **二、RPC框架原理** |
150 | 191 |
|
151 | 192 | RPC框架的目标就是让远程过程(服务)调用更加简单、透明,RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式( XML/JSON/二进制)和通信细节。框架使用者只需要了解谁在什么位置提供了什么样的远程服务接口即可,开发者不需要关心底层通信细节和调用过程。 |
152 | 193 |
|
@@ -220,7 +261,9 @@ https://blog.csdn.net/u013452337/article/details/86593291 |
220 | 261 |
|
221 | 262 |
|
222 | 263 |
|
223 | | - |
| 264 | +- [如何给老婆解释什么是RPC](<https://www.jianshu.com/p/2accc2840a1b> ) |
| 265 | +- [你应该知道的RCP原理](https://www.cnblogs.com/LBSer/p/4853234.html) |
| 266 | +- [深入理解RPC](https://juejin.cn/post/6844903443237175310) |
224 | 267 |
|
225 | 268 |
|
226 | 269 |
|
0 commit comments