> 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.

It sounds that we need to always remove the prefix in this case. As
"/example/package.service.function" isn't valid proto name.
Maybe we can use the code in
https://github.com/apache/apisix/blob/3c0c89a58ee872c9564ded3fe6e8998f96235489/apisix/plugins/serverless/generic-upstream.lua#L76,
which strips the path automatically if it is matched by the wildcard.

JinChao Shuai <shuaijinc...@apache.org> 于2021年12月23日周四 18:40写道:
>
> 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