Golang HTTP filter
In this example, we show how the Golang filter can be used with the Envoy proxy.
The example demonstrates a Go plugin that can respond directly to requests and also update responses provided by an upstream server.
It also shows how Go plugins can be independently configured at runtime.
Step 1: Compile the go plugin library
Change to the examples/golang-http
directory and build the go plugin library.
$ pwd
envoy/examples/golang-http
$ docker compose -f docker-compose-go.yaml run --rm go_plugin_compile
The compiled library should now be in the lib
folder.
$ ls lib
simple.so
Step 2: Start all of our containers
Start all the containers.
Warning
The Envoy Golang filter is designed to be run with the GODEBUG=cgocheck=0
environment variable set.
This disables the cgo pointer check.
Failure to set this environment variable will cause Envoy to crash!
Here, we have set this environment variable in Dockerfile
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------------
golang_proxy_1 /docker-entrypoint.sh /usr ... Up 10000/tcp, 0.0.0.0:10000->10000/tcp,:::10000->10000/tcp
golang_web_service_1 /bin/echo-server Up 8080/tcp
Step 3: Make a request handled by the Go plugin
The output from the curl
command below should include the header added by the simple Go plugin.
$ curl -v localhost:10000 2>&1 | grep rsp-header-from-go
< rsp-header-from-go: bar-test
Step 4: Make a request handled upstream and updated by the Go plugin
The output from the curl
command below should include the body that has been updated by the simple Go plugin.
$ curl localhost:10000/update_upstream_response 2>&1 | grep "updated"
upstream response body updated by the simple plugin
Step 5: Make a request handled by the Go plugin using custom configuration
The output from the curl
command below should include the body that contains value of
prefix_localreply_body
by the simple Go plugin.
$ curl localhost:10000/localreply_by_config 2>&1 | grep "localreply"
Configured local reply from go, path: /localreply_by_config
See also
- Envoy Go filter
Further information about the Envoy Go filter.
- Go extension API
The Go extension filter API.
- Go plugin API
Overview of Envoy’s Go plugin APIs.