gRPC入門學習之旅(一)

来源:https://www.cnblogs.com/chillsrc/p/18062504
-Advertisement-
Play Games

一、多播委托的應用--觀察者模式 遇到一個開發的問題? 面試者:以面向對象的思想實現一下的場景: 貓:Miao一聲,緊接著引發了一系列的行為~ Miao:引發了一系列的動作; 從代碼層面來說:代碼這樣寫好嗎? 貓職責不單一(貓就是貓,他的行為只有Miao一聲) 依賴太重,依賴了很多的普通類; 被依賴 ...


gRpc簡介

  gRPC 是Google公司開發的基於HTTP/2設計,面向移動的一個高性能、開源和通用的 RPC 框架,是一款語言中立、平臺中立、開源的遠程過程調用(RPC)系統。

        gRpc官網地址:https://www.grpc.io

  gRpc中文文檔地址:http://doc.oschina.net/grpc

  gRPC是一款RPC框架,那麼先瞭解Rpc是什麼。

Rpc基本概念

   RPC(Remote Procedure Call)遠程過程調用,是一種通過網路從遠程電腦程式上請求服務,而不需要瞭解底層網路技術的協議,簡單的理解是一個節點請求另一個節點提供的服務。RPC只是一套協議,基於這套協議規範來實現的框架都可以稱為 RPC 框架,比較典型的有 Dubbo、Thrift 和 gRPC。

  RPC 機制和實現過程
  RPC 是遠程過程調用的方式之一,涉及調用方和被調用方兩個進程的交互。因為 RPC 提供類似於本地方法調用的形式,所以對於調用方來說,調用 RPC 方法和調用本地方法並沒有明顯區別。

  RPC的機制的誕生和基礎概念
  1984 年,Birrell 和 Nelson 在 ACM Transactions on Computer Systems 期刊上發表了名為“Implementing remote procedure calls”的論文,該文對 RPC 的機製做了經典的詮釋:
  RPC 遠程過程調用是指電腦 A 上的進程,調用另外一臺電腦 B 上的進程的方法。其中A 上面的調用進程被掛起,而 B 上面的被調用進程開始執行對應方法,並將結果返回給 A,電腦 A 接收到返回值後,調用進程繼續執行。

  發起 RPC 的進程通過參數等方式將信息傳送給被調用方,然後被調用方處理結束後,再通過返回值將信息傳遞給調用方。這一過程對於開發人員來說是透明的,開發人員一般也無須知道雙方底層是如何進行消息通信和信息傳遞的,這樣可以讓業務開發人員更專註於業務開發,而非底層細節。

  RPC 讓程式之間的遠程過程調用具有與本地調用類似的形式。比如說某個程式需要讀取某個文件的數據,開發人員會在代碼中執行 read 系統調用來獲取數據。

  當 read 實際是本地調用時,read 函數由鏈接器從依賴庫中提取出來,接著鏈接器會將它鏈接到該程式中。雖然 read 中執行了特殊的系統調用,但它本身依然是通過將參數壓入堆棧的常規方式調用的,調用方並不知道 read 函數的具體實現和行為。

  當 read 實際是一個遠程過程時(比如調用遠程文件伺服器提供的方法),調用方程式中需要引入 read 的介面定義,稱為客戶端存根(client-stub)。遠程過程 read 的客戶端存根與本地方法的 read 函數類似,都執行了本地函數調用。不同的是它底層實現上不是進行操作系統調用讀取本地文件來提供數據,而是將參數打包成網路消息,並將此網路消息發送到遠程伺服器,交由遠程服務執行對應的方法,在發送完調用請求後,客戶端存根隨即阻塞,直到收到伺服器發回的響應消息為止。


  下圖展示了遠程方法調用過程中的客戶端和服務端各個階段的操作。
    

 

                     RPC 示意圖


  當客戶端發送請求的網路消息到達伺服器時,伺服器上的網路服務將其傳遞給伺服器存根(server-stub)。伺服器存根與客戶端存根一一對應,是遠程方法在服務端的體現,用來將網路請求傳遞來的數據轉換為本地過程調用。伺服器存根一般處於阻塞狀態,等待消息輸入。

  當伺服器存根收到網路消息後,伺服器將方法參數從網路消息中提取出來,然後以常規方式調用伺服器上對應的實現過程。從實現過程角度看,就好像是由客戶端直接調用一樣,參數和返回地址都位於調用堆棧中,一切都很正常。實現過程執行完相應的操作,隨後用得到的結果設置到堆棧中的返回值,並根據返回地址執行方法結束操作。以 read 為例,實現過程讀取本地文件數據後,將其填充到 read 函數返回值所指向的緩衝區。

  read 過程調用完後,實現過程將控制權轉移給伺服器存根,它將結果(緩衝區的數據)打包為網路消息,最後通過網路響應將結果返回給客戶端。網路響應發送結束後,伺服器存根會再次進入阻塞狀態,等待下一個輸入的請求。

  客戶端接收到網路消息後,客戶操作系統會將該消息轉發給對應的客戶端存根,隨後解除對客戶進程的阻塞。客戶端存根從阻塞狀態恢復過來,將接收到的網路消息轉換為調用結果,並將結果複製到客戶端調用堆棧的返回結果中。當調用者在遠程方法調用 read 執行完畢後重新獲得控制權時,它唯一知道的是 read 返回值已經包含了所需的數據,但並不知道該 read 操作到底是在本地操作系統讀取的文件數據,還是通過遠程過程調用遠端服務讀取文件數據。

  總結下RPC執行步驟:

  1. 調用客戶端句柄,執行傳遞參數。

  2. 調用本地系統內核發送網路消息。

  3. 消息傳遞到遠程主機,就是被調用的服務端。

  4. 服務端句柄得到消息並解析消息。

  5. 服務端執行被調用方法,並將執行完畢的結果返回給伺服器句柄。

  6. 伺服器句柄返回結果,並調用遠程系統內核。

  7. 消息經過網路傳遞給客戶端。

  8. 客戶端接受數據。



  RPC框架的組成

  一個完整的 RPC 框架包含了服務註冊發現、負載、容錯、序列化、協議編碼和網路傳輸等組件。不同的 RPC 框架包含的組件可能會有所不同,但是一定都包含 RPC 協議相關的組件,RPC 協議包括序列化、協議編解碼器和網路傳輸棧,如下圖所示:

    

 

 

   RPC 協議一般分為公有協議和私有協議。例如,HTTP、SMPP、WebService 等都是公有協議。如果是某個公司或者組織內部自定義、自己使用的,沒有被國際標準化組織接納和認可的協議,往往劃為私有協議,例如 Thrift 協議和螞蟻金服的 Bolt 協議。

  分散式架構所需要的企業內部通信模塊,往往採用私有協議來設計和研發。相較公有協議,私有協議雖然有很多弊端,比如在通用性上、公網傳輸的能力上,但是高度定製化的私有協議可以最大限度地降低成本,提升性能,提高靈活性與效率。定製私有協議,可以有效地利用協議里的各個欄位,靈活滿足各種通信功能需求,比如:CRC 校驗、Server Fail-Fast 機制和自定義序列化器。

  在協議設計上,你還需要考慮以下三個關鍵問題:

  1. 協議包括的必要欄位與主要業務負載欄位。協議里設計的每個欄位都應該被使用到,避免無效欄位。
  2. 通信功能特性的支持。比如,CRC 校驗、安全校驗、數據壓縮機制等。
  3. 協議的升級機制。畢竟是私有協議,沒有長期的驗證,欄位新增或者修改,是有可能發生的,因此升級機制是必須考慮的。

   

  RPC和HTTP區別
  RPC 和 HTTP都是微服務間通信較為常用的方案之一,其實RPC 和 HTTP 並不完全是同一個層次的概念,它們之間還是有所區別的。
  1. RPC 是遠程過程調用,其調用協議通常包括序列化協議和傳輸協議。序列化協議有基於純文本的 XML 和 JSON、二進位編碼的Protobuf和Hessian。傳輸協議是指其底層網路傳輸所使用的協議,比如 TCP、HTTP。
  2. 可以看出HTTP是RPC的傳輸協議的一個可選方案,比如說 gRPC 的網路傳輸協議就是 HTTP。HTTP 既可以和 RPC 一樣作為服務間通信的解決方案,也可以作為 RPC 中通信層的傳輸協議(此時與之對比的是 TCP 協議)。

 

  常見的 RPC 框架
  目前流行的開源 RPC 框架還是比較多的,有阿裡巴巴的 Dubbo、Google 的 gRPC、Facebook 的 Thrift 和 Twitter 的 Finagle 等。

  1. Go RPC:Go 語言原生支持的 RPC 遠程調用機制,簡單便捷。
  2. gRPC:Google 發佈的開源 RPC 框架,是基於 HTTP 2.0 協議的,並支持眾多常見的編程語言,它提供了強大的流式調用能力,目前已經成為最主流的 RPC 框架之一。
  3. Thrift:Facebook 的開源 RPC 框架,主要是一個跨語言的服務開發框架,作為老牌開源 RPC 協議,以其高性能和穩定性成為眾多開源項目提供數據的方案選項。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是你們的老伙計秀才!今天帶來的是[深入淺出Java多線程]系列的第十篇內容:CAS。大家覺得有用請點贊,喜歡請關註!秀才在此謝過大家了!!! ...
  • 在Word中,表格是一個強大的工具,它可以幫助你更好地組織、呈現和分析信息。本文將介紹如何使用Python在Word中創建表格並填入數據、圖片,以及設置表格樣式等。 Python Word庫: 要使用Python在Word中創建或操作表格,需要先將Spire.Doc for Python這個第三方庫 ...
  • 在 Java 的java.util.concurrent包中,除了提供底層鎖、併發同步等工具類以外,還提供了一組原子操作類,大多以Atomic開頭,他們位於java.util.concurrent.atomic包下。 ...
  • 本文將從leader處理器入手,詳細分析node的增刪改查流程及監聽器原理。 回顧數據讀寫流程 leader ZookeeperServer.processPacket封裝Request並提交給業務處理器 LeaderRequestProcessor做本地事務升級 PrepRequestProces ...
  • 先看效果圖; 再說一下思路: 打開設計器,屬性裡面找到"顏色",設置為漸變色,將漸變色設置為9段,分別是,紅橙黃綠青藍紫白黑(Red,Orange,Yellow,Lime,Cyan,Blue,Magenta,White,Black); 然後移動滑塊兒,比如在紅色和橙色和黃色之間移動的時候,會發現顏色 ...
  • 概述:在WPF中,Command是一種優秀的機制,通過它,我們能夠將用戶界面操作與業務邏輯分離,提高代碼的可維護性和可重用性。通過自定義ICommand介面的實現(如RelayCommand),我們能夠輕鬆創建併在XAML中綁定命令,實現清晰的MVVM架構。這種模式使得應用程式的開發更加靈活,同時提 ...
  • .NET Framework 和 .NET Core 2.0 及更低版本中由 HttpClient 使用的預設消息處理程式為HttpClientHandler。 從 .NET Core 2.1 開始,類SocketsHttpHandler提供了更高級別的 HTTP 網路類(例如HttpClient ...
  • 1、KingBaseES 人大金倉資料庫 是多資料庫、多模式。2、public 為預設模式,因此,預設情況下,我們可以在 public 模式下新建表即可。總的來說,使用 CYQ.Data 框架操作 KingBaseES 資料庫可以簡化開發流程,提高開發效率,同時也增強了系統的穩定性和安全性 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...