gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于

  • 效率至关重要的轻量级微服务。
  • 需要多种语言用于开发的 Polyglot 系统。
  • 需要处理流式处理请求或响应的点对点实时服务。

gRPC 现在可以非常简单的在 .NET Core 和 ASP.NET Core 中使用,并且已经开源,它目前由微软官方 ASP.NET 项目的人员进行维护,良好的接入 .NET Core 生态。

接下来演示如何使用 gRPC,要想使用 gRPC 需要 .NET Core 3.1或者以上的SDK支持。gRPC分服务端和客户端,所以新建两个项目,一个控制台当作客户端gRPC_ClientDemo,一个ASP.NET Core 项目当作服务端gRPC_ServerDemo。

先将服务端搞定,添加Grpc.AspNetCore组件

  1. Install-Package Grpc.AspNetCore

然后Startup.cs中添加services.AddGrpc()。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddGrpc();
  4. }

因为 gRPC 是基于 HTTP/2 来通信的,所以需要在配置文件中添加Kestrel 启用 HTTP/2 的配置

  1. {
  2. "Kestrel": {
  3. "EndpointDefaults": {
  4. "Protocols": "Http2"
  5. }
  6. }
  7. }

gRPC 与传统的api是不同的,需要我们自己定义proto文件,gRPC 使用协定优先方法进行 API 开发。 默认情况下,协议缓冲区 (protobuf) 用作接口设计语言 (IDL)。 *.proto 文件包含:

gRPC 服务的定义。
在客户端与服务器之间发送的消息。
有关 protobuf 文件的语法的详细信息,可以查看官方文档 (protobuf)。

proto文件在实际开发中肯定会有多个存在,这里有一个技巧就是将proto文件放在一个文件夹内,然后利用Protobuf的Link关联即可,这样就只用维护一份proto文件即可。

同时微软还帮我们提供了dotnet-grpc,.NET Core 全局工具,请运行以下命令:

  1. dotnet tool install -g dotnet-grpc

dotnet-grpc 可以用于将 Protobuf 引用作为 <Protobuf /> 项添加到 .csproj 文件:

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

具体用法可以查看文档:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc

在解决访问文件夹根目录添加 Proto 文件夹,新建一个hello.protoproto文件,将其分别连接到两个项目中。

现在来开始编写hello.proto,添加一个SayHello方法。

  1. syntax = "proto3";
  2.  
  3. package hello; //定义包名
  4.  
  5. // 定义服务
  6. service HelloService {
  7. // 定义一个 SayHello 方法
  8. rpc SayHello (HelloRequest) returns (HelloReply);
  9. }
  10.  
  11. message HelloRequest {
  12. string name = 1;
  13. }
  14.  
  15. message HelloReply {
  16. string message = 1;
  17. }

然后来实现这个服务,在服务端添加一个GreeterService.cs。

  1. using Grpc.Core;
  2. using Hello;
  3. using Microsoft.Extensions.Logging;
  4. using System.Threading.Tasks;
  5.  
  6. namespace gRPC_ServerDemo.Services
  7. {
  8. public class GreeterService : HelloService.HelloServiceBase
  9. {
  10. private readonly ILogger _logger;
  11.  
  12. public GreeterService(ILoggerFactory loggerFactory)
  13. {
  14. _logger = loggerFactory.CreateLogger<GreeterService>();
  15. }
  16.  
  17. public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
  18. {
  19. _logger.LogInformation($"Sending hello to {request.Name}");
  20.  
  21. return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
  22. }
  23. }
  24. }

HelloService.HelloServiceBase是proto文件为我们自动生成的类。

调用重载方法SayHello(),记录了一条日志然后返回客户端传进来的字段name。

在配置文件中将GreeterService服务添加到路由管道中

  1. app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapGet("/", async context =>
  4. {
  5. await context.Response.WriteAsync("Hello World!");
  6. });
  7.  
  8. endpoints.MapGrpcService<GreeterService>();
  9. });

