hi, chao

1. When grpc-web client sends a request, it will generate a route according
to the package.service.function rule in the .proto file defined. If we want
to access through "/example/*" instead of "/*" when setting up the route,
the URI we get in the gateway at this time is
"/example/package.service.function", but grpc Server needs "
package.service.function", so the user can use "strip_path" to decide
whether to delete the prefix.

2. There is an introduction about the agreement in the link [5].
The JavaScript client provides two data transmission methods.
The first is the text method. We need to determine the encryption method
through the mimetype in the gateway, then use its corresponding decryption
method to decrypt, reset it to the body, and forward it to the upstream
request. After grpcServer responds, it needs to be encrypted in the same
way to respond to the client.
Data in another binary format can be forwarded directly, and the gateway
only needs to process CORS and the conversion of requests and responses
mime.


Chao Zhang <tok...@apache.org> 于2021年12月23日周四 16:23写道:

> Hi!
>
> Sounds good to me, but still I want to pick your brain to resolve some
> confusions.
>
> 1. I'm confused with the `strip_path` field, could you give some more
> elaborated examples?
> 2. Still don't know how Apache APISIX can support such protocol
> conversion. How does Apache APISIX convert the data in gRPC web format
> to gRPC format?
>
> Best regards
> Chao Zhang
>
> https://github.com/tokers
>
> On Thu, Dec 23, 2021 at 4:00 PM JinChao Shuai <shuaijinc...@apache.org>
> wrote:
> >
> > Hi, folks
> >
> > 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.
> >
> > Plugin Name:
> >
> > - grpc-web
> >
> >
> > Plugin 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.
> >
> > 2、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]
> >
> > 3、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]
> >
> > 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
> >
> >
> > --
> > Thanks,
> > Janko
>


-- 
Thanks,
Janko

Reply via email to