RPC(Remote Producedure Call)調用原理:服務消費者稱為客戶端,服務提供者稱為服務端,處於不同網絡地址,需要建立網絡連接。建立連接后,雙方還必須按照某種約定的協議進行網絡通訊——通訊協議。正常通訊后,為了減少傳輸數據大小,還要對數據進行壓縮——數據序列化和反序列化。
如何建立連接?服務端如何處理請求?數據傳輸采用什么協議?數據怎能序列化和反序列化?
一、客戶端和服務端之間基於TCP協議建立網絡常用兩種途徑。
1、HTTP通訊
2、Socket 通訊
Socket通訊時基於TCP/IP協議的封裝,建立一次Socket連接至少需要一對套接字,其中一個運行於客戶端——ClientSocket;另外一個運行於服務器端——ServerSocket。
Socket通訊分為四步:服務器監聽、客戶端請求、連接確認、數據傳輸
* 服務器監聽:ServerSocket 通過bind()函數綁定某個具體端口,然后調用listen()函數實時監控網絡狀態,等待客戶端的連接請求。
* 客戶端請求:ClientSocket 調用connect()函數向ServerSocket綁定的地址和端口發起連接請求。
* 服務端連接請求:當ServerSocket監聽或者接收到ClientSocket的連接請求時,調用accept()函數響應ClientSocket的請求,同客戶端建立連接。
* 數據傳輸:當ClientSocket和ServerSocket建立連接后,ClientSocket調用send()函數,ServerClient調用recevice()函數,ServerSocket處理請求后,調用send()函數,ClientSocket調用recevice()函數,就可以得到返回結果。
當網絡不可靠,出現網絡閃斷,連接超時,服務器宕機等,通常處理手段有兩種:
* 鏈路存活檢測:客戶端需要定時發送心跳檢測機制(一般通過ping請求)給客戶端,如果服務器連續n次心跳檢測或者超過規定的時間都沒有回復消息,則認為此時連接已經失效,這個時候客戶端就需要重新與服務端建立連接。
* 段連重試:通常有多種情況會導致連接斷開,比如客戶端主動關閉、服務端宕機或者網絡故障等。這個時候客戶端就需要與服務器重新建立連接,但一般不能立刻完成重連,而時是要等待固定的間隔后再發起重連,避免服務端的連接回收不及時,而客戶端瞬間重連的請求太多而把服務端的連接數占滿。
二、服務端如何處理請求
* 同步阻塞方式(BIO)
* 同步非阻塞方式(NIO)
* 異步非阻塞方式(AIO)
三、數據改如何序列化和反序列化
常見兩類:文本類 XML/JSON;二進制類 PB/Thrift
考慮三方面:
* 支持數據結構類型的豐富度
* 跨語言支持
* 性能。PB序列化的壓縮比和速度都要比JSON高很多,但可讀性較差。
