### Envoy是什么?
Envoy 是一個面向服務架構的L7代理和通信總線而設計的,這個項目誕生是出于以下目標:<br />
_對于應用程序而言,網絡應該是透明的,當發生網絡和應用程序故障時,能夠很容易定位出問題的根源。_<br />
實際上,實現前面提到的目標是非常困難的,Envoy 試圖通過提供以下高級特性:<br />
**外置進程架構**:Envoy是一個獨立的進程,與應用程序一起運行。所有的Envoy形成一個對應用透明的通信網格,每個應用程序通過本地發送和接受消息,并不感知網絡拓撲結構。這個外置進程的架構相比傳統的基于library庫服務通信,有兩個優勢;<br />
- Envoy可以與任何語言開發的應用一起工作。Java, C++, Go, PHP, Python等都可以基于Envoy部署成一個服務網格,在面向服務的架構體系中,使用多語言開發應用越來越普遍,Envoy填補了這一空白。<br />
- 任何參與面向服務的大型架構里工作的人都知道,部署升級library是非常令人痛苦的,而現在可以在整個基礎設施上快速升級Envoy。
**基于新C++11編碼**:Envoy是基于C++11編寫的,之所以這樣選擇,是因為我們認為,Envoy這樣的體系結構組件能夠快速有效的開發出來。而現代應用程序開發者已經很難在云環境部署和使用它;通常會選擇性能不高,但是能夠快速提升開發效率的PHP、Python、Ruby、Scala等語言,并且能夠解決復雜的外部環境依賴。并不像本地開發代碼那樣使用如C、C++能夠提供高效的性能。
**L3/L4過濾器**:Envoy其核心是一個L3/L4網絡代理,能夠作為一個可編程過濾器實現不同TCP代理任務,插入到主服務當中。通過編寫過濾器來支持各種任務,如原始TCP代理、HTTP代理、TLS客戶端證書身份驗證等。
**HTTP L7過濾器**:在現代應用架構中,HTTP是非常關鍵的部件,Envoy支持一個額外的HTTP L7過濾層。HTTP過濾器作為一個插件,插入到HTTP鏈接管理子系統中,從而執行不同的任務,如緩沖,速率限制,路由/轉發,嗅探Amazon的DynamoDB等等。
**支持HTTP/2**:在HTTP模式下,Envoy支持HTTP/1.1、HTTP/2,并且支持HTTP/1.1、HTTP/2雙向代理。這意味著HTTP/1.1和HTTP/2,在客戶機和目標服務器的任何組合都可以橋接。建議在服務間的配置使用時,Envoy之間采用HTTP/2來創建持久網絡連接,這樣請求和響應可以被多路復用。Envoy并不支持被淘汰SPDY協議。
**HTTP L7路由**:在HTTP模式下運行時,Envoy支持根據content type、runtime values等,基于path的路由和重定向。當服務構建到服務網格時,Envoy為前端/邊緣代理,這個功能是非常有用的。
**支持gRPC**:gRPC是一個來自谷歌的RPC框架,使用HTTP/2作為底層的多路傳輸。HTTP/2承載的gRPC請求和應答,都可以使用Envoy的路由和LB能力。所以兩個系統非常互補。
**支持MongoDB L7**:現代Web應用程序中,MongoDB是一個非常流行的數據庫應用,Envoy支持獲取統計和連接記錄等信息。
**支持DynamoDB L7**:DynamoDB是亞馬遜托管的NoSQL Key/Value存儲。Envoy支持獲取統計和連接等信息。
**服務發現**:服務發現是面向服務體系架構的重要組成部分。Envoy支持多種服務發現方法,包括異步DNS解析和通過REST請求服務發現服務。
**健康檢查**:構建Envoy網格的推薦方法,是將服務發現視為一個最終一致的方法。Envoy含有一個健康檢查子系統,它可以對上游服務集群進行主動的健康檢查。然后,Envoy聯合服務發現、健康檢查信息來判定健康的LB對象。Envoy作為一個外置健康檢查子系統,也支持被動健康檢查。
**高級LB**:在分布式系統中,不同組件之間LB也是一個復雜的問題。Envoy是一個獨立的代理進程,不是一個lib庫,所以他能夠在一個地方實現高級LB,并且能夠被任何應用程序訪問。目前,包括自動重試、斷路器,全局限速,阻隔請求,異常檢測。將來還會支持按計劃進行請求速率控制。
**前端代理**:雖然Envoy作為服務間的通信系統而設計,但是(調試,管理、服務發現、LB算法等)同樣可以適用于前端,Envoy提供足夠的特性,能夠作為絕大多數Web應用的前端代理,包括TLS、HTTP/1.1、HTTP/2,以及HTTP L7路由。
**極好的可觀察性**:如上所述,Envoy目標是使得網絡更加透明。而然,無論是網絡層還是應用層,都可能會出現問題。Envoy包括對所有子系統,提供了可靠的統計能力。目前只支持statsd以及兼容的統計庫,雖然支持另一種并不復雜。還可以通過管理端口查看統計信息,Envoy還支持第三方的分布式跟蹤機制。
**動態配置**:Envoy提供分層的動態配置API,用戶可以使用這些API構建復雜的集中管理部署。
### 設計目標
**簡要說明**:Envoy并不是很慢(我們已經花了相當長的時間來優化關鍵路徑)。基于模塊化編碼,易于測試,而不是性能最優。我們的觀點是,在其他語言或者運行效率低很多的系統中,部署和使用Envoy能夠帶來很好的運行效率。
### 返回
- [簡介](../Introduction.md)
- [首頁目錄](../README.md)
- 首頁
- 簡介
- Envoy是什么
- 架構介紹
- 術語
- 線程模型
- 監聽器
- L3/L4網絡過濾器
- HTTP連接管理
- HTTP過濾器
- HTTP路由
- gRPC
- WebSocket支持
- 集群管理
- 服務發現
- 健康檢查
- 連接池
- 負載均衡
- 異常檢測
- 熔斷
- 全局限速
- TLS
- 統計
- 運行時配置
- 跟蹤
- TCP代理
- 訪問日志
- MongoDB
- DynamoDB
- Redis
- 熱重啟
- 動態配置
- 初始化
- 逐出
- 腳本
- 部署
- 業界對比
- 獲得幫助
- 歷史版本
- 編譯安裝
- 編譯
- 參考配置
- 演示沙箱
- 前端代理
- Zipkin跟蹤
- Jaeger跟蹤
- gRPC橋接
- 構建Envoy Docker鏡像
- 工具
- 配置參考
- V1 API 概述
- V2 API 概述
- 監聽器
- 網絡過濾器
- TLS客戶端身份認證
- Echo
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP連接管理器
- 路由匹配
- 流量轉移/分流
- HTTP頭部操作
- HTTP頭部清理
- 統計
- 運行時設置
- 路由發現服務
- HTTP過濾器
- 緩存
- CORS過濾器
- 故障注入
- DynamoDB
- gRPC HTTP/1.1 橋接
- gRPC-JSON 轉碼過濾器
- gRPC-Web 過濾器
- 健康檢查
- 速率限制
- 路由
- Lua
- 集群管理
- 統計
- 運行時設置
- 集群發現服務
- 健康檢查
- 熔斷
- 訪問日志
- 限速服務
- 運行時配置
- 路由表檢查工具
- 運維管理
- 命令行選項
- 熱重啟
- 管理接口
- 統計概述
- 運行時配置
- 文件系統
- 自定義擴展示例
- V1 API參考
- 監聽器
- 網絡過濾器
- TLS客戶端身份認證
- Echo
- HTTP連接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP路由配置
- 虛擬主機
- 路由
- 虛擬集群
- 速率限制配置
- 路由發現服務
- HTTP過濾器
- 緩存
- CORS過濾器
- DynamoDB
- 故障注入
- gRPC HTTP/1.1 橋接
- gRPC-JSON 轉碼過濾器
- gRPC-Web 過濾器
- 健康檢查
- Lua
- 速率限制
- 路由
- 集群管理
- 集群
- 健康檢查
- 熔斷
- TLS上下文
- 異常值檢測
- HASH環負載均衡配置
- 異常檢測
- 集群發現服務
- 服務發現服務
- 訪問日志
- 管理接口
- 限速服務
- 運行時配置
- 跟蹤
- V2 API參考
- 啟動引導
- 監聽&監聽發現
- 集群&集群發現
- 服務發現
- 健康檢查
- HTTP路由管理&發現
- TLS配置
- 通用的類型
- 網絡地址
- 協議選項
- 發現API
- 限速組件
- 過濾器
- 網絡過濾器
- TLS客戶端身份認證
- HTTP連接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP過濾器
- 緩存
- 故障注入
- 健康檢查
- Lua
- 速率限制
- 路由
- gRPC-JSON轉碼器
- 常見訪問日志類型
- 常見故障注入類型
- FAQ
- Envoy有多快?
- 我在哪里獲得二進制文件?
- 我如何設置SNI?
- 如何設置區域感知路由?
- 我如何設置Zipkin跟蹤?