带有REST和Open API的gRPC
作者:互联网
今天我们的来宾帖子来自CoreOS的Brandon Phillips。CoreOS为Linux容器构建开源项目和产品。他们的共识和发现的旗舰产品ETCD和他们的集装箱发动机rkt 是gRPC的早期采用者。
CoreOS选择gRPC的主要原因之一是因为它使用HTTP / 2,从而使应用程序可以在单个TCP端口(Go可用)上同时显示HTTP 1.1 REST / JSON API和高效的gRPC接口。这为开发人员提供了与REST Web生态系统的兼容性,同时推进了新的高效RPC协议。在最新发布的Go 1.6中,net/http2
默认情况下,Go附带了一个稳定的软件包。
由于许多CoreOS客户端都使用HTTP 1.1和JSON进行通讯,因此gRPC与JSON和Open API规范的互操作性很容易(以前是Swagger)非常有价值。对于更熟悉基于HTTP / 1.1 + JSON和Open API Spec API的用户,他们使用了开放源代码库的组合,以gRPC和HTTP REST风格提供gRPC服务,并使用API多路复用器为用户提供了最佳的服务。两个世界。让我们深入研究细节,看看它们是如何做到的!
一个名为EchoService的gRPC应用程序
在本文中,我们将根据gRPC API定义构建一个小的概念验证gRPC应用程序,添加REST服务网关,最后将其全部提供给单个TLS端口。该应用程序称为EchoService,在Web上等效于Shell命令echo:该服务将返回或“回显”任何发送给它的文本。
首先,让我们在名为EchoMessage的protobuf消息中定义EchoService的参数,该消息包括一个称为value的字段。我们将在名为的protobuf“ .proto”文件中定义此消息service.proto
。这是我们的EchoMessage:
message EchoMessage {
string value = 1;
}
在相同的.proto文件中,我们定义了一个gRPC服务,该服务采用此数据结构并将其返回:
service EchoService {
rpc Echo(EchoMessage) returns (EchoMessage) {
}
}
service.proto
通过协议缓冲区编译器按原样运行此文件,会protoc
在Go中生成存根gRPC服务以及各种语言的客户端。但是,仅gRPC并没有提供公开REST接口的服务那么有用,因此我们不会因gRPC服务存根而停止。
接下来,我们添加gRPC REST网关。该库将在gRPC EchoService的顶部构建一个RESTful代理。为了构建此网关,我们将元数据添加到EchoService .proto以指示Echo RPC映射到RESTful POST方法,并且所有RPC参数都映射到JSON主体。网关可以将RPC参数映射到URL路径和查询参数,但是为了简洁起见,此处省略了这些复杂性。
service EchoService {
rpc Echo(EchoMessage) returns (EchoMessage) {
option (google.api.http) = {
post: "/v1/echo"
body: "*"
};
}
}
这意味着网关一旦由生成protoc
,现在就可以接受来自HTTP的请求,curl
如下所示:
$ curl -X POST -k https://localhost:10000/v1/echo -d '{"value": "CoreOS is hiring!"}'
到目前为止,整个系统看起来像这样,只有一个service.proto
文件同时生成gRPC服务器和REST代理:
为了将这些结合在一起,回显服务创建了一个Go,http.Handler
以检测协议是否为HTTP / 2和Content-Type为“ application / grpc”,并将此类请求发送到gRPC服务器。其他所有内容都路由到REST网关。代码看起来像这样:
if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
grpcServer.ServeHTTP(w, r)
} else {
otherHandler.ServeHTTP(w, r)
}
要进行尝试,您所需要的只是一个可以运行的Go 1.6开发环境以及以下简单命令:
$ go get -u github.com/philips/grpc-gateway-example
$ grpc-gateway-example serve
在服务器运行时,您可以尝试在HTTP 1.1和gRPC接口上进行请求:
$ grpc-gateway-example echo Take a REST from REST with gRPC
$ curl -X POST -k https://localhost:10000/v1/echo -d '{"value": "CoreOS is hiring!"}'
最后一个好处:因为我们有一个Open API规范,所以https://localhost:10000/swagger-ui/#!/EchoService/Echo
如果您的笔记本电脑上有运行上述服务器的服务器,则可以浏览运行的Open API UI 。
我们已经看了如何使用gRPC桥接到REST世界。如果您想看完整个项目,请查看GitHub上的仓库。我们认为使用单个protobuf来描述API的这种模式会导致易于使用,灵活的API框架,我们很高兴在我们的更多项目中利用它
源:https://grpc.io/blog/coreos/
标签:HTTP,gRPC,REST,API,EchoMessage,EchoService,Open 来源: https://www.cnblogs.com/a00ium/p/13943985.html