網路協議 RPC協議

2022-09-12 01:03:12 字數 3729 閱讀 1016

微服務與遠端方法呼叫的引入

rpc 指的是 remote procedure call,即遠端方法呼叫(也叫遠端服務呼叫、遠端過程呼叫),這也是微服務架構的前導篇,因為微服務裡面遠端服務之間就是通過 rpc 協議進行資料傳輸的。

在介紹 rpc 協議之前,我們先釐清幾個概念:單體應用、微服務應用、本地方法呼叫與遠端方法呼叫。

所謂單體應用指的是將應用的所有服務部署到一台機器上,很多中小型公司都是這麼做的,這樣做的好處是部署和維護起來比較簡單,也方便業務早期的快速迭代,但是缺點也是顯而易見的,隨著業務的增長,會導致**倉庫越來越龐大,與之相伴的,隨著開發人員的增加,不同團隊和成員之間的協作變得越來越複雜,比如同時有五個以上的開發者在開發功能準備上線,合併**時**衝突的風險增加,甚至需要專門的人力來負責合併**,協助解決衝突,然後統一上線,而隨著**倉庫**量的增加,上線時間也會隨之增加,尤其是要部署多台機器的情況下,這就給線上機器的穩定性和出現問題時回滾**帶來隱患。除此之外,因為所有服務都打包在乙個應用裡面,執行在一種程序中,一旦某個功能涉及的**或者資源有問題,就會導致整個應用不可用,從而讓系統可用性大打折扣。

所以總結起來,單體應用主要有三個問題,第

一、隨著業務功能的複雜度增加,團隊之間的協作和**合併越來越困難;第

二、隨著**倉庫**量的增加,應用部署時間越來越長,這就為上線期間線上系統的穩定性和**回滾帶來風險;第

三、單體應用將所有服務打包到乙個應用裡面,如果某個功能或資源不可用,會導致整個應用不可用。

所以單體應用更適用於專案早期快速迭代和試錯階段,隨著業務功能增加,開發團隊的擴充,對系統穩定性和可用性的要求變高,單體應用就顯得越來越捉襟見肘,那麼我們該如何解決單體應用面臨的這一系列問題呢?

答案想必你已經知道,那就是通過微服務架構對服務進行拆分,將原來的單體應用拆分成多個子服務,比如對於乙個電商應用而言,使用者服務專門用於處理與使用者相關的功能,商品服務專門用於處理與商品相關的功能,交易服務專門用於處理與交易相關的功能,依次類推,具體的劃分維度我們放到後面微服務系列去單獨介紹,這些拆分的服務都有著自己獨立的**倉庫,獨立開發、獨立部署、獨立維護,不同的服務之間通過 rpc 協議進行通訊,某個服務不可用並不會應用其它功能的使用,從而完美解決了單體應用的三個瓶頸。

微服務雖好,但也不是包治百病,因為它也引入了一系列需要解決的問題,比如多個服務獨立部署和維護導致上線的複雜度增加,出現問題後除錯的複雜度增加,以及遠端服務呼叫過程中引數傳遞和資料格式的約定等等,所以當團隊規模很小,業務規模不大的情況下,並不適合使用微服務架構,反而是單體應用更加靈活,方便快速迭代。

我們知道,在單體應用中,所有服務都打包在乙個應用裡面,我們只需要通過本地方法即可呼叫其他的服務,比如我們有 userservice 和 productservice 兩個服務,如果要在 userservice 中獲取某個使用者發布的商品,只需要例項化 productservice,並傳入使用者引數到到資料庫查詢並返回結果即可,一切操作都是在本地記憶體中完成的,不同服務之間的呼叫並不涉及到任何網路傳輸,編譯器會幫我們完成所有的函式呼叫、引數解析和**執行,以 php 為例,底層的執行邏輯如下(如果你對服務不太理解的話,常見的 mvc 模式其實就是一種單體應用架構模式):

而在微服務中則不然,不同的服務部署在不同的機器,需要通過網路傳輸約定呼叫方法名、引數和返回資料才能完成乙個完整的方法呼叫,與單體應用本地方法呼叫相對,我們把這種通過網路傳輸呼叫不同服務方法的方式稱之為遠端方法呼叫,既然是遠端方法呼叫,那就與本地方法呼叫完全不同了,我們無法在本地例項化遠端的服務類,更無法呼叫對應的方法,傳入相應的引數,此外,不同服務之間甚至是通過不同程式語言實現的,服務方法呼叫期間出現異常與錯誤的捕獲也要單獨約定。。。總之,你會發現本地方法呼叫的那一套邏輯現在完全不適用了,所以在正式介紹 rpc 協議之前,我們應該知道,遠端方法呼叫至少要解決以下幾個問題:

所有這些問題都是 rpc 協議要解決的,解決了這些問題,才能保證遠端方法呼叫的可靠性,進而保證微服務的穩定性和可用性。

rpc 框架是如何實現 rpc 通訊的

單體應用的缺點以及相應的解決方案 —— 微服務,微服務解決單體應用瓶頸的同時也引入了新的問題,即遠端方法呼叫過程中協議約定、服務發現以及網路傳輸的複雜度增加,必須要解決這些問題才能保證遠端方法呼叫的可靠性,在工程實踐中,我們通常使用一些優秀的開源 rpc 框架來處理這些底層問題(如 spring cloud、dubbo、grrc、thrift、hprose 等),作為一般開發者,只需要基於這些框架專注上層服務實現即可,但是作為乙個有追求的開發者,最好能夠理解 rpc 框架底層的實現,這樣才能更好的使用這些框架。

現有的 rpc 框架都是基於 andrew d. birrell 和 bruce jay nelson 的**實現的:implementing remote procedure calls,該**定義了 rpc 的呼叫標準,這篇**對於英文不好的人啃起來有些吃力(這裡有一篇中文譯文,感興趣的可以看看),我們把它簡化為下面的模型來介紹:

當客戶端應用(服務消費方)想發起乙個遠端呼叫時,實際是通過本地呼叫客戶端的 stub,該 stub 負責將呼叫的介面、方法和引數,通過約定的協議規範進行編碼,並通過本地的 rpcruntime(rpc 通訊包) 進行傳輸,最終將呼叫網路包傳送到伺服器。

伺服器端的 rpcruntime 收到請求後,交給服務提供方 stub 進行解碼,然後呼叫服務端對應的方法,方法執行後返回結果,服務提供方 stub 將返回的結果編碼後,再傳送給客戶端,客戶端的 rpcruntime 收到結果,發給呼叫方 stub 解碼得到結果,返回給客戶端。

至此,乙個完整的 rpc 呼叫就完成了。這裡面分了三個層次,對於使用者層和服務端,都像是本地呼叫一樣,專注於業務邏輯的處理就可以了,實際上,我們在進行微服務開發時,基本上也就是專注在這兩塊,即服務端如何提供服務和客戶端如何消費服務。底層的 stub 處理雙方約定好的語法、語義、封裝和解封裝(解決了協議約定問題),rpcruntime 則主要處理高效能的傳輸,以及網路的錯誤和異常(解決了網路傳輸問題)。

但還有乙個問題,就是服務發現問題,即客戶端呼叫遠端服務時,如何得知要去哪個伺服器呼叫呢?在這篇**中,實現的方案是通過乙個分布式資料庫 grapevine 來繫結服務名與對應的服務提供方位址,當服務端提供新的服務時,需要將其「註冊」到 grapevine,然後客戶端 rpcruntime 在發起遠端呼叫時可以從 grapevine 中查詢到服務名對應的服務端位址,進而發起網路請求:

grapevine 即對應著後面微服務分享中要介紹的 rpc 框架中的「註冊中心」,目前比較主流的註冊中心實現方案有 zookeeper、eureka、consul、etcd 等。

sun 公司是第乙個提供商業化 rpc 庫和 rpc 編譯器的公司,最早的 rpc 實現就是該公司提供的 onc rpc(open network computing remote procedure call,開放網路計算遠端方法呼叫),由於該 rpc 實現用在 sun 系統中,所以也叫 sun rpc。我們比較熟悉的 nfs(network file system,網路檔案系統) 協議就是基於 onc rpc 實現的。

在 php 中,也有一些實現了 rpc 協議,可用於 rpc 通訊的官方擴充套件可以使用,比如 xml-rpc、yar、soap ,我們可以基於它們實現一些簡單的 rpc 遠端呼叫,比如一些古老的傳統 j**a 系統,在 php 中呼叫其服務通常是通過 soap 來實現的。

此外,還可以基於一些跨語言的開源 rpc 框架在 php 專案中實現 rpc 呼叫,並實現工業級的分布式微服務架構,比如 thrift、hprose、grpc、dubbo 等,至於如何在 php 專案中基於這些框架來實現微服務架構,我們將在接下來的微服務系列分享中給大家詳細介紹。

網路協議 RPC協議

遠端呼叫協議,用於定義服務之間的介面呼叫規範標準 最早的rpc框架之一 1.2.1 外部資料表示法 xdr 規定互動協議的檔案,包括 與古老的rpc協議相比,雙方的soap協議沒必要完全一致 引數順序 引數個數等 更加靈活 也是乙個xml,描述了方法名 服務名 埠 請求引數等資訊,通過在服務位址後加...

RPC協議是什麼?RPC協議與HTTP協議的區別

rpc是一種api,http是一種無狀態的網路協議。rpc可以基於http協議實現,也可以直接在tcp協議上實現。rpc主要是用在大型 裡面,因為大型 裡面系統繁多,業務線複雜,而且效率優勢非常重要的一塊,這個時候rpc的優勢就比較明顯了。http主要是用在中小型企業裡面,業務線沒那麼繁多的情況下。...

RPC協議簡述

rpc是指遠端過程呼叫,也就是說兩台伺服器,乙個應用部署在其中一台伺服器上,想要呼叫另外一台伺服器上應用提供的函式 方法 由於不在乙個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。rpc 採用客戶機 伺服器模式。請求程式就是乙個客戶機,而服務提供程式就是乙個伺服器。首先,呼...