

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Routes
<a name="routes"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， Amazon 将停止对的支持。 Amazon App Mesh 2026 年 9 月 30 日之后，您将无法再访问 Amazon App Mesh 控制台或 Amazon App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 Amazon App Mesh 到 Amazon ECS Service Connect](https://www.amazonaws.cn/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

路由与虚拟路由器关联。该路由用于匹配对虚拟路由器的请求并将流量分发到其关联的虚拟节点。如果路由与请求匹配，它可以将流量分配到一个或多个目标虚拟节点。您可以为每个虚拟节点指定相对权重。本主题可帮助您处理服务网格中的路由。

## 创建路由
<a name="create-route"></a>

------
#### [ Amazon Web Services 管理控制台 ]

**要使用创建路线 Amazon Web Services 管理控制台**

1. 打开 App Mesh 控制台，网址为[https://console.aws.amazon.com/appmesh/](https://console.amazonaws.cn/appmesh/)。

1. 选择要在其中创建路由的网格。列出了您拥有的所有网格以及已与您[共享](sharing.md)的所有网格。

1. 在左侧导航中，选择**虚拟路由器**。

1. 选择要将新路由与之关联的虚拟路由器。如果没有列出任何路由器，则需要先[创建一个虚拟路由器](virtual_routers.md#create-virtual-router)。

1. 在**路由**表中，选择**创建路由**。要创建路由，必须将您的账户 ID 列为该路径的**资源所有者**。

1. 对于**路由名称**，指定要用于您的路由的名称。

1. 对于**路由类型**，选择您要路由的协议。您选择的协议必须与您为虚拟路由器选择的侦听器协议和要将流量路由到的虚拟节点相匹配。

1. （可选）在**路由优先级**中，从 0-1000 中选择一个优先级以用于您的路由。路由会根据指定的值进行匹配，其中 0 是最高优先级。

1. （可选）选择**其他配置**。从下面的协议中，选择您为**路由类型**选择的协议，并根据需要在控制台中指定设置。

1. 对于**目标配置**，选择要将流量路由到的现有 App Mesh 虚拟节点并指定**权重**。您可以选择**添加目标**来添加其他目标。所有目标的百分比加起来必须等于 100。如果未列出任何虚拟节点，则必须先[创建一个](virtual_nodes.md#vn-create-virtual-node)虚拟节点。如果所选虚拟节点有多个侦听器，则**需要****目标端口**。

1. 对于**匹配**配置，请指定：

   ***匹配**配置不适用于 `tcp`*
   + 

     如果所选类型为 **http/http2**：
     + （可选）**方法** ‐ 指定要在传入的 **http**/**http2** 请求中匹配的方法标头。
     + （可选）**端口匹配** — 匹配传入流量的端口。如果此虚拟路由器有多个侦听器，则**需要**匹配端口。
     + （可选）**Prefix/Exact/Regex路径**-匹配网址路径的方法。
       + **前缀匹配** — 默认情况下，网关路由的匹配请求将重写为目标虚拟服务的名称，匹配的前缀将重写为 `/`。根据您配置虚拟服务的方式，它可能会使用虚拟路由器根据特定的前缀或标头将请求路由到不同的虚拟节点。
**注意**  
如果您启用基于**路径**/**前缀**的匹配，App Mesh 会启用路径标准[化（normalize\$1path 和 [merge\$1slashes](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-httpconnectionmanager-merge-slashes)），以最大限度地减少出现路径](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-httpconnectionmanager-normalize-path)混淆漏洞的可能性。  
当参与请求的各方使用不同的路径表示形式时，就会出现路径混淆漏洞。
       + **精确匹配** — exact 参数会禁用路径的部分匹配，并确保只有当路径与当前 url 完全匹配时，才会返回路由。
       + **正则表达式匹配** ——用于描述多个模式实际上 URLs 可以识别网站上的单个页面。
     + （可选）**查询参数** — 此字段允许您匹配查询参数。
     + （可选）**标头** ‐ 指定** http** 和 **http2** 的标头。它应该与传入的请求相匹配，以路由到目标虚拟服务。
   + 

     如果选择了 **grpc** 类型：
     + **服务名称** — 要匹配请求的目标服务。
     + **方法名称** — 要匹配请求的目标方法。
     + （可选）**元数据**—根据元数据的存在情况指定 `Match`。所有内容都必须匹配才能处理请求。

1. 选择**创建路由**。

------
#### [ Amazon CLI ]

**使用 Amazon CLI创建路由。**

使用以下命令创建 gRPC 路径并输入 JSON（用您自己的值替换*red*值）：

1. 

   ```
   aws appmesh create-route \
        --cli-input-json file://create-route-grpc.json
   ```

1.  create-route-grpc.json **示例**的内容

   ```
   {
       "meshName" : "meshName",
       "routeName" : "routeName",
       "spec" : {
          "grpcRoute" : {
             "action" : {
                "weightedTargets" : [
                   {
                      "virtualNode" : "nodeName",
                      "weight" : 100
                   }
                ]
             },
             "match" : {
                "metadata" : [
                   {
                      "invert" : false,
                      "match" : {
                         "prefix" : "123"
                      },
                      "name" : "myMetadata"
                   }
                ],
                "methodName" : "nameOfmethod",
                "serviceName" : "serviceA.svc.cluster.local"
             },
             "retryPolicy" : {
                "grpcRetryEvents" : [ "deadline-exceeded" ],
                "httpRetryEvents" : [ "server-error", "gateway-error" ],
                "maxRetries" : 3,
                "perRetryTimeout" : {
                   "unit" : "s",
                   "value" : 15
                },
                "tcpRetryEvents" : [ "connection-error" ]
             }
          },
          "priority" : 100
       },
       "virtualRouterName" : "routerName"
   }
   ```

1. 输出示例：

   ```
   {
       "route": {
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualRouter/routerName/route/routeName",
               "createdAt": "2022-04-06T13:48:20.749000-05:00",
               "lastUpdatedAt": "2022-04-06T13:48:20.749000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 1
           },
           "routeName": "routeName",
           "spec": {
               "grpcRoute": {
                   "action": {
                       "weightedTargets": [
                           {
                               "virtualNode": "nodeName",
                               "weight": 100
                           }
                       ]
                   },
                   "match": {
                       "metadata": [
                           {
                               "invert": false,
                               "match": {
                                   "prefix": "123"
                               },
                               "name": "myMetadata"
                           }
                       ],
                       "methodName": "nameOfMehod",
                       "serviceName": "serviceA.svc.cluster.local"
                   },
                   "retryPolicy": {
   "grpcRetryEvents": [
                           "deadline-exceeded"
                       ],
                       "httpRetryEvents": [
                           "server-error",
                           "gateway-error"
                       ],
                       "maxRetries": 3,
                       "perRetryTimeout": {
                           "unit": "s",
                           "value": 15
                       },
                       "tcpRetryEvents": [
                           "connection-error"
                       ]
                   }
               },
               "priority": 100
           },
           "status": {
               "status": "ACTIVE"
           },
           "virtualRouterName": "routerName"
       }
   }
   ```

有关使用 For App Mesh 创建路径 Amazon CLI 的更多信息，请参阅参考资料中的 [create-ro](https://docs.amazonaws.cn/cli/latest/reference/appmesh/create-route.html) ute 命令。 Amazon CLI 

------

### gRPC
<a name="grpc"></a>

### （可选）**匹配**

+ （可选）输入目标服务的**服务名称**以匹配请求。如果您不指定名称，则会匹配对任何服务的请求。
+ （可选）输入目标方法的**方法名称**以匹配请求。如果不指定名称，则会匹配对任何方法的请求。如果指定方法名称，则必须指定服务名称。

### （可选）**元数据**


选择**添加元数据**。
+ （可选）输入要作为路由依据的**元数据名称**，选择**匹配类型**，然后输入**匹配值**。选择**反转**将匹配相反情况。例如，如果您将**元数据名称**指定为`myMetadata`，将**匹配类型**指定为**精确**，将**匹配值**指定为 `123`，然后选择**反转**，则该路由将匹配元数据名称以 `123` 之外的任何值开头的请求。
+ （可选）选择**添加元数据**以添加最多十个元数据项。

### （可选）**重试策略**


重试策略使客户端可以保护自己免受间歇性网络故障或间歇性服务器端故障的影响。重试策略是可选的，但建议使用。重试超时值定义每次重试尝试（包括初次尝试）的超时时间。如果您未定义重试策略，那么 App Mesh 可能会自动为每条路由创建默认策略。有关更多信息，请参阅 [默认路由重试策略](envoy-defaults.md#default-retry-policy)。
+ 对于**重试超时**，输入超时持续时间的单位数。如果您选择任何协议重试事件，则必须输入一个值。
+ 在**重试超时单位**中，选择一个单位。如果您选择任何协议重试事件，则必须输入一个值。
+ 对于**最大重试次数**，输入请求失败时进行的最大重试次数。如果您选择任何协议重试事件，则必须输入一个值。我们建议至少将值设置为2。
+ 选择一个或多个 **HTTP 重试事件**。我们建议至少选择**流错误**和**网关错误**。
+ 选择 **TCP 重试事件**。
+ 选择一个或多个 **gRPC 重试事件**。我们建议至少选择**已取消**且**不可用**。

### **（可选）超时**

+ 默认值为 15 秒。如果您指定了**重试策略**，则在此处指定的持续时间应始终大于或等于重试持续时间乘以您在重试策略中定义的**最大重试次数**，这样您的**重试策略**才能完成。如果您指定的持续时间大于 15 秒，请确保为任何虚拟节点 **Target** 的侦听器指定的超时时间也大于 15 秒。有关更多信息，请参阅[虚拟节点](https://docs.amazonaws.cn/app-mesh/latest/userguide/virtual_nodes.html)。
+ `0` 值禁用超时。
+ 路径可以处于空闲状态的最长时间。

### HTTP 和 HTTP/2
<a name="http-http2"></a>

### （可选）匹配

+ 指定路由应匹配**的前缀**。例如，如果您的虚拟服务名称为 `service-b.local`，并且您希望路由将请求匹配到 `service-b.local/metrics`，则前缀应为 `/metrics`。指定所有流量的 `/` 路由。
+ （可选）选择一种**方法**。
+ （可选）选择一个**方案**。仅适用于 HTTP2 路线。

### （可选）标头

+ （可选）选择**添加标头**。输入要作为路由依据的**标头名称**，选择**匹配类型**，然后输入**匹配值**。选择**反转**将匹配相反情况。例如，如果您指定一个带**前缀** `123` 且名为 `clientRequestId` 的标头，然后选择**反转**，则该路由将与标头是以 `123` 之外的任何值开头的请求相匹配。
+ （可选）选择**添加标头**。您最多可以添加十个标头。

### **（可选）重试策略**


重试策略使客户端可以保护自己免受间歇性网络故障或间歇性服务器端故障的影响。重试策略是可选的，但建议使用。重试超时值定义每次重试尝试（包括初次尝试）的超时时间。如果您未定义重试策略，那么 App Mesh 可能会自动为每条路由创建默认策略。有关更多信息，请参阅 [默认路由重试策略](envoy-defaults.md#default-retry-policy)。
+ 对于**重试超时**，输入超时持续时间的单位数。如果您选择任何协议重试事件，则必须输入一个值。
+ 在**重试超时单位**中，选择一个单位。如果您选择任何协议重试事件，则必须输入一个值。
+ 对于**最大重试次数**，输入请求失败时进行的最大重试次数。如果您选择任何协议重试事件，则必须输入一个值。我们建议至少将值设置为2。
+ 选择一个或多个 **HTTP 重试事件**。我们建议至少选择**流错误**和**网关错误**。
+ 选择 **TCP 重试事件**。

### **（可选）超时**

+ **请求超时** — 默认超时时间为 15 秒。如果您指定了**重试策略**，则在此处指定的持续时间应始终大于或等于重试持续时间乘以您在重试策略中定义的**最大重试次数**，这样您的**重试策略**才能完成。
+ **空闲时长** — 默认值为 300 秒。
+ `0` 值禁用超时。

**注意**  
 如果您指定的超时时间大于默认值，请确保为所有虚拟节点参与者侦听器指定的超时时间也大于默认值。但是，如果您将超时时间缩短到低于默认值的值，则可以选择更新虚拟节点的超时时间。有关更多信息，请参阅[虚拟节点](https://docs.amazonaws.cn/app-mesh/latest/userguide/virtual_nodes.html)。

### TCP
<a name="tcp"></a>

### **（可选）超时**

+ **空闲时长** — 默认值为 300 秒。
+ `0` 值禁用超时。

## 删除路线
<a name="delete-route"></a>

------
#### [ Amazon Web Services 管理控制台 ]

**要删除路线，请使用 Amazon Web Services 管理控制台**

1. 打开 App Mesh 控制台，网址为[https://console.aws.amazon.com/appmesh/](https://console.amazonaws.cn/appmesh/)。

1. 选择要从中删除路径的网格。列出了您拥有的所有网格以及已与您[共享](sharing.md)的所有网格。

1. 在左侧导航中，选择**虚拟路由器**。

1. 选择要从中删除路由的路由器。

1. 在**路径**表中，选择要删除的路线，然后选择右上角的**删除**。

1. 在确认框中，键入 **delete**，然后单击**删除**。

------
#### [ Amazon CLI ]

**要删除路线，请使用 Amazon CLI**

1. 使用以下命令删除您的路线（用您自己的*red*值替换这些值）：

   ```
   aws appmesh delete-route \
        --mesh-name meshName \
        --virtual-router-name routerName \
        --route-name routeName
   ```

1. 输出示例：

   ```
   {
       "route": {
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualRouter/routerName/route/routeName",
               "createdAt": "2022-04-06T13:46:54.750000-05:00",
               "lastUpdatedAt": "2022-04-07T10:43:57.152000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 2
           },
           "routeName": "routeName",
           "spec": {
               "grpcRoute": {
                   "action": {
                       "weightedTargets": [
                           {
                               "virtualNode": "nodeName",
                               "weight": 100
                           }
                       ]
                   },
                   "match": {
                       "metadata": [
                           {
                               "invert": false,
                               "match": {
                                   "prefix": "123"
                               },
                               "name": "myMetadata"
                           }
                       ],
                       "methodName": "methodName",
                       "serviceName": "serviceA.svc.cluster.local"
                   },
                   "retryPolicy": {
                       "grpcRetryEvents": [
                           "deadline-exceeded"
                       ],
                       "httpRetryEvents": [
                           "server-error",
                           "gateway-error"
                       ],
                       "maxRetries": 3,
                       "perRetryTimeout": {
                           "unit": "s",
                           "value": 15
                       },
                       "tcpRetryEvents": [
                           "connection-error"
                       ]
                   }
               },
               "priority": 100
           },
           "status": {
               "status": "DELETED"
           },
           "virtualRouterName": "routerName"
       }
   }
   ```

有关使用 For App Mesh 删除路径 Amazon CLI 的更多信息，请参阅参考资料中的 [delete-rout](https://docs.amazonaws.cn/cli/latest/reference/appmesh/delete-route.html) e 命令。 Amazon CLI 

------