Envoy Proxy: A C++ Data Plane for Edge, Middle, and Service Traffic
Cloud-native high-performance edge/middle/service proxy. envoy-maintainers: Use this list to reach all core Envoy maintainers.
At a glance
- What is it?
- Envoy is a CNCF-hosted C++ proxy for edge, middle, and service traffic. This review covers its architecture, configuration, operational constraints, and the trade-offs you face when adopting it.
- Who is it for?
- Adopt Envoy if you need a high-performance, extensible data plane for edge, middle, or service traffic and can invest in operational maturity. Do not adopt it if you need a simple, low-maintenance proxy for a handful of routes.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 14, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Envoy Actually Solves
Envoy is a proxy designed for cloud-native environments where traffic flows at three layers: edge (ingress from outside), middle (between services), and service (within a service mesh). The README explicitly positions it as a "cloud-native high-performance edge/middle/service proxy." That matters because many proxies target only one layer. Envoy aims to be a universal data plane, which means you can run the same binary at your edge, as a sidecar, or as an internal load balancer. The core problem it solves is the need for a single, consistent way to handle L3/L4 and L7 traffic with advanced features like dynamic configuration, observability, and extensibility. It is for engineers who operate infrastructure at scale, not for someone who wants a quick reverse proxy for a small app.
How the Data Plane Is Structured
Envoy is written in C++ and organizes traffic processing through a filter chain model. You define listeners, which accept connections, and then apply a sequence of filters to each connection or request. This is visible in the repository layout, where the api/ directory holds the data plane API definitions, and the source tree contains the implementation. The README links to a blog post on the threading model, which is a key part of the architecture: Envoy uses a multi-threaded event loop, with each worker thread handling its own set of connections. That design allows high concurrency without shared-state locks on the hot path. Configuration is delivered via a dynamic API, also defined in the repository, which means you can change routing, listeners, and clusters without restarting the process. This is a major departure from static config proxies. The hot restart feature, also documented in a linked blog, allows binary upgrades with minimal traffic loss. In short, Envoy is not a simple request-forwarding daemon; it is a modular, stateful data plane.
Getting It Running: Build and Run Commands
The README does not include a quick start command, but it points to a Docker-based build and test guide in the ci/ directory. For a developer, the typical path is to clone the repository and use the provided Docker containers to build. The contributing guide mentions the development support toolchain in support/README.md, which automates parts of the build process. For production, you would likely use a prebuilt binary from the official releases, which are tagged like v1.39.1. You configure Envoy with a YAML or JSON config file that defines listeners, filters, and clusters. A minimal config would specify an admin interface, a listener on a port, and a cluster pointing to an upstream. The exact syntax is in the official documentation, not in the README. The key point is that building from source is a C++ project with dependencies, so you should use the provided build system unless you have a specific reason not to. The README also notes that ppc64le builds are best-effort and not covered by the security policy, so check your architecture before relying on a build.
Configuration and Extensibility: The Filter Model
Envoy's power comes from its filter model. You compose behavior by chaining filters, each handling a specific aspect: HTTP connection management, routing, rate limiting, or custom logic. The data plane API is versioned, and the repository includes a mirror of the v2 API definitions in the data-plane-api repository, though the current api/ directory is the source of truth. This API-driven approach means you can manage Envoy programmatically, which is essential for dynamic service meshes. Extensibility is a core design goal. The README links to envoy-filter-example, a separate repository that shows how to add new filters. That example is the entry point for writing custom C++ filters. The trade-off is that writing a filter requires C++ knowledge and a rebuild of the binary. You cannot drop in a script. This makes Envoy less approachable for teams that want to extend behavior in a high-level language. If you need to add custom logic, you must commit to the C++ development workflow.
Operational Maturity: Security and Community Processes
Envoy is a CNCF project with formal security processes. The README documents third-party security audits: Cure53 in 2018 and Ada Logics in 2021 on fuzzing infrastructure. It also runs OSS-Fuzz, which is a strong signal for vulnerability discovery. Security vulnerabilities are reported via GitHub Security Advisories or a dedicated email, and there is a documented security release process. The project has multiple mailing lists, including a low-frequency announce list and a users list, plus a Slack workspace. The maintainers hold a community meeting twice a month, but only if there are agenda items. This operational maturity matters because a proxy sits on your critical path. The README also notes that ppc64le builds are not covered by the security policy, meaning if you run on that architecture, you are outside the official support boundary. That is a concrete limitation to check before deployment.
Limitations and When It Is the Wrong Tool
Envoy is not the right tool for simple use cases. If you need a lightweight reverse proxy for a single service, the operational overhead of running Envoy is disproportionate. The configuration is verbose, and the dynamic API adds complexity. The README does not provide a quick start, which reflects the expectation that users are familiar with proxy concepts. Another limitation is the C++ filter extension model. Adding custom filters requires building the entire binary, which is time-consuming and requires a C++ toolchain. For teams that want to write extensions in Go or Rust, Envoy is not a fit. The hot restart feature is a workaround for upgrades, but it is not a zero-downtime guarantee. The README also mentions that ppc64le is best-effort, so if you target that architecture, you are on your own. Finally, the project is large. The repository is a monorepo with many components, and the learning curve is steep. If you do not need the dynamic configuration or the filter extensibility, a simpler proxy will serve you better.
Alternatives: The Nginx and HAProxy Comparison
The main alternatives to Envoy are Nginx and HAProxy. Nginx is an HTTP server and reverse proxy with a mature configuration model. It is written in C and offers a module system, but the module API is not as cleanly separated as Envoy's filter chain. Nginx's configuration is typically static, and dynamic reconfiguration requires reloads or commercial features. HAProxy is a TCP/HTTP proxy known for its performance and simplicity. It uses a single-threaded event loop per process, which is simpler than Envoy's multi-threaded model. HAProxy's configuration is also static, and it does not have a data plane API like Envoy's. The key difference is that Envoy is built for dynamic, API-driven environments, while Nginx and HAProxy are more traditional. If you need dynamic routing and a universal data plane, Envoy is the choice. If you need a battle-tested, static-config proxy, HAProxy is lighter and easier to operate. The README does not compare these directly, but the architecture is clear from the repository and the linked blogs.
Maintenance and Upgrade Costs
Envoy has a regular release cadence, with three recent releases: v1.39.1, v1.38.4, and v1.37.6. This indicates active maintenance and a stream of bug fixes and features. The release process is documented in RELEASES.md, which you should read before upgrading. The cost of maintenance is high because of the project's size and the C++ codebase. Upgrading Envoy may require config changes if the API has changed between versions. The dynamic API is versioned, so you must keep your control plane in sync with the data plane. The security policy explicitly excludes ppc64le, so if you use that architecture, upgrades are not guaranteed. The project also uses OSS-Fuzz, which means you should expect security patches regularly. The maintenance cost is not just in applying updates; it is in understanding the configuration and the impact of new features. The README advises using the development support toolchain for contributors, which suggests that even building Envoy is not trivial. Plan for a dedicated team if you adopt Envoy.
Editorial conclusion
Adopt Envoy if you need a high-performance, extensible data plane for edge, middle, or service traffic and can invest in operational maturity. Do not adopt it if you need a simple, low-maintenance proxy for a handful of routes. Before adoption, verify your required features are stable in the current release, review the security policy for your architecture, and plan for the C++ build and configuration complexity.
Community notes