17 | 異步RPC:壓榨單機吞吐量
在我們知道RPC框架基礎知識后,我們需要從RPC框架整體性能去考慮問題,例如怎么提升RPC框架的性能、穩定性、安全性、吞吐量,以及如何在分布式的場景下快速定位問題等,
影響RPC呼叫吞吐量的根本原因是什么?
處理RPC請求比較耗時,并且CPU大部分時間都在等待而非去計算,從而導致CPU利用率不高,RPC請求的耗時大部分是業務耗時,比如業務邏輯中有訪問資料庫執行慢SQL的操作,所以我們要看怎么能提升業務邏輯處理,
要提升吞吐量,關鍵就兩個字:異步,
服務呼叫端怎么異步?
對于呼叫端來說,向服務端發送請求訊息與接受服務端發送過來的回應訊息,這兩個處理程序是兩個完全獨立的程序,這兩個程序甚至在大多數情況下都不在一個執行緒中進行,也就是說,對于RPC框架,無論是同步呼叫還是異步呼叫,呼叫端的內部實作都是異步的,
呼叫端發送的每條資訊都有一個唯一的訊息標識,實際上呼叫端想服務端發送請求訊息之前會創建一個Future,并會存盤這個訊息標識與這個Future的映射,動態代理所獲得的回傳值最終就是從這個Future中獲取的,當收到服務端回應的訊息時,呼叫端會根據回應訊息的唯一標識,通過之前存盤的映射找到對應的Future,將結果注入給那個Future,再進行一系列的處理邏輯,最后動態代理從Future中得到正確的回傳值,
所謂同步呼叫,是指RPC框架在呼叫端的處理邏輯中主動執行了Future.get()方法,讓動態代理等待回傳值,而異步呼叫則是RPC框架沒有主動執行這個方法,用戶可以從請求背景關系中得到這個Future,自己決定什么時候執行Future.get()方法,
Future模式的示意圖如下,

服務提供方如何支持業務邏輯異步?
我們可以讓RPC框架支持CompletableFuture,實作RPC呼叫在呼叫方和提供方之間完全異步,
CompletableFuture是Java 8原生支持的,如果RPC框架能夠支持CompletableFuture,那發布一個RPC服務,服務介面定義的回傳值是CompletableFuture物件,整個呼叫程序會分為以下幾步:
- 服務呼叫方發起RPC請求,直接拿到回傳值CompletableFuture物件,之后就不需要任何額外的與RPC框架相關的操作了,直接就可以進行異步處理,
- 在服務提供方業務邏輯中創建一個回傳值CompletableFuture物件,之后服務端真正的業務邏輯完全可以在一個執行緒池中異步處理,業務邏輯完成之后再呼叫這個CompletableFuture物件的complete方法,完成異步通知,
- 服務呼叫方在收到服務提供方發送過來的回應之后,RPC框架再自動地呼叫服務呼叫方拿到的那個 回傳值CompletableFuture物件的complete方法,這樣一次異步呼叫就完成了,
RPC遠程方法呼叫,有以下幾種方式:
- sync,默認方式,這是在“方法”內部同步,但RPC框架還是異步處理的,
- future,RPC消費者得到future,自行決定何時獲取回傳結果,
- callback,RPC呼叫端不需要同步處理回應結果,可以直接回傳,最后回傳結果將會在回呼執行緒中異步處理,
- oneway,呼叫端發起請求后不需要接收回應,
18 | 安全體系:如何建立可靠的安全體系?
RPC一般用于解決內部應用之間的通信,這里的“內部”是指應用都部署在同一個大局域網中,這樣在RPC中,我們很少考慮像資料包篡改、請求偽造等惡意行為,
我們主要關注兩種型別的安全場景:
- 呼叫方之間的安全保證,
- 服務發現中的安全保證,
我們可以引入一個授權平臺,來對呼叫方的身份進行驗證,呼叫方可以在授權平臺上申請自己應用里面需要呼叫的介面,而服務方可以在授權平臺上進行審批,只有服務提供方審批后,呼叫方才能夠呼叫,
上面的設計方案,授權平臺承擔了公司內所有RPC請求的次數總和,當RPC請求量達到一定水平,授權平臺會成為一個瓶頸點,
為了解決這個問題,我們可以將授權平臺所做的事情轉移到服務提供方,我們使用一種不可逆加密演算法,例如HMAC演算法,服務提供方應用里面放一個用于HMAC簽名的私鑰,在授權平臺上用這個私鑰為申請呼叫的呼叫方應用進行簽名,這個簽名生成的串就變成了呼叫方唯一的身份,服務提供方在收到呼叫方的授權請求之后,我們只需要驗證這個簽名更呼叫方應用資訊是否對應的上就可以了,
服務提供方可以提供的安全校驗方式:
- md5摘要校驗
- 非對稱加密演算法
- OAuth2授權
為了避免同一個介面有多個應用做發布提供者,我們需要把介面跟應用系結上,一個介面只允許有一個應用發布提供者,避免其他應用也能發布這個介面,
當注冊中心收到服務提供方注冊申請時,可以驗證下請求過來的應用是否跟介面系結的應用一樣,只有相同才允許注冊,否則就回傳錯誤資訊給啟動的應用,從而避免假冒的服務提供者對外提供錯誤服務,
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542574.html
標籤:其他
