<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET Core 下使用 gRPC

          共 3894字,需瀏覽 8分鐘

           ·

          2020-09-13 22:29

          09009e766cb9f9508ee8f2bd199f193d.webp

          gRPC 是一種與語言無關(guān)的高性能遠(yuǎn)程過程調(diào)用 (RPC) 框架。

          • https://grpc.io/docs/guides/
          • https://github.com/grpc/grpc-dotnet
          • https://docs.microsoft.com/zh-cn/aspnet/core/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ù)。

          gRPC 現(xiàn)在可以非常簡單的在 .NET Core 和 ASP.NET Core 中使用,并且已經(jīng)開源,它目前由微軟官方 ASP.NET 項(xiàng)目的人員進(jìn)行維護(hù),良好的接入 .NET Core 生態(tài)。

          接下來演示如何使用 gRPC,要想使用 gRPC 需要 .NET Core 3.1或者以上的SDK支持。gRPC分服務(wù)端和客戶端,所以新建兩個項(xiàng)目,一個控制臺當(dāng)作客戶端gRPC_ClientDemo,一個ASP.NET Core 項(xiàng)目當(dāng)作服務(wù)端gRPC_ServerDemo

          先將服務(wù)端搞定,添加Grpc.AspNetCore組件

          Install-Package Grpc.AspNetCore

          然后Startup.cs中添加services.AddGrpc()

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

          因?yàn)?gRPC 是基于 HTTP/2 來通信的,所以需要在配置文件中添加Kestrel 啟用 HTTP/2 的配置。

          {
          ??"Kestrel":?{
          ????"EndpointDefaults":?{
          ??????"Protocols":?"Http2"
          ????}
          ??}
          }

          gRPC 與傳統(tǒng)的api是不同的,需要我們自己定義proto文件,gRPC 使用協(xié)定優(yōu)先方法進(jìn)行 API 開發(fā)。默認(rèn)情況下,協(xié)議緩沖區(qū) (protobuf) 用作接口設(shè)計(jì)語言 (IDL)。*.proto 文件包含:

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

          有關(guān) protobuf 文件的語法的詳細(xì)信息,可以查看官方文檔 (protobuf)。

          proto文件在實(shí)際開發(fā)中肯定會有多個存在,這里有一個技巧就是將proto文件放在一個文件夾內(nèi),然后利用ProtobufLink關(guān)聯(lián)即可,這樣就只用維護(hù)一份proto文件即可。

          同時微軟還幫我們提供了dotnet-grpc,.NET Core 全局工具,請運(yùn)行以下命令:

          dotnet?tool?install?-g?dotnet-grpc

          dotnet-grpc?可以用于將?Protobuf?引用作為??項(xiàng)添加到 .csproj 文件:

          <Protobuf?Include="Protos\greet.proto"?GrpcServices="Server"?/>

          具體用法可以查看文檔:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc

          在解決訪問文件夾根目錄添加 Proto 文件夾,新建一個hello.protoproto文件,將其分別連接到兩個項(xiàng)目中。

          c149771b9bb4f89dc18e7c8509a2fcf7.webp

          現(xiàn)在來開始編寫hello.proto,添加一個SayHello方法。

          syntax?=?"proto3";

          package?hello;?//定義包名

          //?定義服務(wù)
          service?HelloService?{
          ????//?定義一個?SayHello?方法
          ????rpc?SayHello?(HelloRequest)?returns?(HelloReply);
          }

          message?HelloRequest?{
          ????string?name?=?1;
          }

          message?HelloReply?{
          ????string?message?=?1;
          }

          然后來實(shí)現(xiàn)這個服務(wù),在服務(wù)端添加一個GreeterService.cs

          using?Grpc.Core;
          using?Hello;
          using?Microsoft.Extensions.Logging;
          using?System.Threading.Tasks;

          namespace?gRPC_ServerDemo.Services
          {
          ????public?class?GreeterService?:?HelloService.HelloServiceBase
          ????{
          ????????private?readonly?ILogger?_logger;

          ????????public?GreeterService(ILoggerFactory?loggerFactory)
          ????????{
          ????????????_logger?=?loggerFactory.CreateLogger();
          ????????}

          ????????public?override?Task?SayHello(HelloRequest?request,?ServerCallContext?context)
          ????????{
          ????????????_logger.LogInformation($"Sending?hello?to?{request.Name}");

          ????????????return?Task.FromResult(new?HelloReply?{?Message?=?"Hello?"?+?request.Name?});
          ????????}
          ????}
          }

          HelloService.HelloServiceBaseproto文件為我們自動生成的類。

          3c656cc873d3491e687943b215ed8126.webp

          調(diào)用重載方法SayHello(),記錄了一條日志然后返回客戶端傳進(jìn)來的字段name。

          在配置文件中將GreeterService服務(wù)添加到路由管道中

          app.UseEndpoints(endpoints?=>
          {
          ????endpoints.MapGet("/",?async?context?=>
          ????{
          ????????await?context.Response.WriteAsync("Hello?World!");
          ????});

          ????endpoints.MapGrpcService();
          });

          支持我們服務(wù)端完成,啟動服務(wù)端拿到啟動地址,https://localhost:5001。

          現(xiàn)在去客戶端配置地址調(diào)用我們寫的服務(wù),在開始之前需要在客戶端解決方案先引用下面幾個nuget包。

          Install-Package Grpc.Net.Client
          Install-Package Google.Protobuf
          Install-Package Grpc.Tools
          using?Grpc.Net.Client;
          using?Hello;
          using?System;
          using?System.Threading.Tasks;

          namespace?gRPC_ClientDemo
          {
          ????class?Program
          ????{
          ????????static?async?Task?Main(string[]?args)
          ????????{
          ????????????using?var?channel?=?GrpcChannel.ForAddress("https://localhost:5001");

          ????????????var?client?=?new?HelloService.HelloServiceClient(channel);

          ????????????await?UnaryCallExample(client);
          ????????}

          ????????private?static?async?Task?UnaryCallExample(HelloService.HelloServiceClient?client)
          ????????{
          ????????????var?reply?=?await?client.SayHelloAsync(new?HelloRequest?{?Name?=?"阿星Plus"?});

          ????????????Console.WriteLine("Greeting:?"?+?reply.Message);
          ????????}
          ????}
          }

          啟動服務(wù)端和客戶端看看效果,成功發(fā)送消息和獲取消息。

          89c649669e6c5254323d0a2bb83ed241.webp


          往期精彩回顧



          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實(shí)現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了

          給我好看

          您看此文用

          ?40081042edcd8ad338ea813b8276616e.webp?8d815adf4c02c8da78b42b5e6d1fadac.webp·c02e4cbc2aceef91c702e90926217cb1.webp?7aa396226042a8a5388acc0b91f6ef3b.webp

          秒,轉(zhuǎn)發(fā)只需1秒呦~

          f5312347fb7e094532dcdc636d21af0a.webp

          好看你就

          點(diǎn)點(diǎn)

          e64a89439d23bb6d7d2458401ab382a1.webp


          瀏覽 59
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品熟妇一区二区三区四区 | 色射爱| 三级在线播放视频 | 大鸡巴视频在线免费观看 | 亚洲无码做爱视频 |