

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

# 网关路由
<a name="gateway-routes"></a>

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

网关路由附加到虚拟网关，并将流量路由到现有虚拟服务。如果路由与请求匹配，它可以将流量分配到目标虚拟服务。本主题可帮助您处理服务网格中的网关路由。

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

------
#### [ AWS 管理控制台 ]

**要使用创建网关路由 AWS 管理控制台**

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

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

1. 在左侧导航中选择**虚拟网关**。

1. 选择要与新网关路由关联的虚拟网关。如果没有列出任何网关，则需要先[创建一个虚拟网关](virtual_gateways.md#create-virtual-gateway)。您只能为您的账户列为**资源所有者的**虚拟网关创建网关路由。

1. 在**网关路由**表中，选择**创建网关路由**。

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

1. **对于**网关路由类型**，请选择 **http**、**http2** 或 grpc。**

1. 选择现有的**虚拟服务名称**。如果没有列出任何虚拟服务，则需要先创建一个[虚拟服务](virtual_services.md#create-virtual-service)列表。

1. 为**虚拟服务提供商端口选择与目标相对应的端口**。当**所选虚拟服务的提供商（路由器或节点）有多个侦听器时，需要**使用虚拟服务提供商端口。

1. （可选）在**优先级**中，指定此网关路由的优先级。

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

     如果所选类型为 **http/http2**：
     + （可选）**方法** ‐ 指定要在传入的 **http**/**http2** 请求中匹配的方法标头。
     + （可选）**端口匹配** - 匹配传入流量的端口。如果此虚拟网关有多个侦听器，则**需要**匹配端口。
     + （可选）**精确/后缀主机名** - 指定在路由到目标虚拟服务的传入请求上应匹配的主机名。
     + （可选）**Prefix/Exact/Regex路径**-匹配网址路径的方法。
       + **前缀匹配** - 默认情况下，网关路由的匹配请求将重写为目标虚拟服务的名称，匹配的前缀将重写为 `/`。根据您配置虚拟服务的方式，它可能会使用虚拟路由器根据特定的前缀或标头将请求路由到不同的虚拟节点。
**重要**  
您不能为**前缀匹配**指定 `/aws-appmesh*` 或 `/aws-app-mesh*`。这些前缀保留供将来的 App Mesh 内部使用。
如果定义了多条网关路由，则会将请求与前缀最长的路由相匹配。例如，如果存在两条网关路由，其中一条的前缀为 `/chapter`，一条的前缀为 `/`，则请求 `www.example.com/chapter/` 将带 `/chapter` 前缀的网关路由进行匹配。
**注意**  
如果您启用基于**路径**/**前缀**的匹配，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** 类型：
     + **主机名匹配类型**和（可选）**精确/后缀匹配** - 指定在路由到目标虚拟服务的传入请求上应匹配的主机名。
     + **grpc 服务名称** —— **grpc** 服务充当应用程序的 API，定义为。 ProtoBuf
**重要**  
您不能为**服务名称**指定 `/aws.app-mesh*` 或 `aws.appmesh`。这些服务名称保留供将来 App Mesh 内部使用。
     + （可选）**元数据** - 指定 **grpc** 的元数据。它应该与传入的请求相匹配，以路由到目标虚拟服务。

1. （可选）对于**重写**配置：
   + 

     如果所选类型为** http/http2**：
     + 

       如果 **前缀** 是选定的匹配类型：
       + **覆盖主机名的自动重写** - 默认情况下，主机名将重写为目标虚拟服务的名称。
       + **覆盖前缀的自动重写** - 开启后，** Prefix rewrite **会指定重写前缀的值。
     + 

       如果**精确路径**是选定的匹配类型：
       + **覆盖主机名的自动重写** - 默认情况下，主机名将重写为目标虚拟服务的名称。
       + **路径重写** - 指定重写路径的值。没有默认路径。
     + 

       如果**正则表达式路径**是选定的匹配类型：
       + **覆盖主机名的自动重写** - 默认情况下，主机名将重写为目标虚拟服务的名称。
       + **路径重写** - 指定重写路径的值。没有默认路径。
   + 

     如果选择了 **grpc** 类型：
     + **覆盖主机名的自动重写** - 默认情况下，主机名将重写为目标虚拟服务的名称。

1. 选择**创建网关路由**以完成。

------
#### [ AWS CLI ]

**使用 AWS CLI创建网关路由。**

使用以下命令创建网关路由，然后输入 JSON（用您自己的*red*值替换值）：

1. 

   ```
   aws appmesh create-virtual-gateway \ 
   --mesh-name meshName \ 
   --virtual-gateway-name virtualGatewayName \
   --gateway-route-name gatewayRouteName \ 
   --cli-input-json file://create-gateway-route.json
   ```

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

   ```
   {
       "spec": {
           "httpRoute" : {
               "match" : {
                   "prefix" : "/"
               },
               "action" : {
                   "target" : {
                       "virtualService": {
                           "virtualServiceName": "serviceA.svc.cluster.local"
                       }
                   }
               }
           }
       }
   }
   ```

1. 输出示例：

   ```
   {
       "gatewayRoute": {
           "gatewayRouteName": "gatewayRouteName",
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualGateway/virtualGatewayName/gatewayRoute/gatewayRouteName",
               "createdAt": "2022-04-06T11:05:32.100000-05:00",
               "lastUpdatedAt": "2022-04-06T11:05:32.100000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 1
           },
           "spec": {
               "httpRoute": {
                   "action": {
                       "target": {
                           "virtualService": {
                               "virtualServiceName": "serviceA.svc.cluster.local"
                           }
                       }
                   },
                   "match": {
                       "prefix": "/"
                   }
               }
           },
           "status": {
               "status": "ACTIVE"
           },
           "virtualGatewayName": "gatewayName"
       }
   }
   ```

有关使用 for App Mesh 创建网关路由的更多信息，请参阅 AWS CLI 参考中的[create-gateway-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-gateway-route.html)命令。 AWS CLI 

------

## 删除网关路由
<a name="delete-gateway-route"></a>

------
#### [ AWS 管理控制台 ]

**要使用删除网关路由 AWS 管理控制台**

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

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

1. 在左侧导航中选择**虚拟网关**。

1. 选择要从中删除网关路由的虚拟网关。

1. 在**网关路由**表中，选择要删除的网关路由，然后选择**删除**。只有当您的账户被列为**资源所有者**时，您才能删除网关路由。

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

------
#### [ AWS CLI ]

**要使用删除网关路由 AWS CLI**

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

   ```
   aws appmesh delete-gateway-route \
        --mesh-name meshName \
        --virtual-gateway-name virtualGatewayName \
        --gateway-route-name gatewayRouteName
   ```

1. 输出示例：

   ```
   {
       "gatewayRoute": {
           "gatewayRouteName": "gatewayRouteName",
           "meshName": "meshName",
           "metadata": {
               "arn": "arn:aws:appmesh:us-west-2:210987654321:mesh/meshName/virtualGateway/virtualGatewayName/gatewayRoute/gatewayRouteName",
               "createdAt": "2022-04-06T11:05:32.100000-05:00",
               "lastUpdatedAt": "2022-04-07T10:36:33.191000-05:00",
               "meshOwner": "123456789012",
               "resourceOwner": "210987654321",
               "uid": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
               "version": 2
           },
           "spec": {
               "httpRoute": {
                   "action": {
                       "target": {
                           "virtualService": {
                               "virtualServiceName": "serviceA.svc.cluster.local"
                           }
                       }
                   },
                   "match": {
                       "prefix": "/"
                   }
               }
           },
           "status": {
               "status": "DELETED"
           },
           "virtualGatewayName": "virtualGatewayName"
       }
   }
   ```

有关使用 for App Mesh 删除网关路由的更多信息，请参阅 AWS CLI 参考中的[delete-gateway-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/delete-gateway-route.html)命令。 AWS CLI 

------