支持我们服务端完成,启动服务端拿到启动地址,https://localhost:5001

现在去客户端配置地址调用我们写的服务,在开始之前需要在客户端解决方案先引用下面几个nuget包。

  1. Install-Package Grpc.Net.Client
  2. Install-Package Google.Protobuf
  3. Install-Package Grpc.Tools
  4. using Grpc.Net.Client;
  5. using Hello;
  6. using System;
  7. using System.Threading.Tasks;
  8.  
  9. namespace gRPC_ClientDemo
  10. {
  11. class Program
  12. {
  13. static async Task Main(string[] args)
  14. {
  15. using var channel = GrpcChannel.ForAddress("https://localhost:5001");
  16.  
  17. var client = new HelloService.HelloServiceClient(channel);
  18.  
  19. await UnaryCallExample(client);
  20. }
  21.  
  22. private static async Task UnaryCallExample(HelloService.HelloServiceClient client)
  23. {
  24. var reply = await client.SayHelloAsync(new HelloRequest { Name = "阿星Plus" });
  25.  
  26. Console.WriteLine("Greeting: " + reply.Message);
  27. }
  28. }
  29. }

启动服务端和客户端看看效果,成功发送消息和获取消息。

NET 5使用gRPC的更多相关文章

  1. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  2. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

  3. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  4. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  5. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  6. gRPC C#学习

    前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...

  7. .net core 用grpc实现微服务

    GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...

  8. rpc框架之gRPC 学习 - hello world

    grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...

  9. Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》

    Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...

  10. gRPC+etcd的优势分析

    相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...

随机推荐

  1. laravel 返回SQL

    默认情况下,toSql 获取到的 sql 里面的参数使用 "?" 代替的,如下: 1 DB::table('user')->where('id', 1)->toSql( ...

  2. C#6,C#7,V#8,C#9 的新特性总结

    看了一下,下图的所有我都有用过,感觉越高的版本越好用. C# 6.0 特性 C# 7.0  Vs2017 C# 8.0     .net core 3.0+ C#9.0 .net5 C#的各种语法糖, ...

  3. Mybatis【2.1】-- 从读取流到创建SqlSession发生了什么?

    目录 1.Resources.getResourceAsStream("mybatis.xml")到底做了什么? 2. new SqlSessionFactoryBuilder() ...

  4. ERP制造模块操作与设计--开源软件诞生30

    赤龙ERP制造模块讲解--第30篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...

  5. 一:robot framework环境安装

    1.安装robot framework: 打开cmd进入dos下,输入 pip install robotframework Microsoft Windows [版本 10.0.18362.267] ...

  6. 关于String的matches方法

    弊端: 虽然String.matches方法最易于看一个字符串是否与正则表达式相匹配.但并不适合在注重性能的情形中重复使用. 问题在于,它内部为正则表达式创建了一个Pattern实例,却只用一次,之后 ...

  7. 使用Git,10件你可能需要“反悔”的事

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  8. 《高并发下的.NET》第2季 - 故障公告:高并发下全线崩溃

    大家好,非常抱歉,在昨天下午(12月3日)的访问高峰,园子迎来更高的并发,在这样的高并发下,突发的数据库连接故障造成博客站点全线崩溃,由此给您带来很大的麻烦,请您谅解. 最近,我们一边在忙于AWS合作 ...

  9. C#Excel导出注意事项

    Excel 导出 1.首先在服务器中安装office ,并且要注册2.在组件服务中 设置Microsoft.excel.appliction 属性中设置自定义加network service用户并交互 ...

  10. Python中判断字符串是否为数字的三个方法isdecimal 、isdigit、isnumeric的差别

    isdecimal .isdigit.isnumeric这三个字符串方法都用于判断字符串是否为数字,为什么用三个方法呢?他们的差别是什么内? isdecimal:是否为十进制数字符,包括Unicode ...