如何理解 RPC 遠程服務調用?

本文主要講解 RPC 遠程服務調用相關的知識。

RPC 遠程服務調用是分布式服務架構的基礎,無論微服務設計上層如何發展,討論服務治理都繞不開遠程服務調用,那么如何理解 RPC、有哪些常見的 RPC 框架、實現一款 RPC 框架需要哪些技術呢?

如何理解 RPC

RPC(Remote Procedure Call)是一種進程間通信方式,百科給出的定義是這樣的:“RPC(遠程過程調用協議),它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議”。

RPC 允許程序調用另一個地址空間的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地接口/服務的還是遠程的接口/服務,本質上編寫的調用代碼基本相同。

比如兩臺服務器 A、B,一個應用部署在 A 服務器上,想要調用 B 服務器上應用提供的函數或者方法,由于不在一個內存空間,則不能直接調用,這時候就可以應用 RPC 框架的實現來解決。

RPC 如何實現

早期的遠程服務調用一般是通過 RMI 或 Hessian 等工具實現,以 Java RMI 為例,RMI 是 Java 語言中 RPC 的一種實現方式。

Java RMI(Java 遠程方法調用,Java Remote Method Invocation)是 Java 編程語言里,一種用于實現遠程過程調用的應用程序編程接口。應用 Java RMI,可以讓某個 Java 虛擬機上的對象調用另一個 Java 虛擬機中的對象上的方法。

Java RMI 實現主要依賴 java.rmi 包下面的工具類,具體流程包括繼承 Remote 實現遠程接口,開發業務邏輯,創建 Server 并且注冊遠程對象,客戶端創建 Client 調用遠程方法等。關于 RMI 的實現細節,由于實際開發中很少應用,這里不展開講解了。

以 Java RMI 為代表的的早期 RPC 實現起來比較繁瑣,需要在代碼中直接編碼地址,并且不支持服務治理,比如無法對服務調用進行統計、無法梳理服務依賴情況、無法保證服務上下線時的穩定性等。隨著分布式系統規模的增長,傳統方式已經無法滿足開發需求,于是誕生了一系列的 RPC 服務框架。

RPC 框架代表

開源社區里有許多優秀的 RPC 框架,比如常用的 Dubbo、Thrift、gRPC 等,下面簡單介紹一下這幾款組件。

Apache Dubbo

Dubbo 是阿里巴巴公司開源的一個高性能 Java 分布式服務框架,目前已經成為 Apache 頂級項目。Dubbo 可以通過高性能的 RPC 實現服務的輸出和輸入,支持服務治理,提供了控制臺界面,可以獨立應用,也可以和 Spring 框架無縫集成。

Dubbo 在設計中采用了微內核架構,基于對 Java SPI 機制的擴展實現,Dubbo 對分布式服務調用核心功能都開放了擴展點,包括服務調用的負載均衡策略、序列化協議、傳輸協議等,使用者都可以添加自定義實現。

Dubbo 在國內曾經擁有很高的人氣,是微服務架構的首選,后來隨著 Spring Cloud 的流行,社區一度停更,外部用戶發布了 DubboX 等升級版本。最近,Dubbo 社區又重新活躍,更新后的 Dubbo 也發布了 3.0 預覽版等,并且宣布會在未來的版本中支持更多特性,值得期待。

Google 的 gRPC

gRPC 是 Google 開發的高性能、通用的開源 RPC 框架,gRPC 使用 ProtoBuf 來定義服務,ProtoBuf 是 Google 開發的一種數據序列化協議,性能比較高,壓縮和傳輸效率高,語法也比較簡單。另外,gRPC 支持多種語言,并能夠基于語言自動生成客戶端和服務端功能庫。

Apache Thrift

Thrift 起源于 Facebook,和 Dubbo 一樣,后來被提交 Apache 基金會將 Thrift 作為一個開源項目。Facebook 創造 Thrift 的目的是為了解決 Facebook 各系統間大數據量的傳輸通信,以及系統間語言環境不同需要跨平臺的問題。

Thrift 支持多種編程語言,如 Java、C++、Python、PHP、Ruby 等,可以在多種不同的語言之間通信。應用 Thrift,需要在一個語言無關的 IDL 文件里,定義數據類型和服務接口,然后生成用來構建 RPC 客戶和服務器所需的代碼。

Thrift 主要的優點是跨語言;缺點是,由于需要定義獨立的 IDL 文件,如果對服務進行修改,當數據結構發生變化時,必須重新編輯 IDL 文件、重新編譯和生成相關的代碼,修改起來比較繁瑣。

微博 Motan

Motan 是新浪微博開源的一個 Java RPC 框架,官方文檔對外宣傳在微博平臺已經廣泛應用,每天為數百個服務完成近千億次的調用。

