[wildfly-dev] gRPC in WildFly

Scott Marlow smarlow at redhat.com
Thu Aug 6 10:52:35 EDT 2020



On 7/24/20 1:55 PM, Ron Sigal wrote:
> Recently the RESTEasy group has been looking at protobuf and gRPC and 
> discussing how they might fit into the JAX-RS world. We now have a 
> feature request (https://github.com/wildfly/wildfly-proposals/pull/326) 
> for exposing JAX-RS resources as gRPC servers 
> (https://issues.redhat.com/browse/WFLY-13530). Briefly, it would work as 
> follows. Compiling the proto file
> 
> service Greeter {
>    rpc SayHello (HelloRequest) returns (HelloReply) {}
>    ...
>    }
> 
> will create a class GreeterGrpc, and a gRPC service can be created by 
> subclassing an inner class. Rather than implementing a gRPC service, we 
> propose passing the request to the appropriate JAX-RS resource, 
> something like this:
> 
> class GreeterImpl extends GreeterGrpc.GreeterImplBase {
> 
>     @Override
>     public void sayHello(HelloRequest req, StreamObserver<HelloReply 
> responseObserver) {
>        JAXRSForwarderBuilder builder = new JAXRSForwarderBuilder();
>        builder.servlet("ResteasyServlet").pathTranslator((String s) -> 
> ("test/" + s)); // Configure the JAXRSForwarder
>        JAXRSForwarder forwarder = builder.build();
>        forwarder.forward(req, (StreamObserver) responseObserver);
>     }
> }
> 
> The gRPC infrasture would catch a request, dispatch it to GreeterImpl, 
> and the JAXRSForwarder would
> 
>    1. create an HttpServletRequest and an HttpServletResponse
>    2. find and invoke the appropriate RESTEasy servlet
>    3. pass the result to the gRPC StreamObserver
> 
> The idea is to hide the complexity behind the JAXRSForwarder.
> 
> Now, this proposal is limited to extending RESTEasy. However, Darren 
> Lofthouse has been reading it carefully and has suggested that it could 
> be part of a larger discussion of how WildFly could incorporate gRPC. 
> Some discussion points:
> 
>    1. Right now we're proposing to open a dedicated socket for the gRPC 
> infrastructure, which runs on top of Netty. When Undertow incorporates 
> Netty, maybe gRPC could share a socket with other subsystems.
> 
>    2. Maybe there should be a separate gRPC subsystem.
> 
>    3. Maybe we should go beyond servers and consider supporting gRPC 
> clients. For example, maybe gRPC clients could be injected into JAX-RS 
> resources the same as MicroProfile REST Clients.
> 
>    4. Darren has suggested that Elytron should be involved.

+1 for ensuring that gRPC support doesn't create any security holes, 
good to hear that Darren is helping!  :-)

> 
> In fact, I'm going to quote one of Darren's recent remarks:
> 
>>     Starting to research gRPC myself it feels like the kind of thing
>>     where the general support / strategy within the application server
>>     should be defined, the individual subsystems such as JAX-RS and
>>     EJB which want to expose their existing deployments would then
>>     dynamically make their resources available through this. For areas
>>     such as security this would be provided consistently within the
>>     general support.
>>
>>     For gRPC initially if feels like it could have a good fit with
>>     CDI, I don't know how practical that would be and if it would
>>     cause a lot of considerations that may make it a better fit as a
>>     SmallRye project. On one side if that gets too complex it may be
>>     something that makes more sense as a SmallRye project to define
>>     how gRPC deployments are handled, on the other side unless the
>>     exposing of JAX-RS endpoints is 100% automated including the
>>     protobuf generation it sounds like a level of user deployment may
>>     be necessary anyway which may mean deployment handling is required.
>>
>>     I think the exposed socket is possibly less of an issue compared
>>     to the general strategy. Maybe it will be necessary to expose a
>>     separate server socket for now, I would have thought something
>>     like this could justify it's own subsystem which would mean it can
>>     be defined in it's own Galleon layer but that would mean as a
>>     subsystem it could follow a similar path the Remoting subsystem
>>     took i.e. exposing a port and once possible adding support to
>>     delegate through Undertow.
>>
>>     Regarding the other comments about how this could integrate with
>>     Undertow, the main motivation for gRPC seems to be the use of this
>>     binary protocol we probably should be cautious that we are not
>>     adding too many layers on our side that requests need to be
>>     translated thought otherwise we may be negating the benefits from
>>     the outset.
>>
>>     Recently the tasks I have been working through have involved a lot
>>     of DeploymentUnitProcessor refactoring to restore better
>>     collaboration between subsystems regarding how they share security
>>     policy information, so far it has been slow going and considering
>>     backwards compatibility there is still quite a long way to go.
>>     This is the reason for something like this I am interested in the
>>     overall architecture first so we can hopefully avoid this kind of
>>     retrospective refactoring as we need to enhance it further.
> 
> 
> Any comments are welcome.
> 
> 
> _______________________________________________
> wildfly-dev mailing list
> wildfly-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/wildfly-dev
> 



More information about the wildfly-dev mailing list