秒懂課堂|RPC框架實現原理講解及實現(文末領福利)

2021-01-15 開課吧

分布式微服務化項目的崛起,逐漸成為許多公司中大型分布式系統架構的主流方式,而今天所說的 RPC 在這其中扮演著至關重要的角色。隨著這段日子公司項目微服務化的演進,發現在日常開發中都在隱式或顯式的使用 RPC,一些剛剛接觸 RPC 的小夥伴會感覺無所適從,而一些入行多年的老手雖然使用 RPC 經驗豐富,但有些對其原理也一知半解,缺乏對原理的深入理解,往往也會造成開發中的一些誤用。

什麼是RPC

RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程電腦程式上請求服務,而不需要了解底層網絡技術的協議。也就是說兩臺伺服器A、B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。

RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程式更加容易。現在業界有很多開源的優秀 RPC 框架,例如 Spring Cloud、Dubbo、Thrift 等。

RPC 起源

RPC 這個概念術語在上世紀 80 年代由 Bruce Jay Nelson 提出。這裡我們追溯下當初開發 RPC 的原動機是什麼?在Nelson 的論文 「Implementing Remote Procedure Calls」 中他提到了幾點:

簡單:RPC 概念的語義十分清晰和簡單,這樣建立分布式計算就更容易。高效:過程調用看起來十分簡單而且高效。通用:在單機計算中過程往往是不同算法部分間最重要的通信機制。通俗一點說,就是一般程式設計師對於本地的過程調用很熟悉,那麼我們把 RPC 作成和本地調用完全類似,那麼就更容易被接受,使用起來毫無障礙。Nelson 的論文發表於 30 年前,其觀點今天看來確實高瞻遠矚,今天我們使用的 RPC 框架基本就是按這個目標來實現的。

RPC 結構

Nelson 的論文中指出實現 RPC 的程序包括 5 個部分:

UserUser-stubRPCRuntimeServer-stubServer

這裡 user 就是 client 端,當 user 想發起一個遠程調用時,它實際是通過本地調用 user-stub。user-stub 負責將調用的接口、方法和參數通過約定的協議規範進行編碼並通過本地的 RPCRuntime 實例傳輸到遠端的實例。遠端 RPCRuntime 實例收到請求後交給 server-stub 進行解碼後發起本地端調用,調用結果再返回給 user 端。

以上是粗粒度的 RPC 實現概念結構,接下來我們進一步細化它應該由哪些組件構成,如下圖所示。

RPC 服務方通過 RpcServer 去導出(export)遠程接口方法,而客戶方通過 RpcClient 去引入(import)遠程接口方法。客戶方像調用本地方法一樣去調用遠程接口方法,RPC 框架提供接口的代理實現,實際的調用將委託給代理RpcProxy 。代理封裝調用信息並將調用轉交給RpcInvoker 去實際執行。在客戶端的RpcInvoker 通過連接器RpcConnector 去維持與服務端的通道RpcChannel,並使用RpcProtocol 執行協議編碼(encode)並將編碼後的請求消息通過通道發送給服務方。

RPC 服務端接收器 RpcAcceptor 接收客戶端的調用請求,同樣使用RpcProtocol 執行協議解碼(decode)。解碼後的調用信息傳遞給RpcProcessor 去控制處理調用過程,最後再委託調用給RpcInvoker 去實際執行並返回調用結果。如下是各個部分的詳細職責:

RpcServer

負責導出(export)遠程接口

RpcClient

負責導入(import)遠程接口的代理實現

RpcProxy

遠程接口的代理實現

RpcInvoker

客戶方實現:負責編碼調用信息和發送調用請求到服務方並等待調用結果返回

服務方實現:負責調用服務端接口的具體實現並返回調用結果

RpcProtocol

負責協議編/解碼

RpcConnector

負責維持客戶方和服務方的連接通道和發送數據到服務方

RpcAcceptor

負責接收客戶方請求並返回請求結果

RpcProcessor

負責在服務方控制調用過程,包括管理調用線程池、超時時間等

RpcChannel

數據傳輸通道

RPC 工作原理

RPC的設計由Client,Client stub,Network ,Server stub,Server構成。 其中Client就是用來調用服務的,Cient stub是用來把調用的方法和參數序列化的(因為要在網絡中傳輸,必須要把對象轉變成字節),Network用來傳輸這些信息到Server stub, Server stub用來把這些信息反序列化的,Server就是服務的提供者,最終調用的就是Server提供的方法。

Client像調用本地服務似的調用遠程服務;Client stub接收到調用後,將方法、參數序列化客戶端通過sockets將消息發送到服務端Server stub 收到消息後進行解碼(將消息對象反序列化)Server stub 根據解碼結果調用本地的服務本地服務執行(對於服務端來說是本地執行)並將結果返回給Server stubServer stub將返回結果打包成消息(將結果消息對象序列化)服務端通過sockets將消息發送到客戶端Client stub接收到結果消息,並進行解碼(將結果消息反序列化)客戶端得到最終結果。RPC 調用分以下兩種:

同步調用:客戶方等待調用執行完成並返回結果。異步調用:客戶方調用後不用等待執行結果返回,但依然可以通過回調通知等方式獲取返回結果。若客戶方不關心調用返回結果,則變成單向異步調用,單向調用不用返回結果。異步和同步的區分在於是否等待服務端執行完成並返回結果。

RPC 能幹什麼

RPC 的主要功能目標是讓構建分布式計算(應用)更容易,在提供強大的遠程調用能力時不損失本地調用的語義簡潔性。為實現該目標,RPC 框架需提供一種透明調用機制,讓使用者不必顯式的區分本地調用和遠程調用,在之前給出的一種實現結構,基於 stub 的結構來實現。下面我們將具體細化 stub 結構的實現。

可以做到分布式,現代化的微服務

部署靈活解耦服務擴展性強RPC的目的是讓你在本地調用遠程的方法,而對你來說這個調用是透明的,你並不知道這個調用的方法是部署哪裡。通過RPC能解耦服務,這才是使用RPC的真正目的。

總結

這篇文章介紹了 RPC 的一些基本原理,相信到這裡您已經對 RPC 有了一定理解。其實發現實現一個 RPC 不算難,難的是實現一個高性能高可靠的RPC框架。比如,既然是分布式了,那麼一個服務可能有多個實例,你在調用時,要如何獲取這些實例的地址呢?這時候就需要一個服務註冊中心,比如在Dubbo中,就可以使用Zookeeper作為註冊中心,在調用時,從Zookeeper獲取服務的實例列表,再從中選擇一個進行調用。那麼選哪個調用好呢?這時候就需要負載均衡了,於是你又得考慮如何實現複雜均衡,比如Dubbo就提供了好幾種負載均衡策略。所以請繼續關注我的另外兩篇文章RPC與服務化的關係和註冊中心,配置中心, 服務發現淺談,相信會幫助對RPC設計和實現有更多的理解

乾貨福利

零基礎學Java更要注重方法:小編為大家準備了「3.6G」的java資料包

《Java入門編程:任務式學習指南》

私聊小編,領取以下全部資料學習包

今日話題:說一說你學習路上最大的阻礙是什麼?

你的點讚與關注是小編堅持的動力。

相關焦點

  • 從零開始,徒手擼一個簡單的 RPC 框架,輕鬆搞定!
    所以就想著試試自己實現一個簡單的RPC框架,即鞏固了基礎的知識,也能更加深入的了解RPC原理。當然一個完整的RPC框架包含了許多的功能,例如服務的發現與治理,網關等等。本篇只是簡單的實現了一個調用的過程。傳參出參分析一個簡單請求可以抽象為兩步
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • 微服務RPC框架選美
    說到RPC框架,可能大家能想到一堆RPC開源框架,那麼在微服務平臺中,微服務間的服務調用,不可避免的會遇到一個問題,該選用哪一個RPC框架好呢?今天我們就請到三位RPC框架,來進行一場選美大賽,看看誰更適合微服務平臺中的服務間調用。
  • 搜狗開源srpc:自研高性能通用RPC框架
    srpc除了自帶的sogou-std協議以外,還實現了baidu-std協議和thrift framed協議,因此srpc可以與thrift或brpc(連接池模式)互通。另外,接口描述文件支持protobuf和thrift,這意味著用戶不僅可以一鍵遷移基於protobuf或thrift作為IDL的項目,還可以用srpc作為一個性能更優的thrift框架或者brpc框架。
  • 後端工程師,必須搞懂的 RPC 框架
    去年我面試一位高級後端工程師的時候,看他簡歷上寫著「熟練掌握 RPC 框架」,所以我就試探著問了他幾個原理方面的問題,比如,「大概說下 RPC 框架的核心原理」「、描述下序列化部分的邏輯」。但聊了半天,我發現他其實並不熟,他的回答基本都是在告訴我怎麼用,以及怎麼更好地用好這些框架。
  • gRPC 通信框架實現存在數據洩露等安全問題
    gRPC 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go.客戶端和伺服器應用程式之間的這種關鍵而複雜的通信可以通過gRPC來處理,該框架促進了已連接系統之間的透明和高效的通信。儘管它很新(僅在2015年由Google開發),但它很快就獲得了普及和採用。在此文中,趨勢科技將討論開發人員在轉向gRPC並在其項目中實現gRPC時可能面臨的安全隱患。
  • 從0 到 1:全面理解 RPC 遠程調用!
    實現遠程調用的三種方式「遠程調用」意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個地方(分布到各個伺服器),調用者只想要函數運算的結果,卻不需要實現函數的具體細節。光說不練嘴把式,接下來,我將分別用三種不同的方式全面地讓你搞明白 rpc 遠程調用是如何實現的。
  • gRPC首頁、文檔和下載 - RPC 框架 - OSCHINA - 中文開源技術交流...
    gRPC 是一個高性能、開源和通用的 RPC 框架目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
  • 微服務之RPC簡述
    比如說兩臺伺服器A,B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,就需要通過網絡來表達調用的語義和傳達調用的數據,而這種方式就是rpcRPC 的主要功能目標是讓構建分布式計算(應用)更容易,在提供強大的遠程調用能力時不損失本地調用的語義簡潔性。
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    實現的方式是:數據綁定。二是將【視圖】轉化成【模型】,即將所看到的頁面轉化成後端的數據。實現的方式是:DOM 事件監聽。這兩個方向都實現的,我們稱之為數據的雙向綁定。總結:在MVVM的框架下視圖和模型是不能直接通信的。
  • rpc、json Rpc和http區別
    帶索引數組參數的rpc調用--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}<-- {"jsonrpc": "2.0", "result": 19, "id": 1} 2.
  • 秒懂課堂丨百度開屏矩陣產品介紹
    的北歐基因及簡約環保的產品形象投放方式:自定義人群包定向+AI落地頁投放效果:CTR 6+%06多品牌廣告聯動,實現全域品牌集中大曝光秒懂課堂丨品牌廣告開屏產品營銷指南
  • 來秒懂百科,知識視頻大咖都在這裡等你!
    來秒懂百科尋找這些問題的答案吧!秒懂百科是百度百科推出的知識短視頻平臺,旨在用視頻讓知識更簡單。上傳至秒懂的視頻長期展現在百度百科詞條頭部,坐擁千萬流量。截止目前,秒懂百科每天響應9000w+次用戶需求,合作超千名頭部知識視頻創作者。無數的創作者們,在這裡用視頻分享自己的知識見解,用知識服務億萬網友。
  • 40張傳感器工作原理動態圖,秒懂!
    原標題:40張傳感器工作原理動態圖,秒懂! 傳感器是實現自動檢測和自動控制的重要器件,是現代技術發展不可或缺的智能元件,也是電子學和工程學非常重要的研究目標。
  • 五分鐘學後端技術:如何學習Java工程師必須掌握的RPC
    RPC 框架是基於 HTTP 協議實現的,底層使用到了 Netty 框架的支持。Thrift:是 Facebook 的開源 RPC 框架,主要是一個跨語言的服務開發框架。 用戶只要在其之上進行二次開發就行,應用對於底層的 RPC 通訊等都是透明的。不過這個對於用戶來說需要學習特定領域語言這個特性,還是有一定成本的。
  • 【行業資訊】SOFARPC v5.7.4 發布,螞蟻金服開源 Java RPC 框架
    SOFARPC 是一個高可擴展性、高性能、生產級的 Java RPC 框架。在螞蟻金服 SOFARPC 已經經歷了十多年及五代版本的發展。SOFARPC 致力於簡化應用之間的 RPC 調用,為應用提供方便透明、穩定高效的點對點遠程服務調用方案。
  • rpc分布式服務 - CSDN
    第一章聊了【「為什麼要進行服務化,服務化究竟解決什麼問題」】第二章聊了【「微服務的服務粒度選型」】今天開始聊一些微服務的實踐,第一塊,RPC框架的原理及實踐,為什麼說要搞定微服務架構,先搞定RPC框架呢?
  • 打造健康教學 3D影像實現立體講解
    打造健康教學 3D影像實現立體講解 2010年09月25日 17:38作者:廠商投稿編輯:耿瑤文章出處:泡泡網原創 日前,在青島四方區教育局對信息教學設備的相關項目招標中,全球視訊科技領導品牌美國ViewSonic脫穎而出,將提供234臺PJD6381投影機,用於青島四方區學校的課堂教學。這對於加快青島教育信息化建設、提倡健康教學、全面提升教學質量,無疑起到了積極的推動作用。
  • Golang 語言使用標準庫 net/rpc/jsonrpc 包跨語言遠程調用
    encoding/gob 包編解碼傳輸數據,gob 編解碼方式僅適用於 Go 應用,如果需要跨語言遠程調用,可以指定支持跨語言的其他編解碼方式,比如 protobuf,或使用 net/rpc 的子包 net/rpc/jsonrpc,它支持JSON-RPC 1.0,通過 json 格式傳輸數據。