.Net Core3.0使用gRPC

gRPC是什麼

gRPC是能夠在任何環境中運行的現代開源高性能RPC框架。它能夠經過可插拔的支持來有效地鏈接數據中心內和跨數據中心的服務,以實現負載平衡,跟蹤,運行情況檢查和身份驗證。它也適用於分佈式計算的最後一英里,以將設備,移動應用程序和瀏覽器鏈接到後端服務。html

proto文件

用於定義gRPC服務和消息的協定;服務端和客戶端共享proto文件。後端

使用新模板建立gRPC服務端

.NETcore 3.0建立項目提供了一個新的gRPC模板,能夠輕鬆地使用ASP.NET Core構建gRPC服務。咱們按照步驟一步一步建立AA.GrpcService 服務,固然你可使用命令:dotnet new grpc -o GrpcGreeter瀏覽器

 選擇gRPC服務項目模板網絡

最終生成的項目app

greet.proto文件

syntax = "proto3";

option csharp_namespace = "AA.GrpcService";

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

GreeterService.cs

public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

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

Startup.cs

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

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

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGrpcService<GreeterService>();

                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("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");
                });
            });
        }

建立完成以後,自動包含了包的引用、proto文件的建立、services服務的生成,模板項目在後臺執行一些操做如框架

  • 建立一個包含全部gRPC依賴項的ASP.NET Core項目。
  • 建立一個名爲的gRPC服務定義文件greet.proto。
  • 根據服務定義文件自動生成全部gRPC存根。
  • GreeterService.cs根據自動生成的gRPC存根建立gRPC服務。
  • 在Startup.cs中配置gRPC管道映射到GreeterService.cs

運行服務

建立gRPC客戶端

下面,咱們建立一個控制檯應用程序做爲客戶端調用gRPC服務;

引用gRPC服務,步驟:右鍵項目添加=》服務引用彈出如下頁面;

點擊肯定

咱們看項目結構,他們會自動幫咱們處理一下操做:

  • 添加引用包:
  1.  package Grpc.Net.ClientFactory
  2.  package Google.Protobuf
  3.  package Grpc.Tools
  • Protos 文件(包含greet.proto)自動從AA.GrpcService項目拷貝
  • 自動添加節點
  <ItemGroup>
    <Protobuf Include="..\AA.GrpcService\Protos\greet.proto" GrpcServices="Client">
      <Link>Protos\greet.proto</Link>
    </Protobuf>
  </ItemGroup>

最後,添加如下代碼進行gRPC請求;async

 class Program
    {
        static async Task Main(string[] args)
        {
            using var channel = GrpcChannel.ForAddress("https://localhost:5005");
            var client = new Greeter.GreeterClient(channel);
            var response = await client.SayHelloAsync(new HelloRequest { Name = "gRPC" });
            Console.WriteLine("Greeting:" + response.Message);
            Console.WriteLine("Press a key to exit");
            Console.ReadKey();
        }
    }

運行結果圖:分佈式

小結: .NETcore 3.0 使得使用gRPC是很是方便集成到項目中,但願這篇文章使你能夠了解.NETcore與gRPC結合使用。那gRPC適用於如下場景ide

  • 微服務– gRPC專爲低延遲和高吞吐量通訊而設計。 gRPC對於效率相當重要的輕量級微服務很是有用。微服務

  • 點對點實時通訊– gRPC對雙向流具備出色的支持。 gRPC服務能夠實時推送消息而無需輪詢。

  • 多種語言環境– gRPC工具支持全部流行的開發語言,所以gRPC是多語言環境的理想選擇。

  • 網絡受限的環境– gRPC消息使用輕量級消息格式Protobuf進行了序列化。 gRPC消息始終小於等效的JSON消息。

參考:

相關文章
相關標籤/搜索