## 路由
路由過濾器實現了HTTP轉發。幾乎所有Envoy部署的HTTP代理場景都有使用。過濾器的主要工作是遵循路由表中配置的指令。除了轉發和重定向之外,過濾器還處理重試,統計等。
- [v1 API 參考](../../v1APIreference/HTTPfilters/Router.md)
- [v2 API 參考](../../v2APIreference/Filters/HTTPfilters/Router.md)
### HTTP頭部
路由器在出口/請求以及入口/響應路徑上消費和設置各種HTTP頭部。它們在本章節中有說明。
- [x-envoy-expected-rq-timeout-ms](#x-envoy-expected-rq-timeout-ms)
- [x-envoy-max-retries](#x-envoy-max-retries)
- [x-envoy-retry-on](#x-envoy-retry-on)
- [x-envoy-retry-grpc-on](#x-envoy-retry-grpc-on)
- [x-envoy-upstream-alt-stat-name](#x-envoy-upstream-alt-stat-name)
- [x-envoy-upstream-canary](#x-envoy-upstream-canary)
- [x-envoy-upstream-rq-timeout-alt-response](#x-envoy-upstream-rq-timeout-alt-response)
- [x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)
- [x-envoy-upstream-rq-per-try-timeout-ms](#x-envoy-upstream-rq-timeout-ms)
- [x-envoy-upstream-service-time](#x-envoy-upstream-service-time)
- [x-envoy-original-path](#x-envoy-original-path)
- [x-envoy-immediate-health-check-fail](#x-envoy-immediate-health-check-fail)
- [x-envoy-overloaded](#x-envoy-overloaded)
- [x-envoy-decorator-operation](#x-envoy-decorator-operation)
#### x-envoy-expected-rq-timeout-ms
這是路由器期望請求完成的時間(以毫秒為單位)。Envoy設置這個HTTP頭部,以便上游主機在接收請求后可以根據請求超時做出決定,例如提前退出。這是在內部請求上設置的,可以從[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)頭部或[路由超時](../../v1APIreference/HTTPRouteconfiguration/Route.md)中按順序獲取。
#### x-envoy-max-retries
如果有[重試策略](../../v1APIreference/HTTPRouteconfiguration/Route.md),Envoy將默認重試一次,除非明確指定。可以在[路由重試配置](../../v1APIreference/HTTPRouteconfiguration/Route.md)或通過使用此頭部顯式設置重試次數。如果未配置重試策略,并且未指定[x-envoy-retry-on](#x-envoy-retry-on)或[x-envoy-retry-grpc-on](#x-envoy-retry-grpc-on)頭,則Envoy將不會重試失敗的請求。
關于Envoy如何重試的一些說明:
- 路由超時(通過[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)或[路由配置設置](../../v1APIreference/HTTPRouteconfiguration/Route.md))包括所有重試。 因此,如果請求超時設置為3秒,并且第一次請求嘗試需要2.7秒,則重試(包括退避)只有0.3s時間完成。這是設計來避免因重試/超時導致指數增長。
- Envoy使用完全抖動的指數退避算法進行重試,其基準時間為25ms。第一次重試將在0-24ms之間隨機延遲,第二次在0-74ms之間,第三次在0-174ms之間,依此類推。
- 如果最大重試次數在頭部和路由配置都有設置,則在會采用最大值用于請求的最大重試次數。
#### x-envoy-retry-on
在出口請求上設置此報頭將導致Envoy嘗試重試失敗的請求(重試次數默認為1,可以通過[x-envoy-max-retries](#x-envoy-max-retries)頭部或路由配置重試策略進行控制)。設置[x-envoy-retry-on](#x-envoy-retry-on)頭的值表示重試策略。可以使用','分隔列表來指定一個或多個策略。支持的策略有:
- **5xx**<br />
如果上游服務器響應任何5xx的響應代碼,或者根本沒有響應(斷開/重置/讀取超時),Envoy將嘗試重試請求。(包括連接失敗和拒絕流)
注:當請求超過[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)(導致504誤錯代碼)時,Envoy將不會重試。如果您想在個別請求上嘗試超長時間的重試,請使用[x-envoy-upstream-rq-per-try-timeout-ms](#x-envoy-upstream-rq-per-try-timeout-ms)。`x-envoy-upstream-rq-timeout-ms`是請求的外部時間限制,包括發生的任何重試。
- **connect-failure**<br />
如果由于上游服務器連接失敗而導致請求失敗(連接超時等),Envoy將嘗試重試。(包含在5xx中)
注:連接失敗/超時是TCP級別,而不是請求級別。這不包括通過[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)或通過[路由配置](../../v1APIreference/HTTPRouteconfiguration/Route.md)指定的上游請求超時。
- **retriable-4xx**<br />
如果上游服務器響應可回復的4xx響應代碼,Envoy將嘗試重試。目前,這個類別中唯一的響應代碼是409。
注:小心打開此重試類型。在某些情況下,409可能表明需要更新樂觀鎖版本。因此,調用者不應該重試并且需要讀取,然后再嘗試寫入。如果在這種類型的情況下發生重試,則將總是以另一個409失敗。
- **refused-stream**<br />
如果上游服務器使用`REFUSED_STREAM`錯誤代碼重置流,Envoy將嘗試重試。此重置類型表示請求可以安全地重試。(包含在5xx中)
重試次數可以通過[x-envoy-max-retries](#x-envoy-max-retries)頭或通過[路由配置](../../v1APIreference/HTTPRouteconfiguration/Route.md)來控制。
請注意,重試策略也可以應用在[路由級別](../../v1APIreference/HTTPRouteconfiguration/Route.md)。
默認情況下,Envoy不會執行重試,除非您已經按照上面的方式配置它們。
#### x-envoy-retry-grpc-on
在出口請求上設置此報頭會導致Envoy嘗試重試失敗的請求(重試次數默認為1,可以通過[x-envoy-max-retries](#x-envoy-max-retries)頭或路由配置[重試策略](../../v1APIreference/HTTPRouteconfiguration/Route.md)進行控制)。gRPC重試當前僅支持響應頭中的gRPC狀態碼。追蹤者中的gRPC狀態碼不會觸發重試邏輯。可以使用','分隔列表來指定一個或多個策略。支持的策略是:
- **cancelled**<br />
如果響應頭中的gRPC狀態碼被“cancelled”(1),Envoy將嘗試重試;
- **deadline-exceeded**<br />
如果響應頭中的gRPC狀態碼是“deadline-exceeded”(4),Envoy將嘗試重試;
- **resource-exhausted**<br />
如果響應頭中的gRPC狀態碼是“resource-exhausted”(8),Envoy將嘗試重試;
同樣`x-envoy-retry-grpc-on`頭的重試次數,可以通過[x-envoy-max-retries](#x-envoy-max-retries)頭來控制
請注意,重試策略也可以應用在[路由級別](../../v1APIreference/HTTPRouteconfiguration/Route.md)。
默認情況下,Envoy不會執行重試,除非您已經按照上面的方式配置它們。
#### x-envoy-upstream-alt-stat-name
在出口請求上設置這個頭部會導致Envoy將上游響應代碼/時間統計信息發送到雙重統計樹。這對于Envoy不知道的應用程序級別的情況下,可能很有用。詳見[統計輸出文檔](../Clustermanager/Statistics.md)。
#### x-envoy-upstream-canary
如果上游主機設置了這個頭部,路由器將使用它來生成金絲雀(灰度升級)相關的統計信息。詳見[統計輸出文檔](../Clustermanager/Statistics.md)。
#### x-envoy-upstream-rq-timeout-alt-response
在出口請求上設置此頭部會導致Envoy在請求超時的情況下設置一個204響應代碼(而不是504)。頭部實際的值被忽略; 只考慮它的存在。另請參見[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)。
#### x-envoy-upstream-rq-timeout-ms
在出口請求上設置此標頭將覆蓋Envoy的路由配置。超時時間必須以毫秒為單位指定。另請參閱[x-envoy-upstream-rq-per-try-timeout-ms](#x-envoy-upstream-rq-per-try-timeout-ms)。
#### x-envoy-upstream-rq-per-try-timeout-ms
在出口請求上設置此頭部將導致Envoy在路由請求上設置每次嘗試超時。此超時必須<=全局路由超時(請參閱[x-envoy-upstream-rq-timeout-ms](#x-envoy-upstream-rq-timeout-ms)),否則將被忽略。這允許調用者每次都嘗試設置超時重試,同時保持合理的總超時。
#### x-envoy-upstream-service-time
包含上游主機處理請求所花費的時間(以毫秒為單位)。如果客戶想要確定網絡延遲與服務請求的時間做對比,這是有用的。這個頭是在響應中設置的。
#### x-envoy-original-path
如果路由使用`prefix_rewrite`,Envoy會將原始路徑頭部放在這個頭部。這對日志記錄和調試很有用。
#### x-envoy-immediate-health-check-fail
如果上游主機返回此頭部(設置為任何值),則Envoy將立即判定上游主機的主動健康檢查失敗(如果已將群集配置為[主動健康檢查](../../Configurationreference/Clustermanager/Healthchecking.md))。這是通過標準數據平面快速上報上游主機所發生故障,而無需等待下一個運行健康檢查超時。上游主機也可以通過標準的主動健康檢查再次變得健康。請參閱[健康檢查概述](../../Introduction/Architectureoverview/Healthchecking.md)了解更多信息。
#### x-envoy-overloaded
如果這個頭由上游主機設置了,Envoy不會重試。目前不關心頭部的值,只關心是否存在。此外,如果處于[維護模式](#運行時設置)或上游[熔斷](../../Introduction/Architectureoverview/Circuitbreaking.md)而導致請求丟失,Envoy將在下游響應中設置此頭部。
#### x-envoy-decorator-operation
如果此頭部出現在入口請求上,則該頭部的值將覆蓋由跟蹤機制生成的服務器span上的任何本地定義的操作名稱(span name)。同樣,如果在出口響應中出現此頭部,其值將覆蓋客戶端范圍上的任何本地定義的操作名稱(span name)。
### 統計
路由器在集群命名空間中輸出許多統計信息(取決于所選路由中指定的集群)。瀏覽[此處](../../Configurationreference/Clustermanager/Statistics.md)獲取更多信息。
路由器過濾器輸出的統計信息命名空間為`http.<stat_prefix>.`。其中`stat_prefix`來自擁有的[HTTP連接管理器](../../v1APIreference/Networkfilters/HTTPconnectionmanager.md)。
| Name | Type | Description |
| ------------- | ------------- | ------------- |
| no_route | Counter | 因沒有路由而導致404錯誤的總請求數 |
| no_cluster | Counter | 因目標集群不存在而導致404錯誤的總請求數 |
| rq_redirect | Counter | 導致重定向響應的總請求數 |
| rq_total | Counter | 總路由請求數 |
輸出的虛擬集群統計信息名稱空間為`vhost.<virtual host name>.vcluster.<virtual cluster name>.`,并包含以下統計信息:
| Name | Type | Description |
| ------------- | ------------- | ------------- |
| upstream_rq_\<*xx> | Counter | HTTP響應代碼匯總(例如,2xx,3xx等) |
| upstream_rq_\<*> | Counter | 特定的HTTP響應碼(例如:201、302等) |
| upstream_rq_time | Histogram | 請求時間,單位毫秒 |
### 運行時設置
路由器過濾器支持以下運行時設置:
- **upstream.base_retry_backoff_ms**<br />
指數重試退避時間粒度。默認為25ms。瀏覽[此處](../../Introduction/Architectureoverview/HTTProuting.md)獲取更多信息。
- **upstream.maintenance_mode.\<cluster name>**<br />
將導致立即返回503響應請求的百分比。這會覆蓋針對`<cluster name>`集群的任何路由請求行為。這可以用于卸載,故障注入等。默認為禁用。
- **upstream.use_retry**<br />
有資格使用重試的請求百分比。在任何其他重試配置之前檢查此配置,如果需要,可用于禁用所有Envoy的重試。
## 返回
- [上一級](../HTTPfilters.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跟蹤?