Skip to content

proposal: support grpc-web proxy #5898

Description

@shuaijinchao

Issue description

gRPC was originally developed by Google and is a high-performance remote procedure call framework based on HTTP/2 implementation. But because the browser does not directly expose HTTP/2, Web applications cannot directly use gRPC.
gRPC-Web is a standardized protocol that solves this problem. You can use gRPC in the browser and provide a JavaScript implementation of gRPC for the browser client.
The principle is to create an end-to-end gRPC pipeline that is compatible with HTTP/1.1 and HTTP/2, and then the browser sends a regular HTTP request to the gRPC-Web between the browser and the server The proxy converts the request and response.

Currently Envoy provides proxy and conversion capabilities of the gRPC-Web protocol. I think Apache APISIX can provide friendly proxy support for gRPC-Web through plugin, which is meaningful to front-end developers. You can use a more native way to develop microservices or applications based on gRPC.

The following are the relevant configuration and technical details.


Name:

  • grpc-web

Configuration:

{
    "strip_path":false
}
  • strip_path: strip request routing prefix, If set to true, stripped request path will be passed to upstream gRPC service

Detail:

  1. What Apache APISIX needs to do ?
gRPC-Web Client  <-->  Proxy  <--> gRPC Service

Implement Proxy, complete the decoding of data from gRPC-Web data to gRPC Server and the encoding of gRPC Server response to gRPC-Web.

  1. Data Format: Use the protoc-gen-grpc-web plugin to generate proto messages and the service client stub from your .proto

    2.1 protoc-gen-grpc-web mode=grpcwebtext: The default generated code sends the payload in the grpc-web-text format.
    - Content-type: application/grpc-web-text
    - Payload are base64-encoded.
    - Both unary and server streaming calls are supported.

    2.2 protoc-gen-grpc-web mode=grpcweb: A binary protobuf format is also supported.
    - Content-type: application/grpc-web+proto
    - Payload are in the binary protobuf format.
    - Only unary calls are supported for now.

refer to: [1]

  1. CORS Support:

    3.1 Should follow the CORS spec (Mandatory)
    - Access-Control-Allow-Credentials to allow Authorization headers
    - Access-Control-Allow-Methods to allow POST and (preflight) OPTIONS only
    - Access-Control-Allow-Headers to whatever the preflight request carries
    3.2 The client library is expected to support header overwrites to avoid preflight
    3.3 CSP support to be specified

refer to: [2]

  1. For more information and use about grpc-web protocol, please refer to: [3]、[4]、[5]

[1] https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md#protocol-differences-vs-grpc-over-http2
[2] https://github.com/grpc/grpc-web/blob/master/doc/browser-features.md#cors-support
[3] https://www.npmjs.com/package/grpc-web
[4] https://github.com/grpc/grpc-web/blob/master/doc/browser-features.md
[5] https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md

Maillist

https://lists.apache.org/thread/k6jtmdz147l0b236d77nhx197s3gxlcz

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions