.NET World——gPRC概覽

来源:https://www.cnblogs.com/kenwoo/archive/2019/08/18/11372290.html
-Advertisement-
Play Games

什麼是gRPC "官方" 的定義: gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in ...


什麼是gRPC

官方的定義:

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

gRPC是一種現代化開源的高性能RPC框架,能夠運行於任意環境之中。它可以高效地在服務和數據中心內部與其間建立連接,並且可支持負載均衡,追蹤,健康檢測與認證功能。同時它也可用於分散式計算的“最後一公裡”,連接設備,移動應用和瀏覽器到後端服務。

維基的定義:

gRPC (gRPC Remote Procedure Calls) is an open source remote procedure call (RPC) system initially developed at Google. It uses HTTP/2 for transport, Protocol Buffers as the interface description language, and provides features such as authentication, bidirectional streaming and flow control, blocking or nonblocking bindings, and cancellation and timeouts. It generates cross-platform client and server bindings for many languages. Most common usage scenarios include connecting services in microservices style architecture and connect mobile devices, browser clients to backend services.

gRPC(gRPC遠程過程調用)是一種開源的遠程過程調用系統,最初由谷歌進行開發。它使用HTTP/2作為傳輸協議。Protocol Buffer被用於介面描述語言,提供了諸如認證,雙向流控制,阻塞或非阻塞綁定,取消與超時功能。它為多種語言生成跨平臺的客戶端與服務端綁定。最通用的使用場景包括在微服務樣式架構中連接服務,以及連接移動設備,瀏覽器客戶端到後端服務。

什麼是RPC

從上面的解釋里不難看出,要對gRPC有更直觀的理解,首先需要明白RPC的定義。

繼續看下維基上的內容:

In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system. In the object-oriented programming paradigm, RPC calls are represented by remote method invocation (RMI). The RPC model implies a level of location transparency, namely that calling procedures is largely the same whether it is local or remote, but usually they are not identical, so local calls can be distinguished from remote calls. Remote calls are usually orders of magnitude slower and less reliable than local calls, so distinguishing them is important.

在分散式計算里,當電腦程式要運行一段代碼,遠程過程調用(RPC)會在不同的記憶體地址(一般是在網路里的不同電腦)上執行它。其無需程式員顯示地對它的遠程交互進行具體編碼,編寫代碼的方式就如同一段普通的本地過程調用一般。即是,程式員所需寫的代碼是相同的,無論其調用的過程是在本地還是遠程。這是一種客戶端-服務端交互的形式(調用方是客戶端,執行方是服務端),典型的實現方式是通過一種請求-響應的傳遞消息系統。在面向對象程式範式里,RPC調用被表示為遠程方式調用(RMI)。RPC模型意味著一定程度的本地透明性,本地或是遠程的調用過程大致而言是等同的,但又不是完全一樣。遠程調用通常比本地調用慢上幾個數量級,同時也更加不可靠。

Remoting,Web Service,WCF

如果對RPC的概念還是理解不了的話,卻曾使用過或者瞭解過諸如Remoting,Web Service或者WCF等技術的話,那麼其實在這方面已經入門了。

Protocol buffers

Protocol buffers是谷歌開發的一套無關開發語言,無關平臺的用於序列化結構數據的可擴展機制。它的用途與XML,JSON相同,但比它們更小,更快,更簡潔。

作為gRPC中預設的介面定義語言,其既可以用於定義服務介面,也可以定義所必要的數據結構。

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

Protocol buffers的代碼需要保存在擴展名為.proto的文件之中。

服務類型

gRPC支持四種服務類型:

  1. 一元式RPC
  2. 服務端流式RPC
  3. 客戶端流式RPC
  4. 雙向流式RPC

一元式RPC,如同普通的方法調用一般,客戶端的單一請求,至服務端後,返回唯一的響應。

rpc SayHello(HelloRequest) returns (HelloResponse){
}

服務端流式RPC,客戶端發送一請求至服務端後,服務端返回一串消息數據流,客戶端持續讀取直到沒有更多的消息。gRPC會確保消息的傳輸順序。

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}

客戶端流式RPC,客戶端對一數據流寫入一串信息後發送到服務端,並等待服務端返迴響應。gRPC會確保消息的傳輸順序。

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}

雙向流式RPC,客戶端與服務端使用兩個數據流,其間互無影響,可以同時進行數據傳遞。

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

gRPC API

光有proto文件,並不能直接使用,還需gRPC中所提供的API將這些文件編譯成不同程式語言的服務端與客戶端代碼。

在服務端,實現服務所定義的方法,並運行gRPC服務程式以處理客戶端調用。gRPC架構負責解碼傳入的請求,執行服務的方法,最後對服務的響應進行編碼。
在客戶端,會有一個名為存根(stub)的本地對象,實現與服務端相同的方法。這樣只需調用這個本地對象的方法,傳入合適的protocol buffers消息類型的參數,gRPC負責將請求發送至服務端,再返回相應的結果。

如果使用過諸如WCF這樣的PRC技術,對這一過程應該是十分熟悉了。

感到陌生的大概是gRPC中將proto文件編譯成代碼的插件工具,例如Grpc.Tools

所以還是舉個具體的例子以便理解。

.NET中的gPRC

首先建立兩個Console工程。

dotnet new console -o gRPCServer
dotnet new console -o gRPCClient

接著,在此兩個工程同級目錄下新建一個名為protos的文件夾。

如此,目錄下的文件夾應該有如下幾個:

  • gRPCServer
  • gRPCClient
  • protos

protos文件夾下新加一個greet.proto文件。

syntax = "proto3";

option csharp_namespace = "GrpcGreeter";

package Greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

然後,進入gRPCServer文件夾,添加相關的類庫包。

dotnet add package Grpc
dotnet add package Grpc.Tools
dotnet add package Google.Protobuf

併在csproj文件中加入下列配置:

  <ItemGroup>
    <Protobuf Include="../protos/*.proto" OutputDir="protos" CompileOutputs="false" GrpcServices="Service" />
  </ItemGroup>   

運行dotnet build,可以看到在gRPCServer工程下新生成一個protos文件夾,以及Greet.cs與GreetGrpc.cs文件。

在Program類中加入Greeter的實現類和相關介面方法,並創建服務端啟動程式。

class Program
{
    const int Port = 51234;

    static void Main(string[] args)
    {
        var server = new Server
        {
            Services = { Greeter.BindService(new GreeterImpl()) },
            Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
        };
        server.Start();

        Console.WriteLine("Greeter server listening on port " + Port);
        Console.WriteLine("Press any key to stop the server...");
        Console.ReadKey();

        server.ShutdownAsync().Wait();
    }
}

class GreeterImpl : Greeter.GreeterBase
{
    // Server side handler of the SayHello RPC
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
    }
}

通過dotnet run命令啟動此服務端。

之後再進入gRPCClient文件夾,加入同樣的類庫包。

在csproj文件中加入類似的配置,註意GrpcServices屬性改為了Client:

  <ItemGroup>
    <Protobuf Include="../protos/*.proto" OutputDir="protos" CompileOutputs="false" GrpcServices="Client" />
  </ItemGroup>   

運行dotnet build,同樣生成protos文件夾及兩個proto文件。

Program類中加入客戶端調用代碼。

static void Main(string[] args)
{
    var channel = new Channel("127.0.0.1:51234", ChannelCredentials.Insecure);

    var client = new Greeter.GreeterClient(channel);
    var reply = client.SayHello(new HelloRequest { Name = "Ken" });
    Console.WriteLine(reply.Message);

    channel.ShutdownAsync().Wait();
    Console.ReadKey();
}

運行客戶端後,應該就可以看到調用服務端方法後返回的結果。

.NET Core 3.0

在最新的.NET Core 3.0中,加入了對gRPC更多的支持。當創建一個Web項目時,選擇ASP.NET Core 3.0,可以發現新增了gRPC Service項目模板。

從建立的項目代碼中可以看出其不再是普通的Web應用,而是完全變成了gRPC的服務端。

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        // Communication with gRPC endpoints must be made through a gRPC client.
        // To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909
        endpoints.MapGrpcService<GreeterService>();
    });
}

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

-Advertisement-
Play Games
更多相關文章
  • 今天是第一天學習Python課程,主要從電腦基礎,Python的歷史,環境 ,變數,常量,註釋,用戶交互,基礎數據類型 ,簡單的if條件語句和while迴圈語句這幾個來學習,重點的掌握內容是python的環境,還有python2和python3的區別,常量等。、 1.電腦基礎 cpu:相當於人的 ...
  • Dbutils,db utils,顧名思義,是一個資料庫工具,體積很小,算是一個dao層的小框架。 DbUtils是Apache的開源項目,對JDBC進行了輕量級封裝,極大地簡化了JDBC編程。 DbUtils可以將結果集映射到JavaBean中,這一點和Hibernate很相似,但比Hiberna ...
  • 本文以一個簡單的小例子,簡述SpringMVC開發中RequestMapping的相關應用,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 1、什麼是跨域問題? 跨域問題是瀏覽器對於ajax請求的一種安全限制:一個頁面發起的ajax請求,只能是用當前頁同功能變數名稱同埠的路徑,這能有效的阻止跨站攻擊。 2、跨域問題出現的條件: 1、跨域問題是ajax請求特有的問題。 2、前後端的功能變數名稱、埠不一致。 3、CORS跨域解決原理簡單分析: CORS ...
  • 原文: https://medium.com/netflix techblog/re architecting the video gatekeeper f7b0ac2f6b00 想法 我們決定部署一個全高密度近場緩存(Hollow)來解決我們的IO瓶頸。對於我們的每個上游系統,我們要建一個能讓Ga ...
  • 對const map使用std::map::[]產生的bug研究了一會兒,發現了const, non-const的各自獨特的用處。 ...
  • 項目的完整代碼在 "C2j Compiler" 前言 有關符號表的文件都在symboltable包里 前面我們通過完成一個LALR(1)有限狀態自動機和一個reduce信息來構建了一個語法解析表,正式完成了C語言的語法解析。接下來就是進入語義分析部分,和在第二篇提到的一樣,語義分析的主要任務就是生成 ...
  • 上一次演示瞭如何 "使用阿裡雲Codepipeline,阿裡雲容器鏡像服務實現CI" ,講到這裡我們push一下代碼後就自動編譯、自動跑單元測試、自動構建鏡像、自動推送鏡像到私倉。那麼離我們最初設定的目標只差那麼一小步了,那就是自動部署到測試/生產環境,這一步就是持續交付/部署(CD)。 CD其實是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...