日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

發(fā)布時間:2023/12/4 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 3.0 上的gRPC服务模板初体验(多图) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

gRPC的簡單介紹

gRPC?是一種與語言無關(guān)的高性能遠(yuǎn)程過程調(diào)用 (RPC) 框架。 有關(guān) gRPC 基礎(chǔ)知識的詳細(xì)信息,請參閱?gRPC 文檔頁。

gRPC 的主要優(yōu)點(diǎn)是:

  • 現(xiàn)代高性能輕量級 RPC 框架。

  • 協(xié)定優(yōu)先 API 開發(fā),默認(rèn)使用協(xié)議緩沖區(qū),允許與語言無關(guān)的實(shí)現(xiàn)。

  • 可用于多種語言的工具,以生成強(qiáng)類型服務(wù)器和客戶端。

  • 支持客戶端、服務(wù)器和雙向流式處理調(diào)用。

  • 使用 Protobuf 二進(jìn)制序列化減少對網(wǎng)絡(luò)的使用。

這些優(yōu)點(diǎn)使 gRPC 適用于:

  • 效率至關(guān)重要的輕量級微服務(wù)。

  • 需要多種語言用于開發(fā)的 Polyglot 系統(tǒng)。

  • 需要處理流式處理請求或響應(yīng)的點(diǎn)對點(diǎn)實(shí)時服務(wù)。

ASP.NET Core 3.0上gRPC服務(wù)模板初體驗(yàn)

創(chuàng)建gRPC服務(wù)

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

  • 如下圖所示,選擇創(chuàng)建《ASP.NET Core Web 應(yīng)用程序》,然后點(diǎn)擊下一步

  • 在此頁面按照下圖所示,輸入項(xiàng)目名稱,位置,解決方案名稱,然后點(diǎn)擊右下角的“創(chuàng)建”按鈕進(jìn)行創(chuàng)建。

  • 你以為上述步驟中點(diǎn)擊“創(chuàng)建”就結(jié)束了嘛?說好的要創(chuàng)建gRPC服務(wù)模板的,所以,點(diǎn)擊上面的創(chuàng)建后會彈出如下圖所示,讓你選擇服務(wù)模板的窗口,這里按照下圖所示選擇gRPC服務(wù)模板,然后再次點(diǎn)擊右下角的創(chuàng)建,才是真正的創(chuàng)建項(xiàng)目。

  • 創(chuàng)建成功后,會出現(xiàn)如下圖所示的項(xiàng)目結(jié)構(gòu)

  • 至此,我們就創(chuàng)建好了一個gRPC服務(wù)的模板,接下來我們先測試一番,然后再好好的看下這個模板的結(jié)構(gòu)吧

  • 測試gRPC服務(wù)

  • 首先打開HelloGrpc.Server?這個服務(wù)端的工作目錄,然后Shift+鼠標(biāo)右鍵彈出如下圖所示的右鍵菜單,如圖所示打開ps窗口

  • 輸入dotnet run?命令運(yùn)行此gRPC服務(wù)端項(xiàng)目,如下圖所示,說明服務(wù)端啟動正常,并開始監(jiān)聽對應(yīng)的端口。

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

  • 至此,gRPC服務(wù)模板創(chuàng)建的服務(wù)端以及客戶端測試成功。下面我們就好好的探究一下這個服務(wù)模板吧。

  • gRPC模板解析

    在HelloGrpc.Server?服務(wù)的端項(xiàng)目中有如下幾個文件

    • greet.proto:greet.proto?文件定義?Greeter?gRPC,且用于生成 gRPC 服務(wù)器資產(chǎn)。

    • Services 文件夾:包含?Greeter?服務(wù)的實(shí)現(xiàn)。

    • appSettings.json:包含配置數(shù)據(jù),如 Kestrel 使用的協(xié)議。(熟悉ASP.NET Core的你一定很熟悉)

    • Program.cs:包含 gRPC 服務(wù)的入口點(diǎn)。(熟悉ASP.NET Core的你一定很熟悉)

    • Startup.cs:IWebHostBuilder的啟動配置文件,包含配置應(yīng)用行為的代碼。(熟悉ASP.NET Core的你一定很熟悉)

    gRPC 客戶端?HelloGrpc.Client?文件:

    Program.cs 包含 gRPC 客戶端的入口點(diǎn)和邏輯。

    下面我們再打開每個文件看看里面究竟是什么東東吧。

    proto文件

    proto

    GRPC使用約定優(yōu)先的API開發(fā)方法。默認(rèn)情況下,使用協(xié)議緩沖區(qū)(Protobuf)作為接口設(shè)計(jì)語言(IDL)。這個.proto文件包含:

    • GRPC服務(wù)的定義。

    • 在客戶端和服務(wù)器之間發(fā)送的消息。

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

    如我們模板中創(chuàng)建的greet.proto?文件內(nèi)容如下:

    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服務(wù)。

    • 這個Greeter服務(wù)定義SayHello請求。

    • SayHello發(fā)送HelloRequest消息并接收HelloResponse信息:
      那么你可能要問了,這個.proto文件是如何包含在項(xiàng)目中的呢,其實(shí),如果你打開.csproject文件就會看到,通過將該文件添加到<Protobuf>的ItemGroup中即可,如下所示:

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

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

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

    • 每次構(gòu)建項(xiàng)目時都會根據(jù)需要進(jìn)行生成。

    • 生成的文件不會被添加到項(xiàng)目或簽入源代碼管理。

    • 生成的C#文件是包含在OBJ目錄。

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

    XML復(fù)制

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

    工具包在運(yùn)行時并不是必需的,因此,應(yīng)該用PrivateAssets="All".

    Services 文件夾中的具體的gRPC服務(wù)

    我們知道Grpc.Tools工具包將根據(jù).proto文件的定義翻譯并生成對應(yīng)的C#類型的文件。

    對于服務(wù)器端資產(chǎn),將生成一個抽象的服務(wù)基類型。基類型包含在.proto文件中包含的所有GRPC調(diào)用的定義。然后,您將創(chuàng)建從此基類型派生的具體服務(wù)實(shí)現(xiàn),并實(shí)現(xiàn)GRPC調(diào)用的邏輯。對于前面描述的greet.proto示例,將生成包含虛擬SayHello方法的抽象GreeterBase類型。具體的實(shí)現(xiàn)GreeterService重寫該方法并實(shí)現(xiàn)處理GRPC調(diào)用的邏輯。
    正如HelloGrpc.Server項(xiàng)目中的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調(diào)用。.proto文件被轉(zhuǎn)換為可以調(diào)用的具體類型上的方法。為greet.proto前面描述的示例,一個具體的GreeterClient類型生成。這個GreeterClient類型包含SayHello方法,可以調(diào)用該方法來啟動對服務(wù)器的GRPC調(diào)用。

    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();
    }
    }

    默認(rèn)情況下,分別生成服務(wù)器和客戶端資產(chǎn)。.proto文件包含在<Protobuf>項(xiàng)目組。若要確保僅在服務(wù)器項(xiàng)目中生成服務(wù)器資產(chǎn),GrpcServices屬性設(shè)置為Server.

    XML復(fù)制

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

    類似地,屬性設(shè)置為Client在僅在客戶項(xiàng)目中生成。

    Startup

    在Startup中我們發(fā)現(xiàn)跟普通的ASP.NET Core程序有所不同,具體的如下圖所示:在ConfigureServices?服務(wù)中引入了gRPC服務(wù),然后在Configure加入了路由

    而這里需要引入三個與gRPC相關(guān)的nuget包

    • Grpc.AspNetCore.Server

    • Google.Protobuf對于Protobuf消息API。

    • Grpc.Tools

    這里需要說明的是

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

    其他需要說明的內(nèi)容

    與ASP.NET Core 接口的集成

    GRPC服務(wù)可以完全訪問ASP.NETCore功能,如依賴注入(Di)和日志功能。例如,服務(wù)實(shí)現(xiàn)可以通過構(gòu)造函數(shù)解析DI容器中的記錄器服務(wù):

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

    默認(rèn)情況下,GRPC服務(wù)可以解析具有任意生存期的其他DI服務(wù)(Singleton, Scoped, or Transient)。

    在GRPC方法中解析HttpContext

    GRPC 應(yīng)用程序接口提供對某些HTTP/2消息數(shù)據(jù)的訪問,例如method, host, header, and trailers。訪問是通過ServerCallContext參數(shù)傳遞給每個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擴(kuò)展方法提供對表示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
    });
    }
    }

    請求體數(shù)據(jù)速率限制

    默認(rèn)情況下,Kestrel服務(wù)器設(shè)置為最小請求主體數(shù)據(jù)速率。對于客戶端流式和雙工流式的請求,此速率可能不滿足,并且連接可能超時。當(dāng)GRPC服務(wù)包括客戶端流和雙工流調(diào)用時,必須禁用最小請求正文數(shù)據(jù)速率限制:

    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;
    });
    });
    }

    參考文章

    • gRPC services with C#

    • Tutorial: Get started with gRPC in ASP.NET Core

    • gRPC services with ASP.NET Core

    • Migrating gRPC services from C-core to ASP.NET Core

    總結(jié)

    今天分享的內(nèi)容有點(diǎn)多,目的就是使記錄盡可能的詳細(xì),盡可能用通俗易懂的語言來進(jìn)行描述,讓大家能用起來。在asp.net core3.0中把grpc服務(wù)作為第一等公民進(jìn)行支持,所以我們有必要進(jìn)行下了解。可能很多朋友會有疑問了,我Web API用的爽歪歪,干嘛還要用gRPC這種遠(yuǎn)程過程調(diào)用協(xié)議啊。關(guān)于這個問題,我準(zhǔn)備再單獨(dú)開一篇文章進(jìn)行講解,最后感謝大家的閱讀,碼字不易,多多推薦支持吧!


    總結(jié)

    以上是生活随笔為你收集整理的ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。