gRPC proxy is a Go reverse proxy that allows for rich routing of gRPC calls with minimum overhead.
gRPC Go Proxy server
Build a transparent reverse proxy for gRPC targets that will make it easy to expose gRPC services over the internet. This includes: * no needed knowledge of the semantics of requests exchanged in the call (independent rollouts) * easy, declarative definition of backends and their mappings to frontends * simple round-robin load balancing of inbound requests from a single connection to multiple backends
The project now exists as a proof of concept, with the key piece being the
proxypackage that is a generic gRPC reverse proxy handler.
proxycontains a generic gRPC reverse proxy handler that allows a gRPC server to not know about registered handlers or their data types. Please consult the docs, here's an exaple usage.
Defining a
StreamDirectorthat decides where (if at all) to send the request
go director = func(ctx context.Context, fullMethodName string) (*grpc.ClientConn, error) { // Make sure we never forward internal services. if strings.HasPrefix(fullMethodName, "/com.example.internal.") { return nil, grpc.Errorf(codes.Unimplemented, "Unknown method") } md, ok := metadata.FromContext(ctx) if ok { // Decide on which backend to dial if val, exists := md[":authority"]; exists && val[0] == "staging.api.example.com" { // Make sure we use DialContext so the dialing can be cancelled/time out together with the context. return grpc.DialContext(ctx, "api-service.staging.svc.local", grpc.WithCodec(proxy.Codec())) } else if val, exists := md[":authority"]; exists && val[0] == "api.example.com" { return grpc.DialContext(ctx, "api-service.prod.svc.local", grpc.WithCodec(proxy.Codec())) } } return nil, grpc.Errorf(codes.Unimplemented, "Unknown method") }Then you need to register it with a
grpc.Server. The server may have other handlers that will be served locally:
server := grpc.NewServer( grpc.CustomCodec(proxy.Codec()), grpc.UnknownServiceHandler(proxy.TransparentHandler(director))) pb_test.RegisterTestServiceServer(server, &testImpl{})
grpc-proxyis released under the Apache 2.0 license. See LICENSE.txt.