欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-25 18:08:43
【ASP.NET Core学习】 介绍在gRPC使用,将从从(What)什么是RPC,(When)什么时候需要使用RPC,(How)如何使用gRPC。 RPC是Remote Procedure Call简称,翻译过来是远程过程调用。它是一个进程间的通讯技术,基于Client-Server模式,让程... ......

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

  1. 什么是rpc
  2. 什么时候需要rpc
  3. 如何使用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调用过程

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

 

什么时候需要rpc

rpc是解决进程间通讯(可以是同一个服务器,也可以是不同服务器的进程间,但是通常是内网的不同服务器之间进程通讯)。 

解决进程间通信,web api也是可以解决,为什么还需要rpc?我认为可以从下面几点

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

 

一、安装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它是一种可序列化的数据结构,但它更重要是定义接口,让服务端和客户端能分离出来