跳到主要内容

gRPC 介绍

gRPC(Google Remote Procedure Call)是一个高性能、开源的远程过程调用(RPC)框架,由 Google 开发。它基于 HTTP/2 协议,支持多种编程语言,能够高效地连接数据中心内和跨数据中心的服务,并提供可插拔的负载平衡、跟踪、健康检查和身份验证支持。

gRPC 生命周期1

一元 RPC

最简单的 RPC 类型,其中客户端发送单个请求并返回单个响应。

  • 一旦客户端调用存根方法,就会通知服务器已使用客户端的此调用的元数据 、方法名称和指定的截止时间(如果适用)调用了 RPC。
  • 然后,服务器可以立即发回自己的初始元数据(必须在任何响应之前发送),或者等待客户端的请求消息。哪个先发生,取决于应用程序。
  • 服务器收到客户端的请求消息后,会执行创建和填充响应所需的所有工作。然后,响应会(如果成功)连同状态详细信息(状态代码和可选状态消息)以及可选尾随元数据一起返回给客户端。
  • 如果响应状态为 OK,则客户端得到响应,从而完成客户端的调用。

服务器流式 RPC

服务器流式 RPC 与一元 RPC 类似,不同之处在于服务器会返回一串消息来响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选状态消息)和可选尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端收到所有服务器消息后即完成。

客户端流式 RPC

客户端流式 RPC 与一元 RPC 类似,不同之处在于客户端向服务器发送的是一串消息,而不是单条消息。服务器通常会(但不一定)在收到所有客户端消息后,以单条消息(以及其状态详细信息和可选的尾随元数据)进行响应。

双向流式 RPC

在双向流式 RPC 中,调用由客户端调用方法和服务器接收客户端元数据、方法名称和截止时间发起。服务器可以选择发回其初始元数据或等待客户端开始流式传输消息。

客户端和服务器端的流处理是特定于应用程序的。由于这两个流是独立的,因此客户端和服务器可以按任何顺序读取和写入消息。例如,服务器可以等到收到客户端的所有消息后再写入其消息,或者服务器和客户端可以玩“乒乓球”——服务器收到请求,然后发回响应,然后客户端根据响应发送另一个请求,依此类推。

如何使用 gRPC

  1. 安装 gRPC

    在项目中使用 gRPC,首先需要安装相关库。以下是 Node.js 的安装示例:

    npm install grpc @grpc/proto-loader
  2. 定义服务

    创建一个 .proto 文件,定义服务和消息格式。例如,创建一个 example.proto 文件:

     syntax = "proto3";

    package example;

    // 定义服务
    service Greeter {
    // 定义方法
    rpc SayHello (HelloRequest) returns (HelloResponse);
    }

    // 定义请求消息
    message HelloRequest {
    string name = 1;
    }

    // 定义响应消息
    message HelloResponse {
    string message = 1;
    }
  3. 生成代码

    使用 gRPC 工具生成客户端和服务器端代码。

    grpc_tools_node_protoc --proto_path=. --js_out=import_style=commonjs,binary:. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` example.proto
  4. 实现服务器

    在服务器端实现定义的服务逻辑。例如,创建一个 server.js 文件:

     const grpc = require('grpc');
    const protoLoader = require('@grpc/proto-loader');

    // 加载proto文件
    const packageDefinition = protoLoader.loadSync('example.proto', {});
    const exampleProto = grpc.loadPackageDefinition(packageDefinition).example;

    // 实现服务逻辑
    function sayHello(call, callback) {
    callback(null, { message: `Hello, ${call.request.name}` });
    }

    // 启动gRPC服务器
    const server = new grpc.Server();
    server.addService(exampleProto.Greeter.service, { sayHello: sayHello });
    server.bind('127.0.0.1:50051', grpc.ServerCredentials.createInsecure());
    console.log('gRPC 服务器正在运行,端口: 50051');
    server.start();
  5. 实现客户端

    在客户端调用远程服务。例如,创建一个 client.js 文件:

     const grpc = require('grpc');
    const protoLoader = require('@grpc/proto-loader');

    // 加载proto文件
    const packageDefinition = protoLoader.loadSync('example.proto', {});
    const exampleProto = grpc.loadPackageDefinition(packageDefinition).example;

    // 创建客户端
    const client = new exampleProto.Greeter('localhost:50051', grpc.credentials.createInsecure());

    // 调用远程方法
    client.sayHello({ name: 'World' }, (error, response) => {
    if (!error) {
    console.log('服务器响应:', response.message);
    } else {
    console.error('错误:', error);
    }
    });

在Hapydev 中调试 gRPC 接口

作为一款专业的接口调试工具,Hapydev 全面支持所有主流接口类型,并独家提供 gRPC 反射功能(截至目前,国内仅此一家 API 工具具备此特性)。

  1. 点击左侧的 + 按钮,轻点“新建 gRPC 接口”选项。

  1. 选择服务定义页签,选择服务类型“导入proto”, 导入定义 gRPC 接口所使用的服务、方法和消息的 .proto 文件。

  1. 支持通过服务反射加载方法列表

  1. 选择要发送的消息

    您可以在请求区域内,点击使用示例数据,Hapydev 会根据您的 proto 描述信息自动生成符合规则的示例参数

  2. 调用 gRPC 服务

  3. 查看 gRPC 响应消息

    响应窗格显示 gRPC 响应的消息列表,包括传入消息、传出消息和网络消息。

参考链接

  1. gRPC 官方文档: https://grpc.io/docs/what-is-grpc/core-concepts/#using-the-api