RPC很是重要,不少人面試的時候都掛在了這個地方!你要是還不懂RPC是什麼?他的基本原理是什麼?你必定要把下邊的內容記起來!好好研究一下!特別是文中給出的一張關於RPC的基本流程圖,重點中的重點,Dubbo RPC的基本執行流程就是他,RPC框架的基本原理也是他,別說我沒告訴你!看了下邊的內容你要掌握的內容以下,固然還有不少:前端
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。程序員
一、單一應用架構面試
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM) 是關鍵。sql
二、垂直應用架構編程
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。安全
三、分佈式服務架構服務器
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。網絡
此時,用於提升業務複用及整合的分佈式服務框架(RPC),提供統一的服務是關鍵。架構
例如:各個團隊的服務提供方就不要各自實現一套序列化、反序列化、網絡框架、鏈接池、收發線程、超時處理、狀態機等「業務以外」的重複技術勞動,形成總體的低效。併發
PS: 其實上述三個緣由也是爲何要有Dubbo的緣由!不信你去Dubbo官網去看!
四、流動計算架構
PS:這個屬於擴展內容,摘自Dubbo官網,屬於架構演進的一個過程
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。
五、另一個緣由
就是由於在幾個進程內(應用分佈在不一樣的機器上),沒法共用內存空間,或者在一臺機器內經過本地調用沒法完成相關的需求,好比不一樣的系統之間的通信,甚至不一樣組織之間的通信。此外因爲機器的橫向擴展,須要在多臺機器組成的集羣上部署應用等等。
因此,統一RPC框架來解決提供統一的服務。
RPC(Remote Procedure Call Protocol)遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。簡言之,RPC使得程序可以像訪問本地系統資源同樣,去訪問遠端系統資源。比較關鍵的一些方面包括:通信協議、序列化、資源(接口)描述、服務框架、性能、語言支持等。
簡單的說,RPC就是從一臺機器(客戶端)上經過參數傳遞的方式調用另外一臺機器(服務器)上的一個函數或方法(能夠統稱爲服務)並獲得返回的結果。
一個基本的RPC架構裏面應該至少包含如下4個組件:
具體調用過程:
而RPC框架的實現目標則是將上面的第2-10步無缺地封裝起來,也就是把調用、編碼/解碼的過程給封裝起來,讓用戶感受上像調用本地服務同樣的調用遠程服務。
一、REST
能夠看着是HTTP協議的一種直接應用,默認基於JSON做爲傳輸格式,使用簡單,學習成本低效率高,可是安全性較低。
二、SOAP
SOAP是一種數據交換協議規範,是一種輕量的、簡單的、基於XML的協議的規範。而SOAP能夠看着是一個重量級的協議,基於XML、SOAP在安全方面是經過使用XML-Security和XML-Signature兩個規範組成了WS-Security來實現安全控制的,當前已經獲得了各個廠商的支持 。
它有什麼優勢?簡單總結爲:易用、靈活、跨語言、跨平臺。
三、SOA
面向服務架構,它能夠根據需求經過網絡對鬆散耦合的粗粒度應用組件進行分佈式部署、組合和使用。服務層是SOA的基礎,能夠直接被應用調用,從而有效控制系統中與軟件代理交互的人爲依賴性。
SOA是一種粗粒度、鬆耦合服務架構,服務之間經過簡單、精肯定義接口進行通信,不涉及底層編程接口和通信模型。SOA能夠看做是B/S模型、XML(標準通用標記語言的子集)/Web Service技術以後的天然延伸。
四、REST 和 SOAP、RPC 有何區別呢?
沒什麼太大區別,他們的本質都是提供可支持分佈式的基礎服務,最大的區別在於他們各自的的特色所帶來的不一樣應用場景 。
一、動態代理
生成Client Stub(客戶端存根)和Server Stub(服務端存根)的時候須要用到Java動態代理技術,可使用JDK提供的原生的動態代理機制,也可使用開源的:CGLib代理,Javassist字節碼生成技術。
二、序列化和反序列化
在網絡中,全部的數據都將會被轉化爲字節進行傳送,因此爲了可以使參數對象在網絡中進行傳輸,須要對這些參數進行序列化和反序列化操做。
目前比較高效的開源序列化框架:如Kryo、FastJson和Protobuf等。
三、NIO通訊
出於併發性能的考慮,傳統的阻塞式 IO 顯然不太合適,所以咱們須要異步的 IO,即 NIO。Java 提供了 NIO 的解決方案,Java 7 也提供了更優秀的 NIO.2 支持。能夠選擇Netty或者MINA來解決NIO數據傳輸的問題。
四、服務註冊中心
可選:Redis、Zookeeper、Consul 、Etcd。通常使用ZooKeeper提供服務註冊與發現功能,解決單點故障以及分佈式部署的問題(註冊中心)。
**PS:**這張圖很是重點,是PRC的基本原理,請你們必定記住!
也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。
好比說,A服務器想調用B服務器上的一個方法:
User getUserByName(String userName)
2.一、從服務提供者的角度看:
當服務提供者啓動的時候,須要將本身提供的服務註冊到指定的註冊中心,以便服務消費者可以經過服務註冊中心進行查找;
當服務提供者因爲各類緣由導致提供的服務中止時,須要向註冊中心註銷中止的服務;
服務的提供者須要按期向服務註冊中心發送心跳檢測,服務註冊中心若是一段時間未收到來自服務提供者的心跳後,認爲該服務提供者已經中止服務,則將該服務從註冊中心上去掉。
2.二、從調用者的角度看:
服務的調用者啓動的時候根據本身訂閱的服務向服務註冊中心查找服務提供者的地址等信息;
當服務調用者消費的服務上線或者下線的時候,註冊中心會告知該服務的調用者;
服務調用者下線的時候,則取消訂閱。
3.一、序列化
當A機器上的應用發起一個RPC調用時,調用方法和其入參等信息須要經過底層的網絡協議如TCP傳輸到B機器,因爲網絡協議是基於二進制的,全部咱們傳輸的參數數據都須要先進行序列化(Serialize)或者編組(marshal)成二進制的形式才能在網絡中進行傳輸。而後經過尋址操做和網絡傳輸將序列化或者編組以後的二進制數據發送給B機器。
3.二、反序列化
當B機器接收到A機器的應用發來的請求以後,又須要對接收到的參數等信息進行反序列化操做(序列化的逆操做),即將二進制信息恢復爲內存中的表達方式,而後再找到對應的方法(尋址的一部分)進行本地調用(通常是經過生成代理Proxy去調用,
一般會有JDK動態代理、CGLIB動態代理、Javassist生成字節碼技術等),以後獲得調用的返回值。
B機器進行本地調用(經過代理Proxy和反射調用)以後獲得了返回值,此時還須要再把返回值發送回A機器,一樣也須要通過序列化操做,而後再通過網絡傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值以後,則再次進行反序列化操做,恢復爲內存中的表達方式,最後再交給A機器上的應用進行相關處理(通常是業務邏輯處理操做)。
一般,通過以上四個步驟以後,一次完整的RPC調用算是完成了,另外可能由於網絡抖動等緣由須要重試等。
分享免費學習資料
針對於還會準備免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
爲何某些人會一直比你優秀,是由於他自己就很優秀還一直在持續努力變得更優秀,而你是否是還在知足於現狀心裏在竊喜!但願讀到這的您能轉發和關注下,之後還會更新技術乾貨,謝謝您的支持!
下面是部分資料截圖,誠意滿滿:特別適合有1-5年開發經驗的Java程序員們學習。
資料免費領取方式:加入合做Java架構學習交流Qqun:277763288,管理員處免費領取資料。
資料免費領取方式:加入合做Java架構學習交流Qqun:277763288,管理員處免費領取資料。