grpc-proxy
is a minimal configuration library that acts as a local HTTP proxy and transparently proxies all gRPC requests to the requested destination. A gRPC StreamClientInterceptor can be registered which will be called for all requests and lets you do anything that gRPC middleware can do.
For example you can build applications that:
grpc-dump
).grpc-fixture
).grpc-proxy
is super simple to use, this short snippet is a simplified version of grpc-dump
that logs the service names of all intercepted methods:
package main
import (
"flag"
"fmt"
"github.com/bradleyjkemp/grpc-tools/grpc-proxy"
"google.golang.org/grpc"
)
func main() {
grpc_proxy.RegisterDefaultFlags()
flag.Parse()
proxy, _ := grpc_proxy.New(
grpc_proxy.WithInterceptor(intercept),
grpc_proxy.DefaultFlags(),
)
proxy.Start()
}
func intercept(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
fmt.Println(info.FullMethod)
return handler(srv, ss)
}
grpc-proxy
can only intercept requests if the application supports HTTP proxies. The standard gRPC libraries support HTTP proxies by default but applications can override this behaviour by using a custom Dialer.
Troubleshooting steps:
grpc-proxy
in fallback mode.Check your application is configured to use the HTTP proxy. This is normally done by setting the http_proxy
or all_proxy
environment variable to the address grpc-proxy
is listening on (e.g. http_proxy=http://localhost:12345
).
Some applications interpret these environment variables differently, you may have to set both http_proxy
and https_proxy
to point to grpc-proxy
.
Try using grpc-proxy
as your system proxy. This will mean traffic from all applications will go through the proxy. You can find instructions for this here.
Warning: this may cause other applications to not work properly if grpc-proxy
is unable to proxy its requests properly. It’s preferable to only configure the target application to use the proxy to minimise potential disruption.
grpc-proxy
in fallback mode instead (see below for details).grpc-proxy
in fallback modeFor applications that do not work with HTTP proxies, grpc-proxy
can act as an explicit proxy server.
Rather than letting grpc-proxy
try to transparently intercept requests you should configure your application to connect directly to your proxy and use the Destination setting to tell grpc-proxy
to send all traffic to the specified host.