zoukankan      html  css  js  c++  java
  • 带有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代理:

    带REST网关的gRPC API

    为了将这些结合在一起,回显服务创建了一个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 Open API文档

    我们已经看了如何使用gRPC桥接到REST世界。如果您想看完整个项目,请查看GitHub上的仓库我们认为使用单个protobuf来描述API的这种模式会导致易于使用,灵活的API框架,我们很高兴在我们的更多项目中利用它

    源:https://grpc.io/blog/coreos/

  • 相关阅读:
    JavaEE基础(十九)/异常和File
    JavaEE基础(十八)/集合
    JavaEE基础(十七)/集合
    JavaEE基础(十六)/集合
    快排、插入、冒泡排序
    函数技巧总结
    读书笔记-你不知道的JS中-函数生成器
    读书笔记-你不知道的JS中-promise(3)
    异步API
    读书笔记-你不知道的JS中-promise(2)
  • 原文地址:https://www.cnblogs.com/a00ium/p/13943985.html
Copyright © 2011-2022 走看看