本文介绍在 gRPC 使用, 将从下面几个方面介绍
什么是 RPC
什么时候需要 RPC
如何使用 gRPC
什么是 RPC
RPC 是 Remote Procedure Call 简称, 翻译过来是远程过程调用. 它是一个进程间的通讯技术, 基于 Client-Server 模式, 让程序像调用本地方法一样使用, 而无需去关系它细节如何实现.
上面是我的理解, 怕理解有错或者表达不准确, 下面引用维基百科
维基百科 a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction
网上找到一个图, 比较形象描述 RPC 调用过程
什么时候需要 RPC
RPC 是解决进程间通讯 (可以是同一个服务器, 也可以是不同服务器的进程间, 但是通常是内网的不同服务器之间进程通讯).
解决进程间通信, web API 也是可以解决, 为什么还需要 RPC? 我认为可以从下面几点
1. Web API 是基于 HTTP,RPC 可以是 HTTP, 也可以是 TCP, 甚至基于 Socket,RPC 框架通常都是隐藏通讯细节, 让我们无感知使用
2. Web API 通常基于 JSON 格式, xml 格式, 这种格式易读性强, 但是随之带来就是传输过程需要把数据的元数据也带进去传输
3. Web API 更多应用场景是提供方定义好接口, 由客户端按需调用, RPC 通常需要调用方和提供方沟通一起定义接口
所以 PRC 更多是使用以下场景
对通讯性能要求较高
微服务
点到点通讯
gRPC 使用
gRPC 是 Google 开源的高性能 RPC 框架, 有以下几个特点
现代高性能轻量级 RPC 框架.
协定优先 API 开发, 默认使用 protobuf, 允许与语言无关的实现.(这里涉及两点, 1. 面向接口开发, 依赖抽象而不是具体, 2. 可以不同语言实现协作)
使用 Protobuf 二进制序列化减少对网络的使用.(减少网络传输)
可用于多种语言的工具, 以生成强类型服务器和客户端.
支持客户端, 服务器和双向流式处理调用.
下面开始介绍如何在 Net Core 上使用 gRPC
一, 安装 dotnet-gRPC 工具 (用于引用 protobuf 文件, 生成客户端 / 服务端代码)
dotnet tool install dotnet-grpc -g
二, 新建一个 protobuf 文件
- syntax = "proto3";
- option csharp_namespace = "gRPC.Services";
- package sms;
- // The greeting service definition.
- service SmsSender {
- // Sends a greeting
- rpc SendSms (SmsRequest) returns (SmsResponse);
- }
- // The request message containing the user's name.
- message SmsRequest {
- string tel = 1;
- string content = 2;
- }
- // The response message containing the greetings.
- message SmsResponse {
- int32 code = 1;
- string message = 2;
- }
三, 新建一个服务端
1. 新建一个 gRPC 工程
dotnet new grpc -n gRPC.Services
2. 引入步骤二生成的 protobuf 文件 (可以使用通配符引入多个 protobuf 文件)
dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Serve
3. 新建服务类
- public class SmsService : SmsSender.SmsSenderBase
- {
- private readonly ILogger<SmsService> _logger;
- public SmsService(ILogger<SmsService> logger)
- {
- _logger = logger;
- }
- public override Task<SmsResponse> SendSms(SmsRequest request, ServerCallContext context)
- {
- return Task.FromResult(new SmsResponse
- {
- Code = 1,
- Message = "发送成功"
- });
- }
- }
SmsSender 是生成工具生成的服务端代码
4. 配置 grpc 服务类终结点
- App.UseEndpoints(endpoints =>
- {
- endpoints.MapGrpcService<SmsService>();
- });
四, 新建客户端
1. 新建控制台程序
dotnet new console -n gRPC.Client
2. 添加包 (Google.Protobuf)
dotnet add package Google.Protobuf
3. 引入步骤二生成的 protobuf 文件 (可以使用通配符引入多个 protobuf 文件), 注意: 这里需要生成是客户端代码, 当然也可以用 Both 参数生成
dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Client
五, 运行
1. 运行服务端
2. 启动客户端
客户端输出下面信息
{"Code":1,"Message":"\u53D1\u9001\u6210\u529F"}
六, 小结
gRPC 的生命周期
Client(发送请求) -> Client stub(压缩 / 解压) -> Client RPC Transfer(发送 / 接收) -> Server RPC Transfer(接收 / 发送) -> Server stub(解压 / 压缩) -> Server (处理响应)
gPRC 帮我们隐藏中间的环节, 只剩下两头的代码 (俗称业务逻辑代码)
protobuf 它是一种可序列化的数据结构, 但它更重要是定义接口, 让服务端和客户端能分离出来
转发请标明出处: https://www.cnblogs.com/WilsonPan/p/12000796.html
示例代码: https://github.com/WilsonPan/AspNetCoreExamples/tree/master/gRPC
来源: https://www.cnblogs.com/WilsonPan/p/12000796.html