gRPC入门学习之旅(二)
gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准
和协议层Protobuf序列化协议
开发,支持众多的开发语言,由Google开源。
gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。
特点:
- 跨语言;
- 基于HTTP/2之上的二进制协议;
- Protobuf序列化机制,比JSON体积小,网络传输快;
- 一个连接上可以多路复用,并发处理多个请求和响应;
- 多种语言的类库实现;
- 服务定义文件和自动代码生成(.proto 文件和 Protobuf 编译工具);
- 适合高性能轻量的微服务,一般对外的接口用Restful API,内部服务的调用用gRPC。gRPC是一个分布式服务框架,和以前的WebService,WCF类似;
- gRPC还提供了很多扩展点,用于对框架进行功能定制和扩展,例如,通过开放负载均衡接口可以无缝的与第三方组件进行集成对接(Zookeeper、域名解析服务、SLB 服务等)。
gRPC 使用 HTTP/2 作为传输协议。 虽然与 HTTP 1.1 也能兼容,但 HTTP/2 具有许多高级功能:
用于数据传输的二进制组帧协议 - 与 HTTP 1.1 不同,HTTP 1.1 是基于文本的。
对通过同一连接发送多个并行请求的多路复用支持 - HTTP 1.1 将处理限制为一次处理一个请求/响应消息。
双向全双工通信,用于同时发送客户端请求和服务器响应。
内置流式处理,支持对大型数据集进行异步流式处理的请求和响应。
减少网络使用率的标头压缩。
gRPC 是轻量型且高性能的。 其处理速度可以比 JSON 序列化快 8 倍,消息小 60% 到 80%。 在 Microsoft Windows Communication Foundation (WCF) 中,gRPC 的性能超过经过高度优化的 NetTCP 绑定的速度和效率。 与偏向于 Microsoft 堆栈的 NetTCP 不同,gRPC 是跨平台的。
接下来,我们通过一个Demo,来学习一下,如何在Visual Studio 2022中实现gRPC功能。
2、创建gRPC服务端
2.1、创建gRPC服务端项目
1. 打开Visual Studio 2022,在开始界面中选择“创建新项目”。如下图。
2.或者在菜单上点击文件—>新建—>项目—>弹出“创建新项目”的界面。如下图。
3. Visual Studio 2022弹出的“创建新项目”的对话框中做如下选择。如下图。
- 在最左边的下拉框中,选择 “C# ,如下图中1处
- 在中间的下拉框中,选择 “所有平台”,如下图2处。
- 在最右边的下拉框中,选择“Web”,如下图3处。
- 在下图中4处,选择“ASP.NET Core gRPC服务”gRPC项目模板,点击“下一步”按钮。
4.在弹出的“配置新项目”的对话框中,如下图,在“项目名称”输入框中,输入“Demo.GrpcService”。然后使用鼠标点击“下一步”按钮。
5. 在弹出的“其他信息”的对话框,如下图。在“框架”下拉框中,选择“NET 7.0(标准期限支持)”。其他值选择默认值即可。然后使用鼠标点击“创建”按钮。
6.默认项目文件结构,如下图所示:
2.2、项目文件说明
- appsettings.json
我们打开appsettings.json文件,其中有一个Protocols
属性,代表基于Http2进行通信。
- Protos
在创建的项目中,我们会看到有一个名称为Protos
的文件夹,该文件夹用于存放proto协议文件,其中的greet.proto是项目默认给我们创建的一个示例文件,它会根据协议自动生成需要的类文件。该协议文件中的具体说明如下图所示:
- Services
在创建的项目中,我们会看到有一个名称Services
的文件夹,该文件夹用于存放具体的业务实现类(即:服务类),其中的GreeterService.cs是项目默认给我们创建的一个示例文件,具体说明如下图所示:
上述图中的Greeter.GreeterBase来自greet.proto文件生成的类文件,具体位置如下图所示:
- 注册服务
在Visual Studio 2022的“解决方案资源管理器”中找到Program.cs文件,使用鼠标双击打开Program.cs
文件,在这个文件中需要添加gRPC服务,同时需要将所有的业务服务进行注册,如下图所示: