Dapr + .NET 实战(十二)服务调用之GRPC
歡迎大家參加4小時Dapr+.NET 5的實戰課程
課程鏈接? ? ?https://ke.qq.com/course/4000292?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.dll3.調用FrontEnd的dapr/grpc接口進行測試,調用成功!!
相關文章:
Dapr實戰(一) 基礎概念與環境搭建
Dapr + .NET Core實戰(二) 服務調用
Dapr + .NET Core實戰(三)狀態管理
Dapr + .NET 實戰(四)發布和訂閱
Dapr + .NET 實戰(五)Actor
Dapr + .NET 實戰(六)綁定
Dapr + .NET 實戰(七)Secrets
Dapr + .NET 實戰(八)服務監測
Dapr + .NET 實戰(九)本地調試
Dapr + .NET 實戰(十-終篇)K8S運行Dapr
Dapr + .NET實戰(十一)單機Dapr集群負載均衡
為什么 Dapr 如此令人興奮
總結
以上是生活随笔為你收集整理的Dapr + .NET 实战(十二)服务调用之GRPC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core Filter与
- 下一篇: 公开征集 | 每个人都可以成为 COSC