Motan 基于 Java 語言開發,設計和實現與 Dubbo 比較類似,包括服務提供者(RPC Server)、服務調用方(RPC Client)、服務注冊中心(Registry)三個角色。服務端會向注冊中心注冊服務,消費端使用服務需要先向注冊中心進行訂閱,根據注冊中心的返回列表與具體的 服務端建立連接,進行 RPC 通訊。當服務端發生變更的時候,注冊中心也會同步變更,然后同步的通知到消費端。

Motan 也提供了服務治理的功能,包括服務的發現、服務的摘除、高可用及負載均衡。

RPC 框架用到哪些技術

了解了常見的 RPC 框架后,我們來看一下實現一個 RPC 框架需要哪些技術。

如何建立通信

實現分布式服務框架,首先要解決不同節點之間通訊的問題,需要在客戶端和服務器之間建立 TCP 連接,遠程過程調用的所有交換的數據都在這個連接里傳輸。

一般來說,建立通信可以使用成熟的網絡通信框架,比如 Java 語言中的 Netty,這是一個優秀的網絡通信框架。在 Dubbo、Motan 中都應用了 Netty。

如何進行網絡傳輸

建立通信之后,節點之間數據傳輸采用什么協議,也就是選擇什么樣的二進制數據格式組織;傳輸的數據如何序列化和反序列化,比如在 Dubbo 中,傳輸協議默認使用 Dubbo 協議,序列化支持選擇 Hessian、Kryo、Protobuf 等不同方式。

如何進行服務注冊和發現

服務注冊和發現,也就是服務尋址,以 Dubbo 為例,下圖分布式服務典型的尋址和調用過程:

image.png

服務注冊,需要服務提供者啟動后主動把服務注冊到注冊中心,注冊中心存儲了該服務的 IP、端口、調用方式(協議、序列化方式)等信息。

服務發現,當服務消費者第一次調用服務時,會通過注冊中心找到相應的服務提供方地址列表,并緩存到本地,以供后續使用。當消費者再次調用服務時,不會再去請求注冊中心,而是直接通過負載均衡算法從 IP 列表中取一個服務提供者調用服務。

上面列舉了一些分布式服務框架的實現要點,除了這些,還有很多技術細節,比如如何實現服務調用,RPC 框架如何和服務層交互,Java 中通過代理實現服務調用,那么代理對象如何解析請求參數、如何處理返回值等。

總結

本文分享了 RPC 遠程服務調用的概念,介紹了常見的 RPC 框架實現,以及 RPC 框架需要關心哪些技術。通過本課時的學習,相信你對 RPC 相關技術有了一個初步認識,如果對其中某個框架感興趣,你可以找一些資料深入了解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212654.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決electron修改主進程后需要重啟才生效

nodemon 是一種工具,可在檢測到目錄中的文件更改時通過自動重新啟動節點應用程序來幫助開發基于 node.js 的應用程序 nodemon 特性 自動重新啟動應用程序。檢測要監視的默認文件擴展名。默認支持 node,但易于運行任何可執行文件,如 python、…

自動駕駛學習筆記(十七)——視覺感知

#Apollo開發者# 學習課程的傳送門如下,當您也準備學習自動駕駛時,可以和我一同前往: 《自動駕駛新人之旅》免費課程—> 傳送門 《Apollo 社區開發者圓桌會》免費報名—>傳送門 文章目錄 前言 分類 目標檢測 語義分割 實例分割 …

SQL語句的執行順序怎么理解?

SQL語句的執行順序怎么理解? 我們常常會被SQL其書寫順序和執行順序之間的差異所迷惑。理解這兩者的區別,對于編寫高效、可靠的SQL代碼至關重要。今天,讓我們用一些生動的例子和場景來深入探討SQL的執行順序。 一、書寫順序 VS 執行順序 SQ…

【unity實戰】一個通用的FPS槍支不同武器射擊控制腳本

文章目錄 前言模型素材文章用到的粒子火光特效射擊效果換彈瞄準開槍抖動效果設置顯示文本最終代碼不同武器射擊效果1. 手槍2. 機槍3. 狙擊槍4. 霰彈槍5. 加特林 其他感謝完結 前言 實現FPS槍支不同武器效果,比如手槍,噴子,狙擊槍&#xff0c…

《使用ThinkPHP6開發項目》 - 創建應用

《使用ThinkPHP6開發項目》 - 安裝ThinkPHP框架-CSDN博客 《使用ThinkPHP6開發項目》 - 設置項目環境變量-CSDN博客 《使用ThinkPHP6開發項目》 - 項目使用多應用開發-CSDN博客 根據前面的步驟,我們現在就可以開發我們的項目開發了,根據項目開發的需要…

【數據挖掘】國科大蘇桂平老師數據庫新技術課程作業 —— 第四次作業

云數據庫研究 云計算與云數據庫背景 云計算(cloud computing)是 IT 技術發展的最新趨勢,正受到業界和學術界的廣泛關注。云計算是在分布式處理、并行處理和網格計算等技術的基礎上發展起來的,是一種新興的共享基礎架構的方法。它…

Django多對多ManyToManyField字段

Django是一個支持多對多關系的Web框架,可以在模型中定義多對多關系。多對多關系通常涉及兩個實體之間的復雜交互,例如用戶和組之間的關系,或者課程和學生之間的關系。在Django中,可以使用ManyToManyField字段來定義多對多關系。 …

[足式機器人]Part4 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames

本文僅供學習使用 本文參考: B站:CLEAR_LAB 筆者帶更新-運動學 課程主講教師: Prof. Wei Zhang 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

機器學習基礎入門

機器學習 引言 介紹機器學習的重要性和應用領域。簡要說明機器學習與人工智能的關系。 在當今迅速發展的技術世界中,機器學習已經成為一項不可或缺的技術,它正在改變我們解決問題和理解世界的方式。機器學習,作為人工智能(AI&a…

最新Redis7持久化(權威出版)

首先我們要知道什么是持久化:持久化是指將數據保存到磁盤上,以確保在Redis服務器重啟時數據不會丟失。 Redis支持兩種主要的持久化方式:RDB持久化和AOF持久化 下面讓我依次給你介紹一下: RDB持久化 作用 這是將Redis數據保存…

Java8新特性 - Stream

一、特性 Java 8引入的Stream API為集合&#xff08;Collections&#xff09;提供了一種聲明式的處理方式&#xff0c;支持豐富的操作&#xff0c;包括篩選、映射、歸約等。以下是一些Stream的主要功能和使用方式的案例&#xff1a; 創建Stream&#xff1a; List<String&…

Java語言概述及保姆級入門教程(JDK 17版本)

筆記來自尚硅谷老師-康老師 學習教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基礎全程脈絡圖 1.1 本章專題與脈絡 2. 抽絲剝繭話Java 2.1 當前大學生就業形勢 麥可思研究院發布了《2022年中國大學生就業…

TCP 和UDP 到底有啥區別

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是互聯網上常用的兩種傳輸層協議&#xff0c;它們在數據傳輸方式和特性上有顯著的區別。下面是TCP和UDP的主要區別&#xff1a; 連接性: TCP 是一種面向連接的協議。在數據傳輸前&#xf…

C#圖像處理OpenCV開發指南(CVStar,09)——邊緣識別之Scharr算法的實例代碼

1 邊緣識別之Scharr算法 算法文章很多&#xff0c;不再論述。 1.1 函數原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 參數說明 src 代表原始圖像。dst 代表目標圖像。ddepth 代表輸出圖像的深度。CV_16Sdx 代表x方向上的求導階數…

uniApp應用軟件在運行時,不符合華為應用市場審核標準。解決方案合集!

&#xff08;暫時用不到的也建議收藏一下&#xff0c;因為文章持續更新中&#xff09; 最新更改時間&#xff1a;20023-12-10 第一次做App應用開發相信大家一定都遇到過華為應用市場審核的“駁回”&#xff01; 有些問題一看就明白可以立馬修改&#xff0c;而有一些問題修改意…

Dubbo入門直接上手,結合微服務詳解

Dubbo 高性能、輕量級的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 遠程過程調用&#xff0c;簡單來說就是它允許一個計算機程序通過網絡請求調用另一個計算機上的程序&#xff0c;就像本地調用一樣。有非常多的協議和技術來都實現了RPC的過程&#xff0c;比如&a…

Elasticsearch 8.9 refresh刷Es緩沖區的數據到Lucene,更新segemnt,使數據可見

一、相關API的handler1、接受HTTP請求的hander(RestRefreshAction)2、往數據節點發送刷新請求的action(TransportRefreshAction)3、數據節點接收主節點refresh傳輸的action(TransportShardRefreshAction) 二、在IndexShard執行refresh操作1、根據入參決定是使用lucene提供的阻塞…

【華為數據之道學習筆記】3-8以確保合規遵從為核心的外部數據管理

一、以確保合規遵從為核心的外部數據管理 外部數據是指華為公司引入的外部組織或者個人擁有處置權利的 數據&#xff0c;如供應商資質證明、消費者洞察報告等。外部數據治理的出發點是合規遵從優先&#xff0c;與內部數據治理的目的不同。 外部數據的治理主要遵循以下原則。 1&…

【設計模式--創建型--原型模式】

設計模式--創建型--原型模式 原型模式概述結構實現結果 案例代碼結果使用場景 擴展&#xff08;深\淺克隆&#xff09;淺克隆演示&#xff1a;結果&#xff1a;使用深克隆&#xff08;利用對象流&#xff09;結果 原型模式 概述 用一個已經創建的實例作為原型&#xff0c;通過…

Go簡單了解

0.一直很好奇,go是不是像傳說中的速度快,解決了多線程問題,快速進行了解了解,和java進行對比,他是怎么解決語言發展的問題的…,所有語言都是差不多的,只是熟練程度不同而已 1.go圖標是土撥鼠,2009發行 docker使用go,解決了并發問題 google facebook 騰訊 百度 七牛云 京東 小米…