Dapr + .NET Core實戰(十二)服務調用之GRPC


4小時Dapr+.NET 5+K8S 的實戰  https://ke.qq.com/course/4000292?tuin=1271860f

Dapr進階虛擬機集群實戰(非K8S) https://ke.qq.com/course/4002149?tuin=1271860f

                   

什么是GRPC

gRPC 是一種與語言無關的高性能遠程過程調用 (RPC) 框架。

gRPC 的主要優點是:

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

這些優點使 gRPC 適用於:

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

Dapr中的GRPC

Dapr中的GRPC與我們通常情況下使用GRPC大致是一致的,唯一的不同是Dapr中的GRPC會固定調用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke,因此我們在Dapr中使用GRPC時,proto文件中不需要再定義service節點中的rpc接口,只需要定義交互使用的序列化結構體即可。

項目實戰

我們繼續使用FrontEnd+BackEnd項目,首先需要將BackEnd中的監聽協議切換成https,因為GRPC是基於HTTP2實現的,傳輸層使用TLS。

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>().UseUrls("https://*:5000");
                });

BackEnd

1.為BackEnd引入Nuget包

  • Dapr.AspNetCore
  • Grpc.AspNetCore

2.在BackEnd中新建Protos/greet.proto文件,定義交互的結構體

syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

注意:不需要定義service.rpc接口,因為Dapr中的GRPC固定調用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke。

3.修改項目文件BackEnd.csproj

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

4.新增接口類Services/HelloService

    public class HelloService : AppCallback.AppCallbackBase
    {
        public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context)
        {
            var response = new InvokeResponse();
            switch (request.Method)
            {
                case "sayhi":
                    var input = request.Data.Unpack<HelloRequest>();
                    response.Data = Any.Pack(new HelloReply { Message = "ok" });
                    break;
            }
            return response;
        }
    }

HelloService中我們只需要定義OnInvoke方法,通過request.Method來實現不同業務的代碼編寫。

5.為grpc注入類

 services.AddGrpc();

6.為grpc新增終結點映射

endpoints.MapGrpcService<HelloService>();

FrontEnd

1.為FrontEnd引入Nuget包

  • Google.Protobuf
  • Grpc.Net.Client
  • Grpc.Tools

2.新增Protos/greet.proto文件

syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

3.修改FrontEnd.csproj文件

<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices=“Client" />
</ItemGroup>

4.在DaprController中新增接口

     [HttpGet("grpc")]
        public async Task<ActionResult> GrpcAsync()
        {
            using var daprClient = new DaprClientBuilder().Build();
            var result = await daprClient.InvokeMethodGrpcAsync<HelloRequest, HelloReply>("backend", "sayhi", new HelloRequest { Name = "aaa" });
            return Ok(result);
        }

測試

1.運行BackEnd

dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend  --app-protocol grpc  dotnet  .\BackEnd\bin\Debug\net5.0\BackEnd.dll --app-ssl

我們通過--app-protocol grpc指明了使用grpc,通過--app-ssl指明了開啟tls

2.運行FrontEnd

dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll

3.調用FrontEnd的dapr/grpc接口進行測試,調用成功!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM