Golang
The HTTP Golang filter allows Golang to be run during both the request and response flows and makes it easier to extend Envoy.
Go plugins used by this filter can be recompiled independently of Envoy.
See the Envoy’s Golang extension proposal documentation for more details on the filter’s implementation.
Developing a Go plugin
Envoy’s Go plugins must implement the StreamFilter API.
Attention
The Go plugin API is not yet stable, you are strongly recommended to use the same version of Go plugin SDK and Envoy.
When you are using a release version of Envoy, i.e. 1.26.x,
you should use github.com/envoyproxy/envoy v1.26.x in the go.mod file.
When you are not using a release, i.e. the latest main branch of Envoy,
you could use go get -u github.com/envoyproxy/envoy@SHA to get the same version of Go plugin SDK,
the SHA is the latest commit sha.
Building a Go plugin
Attention
When building a Go plugin dynamic library, you must use a Go version consistent with Envoy’s version of glibc.
One way to ensure a compatible Go version is to use the Go binary provided by Envoy’s bazel setup:
$ bazel run @go_sdk//:bin/go -- version
...
go version goX.YZ linux/amd64
For example, to build the .so for a foo plugin, you might run:
$ bazel run @go_sdk//:bin/go build -- --buildmode=c-shared  -v -o path/to/output/libfoo.so path/to/src/foo
Configuration
Tip
This filter should be configured with the type URL type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config.
A prebuilt Golang HTTP filter  my_plugin.so might be configured as follows:
16          http_filters:
17          - name: envoy.filters.http.golang
18            typed_config:
19              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
20              library_id: my-plugin-id
21              library_path: "lib/my_plugin.so"
22              plugin_name: my_plugin
23          - name: envoy.filters.http.header_to_metadata
An HttpConnectionManager can have multiple Go plugins in its http_filters:
16          http_filters:
17          - name: envoy.filters.http.golang
18            typed_config:
19              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
20              library_id: my-plugin-id
21              library_path: "lib/my_plugin.so"
22              plugin_name: my_plugin
23          - name: envoy.filters.http.header_to_metadata
24            typed_config:
25              "@type": type.googleapis.com/envoy.extensions.filters.http.header_to_metadata.v3.Config
26          - name: envoy.filters.http.golang
27            typed_config:
28              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
29              library_id: my-other-plugin-id
30              library_path: "lib/my_other_plugin.so"
31              plugin_name: my_other_plugin
32          - name: envoy.filters.http.router
33            typed_config:
This can be useful if, for example, you have one plugin that provides authentication, and another that provides connection limiting.
Extensible plugin configuration
Envoy’s Go plugins can specify and use their own configuration.
Below is a very simple example of how such a plugin might be configured in Envoy:
17          - name: envoy.filters.http.golang
18            typed_config:
19              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
20              library_id: my-configurable-plugin-id
21              library_path: "lib/my_configurable_plugin.so"
22              plugin_name: my_configurable_plugin
23              plugin_config:
24                "@type": type.googleapis.com/xds.type.v3.TypedStruct
25                value:
26                  foo: bar
27          - name: envoy.filters.http.router
See the StreamFilter API for more information about how the plugin’s configuration data can be accessed.
Per-route plugin configuration
Go plugins can be configured on a per-route basis, as in the example below:
16          http_filters:
17          - name: envoy.filters.http.golang
18            typed_config:
19              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
20              library_id: my-configurable-plugin-id
21              library_path: "lib/my_configurable_plugin.so"
22              plugin_name: my_configurable_plugin
23              plugin_config:
24                "@type": type.googleapis.com/xds.type.v3.TypedStruct
25                value:
26                  foo: default_foo
27          - name: envoy.filters.http.router
28            typed_config:
29              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
30          route_config:
31            name: route_0
32            virtual_hosts:
33            - name: service_0
34              domains: ["*"]
35              routes:
36              - match:
37                  prefix: "/"
38                route:
39                  cluster: cluster_0
40            typed_per_filter_config:
41              envoy.filters.http.golang:
42                "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.ConfigsPerRoute
43                plugins_config:
44                  my_configurable_plugin:
Per-virtualhost plugin configuration
Go plugins can also be configured on a per-virtualhost basis:
 1          http_filters:
 2          - name: envoy.filters.http.golang
 3            typed_config:
 4              "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
 5              library_id: my-configurable-plugin-id
 6              library_path: "lib/my_configurable_plugin.so"
 7              plugin_name: my_configurable_plugin
 8              plugin_config:
 9                "@type": type.googleapis.com/xds.type.v3.TypedStruct
10                value:
11                  foo: default_foo
12          - name: envoy.filters.http.router
13            typed_config:
14              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
15          route_config:
16            name: route_0
17            virtual_hosts:
18            - name: service_0
19              domains: ["*"]
20              routes:
21              - match:
22                  prefix: "/"
23                route:
24                  cluster: cluster_0
25                typed_per_filter_config:
26                  envoy.filters.http.golang:
27                    "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.ConfigsPerRoute
28                    plugins_config:
29                      my_configurable_plugin:
Complete example
Learn more about building and running a plugin for the Envoy Go filter in the step by step Envoy Go Sandbox.