grpc-proxy

module
v0.0.0-...-2f6cc66 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 19, 2021 License: Apache-2.0

README

gRPC Proxy

This is an implementation of a gRPC Proxying Server in Golang, based on grpc-go. Features:

  • full support for all Streams: Unitary RPCs and Streams: One-Many, Many-One, Many-Many
  • pass-through mode: no overhead of encoding/decoding messages
  • customizable StreamDirector routing based on context.Context of the Stream, allowing users to return a grpc.ClientConn after dialing the backend of choice based on:
    • inspection of service and method name
    • inspection of user credentials in authorization header
    • inspection of custom user-features
    • inspection of TLS client cert credentials
  • integration tests

Example Use


director := func(ctx context.Context) (*grpc.ClientConn, error) {
    if err := CheckBearerToken(ctx); err != nil {
        return nil, grpc.Errorf(codes.PermissionDenied, "unauthorized access: %v", err)
    }
    stream, _ := transport.StreamFromContext(ctx)
    backend, found := PreDialledBackends[stream.Method()];
    if !found {
        return nil, grpc.Errorf(codes.Unimplemented, "the service %v is not implemented", stream.Method)
    }
    return backend, nil
}

proxy := grpcproxy.NewProxy(director)
proxy.Server(boundListener)

Status

This is alpha software, written as a proof of concept. It has been integration-tested, but please expect bugs.

The current implementation depends on a public interface to ClientConn.Picker(), which hopefully will be upstreamed in grpc-go#397.

Contributors

Names in no particular order:

License

grpc-proxy is released under the Apache 2.0 license. See LICENSE.txt.

Part of the main server loop are lifted from the grpc-go Server, which is copyrighted Google Inc. and licensed under MIT license.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL