1.微服務架構數據庫
1.1 特徵服務器
自動化部署,端點智能化,語言和數據的去中心化控制。網絡
1.2架構架構
一種將一個單一應用程序開發爲一組小型服務的方法,每一個服務運行在本身的進程中,服務間通訊採用輕量級通訊機制(一般用HTTP資源API)。可經過全自動部署機制獨立部署,共用一個最小型的集中式的管理。服務可用不一樣的語言開發,使用不一樣的數據存儲技術。負載均衡
1.微服務架構框架
1.1 特徵異步
自動化部署,端點智能化,語言和數據的去中心化控制。socket
1.2架構函數
一種將一個單一應用程序開發爲一組小型服務的方法,每一個服務運行在本身的進程中,服務間通訊採用輕量級通訊機制(一般用HTTP資源API)。可經過全自動部署機制獨立部署,共用一個最小型的集中式的管理。服務可用不一樣的語言開發,使用不一樣的數據存儲技術。微服務
1、需求緣起
服務化的一個好處就是,不限定服務的提供方使用什麼技術選型,可以實現大公司跨團隊的技術解耦,以下圖:
服務A是歐洲團隊提供服務,歐洲團隊的技術背景是Java,能夠用Java實現服務;
服務B是美洲團隊提供服務,能夠用C++實現服務;
服務C是中國團隊提供服務,能夠用Go實現服務;
服務的上游調用方,按照接口、協議便可完成對遠端服務的調用。
但實際上,99.9%的公司的團隊規模有限,技術團隊人數也有限,基本是使用同一套技術體系來調用和提供服務的:
這樣的話,若是沒有統一的服務框架,RPC框架,各個團隊的服務提供方就須要各自實現一套序列化、反序列化、網絡框架、鏈接池、收發線程、超時處理、狀態機等「業務以外」的重複技術勞動,形成總體的低效。因此,統一RPC框架把上述「業務以外」的技術勞動統一處理,是服務化首要解決的問題。
在達成【「使用統一的RPC框架」是正確的道路】這個一致的前提下,本文指望用簡單通俗的言語簡述一下一個通用RPC框架的技術點與實現。
2、RPC背景與過程
什麼是RPC(Remote Procedure Call Protocol),遠程過程調用?
先來看下什麼是本地函數調用,當咱們寫下:
int result = Add(1, 2);
這段代碼的時候,咱們知道,咱們傳入了1,2兩個入參數,調用了本地代碼段中的一個Add函數,獲得了result出參。此時,傳入數據,傳出數據,代碼段在同一個進程空間裏,這是本地函數調用。
那有沒有辦法,咱們可以調用一個跨進程(因此叫「遠程」,典型的,這個進程部署在另外一臺服務器上)的函數呢?
最容易想到的,兩個進程約定一個協議格式,使用Socket通訊,來傳輸【入參】【調用哪一個函數】【出參】。
假設請求報文協議是一個11字節的字節流:
(1)前3個字節填入函數名
(2)中間4個字節填入第一個參數
(3)末尾4個字節填入第二個參數
同時能夠設計響應報文協議是一個4字節的字節流:
即處理結果。
調用方的代碼可能變爲:
簡單解釋一下:
(1)講傳入參數變爲字節流
(2)將字節流發給服務B
(3)從服務B接受返回字節流
(4)將返回字節流變爲傳出參數
服務方的代碼可能變爲:
這個過程也很好理解:
(1)服務端收到字節流
(2)將字節流轉爲函數名與參數
(3)本地調用函數獲得結果
(4)將結果轉變爲字節流
(5)將字節流發送給調用方
這個過程用一張圖描述如上,調用方與服務方的處理步驟都是很是清晰的。這個過程存在最大的問題是什麼呢?
回答:調用方太麻煩了,每次都要關注不少底層細節
(1)入參到字節流的轉化,即序列化應用層協議細節
(2)socket發送,即網絡傳輸協議細節
(3)socket接受
(4)字節流到出參的轉化,即反序列化應用層協議細節
能不能調用層不關注這個細節呢?
回答:能夠,RPC框架就是解決這個問題的,它可以讓調用方「像調用本地函數同樣調用遠端的函數(服務)」。
3、RPC框架職責
經過上面的討論,RPC框架要向調用方屏蔽各類複雜性,要向服務提供方也屏蔽各種複雜性:
(1)調用方感受就像調用本地函數同樣
(2)服務提供方感受就像實現一個本地函數同樣來實現服務
因此整個RPC框架又分爲client部分與server部分,負責把整個非(1)(2)的各種複雜性屏蔽,這些複雜性就是RPC框架的職責。
再細化一些,client端又包含:序列化、反序列化、鏈接池管理、負載均衡、故障轉移、隊列管理,超時管理、異步管理等等等等職責。
server端包含:服務端組件、服務端收發包隊列、io線程、工做線程、序列化反序列化、上下文管理器、超時管理、異步回調等等等等職責。
however,由於篇幅有限,這些細節不作深刻展開。
4、結論
(1)RPC框架是架構微服務化的首要基礎組件,它能大大下降架構微服務化的成本,提升調用方與服務提供方的研發效率,屏蔽跨進程調用函數(服務)的各種複雜細節
(2)RPC框架的職責是:讓調用方感受就像調用本地函數同樣調用遠端函數、讓服務提供方感受就像實現一個本地函數同樣來實現服務