概念
首先我们先看看什么叫 metadata:
下面的内容摘录自 阮一峰的博客
元数据是用来描述数据的数据(Data that describes other data)。单单这样说,不太好理解,我来举个例子。
下面是契诃夫的小说《套中人》中的一段,描写一个叫做瓦莲卡的女子:
(她)年纪已经不轻,三十岁上下,个子高挑,身材匀称,黑黑的眉毛,红红的脸蛋--一句话,不是姑娘,而是果冻,她那样活跃,吵吵嚷嚷,不停地哼着小俄罗斯的抒情歌曲,高声大笑,动不动就发出一连串响亮的笑声:哈,哈,哈!
这段话里提供了这样几个信息:年龄(三十岁上下)、身高(个子高挑)、相貌(身材匀称,黑黑的眉毛,红红的脸蛋)、性格(活跃,吵吵嚷嚷,不停地哼着小俄罗斯的抒情歌曲,高声大笑)。有了这些信息,我们就可以大致想像出瓦莲卡是个什么样的人。推而广之,只要提供这几类的信息,我们也可以推测出其他人的样子。
这个例子中的"年龄"、“身高”、“相貌”、“性格”,就是元数据,因为它们是用来描述具体数据/信息的数据/信息。
当然,这几个元数据用来刻画个人状况还不够精确。我们每个人从小到大,都填过《个人情况登记表》之类的东西吧,其中包括姓名、性别、民族、政治面貌、一寸照片、学历、职称等等…这一套元数据才算比较完备。
在日常生活中,元数据无所不在。有一类事物,就可以定义一套元数据。
了解了元数据的定义之后,我们来看看在 gRPC 当中,如何进行元数据的收发。
gRPC 与 metadata
更加详细的原理说明文档可以参看 gRPC over HTTP2。这里我们就先讲讲在 gRPC 上面,应该如何使用相关接口,进行 metadata 的收发。
helloworld.proto:
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
// 服务端需要对 SayHello 这个接口进行实现
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
server.py:
from concurrent import futures
import logging
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
class Greeter(helloworld_pb2_grpc.GreeterServicer):
# 实现 proto 当中的 抽象方法
def SayHello(self, request, context