什么是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接口进行测试,调用成功!!

最新文章

  1. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用
  2. java学习第10天
  3. PHP使用Xdebug进行远程调试
  4. 【Mood-5】14条建议,使你的IT职业生涯更上一层楼
  5. yii2单独给input或者其他标签定义class
  6. 谈谈IT人的发展[转载]
  7. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .
  8. 再谈AbstractQueuedSynchronizer:独占模式
  9. Idea工具开发 SpringBoot整合JSP(毕设亲测可用)
  10. ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成
  11. BZOJ_3675_[Apio2014]序列分割_斜率优化
  12. java网页爬数据获取class中的空格
  13. Linux 三剑客 -- awk sed grep
  14. STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。
  15. Creating objects on stack or heap
  16. Scrapy官网程序执行示例
  17. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
  18. laravel 拾遗 中间件
  19. [Bzoj4408]神秘数(主席树)
  20. Manager模块 队列 管道 进程池

热门文章

  1. JDBC中级篇(MYSQL)——在JDBC中如何获得表中的,自增长的字段值
  2. vue@cli3 项目模板怎么使用public目录下的静态文件,找了好久都不对,郁闷!
  3. mysql批量新增的语法
  4. for循环操作(for...in、forEach)
  5. MySQL-LSN
  6. 整理之BroadcaseReceiver
  7. java变量类型和常量类型
  8. zap高性能日志
  9. Mac超好用的软件合集和系统设置
  10. B. 2194: 快速傅立叶之二解题报告