[TOC]
### Rpc
全稱**Remote Procedure Call,遠程過程調用**,調用遠端的方法就像調用本地的一樣
### RPC和HTTP 區別
HTTP和RPC不是 對等 的概念
`RPC是一個完整的遠程調用方案`,它包括了:接口規范+序列化反序列化規范+通信協議等。
而`HTTP只是一個通信協議`,工作在OSI的第七層,不是一個完整的遠程調用方案。
所以可以說 RPC是能夠基于 HTTP 實現,也可以不基于,基于更下一層的 TCP/ UDP協議
### RPC原理

①服務調用方(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配置。
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker