<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        圖析ASP.NET Core引入gRPC服務模板

        來源:懂視網 責編:小采 時間:2020-11-27 22:34:38
        文檔

        圖析ASP.NET Core引入gRPC服務模板

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

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

        gRPC的簡單介紹

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

        gRPC 的主要優點是:

      1. 現代高性能輕量級 RPC 框架。
      2. 協定優先 API 開發,默認使用協議緩沖區,允許與語言無關的實現。
      3. 可用于多種語言的工具,以生成強類型服務器和客戶端。
      4. 支持客戶端、服務器和雙向流式處理調用。
      5. 使用 Protobuf 二進制序列化減少對網絡的使用。
      6. 這些優點使 gRPC 適用于:

      7. 效率至關重要的輕量級微服務。
      8. 需要多種語言用于開發的 Polyglot 系統。
      9. 需要處理流式處理請求或響應的點對點實時服務。
      10. ASP.NET Core 3.0上gRPC服務模板初體驗

        創建gRPC服務

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

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

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

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

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

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

        測試gRPC服務

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

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

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

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

        gRPC模板解析

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

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

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

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

        proto文件

        proto

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

      17. GRPC服務的定義。
      18. 在客戶端和服務器之間發送的消息。
      19. 有關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;
        }
      20. 定義Greeter服務。
      21. 這個Greeter服務定義SayHello請求。
      22. SayHello發送HelloRequest消息并接收HelloResponse信息:
      23. 那么你可能要問了,這個.proto文件是如何包含在項目中的呢,其實,如果你打開.csproject文件就會看到,通過將該文件添加到<Protobuf>的ItemGroup中即可,如下所示:
      24. <ItemGroup>
         <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
         <Content Include="@(Protobuf)" LinkBase="" />
        </ItemGroup>

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

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

      25. 每次構建項目時都會根據需要進行生成。
      26. 生成的文件不會被添加到項目或簽入源代碼管理。
      27. 生成的C#文件是包含在OBJ目錄。
      28. 服務器和客戶端項目都需要此包。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加入了路由

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

      29. Grpc.AspNetCore.Server
      30. Google.Protobuf對于Protobuf消息API。
      31. Grpc.Tools
      32. 這里需要說明的是

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

        參考文章

        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

        總結

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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        圖析ASP.NET Core引入gRPC服務模板

        圖析ASP.NET Core引入gRPC服務模板:早就聽說ASP.NET Core 3.0中引入了gRPC的服務模板,正好趁著家里電腦剛做了新系統,然后裝了VS2019的功夫來體驗一把。同時記錄體驗的過程。如果你也想按照本文的步驟體驗的話,那你得先安裝.NET Core3.0預覽版的SDK。至于開發工具我用的時VS2019,當然
        推薦度:
        標簽: core 引入 ASP.NET
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产亚洲精品国看不卡| 日本免费高清一本视频| 国产成人亚洲精品青草天美| 一级免费黄色毛片| 在线精品亚洲一区二区小说| 你懂的在线免费观看| 国产亚洲人成无码网在线观看| 久久九九久精品国产免费直播| 亚洲日韩中文在线精品第一| 无码AV动漫精品一区二区免费| 亚洲综合日韩久久成人AV| 精品免费视在线观看| 老色鬼久久亚洲AV综合| 国产成人A在线观看视频免费| 欧美亚洲国产SUV| 国产福利电影一区二区三区,亚洲国模精品一区 | rh男男车车的车车免费网站| 自拍偷自拍亚洲精品第1页| 嫩草在线视频www免费看| 亚洲精品第五页中文字幕| 男人的好免费观看在线视频| 朝桐光亚洲专区在线中文字幕| 亚洲人成人网站在线观看| 日本在线看片免费| 97久久国产亚洲精品超碰热| 国产在线观看www鲁啊鲁免费| 一级黄色片免费观看| 久久噜噜噜久久亚洲va久| 国产人在线成免费视频| 黄色网页免费观看| 亚洲天堂男人天堂| 狼友av永久网站免费观看| 久青草视频在线观看免费| 亚洲人成网站在线观看播放青青| 午夜dj在线观看免费视频| 国产特黄一级一片免费| 亚洲午夜电影在线观看高清| 亚洲精品无码久久毛片| 13一14周岁毛片免费| xxxxxx日本处大片免费看| 亚洲依依成人精品|