一、简介
gRPC:由Google开源,跨语言,高性能的远程过程调用(RPC)框架。
gRPC使客户端和服务器端应用程序可以透明的进行通信,简化连接系统的构建。
使用HTTP/2作为通信协议,使用Protocol Buffers作为序列化协议。
优点:
- 现在高性能轻量级RPC框架。
- 约定优先的API开发,默认使用Protocol Buffers作为描述语言,允许和语言无关的实现;
- 可用于多种语言工具,以生成强类型的服务器和客户端;
- 支持客户端,服务器双向流调用;
- 通过Protocol Buffers二进制序列化减少网络使用;
- 使用HTTP/2进行传输。
使用场景:
- 高性能轻量级微服务:gRPC设计为低延时高吞吐量通信,非常适合需要高性能的轻量级微服务。
- 多语言混合开发:gRPC工具支持所有流行的开发语言,使gRPC成为多语言开发环境的理想选择。
- 点对点实时通信:gRPC对双向流调用提供出色的支持。gRPC服务可以实时推送消息而武勋轮询。
- 网络受限环境:使用Protocol Buffers二进制序列化消息,该序列化始终小于等效的json消息,对网络带宽需求比json小。
不推荐使用场景:
- 浏览器可访问的API:浏览器不完全支持gRPC。虽然gRPC-Web可以提供浏览器支持,但是有局限性,引入了服务器代理。
- 广播实时通信:gRPC支持通过流进行实时通信,但不存在向已注册连接广播消息的概念。
- 进程间通信:进程必须承载HTTP/2才能接受传入的gRPC调用,对于Windows,进程间通信管道是一种更快速的办法。
二、创建ASP.NET Core创建gRPC服务
VS2019,查询gRPC,快速构建gRPC服务。
2.1、讲解
1、appsettings.json文件,配置了Kestrel启用HTTP/2,gRPC基于HTTP/2来通信。
2、PB协议文件greet.proto用于自动生成服务、客户端和消息【表示传递的数据】的C# 类
3、 服务类 GreeterService ,服务类集成的 Greeter.GreeterBase 来自于根据proto文件自动生成的,生成的类在 obj\Debug\netcoreapp3.1目录下
4、生成的自定义类
在系统重新生成一遍之后
5、Startup.cs类,将 gRPC服务添加到了终结点路由中
6、csproj 项目文件,包含了 proto 文件引用【找到路径后用其他方式打开,比如文本格式或者txt格式】
7、运行
三、创建gRPC客户端
3.1、添加.NET Core控制台应用程序
框架选择相同的.NET Framework Core 3.1
3.2、添加Nuget包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools
3.3、将服务的proto文件复制到客户端,然后重新生成,再打开GrpcClient.csproj文件,修改内容
修改后:
3.4、然后重新生成代码,查询生成后的问题。
3.5、添加客户端运行代码
四、配置同时启动客户端和服务器端,避免相互启动测试麻烦。
五、运行测试
客户端成功调用了服务,收到了返回消息。
六、优化
6.1、合并proto
我们再客户端和服务器端需要复制proto,其实可以合并省略。
1、复制Protos文件夹到解决方案根目录(sln文件所在目录)
2、删除客户端和服务项目中的Protos文件夹
3、在客户端项目文件csproj中添加proto文件描述
4、在服务端项目文件csproj中添加proto文件描述
实际项目中,请自行计算相对路径
5、这样两个项目都使用一个proto文件,只维护一个文件即可
6.2、合并多个proto文件
实际项目,肯定有多个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>
7、源码下载