1.什麼是RPC?java
遠程過程調用協議RPC(Remote Procedure Call Protocol)服務器
首先了解什麼叫RPC,爲何要RPC,RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。網絡
2.RPC調用過程是什麼?數據結構
3.怎麼作到透明化遠程服務調用併發
代理!怎麼封裝通訊細節才能讓用戶像以本地調用方式調用遠程服務呢?對java來講就是使用代理!java代理有兩種方式:1) jdk 動態代理;2)字節碼生成。儘管字節碼生成方式實現的代理更爲強大和高效,但代碼不易維護,大部分公司實現RPC框架時仍是選擇動態代理方式。負載均衡
4.怎麼對消息進行編碼和解碼框架
4.1肯定消息的數據結構異步
請求消息結構:①接口名稱②方法名③參數類型&參數值④超時時間⑤requestID(異步請求時,依靠此id才能將return綁定到對應請求線程上)函數
服務器返回的消息結構:①返回值②狀態code③requestID編碼
4.2序列化和反序列化
5.通訊
消息數據結構被序列化爲二進制流後,下一步就要進行網絡通訊,目前有兩種通訊模型,BIO和NIO。通常rpc框架都須要支持這兩種通訊模型。
(基於netty實現io通訊框架,好比阿里巴巴的HSF、dubbo,Twitter的finagle)
6.如何發佈本身的服務
如何讓別人使用咱們的服務呢?有同窗說很簡單嘛,告訴使用者服務的IP以及端口就能夠了啊。確實是這樣,這裏問題的關鍵在因而自動告知仍是人肉告知。
人肉告知的方式:若是你發現你的服務一臺機器不夠,要再添加一臺,這個時候就要告訴調用者我如今有兩個ip了,大家要輪詢調用來實現負載均衡;調用者咬咬牙改了,結果某天一臺機器掛了,調用者發現服務有一半不可用,他又只能手動修改代碼來刪除掛掉那臺機器的ip。現實生產環境固然不會使用人肉方式。
有沒有一種方法能實現自動告知,即機器的增添、剔除對調用方透明,調用者再也不須要寫死服務提供方地址?固然能夠,現現在zookeeper被普遍用於實現服務自動註冊與發現功能!
簡單來說,zookeeper能夠充當一個服務註冊表
(Service Registry),讓多個服務提供者
造成一個集羣,讓服務消費者
經過服務註冊表獲取具體的服務訪問地址(ip+端口)去訪問具體的服務提供者。
zookeeper和eruke的對比:https://blog.csdn.net/u010963948/article/details/71730165
參考:https://blog.csdn.net/u013521220/article/details/70157956