一.简介

gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用 Protocol Buffers 作为序列化协议。

它的主要优点:

  • 现代高性能轻量级 RPC 框架。

  • 约定优先的 API 开发,默认使用 Protocol Buffers 作为描述语言,允许与语言无关的实现。

  • 可用于多种语言的工具,以生成强类型的服务器和客户端。

  • 支持客户端,服务器双向流调用。

  • 通过Protocol Buffers二进制序列化减少网络使用。

  • 使用 HTTP/2 进行传输

这些优点使gRPC非常适合:

  • 高性能轻量级微服务 - gRPC设计为低延迟和高吞吐量通信,非常适合需要高性能的轻量级微服务。

  • 多语言混合开发 - gRPC工具支持所有流行的开发语言,使gRPC成为多语言开发环境的理想选择。

  • 点对点实时通信 - gRPC对双向流调用提供出色的支持。gRPC服务可以实时推送消息而无需轮询。

  • 网络受限环境 - 使用 Protocol Buffers二进制序列化消息,该序列化始终小于等效的JSON消息,对网络带宽需求比JSON小。

不建议使用gRPC的场景:

  • 浏览器可访问的API - 浏览器不完全支持gRPC。虽然gRPC-Web可以提供浏览器支持,但是它有局限性,引入了服务器代理

  • 广播实时通信 - gRPC支持通过流进行实时通信,但不存在向已注册连接广播消息的概念

  • 进程间通信 - 进程必须承载HTTP/2才能接受传入的gRPC调用,对于Windows,进程间通信管道是一种更快速的方法。

摘自微软官方文档

支持的语言如下:

二.gRPC on .NET Core

gRPC 现在可以非常简单的在 .NET Core 和 ASP.NET Core 中使用,在 .NET Core 上的实现的开源地址:https://github.com/grpc/grpc-dotnet ,它目前由微软官方 ASP.NET 项目的人员进行维护,良好的接入 .NET Core 生态。

.NET Core 的 gRPC 功能如下:

  • Grpc.AspNetCore 一个用于在ASP.NET Core承载gRPC服务的框架,将 gRPC和ASP.NET Core 功能集成在一起,如:日志、依赖注入、身份认证和授权。

  • Grpc.Net.Client 基于HttpClient (HttpClient现已支持HTTP/2)的 gRPC客户端

  • Grpc.Net.ClientFactory 与gRPC客户端集成的HttpClientFactory,允许对gRPC客户端进行集中配置,并使用DI注入到应用程序中

三.使用 ASP.NET Core 创建 gRPC 服务

  1. 通过 Visual Studio 2019 (16.3.0)提供的模板,可以快速创建 gRPC 服务。

扒拉一下默认源码包含了什么东东。

① 配置文件 appsettings.json ,多了Kestrel 启用 HTTP/2 的配置,因为 gRPC 是基于 HTTP/2 来通信的

② PB协议文件 greet.proto 用于自动生成服务、客户端和消息(表示传递的数据)的C# Class

③ 服务类 GreeterService ,服务类集成的 Greeter.GreeterBase 来自于根据proto文件自动生成的,生成的类在 obj\Debug\netcoreapp3.0目录下

自动生成的类:

④ Startup.cs类,将 gRPC服务添加到了终结点路由中

⑤ csproj 项目文件,包含了 proto 文件引用

2.运行

第一次运行会提示是否信任证书,点击“是”

这是因为HTTP/2需要HTTPS,尽管HTTP/2协议没有明确规定需要HTTPS,但是为了安全在浏览器实现上都要求了HTTPS,所以现在的HTTP/2和HTTPS基本都是一对。

四. 创建 gRPC 客户端

1.添加一个.NET Core 控制台应用程序

2.通过nuget添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools

3.将服务的 proto 文件复制到客户端

4.编辑客户端项目文件,添加关于proto文件的描述

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

注意 GrpcServices="Client" 这里是Client和服务是不一样的

5.生成客户端项目可以通过proto文件生成类

6.添加客户端调用代码

static async Task Main(string[] args)
{var channel = GrpcChannel.ForAddress("https://localhost:5001");var client = new Greeter.GreeterClient(channel);var reply = await client.SayHelloAsync(new HelloRequest { Name = "晓晨" });Console.WriteLine("Greeter 服务返回数据: " + reply.Message);Console.ReadKey();
}

7.先启动服务,然后运行客户端

这里可以看到,客户端成功调用了服务,收到了返回的消息。

五.自己动手写一个服务

前面我们使用的 Greeter 服务是由模板自动给我们创建的,现在我们来自己动手写一个服务。

编写一个“撸猫服务”

1.定义 proto 文件 LuCat.proto,并在csproj项目文件中添加描述

syntax = "proto3";option csharp_namespace = "AspNetCoregRpcService";import "google/protobuf/empty.proto";
package LuCat;service LuCat{rpc SuckingCat(google.protobuf.Empty) returns(SuckingCatResult);
}message SuckingCatResult{string message=1;
}

2.实现服务 LuCatService.cs

public class LuCatService:LuCat.LuCatBase
{private static readonly List<string> Cats=new List<string>(){"英短银渐层","英短金渐层","美短","蓝猫","狸花猫","橘猫"};private static readonly Random Rand=new Random(DateTime.Now.Millisecond);public override Task<SuckingCatResult> SuckingCat(Empty request, ServerCallContext context){return Task.FromResult(new SuckingCatResult(){Message = $"您吸了一只{Cats[Rand.Next(0, Cats.Count)]}"});}
}

3.在 Startup终结点路由中注册

