【ASP.NET Core学习】远程过程调用 - gRPC使用

 本文介绍在gRPC使用,将从下面几个方面介绍html

  1. 什么是RPC
  2. 何时须要RPC
  3. 如何使用gRPC

什么是RPCgit

RPC是Remote Procedure Call简称,翻译过来是远程过程调用。它是一个进程间的通信技术,基于Client-Server模式,让程序像调用本地方法同样使用,而无需去关系它细节如何实现。github

上面是个人理解,怕理解有错或者表达不许确,下面引用维基百科服务器

维基百科 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调用过程数据结构

 

何时须要RPCapp

RPC是解决进程间通信(能够是同一个服务器,也能够是不一样服务器的进程间,可是一般是内网的不一样服务器之间进程通信)。 框架

解决进程间通讯,Web Api也是能够解决,为何还须要RPC?我认为能够从下面几点ide

1. Web Api是基于HTTP,RPC能够是HTTP,也能够是TCP,甚至基于Socket,RPC框架一般都是隐藏通信细节,让咱们无感知使用微服务

2. Web Api 一般基于JSON格式,XML格式,这种格式易读性强,可是随之带来就是传输过程须要把数据的元数据也带进去传输

3. Web Api更多应用场景是提供方定义好接口,由客户端按需调用,RPC一般须要调用方和提供方沟通一块儿定义接口

因此PRC更可能是使用如下场景

  1. 对通信性能要求较高
  2. 微服务
  3. 点到点通信

gRPC使用

 gRPC是Google开源的高性能RPC框架,有如下几个特色

  1. 现代高性能轻量级 RPC 框架。
  2. 协定优先 API 开发,默认使用protobuf,容许与语言无关的实现。(这里涉及两点,1.面向接口开发,依赖抽象而不是具体,2. 能够不一样语言实现协做)

  3. 使用 Protobuf 二进制序列化减小对网络的使用。(减小网络传输)

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

  5. 支持客户端、服务器和双向流式处理调用。

下面开始介绍如何在Net Core上使用gRPC

 

1、安装dotnet-gRPC工具(用于引用protobuf文件,生成客户端/服务端代码)

dotnet tool install dotnet-grpc -g

2、新建一个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;
}

3、新建一个服务端

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>();
});

 

4、新建客户端

 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

 

5、运行

1. 运行服务端

2. 启动客户端

客户端输出下面信息

{"Code":1,"Message":"\u53D1\u9001\u6210\u529F"}

 

6、小结

gRPC的生命周期

Client(发送请求) -> Client stub(压缩/解压) -> Client RPC Transfer(发送/接收) -> Server RPC Transfer(接收/发送) -> Server stub(解压/压缩) -> Server (处理响应)

gPRC帮咱们隐藏中间的环节,只剩下两头的代码(俗称业务逻辑代码)

protobuf它是一种可序列化的数据结构,但它更重要是定义接口,让服务端和客户端能分离出来