Dapr + .NET 实战服务调用之GRPC
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.dll
3.调用FrontEnd的dapr/grpc接口进行测试,调用成功!!
相关文章:
以上是关于Dapr + .NET 实战服务调用之GRPC的主要内容,如果未能解决你的问题,请参考以下文章