通过nodejs上的GRPC序列化动态JSON
#javascript #node #grpc #protobuf

什么是GRPC?

gRPC是由Google开发的RPC(远程过程调用)框架,该框架使用协议缓冲区在不同语言或平台上实现的应用程序之间在应用程序之间进行通信,这使得GRPC成为跨平台技术。

协议缓冲区是Google的语言中立,平台中性的,可扩展的结构化数据的可扩展机制。协议缓冲区为典型的结构化数据包提供了序列化格式,该数据的大小高达几兆字节。

接近方案

认为我们之间有需要灵活的领域的服务之间的通信,我们无法完全期望我们将收到的内容。作为JavaScript开发人员,我们迅速考虑了普通和旧的JSON对象,但是在协议缓冲区上,事情往往更加复杂和结构化。那么,我们如何在协议缓冲器定义中表示动态JSON?

答案是Struct型。

结构类型

结构类型是表示灵活/动态JSON对象的结构化方法,我们需要代表字段的值类型。

例如,认为我们必须在GRPC的结构字段中发送此对象:

{
  name: 'John Smith',
  age: 25
}

遵循结构类型结构,我们会这样发送:

{
  fields: {
     name: {
       kind: 'stringValue',
       stringValue: 'John Smith'
     },
     age: {
       kind: 'numberValue'
       numberValue: 25
     }
  }
}

不用担心,我们甚至不需要手工进行这种转换,很快我们将在下一节中看到pb-util lib为我们做到这一点;)

动手

假设我们需要开发一种假设的电子邮件服务,该服务接收用户电子邮件和自定义参数以进行电子邮件格式,但是在这里,我将仅记录接收的有效负载以进行插图。在下面,我们看到了原始,服务器和客户端的代码片段。

  • 原始
syntax = "proto3";
import "google/protobuf/struct.proto";

service SampleMessagingService {
  rpc SendEmail (EmailMessage) returns (Void);
}

message EmailMessage {
  string email = 1;
  google.protobuf.Struct parameters = 2;
}
  • 服务器
function SendEmail (messagePayload, callback) {
  const { request } = messagePayload;

  console.log('Received Message Payload', {
    ...request,
    parameters: struct.decode(request.parameters)
  })

  return callback(null, {})
}
  • 客户
const payload = {
    email: 'joaopaulo11jp@gmail.com',
    parameters: struct.encode({
        name: 'John Paul',
        age: 25,
        isDev: true
    })
}

// Sending message
client.SendEmail(payload, (err, response) => {
  if (err) throw err
  console.log(response)
})

运行服务器和客户端,我们可以在服务器的控制台日志上看到结果消息有效负载:

The message payload reading on server-side

就是这样!我希望它能有所帮助。您可以检查完整的代码here。 ð

参考
https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/struct.proto