🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### Rpc 全称**Remote Procedure Call,远程过程调用**,调用远端的方法就像调用本地的一样 ### RPC和HTTP 区别 HTTP和RPC不是 对等 的概念 `RPC是一个完整的远程调用方案`,它包括了:接口规范+序列化反序列化规范+通信协议等。 而`HTTP只是一个通信协议`,工作在OSI的第七层,不是一个完整的远程调用方案。 所以可以说 RPC是能够基于 HTTP 实现,也可以不基于,基于更下一层的 TCP/ UDP协议 ### RPC原理 ![](https://img.kancloud.cn/1e/1d/1e1d31c33964073c93fd38bd0ab2bef5_843x430.png) ①服务调用方(client)以本地调用方式调用服务; ② client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体; ③ client stub找到服务地址,并将消息发送到服务端; ④ server 端接收到消息; ⑤ server stub收到消息后进行解码; ⑥ server stub根据解码结果调用本地的服务; ⑦ 本地服务执行并将结果返回给server stub; ⑧ server stub将返回结果打包成能够进行网络传输的消息体; ⑨ 按地址将消息发送至调用方; ⑩ client 端接收到消息; ⑪ client stub收到消息并进行解码; ⑫ 调用方得到最终结果。 ### GRPC grpc只是一个框架,是对rpc的封装,类似的框架还有`thrift`等。 > 目标是只需要关心第1步和最后1步,中间的其他步骤统统封装起来,让使用者无需关心 #### grpc解决的rpc三大问题 ①协议约定。gRPC 的协议是 Protocol Buffers,是一种压缩率极高的序列化协议,Google 在 2008 年开源了 Protocol Buffers,支持多种编程语言,所以 gRPC 支持客户端与服务端可以用不同语言实现。 ②传输协议。gRPC 的数据传输用的是 Netty Channel, Netty 是一个高效的基于异步 IO 的网络传输架构。Netty Channel 中,每个 gRPC 请求封装成 HTTP 2.0 的 Stream。 ③服务发现。gRPC 本身没有提供服务发现的机制,需要通过其他组件。 ### RPC接口和传统的http接口的区别 1. 传输协议 >RPC:可以基于TCP协议,也可以基于HTTP协议。 > HTTP:基于HTTP协议。 2. 传输效率 >RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。 > HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理。 3. 服务治理 >RPC:能做到自动通知,不影响上游。 HTTP:需要事先通知,修改Nginx/HAProxy配置。