endpoints.MapGrpcService<LuCatService>();

4.添加客户端调用

var catClient = new LuCat.LuCatClient(channel);
var catReply = await catClient.SuckingCatAsync(new Empty());
Console.WriteLine("调用撸猫服务:"+ catReply.Message);

5.运行测试

六.实际使用中的技巧

技巧1

上面章节的操作步骤中,我们需要在服务和客户端之间复制proto,这是一个可以省略掉的步骤。

1.复制 Protos 文件夹到解决方案根目录(sln文件所在目录)

2.删除客户端和服务项目中的 Protos 文件夹

3.在客户端项目文件csproj中添加关于proto文件的描述

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

4.在服务项目文件csproj中添加关于proto文件的描述

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

在实际项目中,请自己计算相对路径

5.这样两个项目都是使用的一个proto文件,只用维护这一个文件即可

技巧2

我们在实际项目中使用,肯定有多个 proto 文件,难道我们每添加一个 proto 文件都要去更新 csproj文件?

我们可以使用MSBuild变量来帮我们完成,我们将 csproj 项目文件中引入proto文件信息进行修改。

服务端:

  <ItemGroup><Protobuf Include="..\..\Protos\*.proto" GrpcServices="Server" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /></ItemGroup>

客户端:

  <ItemGroup><Protobuf Include="..\..\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /></ItemGroup>

示例:

七.总结

gRPC 现目前是一款非常成熟的高性能RPC框架,当前的生态是非常好的,很多公司的产品或者开源项目都有在使用gRPC,有了它,相信可以让我们更容易的构建.NET Core 微服务,可以让 .NET Core 更好的接入 gRPC 生态。不得不说这是 .NET Core 3.0 带来的最令人振奋的特性之一。

参考资料:

  • proto3 说明文档

  • 在ASP.NET Core中创建gRPC客户端和服务

  • Demo 地址

原文链接:https://www.cnblogs.com/stulzq/p/11581967.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

ASP.NET Core 3.0 使用gRPC相关推荐

  1. ASP.NET Core 3.0 gRPC 身份认证和授权

    一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...

  2. ASP.NET Core 3.0 gRPC 双向流

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 < 二. 什么 ...

  3. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

  4. asp.net core 3.0 gRPC框架小试

    什么是gRPC gRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,采用ProtoBuf 定义的IDL. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优 ...

  5. diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻

    (给DotNet加星标,提升.Net技能) 转自:LineZerocnblogs.com/linezero/p/netcore3 前几天微软发布了< .NET Core 3.0 Preview ...

  6. ASP.NET Core 5.0新增功能摘要

    .NET5.0发布了大半个月,从.NET Core3.1的平滑迁移体验令人心旷神怡,改个targetframework就完成迁移,不要太轻松!然而,ASP.NET Core5.0也有很多有意思的改变, ...

  7. [翻译] ASP.NET Core 3.0 的新增功能

    全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0 本文重点介绍了 ASP.NET Core 3.0 中最重要的更改,并提供相关文档的连接. Blazor Bl ...

  8. .NET Core 3.0及ASP.NET Core 3.0 前瞻

    前几天微软发布了 .NET Core 3.0 Preview 9 ,这是.NET Core 3.0 最后一个预览版. [翻译] .NET Core 3.0 Preview 9 发布 .NET Core ...

  9. ASP.NET Core 3.0预览版体验

    目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3,对应ASP.NET Core 3.0 Preview 3. ASP.NET Core 3.0 之后将不再支持.NE ...

最新文章

  1. win7没有个性化如何把计算机放到桌面,win7系统家庭版右键没有个性化设置桌面壁纸...
  2. android6.0 wifi流程,[RK3288][Android6.0] WiFi之从Linkspeed看获取流程
  3. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  4. mysql 控制台全是_Mysql控制台命令大全
  5. 配置WCF同时支持WSDL和REST,swaggerwcf生成文档
  6. 程序员想进大公司?学会这门编程知识,决定你能进什么样的企业!
  7. oracle数据库提示无监听,【原创】PL/SQL连数据库提示无监听程序
  8. 第二单元答案计算机基础,《计算机基础》资源包-第二单元课后题答案.docx
  9. 优秀ASP.NET程序员的修炼之路(转)
  10. 心电图 python_能测血压,还有心电图,兼顾9大运动模式,dido手环还不错
  11. 企业信息化与BI系统建设规划
  12. apk提取加密素材_WDF资源加密及解密工具 – 素材防偷专用工具(附带教程)
  13. hibernate还有人用吗
  14. cc9.3 indesign_Adobe InDesign CC2019
  15. 含参积分求导/积分上限函数求导/
  16. 【数学模拟卷总结】2022李林四套卷数学二第一套
  17. 一个人年轻的时候,总以为疾病和死神只会光顾别人
  18. 斐波那契数列——《剑指offer》
  19. mendeley引用参考文献不显示_ubuntu下使用mendeley插入参考文献
  20. [git]上传代码到github

热门文章

  1. ruby语法_Ruby函数(方法)语法
  2. 如何在Windows 8.1中获取Windows 10样式的开始菜单
  3. 撬锁锤怎么用_安全锤是啥?消防蜀黍教你怎么选?如何快速破拆逃生?
  4. Serv-U服务器的管理3
  5. Ansible 一步一步从入门到精通(一)
  6. 在Android NDK中使用OpenSSL
  7. [转]Multiple outputs from T4 made easy
  8. 虎年云原生落地技术趋势
  9. 2022年终结版WPF项目实战合集发布
  10. .NET6下周发布真的香,可不少人却只会.NET Framework!