- 什么是 RPC攒菠?
- RPC 有什么作用亡容?
- RPC 步驟
- 為什么需要序列化熄浓?
- 零拷貝
- 動態(tài)代理實(shí)現(xiàn)
- HTTP/2 特性
- 為什么需要服務(wù)發(fā)現(xiàn)术徊?
- 定時任務(wù) & 時間輪
- 如何注冊和發(fā)現(xiàn)服務(wù)赠涮?
- 如何實(shí)現(xiàn) RPC 遠(yuǎn)程調(diào)用子寓?
- 如何追蹤微服務(wù)?
- 注冊中心選型
- 開源 RPC 框架
- Spring Cloud 微服務(wù)架構(gòu)
什么是 RPC笋除?
Remote Procedure Call斜友,遠(yuǎn)程過程調(diào)用。
RPC 有什么作用垃它?
- 屏蔽遠(yuǎn)程調(diào)用鲜屏、本地調(diào)用的區(qū)別
-
隱藏底層網(wǎng)絡(luò)通信的復(fù)雜性
,讓我們更專注于業(yè)務(wù)
RPC 步驟
為什么需要序列化国拇?
- 網(wǎng)絡(luò)傳輸必須是「二進(jìn)制」洛史,調(diào)用方的參數(shù)都是對象
- 請求?二進(jìn)制消息體
零拷貝
什么是零拷貝?
為什么需要零拷貝酱吝?
網(wǎng)卡
等操作也殖,只能通過內(nèi)核操作
,應(yīng)用程序
要發(fā)送網(wǎng)絡(luò)數(shù)據(jù)务热,需要將數(shù)據(jù)復(fù)制到內(nèi)核
忆嗜。
如何實(shí)現(xiàn)零拷貝?
虛擬內(nèi)存
- mmap + write
- sendfile
Netty 的零拷貝有何不同崎岂?
- 一個請求捆毫,可能拆分成多個數(shù)據(jù)包
- 數(shù)據(jù)包的組合在用戶空間,解決用戶空間內(nèi)存的拷貝處理問題该镣,CompositeByteBuf
- 也包括用戶空間冻璃、內(nèi)核空間的數(shù)據(jù)拷貝:Direct Buffers
動態(tài)代理實(shí)現(xiàn)
- JDK:只能代理接口
-
Javassist
:操作底層字節(jié)碼
响谓,不需要反射损合,性能好 -
Byte Buddy
:更容易的 API省艳,速度比 Javassist 快,Spring嫁审、Jackson 使用
HTTP/2 特性
-
多路復(fù)用
跋炕,同一鏈路雙向發(fā)送stream數(shù)據(jù) Header 壓縮
為什么需要服務(wù)發(fā)現(xiàn)?
公共的“通訊錄”
為什么不用 DNS律适?
- DNS多級緩存辐烂,且緩存時間長
- 需要搭建負(fù)載均衡,額外成本
定時任務(wù) & 時間輪
定時任務(wù)的問題捂贿?
- future 啟動線程進(jìn)行異步編程纠修,sleep
- 如果5秒超時,高并發(fā)的
- 讓CPU額外輪詢遍歷厂僧,浪費(fèi)CPU
時間輪的應(yīng)用
- 延遲消息
- 訂單過期(10分鐘未付款扣草,取消訂單)
時鐘輪本質(zhì)
減少額外的掃描操作
時間輪在 RPC 的應(yīng)用
調(diào)用端請求的超時處理,節(jié)省CPU
時間輪實(shí)現(xiàn)
Netty的 TimeWheel
如何注冊和發(fā)現(xiàn)服務(wù)颜屠?
-
RPC Server
提供服務(wù)辰妙,向 Registry 注冊自身 -
RPC Client
調(diào)用服務(wù),從 Registry 拉取服務(wù)列表 - Server 節(jié)點(diǎn)變更時甫窟,同步變更密浑,Client 感知刷新本地的「服務(wù)節(jié)點(diǎn)列表」
實(shí)現(xiàn):
- 注冊中心 API
- 服務(wù)健康狀態(tài)監(jiān)測:ZooKeeper 的會話超時控制機(jī)制
- 服務(wù)狀態(tài)變更通知:ZooKeeper 的 Watcher 機(jī)制
如何實(shí)現(xiàn) RPC 遠(yuǎn)程調(diào)用?
- 客戶端粗井、服務(wù)端如何建立網(wǎng)絡(luò)連接:HTTP尔破、Socket
- 服務(wù)端如何處理請求:NIO(使用
Netty
) - 數(shù)據(jù)傳輸采用什么協(xié)議
- 數(shù)據(jù)如何序列化、反序列化:JSON浇衬,PB呆瞻,Thrift
如何追蹤微服務(wù)?
核心理念:調(diào)用鏈径玖,全局唯一的 ID
將同一請求串聯(lián)起來痴脾,從而還原調(diào)用關(guān)系,統(tǒng)計系統(tǒng)指標(biāo)梳星。
注冊中心選型
-
高可用
- 集群部署:多個實(shí)例
- 多機(jī)房部署:一個機(jī)房斷電等不可抗因素
-
數(shù)據(jù)一致性
-
CP
型:ZooKeeper(Redis)赞赖,強(qiáng)一致性,機(jī)房間斷網(wǎng)冤灾,注冊中心不可用 - AP 型:犧牲一致性前域,保證可用性。Eureka
-
開源 RPC 框架
限定語言
- Dubbo:Java韵吨,阿里
- Motan:Java匿垄,微博
- Tars:C++,騰訊(已支持多語言)
- Spring Cloud:Java
- 網(wǎng)關(guān) Zuul
- 注冊中心 Eureka
- 服務(wù)超時熔斷 Hystrix
- 調(diào)用鏈監(jiān)控 Sleuth
- 日志分析 ELK
跨語言 RPC 框架
- gRPC:HTTP/2
- Thrift:TCP
Spring Cloud 微服務(wù)架構(gòu)
代碼、思維導(dǎo)圖筆記下載
代碼和思維導(dǎo)圖在 GitHub 項(xiàng)目中椿疗,歡迎大家 star漏峰!