### 路由
路由指定请求如何匹配相应的路径以及接下来要做什么(例如,重定向,转发,重写等)的规范。
注意:Envoy支持通过匹配HTTP头中的方法进行路由。
```
{
"prefix": "...",
"path": "...",
"regex": "...",
"cluster": "...",
"cluster_header": "...",
"weighted_clusters" : "{...}",
"host_redirect": "...",
"path_redirect": "...",
"prefix_rewrite": "...",
"host_rewrite": "...",
"auto_host_rewrite": "...",
"case_sensitive": "...",
"use_websocket": "...",
"timeout_ms": "...",
"runtime": "{...}",
"retry_policy": "{...}",
"shadow": "{...}",
"priority": "...",
"headers": [],
"rate_limits": [],
"include_vh_rate_limits" : "...",
"hash_policy": "{...}",
"request_headers_to_add" : [],
"opaque_config": [],
"cors": "{...}",
"decorator" : "{...}"
}
```
- **prefix**<br />
(sometimes required, string) 如果指定,则路由使用匹配前缀规则,这意味着前缀必须匹配路径头的开始部分。
注意:必须指定`prefix`,`path`或`regex`其中之一。
- **path**<br />
(sometimes required, string) 如果指定,则路由采用一个精确的路径匹配规则,这意味着一旦路径字符串匹配,则将会被移除,
注意:必须指定`prefix`,`path`或`regex`其中之一。
- **regex**<br />
(sometimes required, string) 如果指定,则路由采用正则表达式匹配规则,这意味着一旦路径字符串匹配,则将会被移除,正则表达式必须匹配`:path`头。整个完整的路径(不含查询字符串)必须匹配正则表达式。如果只有`:path`头的子序列与正则表达式匹配,则规则上不匹配。这里定义了[正则表达式语法](http://en.cppreference.com/w/cpp/regex/ecmascript)。
示例:
- 正则表达式 /b[io]t 匹配路径 /bit
- 正则表达式 /b[io]t 匹配路径 /bot
- 正则表达式 /b[io]t 不匹配路径 /bite
- 正则表达式 /b[io]t 不匹配路径 /bit/bot
注意:必须指定`prefix`,`path`或`regex`其中之一。
- **cors**<br />
(optional, object) 指定路由的CORS策略。
- **cluster**<br />
(sometimes required, string) 如果不是重定向路由(未指定`host_redirect`或`path_redirect`),则必须指定`cluster`,`cluster_header`或`weighted_clusters`其中之一。指定群集时,其值指示请求应转发到的上游群集。
- **cluster_header**<br />
(sometimes required, string) 如果不是重定向路由(未指定`host_redirect`或`path_redirect`),则必须指定`cluster`,`cluster_header`或`weighted_clusters`其中之一。当指定`cluster_header`时,Envoy将通过从请求头中读取由`cluster_header`命名的HTTP头的值,来明确要路由到的集群。如果相应的头没有找到,或者引用的群集不存在,Envoy将返回一个404响应。
注意:在内部,Envoy始终使用HTTP/2的`:authority`头来表示HTTP/1主机头。因此,如果在试图匹配主机,应该匹配`:authority`头。
- **weighted_clusters**<br />
(sometimes required, object) 如果不是重定向路由(未指定`host_redirect`或`path_redirect`),则必须指定`cluster`,`cluster_header`或`weighted_clusters`其中之一。使用`weighted_clusters`选项,可以为该路由指定多个上游群集。根据每个集群的权重,将请求转发到其中一个上游集群。请参阅[流量拆分](../../Configurationreference/HTTPconnectionmanager/TrafficShiftingSplitting.md)以获取相应的文档。
- **host_redirect**<br />
(sometimes required, string) 表示该路由是重定向规则。如果匹配,则会发送301重定向的响应,该响应将使用该值交换URL的主机部分。也可以使用`path_redirect`选项一起指定。
- **path_redirect**<br />
(sometimes required, string) 表示该路由是重定向规则。如果匹配,则会发送一个301重定向的响应,用这个值交换URL的路径部分。可以与`host_redirect`选项一起指定。路由器过滤器将在重写`x-envoy-original-path`头之前放置原始路径。
- **prefix_rewrite**<br />
(optional, string) 表示在转发过程中,此值将替换所匹配的前缀(或路径)。当使用正则表达式路径匹配时,将替换整个路径(不包括查询字符串)。此选项允许应用程序的URL与反向代理层公开的路径不同。
- **host_rewrite**<br />
(optional, string) 表示在转发过程中,此值将替换主机头。
- **auto_host_rewrite**<br />
(optional, boolean) 表示在转发过程中,主机头将与群集管理器选择的上游主机的主机名进行交换。此选项仅适用于路由的目标群集的类型为`strict_dns`或`logical_dns`。对于其他群集类型,设置为`true`将无效。`auto_host_rewrite`和`host_rewrite`是互斥的选项。只能指定一个。
- **case_sensitive**<br />
(optional, boolean) 表示前缀/路径匹配是否区分大小写。默认值是true。
- **use_websocket**<br />
(optional, boolean) 表示是否允许与此路由连接的HTTP/1.1客户端升级到WebSocket连接。默认值是false。
注意:如果设置为true,Envoy期望与此路由匹配的第一个请求包含WebSocket升级头。如果升级头不存在,连接将作为普通的HTTP/1.1连接进行处理。如果升级头存在,Envoy将在客户端和上游服务器之间建立纯TCP代理。因此,如果要拒绝WebSocket升级请求,上游服务器将要负责关闭相关的连接。在关闭连接之前,Envoy将持续从客户端代理数据到上游服务器。
具有WebSocket升级头的请求不支持重定向,超时和重试。
- **timeout_ms**<br />
(optional, integer) 指定路由的超时时间。如果未指定,则默认值为15秒。请注意,此超时包括所有重试。另请参阅[x-envoy-upstream-rq-timeout-ms](../../Configurationreference/HTTPfilters/Router.md#x-envoy-upstream-rq-timeout-ms),[x-envoy-upstream-rq-per-try-timeout-ms](../../Configurationreference/HTTPfilters/Router.md#x-envoy-upstream-rq-per-try-timeout-ms)和[重试概述](../../Introduction/Architectureoverview/HTTProuting.md)。
- **runtime**<br />
(optional, object) 可选,指定路由的[运行时](#Runtime)配置。
- **retry_policy**<br />
(optional, object) 可选,表示该路由具有[重试策略](#Retry-policy)。
- **shadow**<br />
(optional, object) 可选,表示路由具有[影子策略](#Shadow)。
- **priority**<br />
(optional, string) 可选,指定路由[优先级](../../Introduction/Architectureoverview/HTTProuting.md)。
- **headers**<br />
(optional, array) 指定与该路由匹配的一组[头](#Headers)列表。路由器将根据配置中指定头检查请求的头部。如果路由中的所有头都与请求中头的值相同(或者配置中没有指定相应的值,则认定存在),则将发生匹配。
- **request_headers_to_add**<br />
(optional, array) 指定应添加到由此虚拟主机处理的每个请求的HTTP头列表。以下面的形式指定头部:
```
[
{"key": "header1", "value": "value1"},
{"key": "header2", "value": "value2"}
]
```
有关更多信息,请参阅[自定义请求头](../../Configurationreference/HTTPconnectionmanager/HTTPheadermanipulation.md)的文档。
- **opaque_config**<br />
(optional, array) 指定可由过滤器访问的一组可选[路由配置值](#Opaque-Config)。
- **rate_limits**<br />
(optional, array) 指定可应用与该路由的一组[速率限制配置](../../v1APIreference/HTTPRouteconfiguration/Ratelimitconfiguration.md)。
- **include_vh_rate_limits**<br />
(optional, boolean) 指定速率限制过滤器是否应包含虚拟主机的速率限制。默认情况下,如果路由配置的速率限制,虚拟主机`rate_limits`将不适用于请求。
- **hash_policy**<br />
(optional, object) 如果上游群集使用哈希负载平衡器,则通过此选项指定路由的[哈希策略](../../Introduction/Architectureoverview/Loadbalancing.md)。
- **decorator**<br />
(optional, object) 指定用于增强相关匹配的路由描述信息,用于信息上报。
### Runtime
可用于路由的[运行时](../../Introduction/Architectureoverview/Runtimeconfiguration.md)配置,开展路由的逐步变更,而无需部署完整的代码/配置。请参阅[流量转移文档](../../Configurationreference/HTTPconnectionmanager/TrafficShiftingSplitting.md)。
```
{
"key": "...",
"default": "..."
}
```
- **key**<br />
(required, string) 指定运行时应查询的键的名称,以确定路由是否匹配。有关键名称如何映射到底层实现,请参阅[运行时文档](../../Operationsandadministration/Runtime.md)。
- **default**<br />
(required, integer) 一个0-100之间的整数,每当路由匹配时,会选择0-99之间的随机数。若该值<=在该键中找到的值(优先检查),或者若该键不存在,则为默认值,该路由是匹配的(假定所有的都路由匹配)。
### Retry policy
HTTP重试[架构概述](../../Introduction/Architectureoverview/HTTProuting.md)。
```
{
"retry_on": "...",
"num_retries": "...",
"per_try_timeout_ms" : "..."
}
```
- **retry_on**<br />
(required, string) 指定重试的发生条件。这些是与[x-envoy-retry-on](../../Configurationreference/HTTPfilters/Router.md#x-envoy-retry-on)和[x-envoy-retry-grpc-on](../../Configurationreference/HTTPfilters/Router.md#x-envoy-retry-grpc-on)记录的条件相同。
- **num_retries**<br />
(optional, integer) 指定允许的重试次数。此参数是可选的,默认值为1。这些与[x-envoy-max-retries](../../Configurationreference/HTTPfilters/Router.md#x-envoy-max-retries)记录的条件相同。
- **per_try_timeout_ms**<br />
(optional, integer) 指定每个重试尝试的非零超时。该参数是可选的。与[x-envoy-upstream-rq-per-try-timeout-ms](../../Configurationreference/HTTPfilters/Router.md#x-envoy-upstream-rq-per-try-timeout-ms)记录的条件相同。
注意:如果未指定,Envoy将使用全局路由请求超时。因此,当使用基于`5xx`的重试策略时,超时请求将不会被重试,因为总超时预算已经耗尽。
### Shadow
路由器能够实现将流量从一个集群映射到另一个集群。目前的实现是“fire and forget”,这意味着Envoy在返回来自主集群的响应之前不会等待影子集群作出响应。所有正常的统计数据都会被收集用于阴影集群,使得该功能对测试很有用。
在shadow期间,host/authority头被改变,使得`-shadow`被附加。这对于日志记录很有用。例如:`cluster1`变为`cluster1-shadow`。
```
{
"cluster": "...",
"runtime_key": "..."
}
```
- **cluster**<br />
(required, string) 指定请求将被映射到的群集。群集必须存在于[群集管理器](../../Configurationreference/Clustermanager.md)配置中。
- **runtime_key**<br />
(optional, string) 如果未指定,则对目标群集的所有请求都将被映射。如果指定,Envoy将查找运行时键,以获取请求的百分比。有效值从0到10000,允许0.01%的增幅。如果运行时键在配置中指定,但运行时不存在,则默认为0,因此请求的0%将被映射。
### Headers
```
{
"name": "...",
"value": "...",
"regex": "..."
}
```
- **name**<br />
(required, string) 指定请求中头部的名称。
- **value**<br />
(optional, string) 指定头的值。如果值不存在,则具有头名的请求都将匹配,而不管头的值如何。
- **regex**<br />
(optional, boolean) 指定头的值是否采用正则表达式。默认为`false`。整个请求头的值必须与正则表达式匹配。如果只有请求头值的子序列与正则表达式匹配,则规则不匹配。这里定义了值字段中使用的[正则表达式语法](http://en.cppreference.com/w/cpp/regex/ecmascript)。
示例:
- 正则表达式d{3}匹配123值
- 正则表达式d{3}不匹配1234值
- 正则表达式d{3}不匹配123.456值
注意:在内部,Envoy始终使用HTTP/2的`:authority`来表示HTTP/1主机头。因此,如果试图匹配主机,则匹配`:authority`替代。
注意:若要使用HTTP的`method`进行路由,请使用特殊的HTTP/2的`:method`头。这适用于HTTP/1和HTTP/2,因为Envoy标准化头。例如:
```
{
"name": ":method",
"value": "POST"
}
```
### Weighted Clusters
与指定单个上游群集作为请求的目标群集相比,`weighted_clusters`选项允许指定多个上游群集,以及指定要转发给每个群集的流量的百分比权重。路由器将根据权重选择上游集群。
```
{
"clusters": [],
"runtime_key_prefix" : "..."
}
```
- **clusters**<br />
(required, array) 指定与路由器相关的一个或多个上游群集。
```
{
"name" : "...",
"weight": "..."
}
```
- **name**<br />
(required, string) 上游群集的名称。群集必须存在于[群集管理器](../../Configurationreference/Clustermanager.md)配置中。
- **weight**<br />
(required, integer) 一个0-100之间的整数,当请求与路由匹配时,选择上游集群的权重比。集群组中所有权重之和必须为100。
- **runtime_key_prefix**<br />
(optional, string) 指定运行时每个群集相关的运行时键的前缀。当指定`runtime_key_prefix`时,路由器将在键为`runtime_key_prefix + "." + cluster[i].name`下查找与每个上游集群相关的权重。其中,`cluster[i]`表示集群组中的条目。如果群集的运行时键不存在,则配置文件中指定的值将用作默认权重。有关键名称如何映射到底层实现,请参阅[运行时](../../Operationsandadministration/Runtime.md)文档。
注意:如果运行时权重之和超过100,则流量拆分的行为将未定义(尽管请求将被路由到其中一个集群)。
### Hash policy
如果上游群集使用哈希负载平衡器,则指定路由的哈希策略。
```
{
"header_name": "..."
}
```
- **header_name**<br />
(required, string) 获取的请求头部的名称作为哈希值。如果请求头不存在,负载均衡器将使用一个随机数作为哈希值,从而使得有效地使负载均衡策略变为随机策略。
### Decorator
指定路由的修饰符。
```
{
"operation": "..."
}
```
- **operation**<br />
(required, string) 与此路由匹配的请求相关的操作名称。如果已启用跟踪,则将使用此信息作为为此请求跟踪记录的span名称。注意:对于入口(入站)请求或出口(出站)响应,此值可能会被`x-envoy-decorator-operation`头部覆盖。
### Opaque Config
可以通过“不透明配置”机制为过滤器提供额外的配置。在路由配置中指定属性列表。该配置不能未被Envoy解释,可以在用户定义的过滤器中访问。该配置是一个通用的字符串映射。不支持嵌套对象。
```
[
{"...": "..."}
]
```
### Cors
设置路由的优先于虚拟主机的设置。
```
{
"enabled": false,
"allow_origin": ["http://foo.example"],
"allow_methods": "POST, GET, OPTIONS",
"allow_headers": "Content-Type",
"allow_credentials": false,
"expose_headers": "X-Custom-Header",
"max_age": "86400"
}
```
- **enabled**<br />
(optional, boolean) 默认为true。只有在路由上启用并设置为false,才会禁用此路由的CORS。该设置对虚拟主机没有影响。
- **allow_origin**<br />
(optional, array) 将允许做CORS请求的来源。通配符“*”表示允许任何来源。
- **allow_methods**<br />
(optional, string) `access-control-allow-methods`头的内容。以逗号分隔的HTTP方法列表。
- **allow_headers**<br />
(optional, string) `access-control-allow-headers`头的内容。以逗号分隔的HTTP标题列表。
- **allow_credentials**<br />
(optional, boolean) 资源是否允许凭证。
- **expose_headers**<br />
(optional, string) `access-control-expose-headers`头的内容。以逗号分隔的HTTP标题列表。
- **max_age**<br />
(optional, string) `access-control-max-age`头的内容。以秒为单位的值,可以缓存对预检请求的响应时间。
## 返回
- [上一级](../HTTPRouteconfiguration.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跟踪?