带有REST和Open API的gRPC

Posted DaisyLinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有REST和Open API的gRPC相关的知识,希望对你有一定的参考价值。

 

今天我们的来宾帖子来自CoreOS的Brandon PhillipsCoreOS为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/

以上是关于带有REST和Open API的gRPC的主要内容,如果未能解决你的问题,请参考以下文章

基于场景选择微服务的API范式:RESTGraphQLWebhooks和gRPC

gRPC vs REST:两种API架构风格的对比

使用 Spring Boot 的 gRPC 和 REST 微服务

部署 Rest + gRPC 服务器部署到带有入口的 k8s

在WePay上将API从REST迁移到gRPC

(译)xDS REST and gRPC protocol