ASP.NET Core 3.0 上的gRPC服務模板初體驗(多圖)

来源:https://www.cnblogs.com/yilezhu/archive/2019/04/01/10631420.html
-Advertisement-
Play Games

早就聽說ASP.NET Core 3.0中引入了gRPC的服務模板,正好趁著家裡電腦剛做了新系統,然後裝了VS2019的功夫來體驗一把。同時記錄體驗的過程。如果你也想按照本文的步驟體驗的話,那你得先安裝.NET Core3.0預覽版的SDK。至於開發工具我用的時VS2019,當然你也可以使用VS C ...


早就聽說ASP.NET Core 3.0中引入了gRPC的服務模板,正好趁著家裡電腦剛做了新系統,然後裝了VS2019的功夫來體驗一把。同時記錄體驗的過程。如果你也想按照本文的步驟體驗的話,那你得先安裝.NET Core3.0預覽版的SDK。至於開發工具我用的時VS2019,當然你也可以使用VS Code進行。

作者:依樂祝
原文地址:https://www.cnblogs.com/yilezhu/p/10631420.html

gRPC的簡單介紹

gRPC 是一種與語言無關的高性能遠程過程調用 (RPC) 框架。 有關 gRPC 基礎知識的詳細信息,請參閱 gRPC 文檔頁

gRPC 的主要優點是:

  • 現代高性能輕量級 RPC 框架。
  • 協定優先 API 開發,預設使用協議緩衝區,允許與語言無關的實現。
  • 可用於多種語言的工具,以生成強類型伺服器和客戶端。
  • 支持客戶端、伺服器和雙向流式處理調用。
  • 使用 Protobuf 二進位序列化減少對網路的使用。

這些優點使 gRPC 適用於:

  • 效率至關重要的輕量級微服務。
  • 需要多種語言用於開發的 Polyglot 系統。
  • 需要處理流式處理請求或響應的點對點實時服務。

ASP.NET Core 3.0上gRPC服務模板初體驗

創建gRPC服務

  1. 打開VS2019 從 Visual Studio“文件”菜單中選擇“新建” > “項目”。(由於我是新打開的VS,所以按照如下圖所示創建新項目)

    1554009071721

  2. 如下圖所示,選擇創建《ASP.NET Core Web 應用程式》,然後點擊下一步

    1554009107868

  3. 在此頁面按照下圖所示,輸入項目名稱,位置,解決方案名稱,然後點擊右下角的“創建”按鈕進行創建。

    1554009210208

  4. 你以為上述步驟中點擊“創建”就結束了嘛?說好的要創建gRPC服務模板的,所以,點擊上面的創建後會彈出如下圖所示,讓你選擇服務模板的視窗,這裡按照下圖所示選擇gRPC服務模板,然後再次點擊右下角的創建,才是真正的創建項目。

    1554009368040

  5. 創建成功後,會出現如下圖所示的項目結構

    1554009441048

  6. 至此,我們就創建好了一個gRPC服務的模板,接下來我們先測試一番,然後再好好的看下這個模板的結構吧

測試gRPC服務

  1. 首先打開HelloGrpc.Server 這個服務端的工作目錄,然後Shift+滑鼠右鍵彈出如下圖所示的右鍵菜單,如圖所示打開ps視窗

    1554009655486

  2. 輸入dotnet run 命令運行此gRPC服務端項目,如下圖所示,說明服務端啟動正常,並開始監聽對應的埠。

    1554009713142

  3. 同樣的方法,我們啟動客戶端,這時候客戶端會向該服務端發送一條包含具有其名稱“GreeterClient”的消息的問候信息。 該服務端將發送一條消息“Hello GreeterClient”作為響應,並顯示在命令提示符中。如下圖所示:

    1554009820515

  4. 至此,gRPC服務模板創建的服務端以及客戶端測試成功。下麵我們就好好的探究一下這個服務模板吧。

gRPC模板解析

HelloGrpc.Server 服務的端項目中有如下幾個文件

  • greet.proto:greet.proto 文件定義 Greeter gRPC,且用於生成 gRPC 伺服器資產。
  • Services 文件夾:包含 Greeter 服務的實現。
  • appSettings.json:包含配置數據,如 Kestrel 使用的協議。(熟悉ASP.NET Core的你一定很熟悉)
  • Program.cs:包含 gRPC 服務的入口點。(熟悉ASP.NET Core的你一定很熟悉)
  • Startup.cs:IWebHostBuilder的啟動配置文件,包含配置應用行為的代碼。(熟悉ASP.NET Core的你一定很熟悉)

gRPC 客戶端 HelloGrpc.Client 文件:

Program.cs 包含 gRPC 客戶端的入口點和邏輯。

下麵我們再打開每個文件看看裡面究竟是什麼東東吧。

proto文件

proto

GRPC使用約定優先的API開發方法。預設情況下,使用協議緩衝區(Protobuf)作為介面設計語言(IDL)。這個.proto文件包含:

  • GRPC服務的定義。
  • 在客戶端和伺服器之間發送的消息。

有關Protobuf文件語法的更多信息,請參見正式文件(原型).

如我們模板中創建的greet.proto 文件內容如下:

syntax = "proto3";

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;
}
  • 定義Greeter服務。
  • 這個Greeter服務定義SayHello請求。
  • SayHello發送HelloRequest消息並接收HelloResponse信息:
    那麼你可能要問了,這個.proto文件是如何包含在項目中的呢,其實,如果你打開.csproject文件就會看到,通過將該文件添加到<Protobuf>的ItemGroup中即可,如下所示:
<ItemGroup>
  <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
  <Content Include="@(Protobuf)" LinkBase="" />
</ItemGroup>

C#對.proto文件的工具支持

工具包Grpc.Tools 被用來從.proto文件生成C#文件。生成的資產(文件)具有如下特性:

  • 每次構建項目時都會根據需要進行生成。
  • 生成的文件不會被添加到項目或簽入源代碼管理。
  • 生成的C#文件是包含在OBJ目錄。

伺服器和客戶端項目都需要此包。Grpc.Tools可以通過在VisualStudio中使用包管理器或添加<PackageReference>到項目文件:

XML複製

<PackageReference Include="Grpc.Tools" Version="1.19.0-pre1" PrivateAssets="All" />

工具包在運行時並不是必需的,因此,應該用PrivateAssets="All".

Services 文件夾中的具體的gRPC服務

我們知道Grpc.Tools工具包將根據.proto文件的定義翻譯並生成對應的C#類型的文件。

對於伺服器端資產,將生成一個抽象的服務基類型。基類型包含在.proto文件中包含的所有GRPC調用的定義。然後,您將創建從此基類型派生的具體服務實現,並實現GRPC調用的邏輯。對於前面描述的greet.proto示例,將生成包含虛擬SayHello方法的抽象GreeterBase類型。具體的實現GreeterService重寫該方法並實現處理GRPC調用的邏輯。
正如HelloGrpc.Server項目中的Services\GreeterService.cs中的代碼

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> 
        SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

對於客戶端,將生成一個具體的客戶端類型中的GRPC調用。.proto文件被轉換為可以調用的具體類型上的方法。為greet.proto前面描述的示例,一個具體的GreeterClient類型生成。這個GreeterClient類型包含SayHello方法,可以調用該方法來啟動對伺服器的GRPC調用。

public class Program
{
    static async Task Main(string[] args)
    {
        // Include port of the gRPC server as an application argument
        var port = args.Length > 0 ? args[0] : "50051";

        var channel = new Channel("localhost:" + port, ChannelCredentials.Insecure);
        var client = new Greeter.GreeterClient(channel);

        var reply = await client.SayHelloAsync(
                                      new HelloRequest { Name = "GreeterClient" });
        Console.WriteLine("Greeting: " + reply.Message);

        await channel.ShutdownAsync();

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}

預設情況下,分別生成伺服器和客戶端資產。.proto文件包含在<Protobuf>項目組。若要確保僅在伺服器項目中生成伺服器資產,GrpcServices屬性設置為Server.

XML複製

<ItemGroup>
  <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
  <Content Include="@(Protobuf)" LinkBase="" />
</ItemGroup>

類似地,屬性設置為Client在僅在客戶項目中生成。

Startup

Startup中我們發現跟普通的ASP.NET Core程式有所不同,具體的如下圖所示:在ConfigureServices 服務中引入了gRPC服務,然後在Configure加入了路由

1554014291599

而這裡需要引入三個與gRPC相關的nuget包

這裡需要說明的是

ASP.NET Core 中間件和功能共用路由管道,因此可以將應用程式配置為服務其他請求處理程式。其他請求處理程式(如MVC控制器)可以與配置的GRPC服務路由並行工作。

其他需要說明的內容

與ASP.NET Core 介面的集成

GRPC服務可以完全訪問ASP.NETCore功能,如依賴註入(Di)和日誌功能。例如,服務實現可以通過構造函數解析DI容器中的記錄器服務:

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

預設情況下,GRPC服務可以解析具有任意生存期的其他DI服務(Singleton, Scoped, or Transient)。

在GRPC方法中解析HttpContext

GRPC 應用程式介面提供對某些HTTP/2消息數據的訪問,例如method, host, header, and trailers。訪問是通過ServerCallContext參數傳遞給每個GRPC方法:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> 
        SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext不提供對所有ASP.NET 介面中HttpContext的完全訪問。GetHttpContext擴展方法提供對錶示ASP.NET API中底層HTTP/2消息的httpContext的完全訪問:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, 
        ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();

        return Task.FromResult(new HelloReply
        {
            Message = "Using https: " + httpContext.Request.IsHttps
        });
    }
}

請求體數據速率限制

預設情況下,Kestrel伺服器設置為最小請求主體數據速率。對於客戶端流式和雙工流式的請求,此速率可能不滿足,並且連接可能超時。當GRPC服務包括客戶端流和雙工流調用時,必須禁用最小請求正文數據速率限制:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
        webBuilder.ConfigureKestrel((context, options) =>
        {
            options.Limits.MinRequestBodyDataRate = null;
        });
    });
}

參考文章

總結

今天分享的內容有點多,目的就是使記錄儘可能的詳細,儘可能用通俗易懂的語言來進行描述,讓大家能用起來。在asp.net core3.0中把grpc服務作為第一等公民進行支持,所以我們有必要進行下瞭解。可能很多朋友會有疑問了,我Web API用的爽歪歪,幹嘛還要用gRPC這種遠程過程調用協議啊。關於這個問題,我準備再單獨開一篇文章進行講解,最後感謝大家的閱讀,碼字不易,多多推薦支持吧!


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

-Advertisement-
Play Games
更多相關文章
  • python assert 句語格式及用法很簡單。通常程式在運行完之後拋出異常,使用assert可以在出現有異常的代碼處直接終止運行。 而不用等到程式執行完畢之後拋出異常。 python assert的作用 python assert如果發生異常就說明表達示為假。可以理解表示式返回 值為假 時就會觸 ...
  • 在上一篇博客 "《程式員如何從0到1搭建自己的技術博客》" 中,我們瞭解瞭如何快速的從0到1搭建一個個人博客。 其實細心的你會發現,該博客用到了一個評論插件,這個插件就是Gitalk。 如果想要在博客中正確的使用該插件,還是需要修改下_config.yml里關於Gitalk的配置的。 也許你會好奇G ...
  • # ******************************練習****************************# 在控制臺中獲取兩個整數,作為迴圈開始和結束的點'''a = int(input('請輸入起點:'))b = int(input('請輸入終點:'))while a <= b ...
  • 1. zuul進階學習(二) 1.1. zuul對接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生產管理實踐 1.2.1. zuul網關參考部署 1.2.2. 分集群過濾管理 1.2.3. 網關生產級部署實踐 1.2.4. Hystrix實時 ...
  • 本文用第三方類庫:yagmail 實現;以QQ郵箱作為發送郵箱為例。最終的實現效果:給指定郵箱,發送指定內容的郵件。 準備工作 1、用於發送郵件的賬號信息 比如賬號用自己的qq郵箱,但'密碼'需要在郵箱:設置--賬戶--開啟POP3/SMTP服務,開啟後會獲得授權碼(把它理解為'密碼'就行~)。 2 ...
  • 本篇博文主要記錄Python的Debug方法:print()、logging、ipdb ...
  • 資料庫連接字元串(web.config來配置),可以動態更改connectionString支持多資料庫. SqlServer調用資料庫 using System; using System.Collections.Generic; using System.Linq; using System.T ...
  • 隨著.NET Core 在 Linux 下的熱動,相信動不動就要分散式或集群的應用的需求,會慢慢火起來。所以這段時間一直在研究和思考分散式集群的問題,同時也在思考把幾個框架的思維相對提升到這個Level。最近大力重構了框架兩個點:一個是分散式緩存,一個是資料庫主從備。 今天,先分享分散式緩存的改進的... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...