路由 - AWS App Mesh

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

路由

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

创建路由

AWS Management Console
使用 AWS Management Console 创建路由
  1. 打开 App Mesh 控制台,网址为 https://console.aws.amazon.com/appmesh/

  2. 选择要在其中创建路由的网格。列出了您拥有的所有网格以及已与您共享的所有网格。

  3. 在左侧导航中,选择虚拟路由器

  4. 选择要将新路由与之关联的虚拟路由器。如果没有列出任何路由器,则需要先创建一个虚拟路由器

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

  6. 对于路由名称,指定要用于您的路由的名称。

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

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

  9. (可选)选择其他配置。从下面的协议中,选择您为路由类型选择的协议,并根据需要在控制台中指定设置。

  10. 对于目标配置,选择要将流量路由到的现有 App Mesh 虚拟节点并指定权重。您可以选择添加目标来添加其他目标。所有目标相加必须等于100。如果没有列出虚拟节点,则必须先创建一个。如果所选虚拟节点有多个侦听器,则需要目标端口

  11. 对于匹配配置,请指定:

    匹配配置不适用于 tcp

    • 如果所选类型为 http/http2

      • (可选)方法 ‐ 指定要在传入的 http/http2 请求中匹配的方法标头。

      • (可选)端口匹配 — 匹配传入流量的端口。如果此虚拟路由器有多个侦听器,则需要匹配端口。

      • (可选)前缀/精确/正则表达式路径 — 匹配网址路径的方法。

        • 前缀匹配 — 默认情况下,网关路由的匹配请求将重写为目标虚拟服务的名称,匹配的前缀将重写为 /。根据您配置虚拟服务的方式,它可能会使用虚拟路由器根据特定的前缀或标头将请求路由到不同的虚拟节点。

          注意

          如果您启用基于路径/前缀的匹配,App Mesh 会启用路径标准化(normalize_path 和 merge_slashes),以最大限度地减少出现路径混淆漏洞的可能性。

          当参与请求的各方使用不同的路径表示形式时,就会出现路径混淆漏洞。

        • 精确匹配 — exact 参数会禁用路径的部分匹配,并确保只有当路径与当前 url 完全匹配时,才会返回路由。

        • 正则表达式匹配 — 用于描述多个网址实际上可以识别网站上的单个页面的模式。

      • (可选)查询参数 — 此字段允许您匹配查询参数。

      • (可选)标头 ‐ 指定 httphttp2 的标头。它应该与传入的请求相匹配,以路由到目标虚拟服务。

    • 如果选择了 grpc 类型:

      • 服务名称 — 要匹配请求的目标服务。

      • 方法名称 — 要匹配请求的目标方法。

      • (可选)元数据—根据元数据的存在情况指定 Match。所有内容都必须匹配才能处理请求。

  12. 选择创建路由

AWS CLI

使用 AWS CLI 创建路由。

使用以下命令创建 gRPC 路径并输入 JSON(用您自己的值替换红色值):

  1. aws appmesh create-route \ --cli-input-json file://create-route-grpc.json
  2. 示例 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" }
  3. 输出示例:

    { "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" } }

有关使用适用于 App Mesh 的 AWS CLI 创建路径的更多信息,请参阅 AWS CLI 参考资料中的 create-ro ute 命令。

(可选)匹配

  • (可选)输入目标服务的服务名称以匹配请求。如果没有指定名称,则将匹配对任何服务的请求。

  • (可选)输入目标方法的方法名称以匹配请求。如果没有指定名称,则将匹配对任何方法的请求。如果指定方法名称,则必须指定服务名称。

(可选)元数据

选择添加元数据

  • (可选)输入要作为路由依据的元数据名称,选择匹配类型,然后输入匹配值。选择反转将匹配相反情况。例如,如果您将元数据名称指定为myMetadata,将匹配类型指定为精确,将匹配值指定为 123,然后选择反转,则该路由将匹配元数据名称以 123 之外的任何值开头的请求。

  • (可选)选择添加元数据以添加最多十个元数据项。

(可选)重试策略

