Library / SDK
envoyproxy/envoy avatar
envoyproxy/envoy

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.

29,230 stars5,725 forksC++Apache-2.0

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 received new commits within the last day.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • envoyproxy/envoy29,230 ★ · +552
Star history
Repository2026-08-022026-11-13
envoyproxy/envoy28.7k29.2k

552 Stars in the last 103 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial 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 README also suggests the development support toolchain in support/README.md, which helps automate parts of the development process, particularly code review. For production, you would likely use a prebuilt binary from the official releases, which are tagged like v1.40.2. 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.

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 separate data-plane-api repository holds the v2 API definitions as a read-only mirror of the api/ directory. 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 repository's Cargo.toml also declares a Rust workspace for source/extensions/dynamic_modules/sdk/rust, so C++ is not the only extension language in the tree.

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 offers only a build/test quick start for developers. Another limitation is that the filter example the README links, envoy-filter-example, is a C++ repository that links to the main one, though the tree also carries a Rust SDK for dynamic modules. 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. 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. 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 Envoy with either.

Maintenance and Upgrade Costs

Envoy has a regular release cadence, with three recent releases: v1.40.2, v1.39.6, and v1.38.9. 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 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. 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.

Frequently asked questions

How do I use the Envoy proxy?

Envoy is a cloud-native edge, middle and service proxy, hosted by the Cloud Native Computing Foundation. The README sends you to the official documentation at envoyproxy.io for configuration and usage, to a separate examples repository, and to a set of architecture write-ups on the threading model, hot restart, the stats architecture and the universal data plane API.

How do I install Envoy?

The README contains no install command. It points to the official documentation for usage, to a distribution/ directory in the repository, and to a Docker-based build and test quick start for working from source, so a production install is documented outside this repository.

How do I install the Envoy proxy binary?

Nothing in the README describes installing a binary. The repository's own instructions cover contributing, where a Docker quick start for building and running tests as a developer is the starting point, and everything else is deferred to the documentation at envoyproxy.io.

How do I install Envoy on Ubuntu?

The README does not give per-distribution installation steps for Ubuntu or anything else. It links the official documentation and the release process document instead, and the repository builds through Bazel with a version pinned in .bazelversion.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/envoyproxy-envoy.svg)](https://hysenlabs.com/projects/envoyproxy-envoy)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/envoyproxy-envoy.svg)](https://hysenlabs.com/projects/envoyproxy-envoy)

Was this useful?