當前位置: 妍妍網 > 碼農

RPC三連問:什麽是RPC框架?實作原理呢?與SOA、REST有啥區別?

2024-06-29碼農

作者:熬夜不加班
連結:https://www.jianshu.com/p/210c34970529

面試題1:說說你對RPC框架的理解?

RPC (Remote Procedure Call)即遠端程序呼叫,是分布式系統常見的一種通訊方法。它允許程式呼叫另一個地址空間(通常是共享網路的另一台機器上)的過程或函式,而不用程式設計師顯式編碼這個遠端呼叫的細節。

除 RPC 之外,常見的多系統數據互動方案還有分布式訊息佇列、HTTP 請求呼叫、資料庫和分布式緩存等。

其中 RPC 和 HTTP 呼叫是沒有經過中介軟體的,它們是端到端系統的直接數據互動。

通俗點說

  • RPC就是從一台機器(客戶端)上透過參數傳遞的方式呼叫另一台機器(伺服器)上的一個函式或方法(可以統稱為服務)並得到返回的結果。

  • RPC會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)。

  • 客戶端發起請求,伺服器返回響應(類似於Http的工作方式)RPC在使用形式上像呼叫本地函式(或方法)一樣去呼叫遠端的函式(或方法)。

  • 追問1:RPC框架實作原理是什麽樣的

    在RPC框架中主要有三個角色:提供者、消費者和註冊中心。如下圖所示:

  • 提供者: 暴露服務的服務提供方。

  • 提供者: 呼叫遠端服務的服務消費方。

  • 註冊中心: 服務註冊與發現的註冊中心。

  • 原理圖如上,也就是說兩台伺服器A,B,一個套用部署在A伺服器上,想要呼叫B伺服器上套用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要透過網路來表達呼叫的語意和傳達呼叫的數據。

    比如說,A伺服器想呼叫B伺服器上的一個方法:Employee getEmployeeByName(String fullName)

    RPC整個呼叫過程,主要經歷如下幾個步驟:

    1、建立通訊

    首先要解決通訊的問題:即A機器想要呼叫B機器,首先得建立起通訊連線。

    主要是透過在客戶端和伺服器之間建立TCP連線,遠端程序呼叫的所有交換的數據都在這個連線裏傳輸。連線可以是按需連線,呼叫結束後就斷掉,也可以是長連線,多個遠端程序呼叫共享同一個連線。

    2、服務尋址

    要解決尋址的問題,也就是說,A伺服器上的套用怎麽告訴底層的RPC框架,如何連線到B伺服器(如主機或IP地址)以及特定的埠,方法的名稱名稱是什麽。

    通常情況下我們需要提供B機器(主機名或IP地址)以及特定的埠,然後指定呼叫的方法或者函式的名稱以及入參出參等資訊,這樣才能完成服務的一個呼叫。

    可靠的尋址方式(主要是提供服務的發現)是RPC的實作基石,比如可以采用redis或者zookeeper來註冊服務等等。

    從服務提供者的角度看:當提供者服務啟動時,需要自動向註冊中心註冊服務;

    當提供者服務停止時,需要向註冊中心登出服務;

    提供者需要定時向註冊中心發送心跳,一段時間未收到來自提供者的心跳後,認為提供者已經停止服務,從註冊中心上摘取掉對應的服務。

    從呼叫者的角度看:呼叫者啟動時訂閱註冊中心的訊息並從註冊中心獲取提供者的地址;

    當有提供者上線或者下線時,註冊中心會告知到呼叫者;

    呼叫者下線時,取消訂閱。

    3、網路傳輸

  • 序列化

  • 當A機器上的套用發起一個RPC呼叫時,呼叫方法和其入參等資訊需要透過底層的網路協定如TCP傳輸到B機器,由於網路協定是基於二進制的,所有我們傳輸的參數數據都需要先進行序列化(Serialize)或者編組(marshal)成二進制的形式才能在網路中進行傳輸。然後透過尋址操作和網路傳輸將序列化或者編組之後的二進制數據發送給B機器。

  • 反序列化

  • 當B機器接收到A機器的套用發來的請求之後,又需要對接收到的參數等資訊進行反序列化操作(序列化的逆操作),即將二進制資訊恢復為記憶體中的表達方式,然後再找到對應的方法(尋址的一部份)進行本地呼叫(一般是透過生成代理Proxy去呼叫,

    通常會有JDK動態代理、CGLIB動態代理、Javassist生成字節碼技術等),之後得到呼叫的返回值。

    4、服務呼叫

    B機器進行本地呼叫(透過代理Proxy)之後得到了返回值,此時還需要再把返回值發送回A機器,同樣也需要經過序列化操作,然後再經過網路傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值之後,則再次進行反序列化操作,恢復為記憶體中的表達方式,最後再交給A機器上的套用進行相關處理(一般是業務邏輯處理操作)。

    面試題2:常見的RPC框架有哪些?

  • Thrift:thrift是一個軟體框架,用來進行可延伸且跨語言的服務的開發。它結合了功能強大的軟體堆疊和程式碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些程式語言間無縫結合的、高效的服務。

  • Dubbo:Dubbo是一個分布式服務框架,以及SOA治理方案。其功能主要包括:高效能NIO通訊及多協定整合,服務動態尋址與路由,軟負載均衡與容錯,依賴分析與降級等。Dubbo是阿裏巴巴內部的SOA服務化治理方案的核心框架,Dubbo自2011年開源後,已被許多非阿裏系公司使用。

  • Spring Cloud:Spring Cloud由眾多子計畫組成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系統及微服務常用的工具,如配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、一次性token、全域鎖、選主、分布式會話和集群狀態等,滿足了構建微服務所需的所有解決方案。Spring Cloud基於Spring Boot, 使得開發部署極其簡單。

  • 面試題3:說說RPC和SOA、SOAP、REST的區別吧

    1、REST

    可以看著是HTTP協定的一種直接套用,預設基於JSON作為傳輸格式,使用簡單,學習成本低效率高,但是安全性較低。

    2、SOAP

    SOAP是一種數據交換協定規範,是一種輕量的、簡單的、基於XML的協定的規範。而SOAP可以看著是一個重量級的協定,基於XML、SOAP在安全方面是透過使用XML-Security和XML-Signature兩個規範組成了WS-Security來實作安全控制的,當前已經得到了各個廠商的支持

    它主要的優點是:易用、靈活、跨語言、跨平台。

    3、SOA

    面向服務架構,它可以根據需求透過網路對松散耦合的粗粒度套用元件進行分布式部署、組合和使用。服務層是SOA的基礎,可以直接被套用呼叫,從而有效控制系統中與軟體代理互動的人為依賴性。

    SOA是一種粗粒度、松耦合服務架構,服務之間透過簡單、精確定義介面進行通訊,不涉及底層編程介面和通訊模型。SOA可以看作是B/S模型、XML(標準通用標示語言的子集)/Web Service技術之後的自然延伸。