重试策略使客户端可以保护自己免受间歇性网络故障或间歇性服务器端故障的影响。重试策略是可选的,但我们建议您这样做。重试超时值定义每次重试尝试(包括初次尝试)的超时时间。如果您未定义重试策略,那么 App Mesh 可能会自动为每条路由创建默认策略。有关更多信息,请参阅 默认路由重试策略

  • 对于重试超时,输入超时持续时间的单位数。如果您选择任何协议重试事件,则必须输入一个值。

  • 重试超时单位中,选择一个单位。如果您选择任何协议重试事件,则必须输入一个值。

  • 对于最大重试次数,输入请求失败时进行的最大重试次数。如果您选择任何协议重试事件,则必须输入一个值。我们建议至少将值设置为2。

  • 选择一个或多个 HTTP 重试事件。我们建议至少选择流错误网关错误

  • 选择 TCP 重试事件

  • 选择一个或多个 gRPC 重试事件。我们建议至少选择已取消不可用

(可选)超时

  • 默认值为 15 秒。如果您指定了重试策略,则在此处指定的持续时间应始终大于或等于重试持续时间乘以您在重试策略中定义的最大重试次数,这样您的重试策略才能完成。如果您指定的持续时间大于 15 秒,请确保为任何虚拟节点 Target 的侦听器指定的超时时间也大于 15 秒。有关更多信息,请参阅虚拟节点

  • 0 值禁用超时。

  • 路径可以空闲的最长时间。

(可选)匹配

  • 指定路由应匹配的前缀。例如,如果您的虚拟服务名称为 service-b.local,并且您希望路由将请求匹配到 service-b.local/metrics,则前缀应为 /metrics。指定所有流量的 / 路由。

  • (可选)选择一种方法

  • (可选)选择一个方案。仅适用于 HTTP2 路由。

(可选)标头

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

  • (可选)选择添加标头。您最多可以添加十个标头。

(可选)重试策略

重试策略使客户端可以保护自己免受间歇性网络故障或间歇性服务器端故障的影响。重试策略是可选的,但我们建议您这样做。重试超时值定义每次重试尝试(包括初次尝试)的超时时间。如果您未定义重试策略,那么 App Mesh 可能会自动为每条路由创建默认策略。有关更多信息,请参阅 默认路由重试策略

  • 对于重试超时,输入超时持续时间的单位数。如果您选择任何协议重试事件,则必须输入一个值。

  • 重试超时单位中,选择一个单位。如果您选择任何协议重试事件,则必须输入一个值。

  • 对于最大重试次数,输入请求失败时进行的最大重试次数。如果您选择任何协议重试事件,则必须输入一个值。我们建议至少将值设置为2。

  • 选择一个或多个 HTTP 重试事件。我们建议至少选择流错误网关错误

  • 选择 TCP 重试事件

(可选)超时

  • 请求超时 — 默认超时时间为 15 秒。如果您指定了重试策略,则在此处指定的持续时间应始终大于或等于重试持续时间乘以您在重试策略中定义的最大重试次数,这样您的重试策略才能完成。

  • 空闲时长 — 默认值为 300 秒。

  • 0 值禁用超时。

注意

如果您指定的超时时间大于默认值,请确保为所有虚拟节点参与者侦听器指定的超时时间也大于默认值。但是,如果您将超时时间缩短到低于默认值的值,则可以选择更新虚拟节点的超时时间。有关更多信息,请参阅虚拟节点

(可选)超时

  • 空闲时长 — 默认值为 300 秒。

  • 0 值禁用超时。

删除路由

AWS Management Console
使用 AWS Management Console 删除路由表
  1. 打开 App Mesh 控制台,网址为 https://console.aws.amazon.com/appmesh/

  2. 选择要从中删除路径的网格。列出了您拥有的所有网格以及已与您共享的所有网格。

  3. 在左侧导航中,选择虚拟路由器

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

  5. 路径表中,选择要删除的路线,然后选择右上角的删除

  6. 在确认框中,键入 delete,然后单击删除

AWS CLI
使用 AWS CLI 删除路由表
  1. 使用以下命令删除您的路线(用您自己的值替换红色值):

    aws appmesh delete-route \ --mesh-name meshName \ --virtual-router-name routerName \ --route-name routeName
  2. 输出示例:

    { "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" } }

有关使用适用于 App Mesh 删除路径 AWS CLI 的更多信息,请参阅 AWS CLI 参考资料中的 delete-route 命令。