

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 路由
<a name="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-route"></a>

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

**使用 建立路由 AWS 管理主控台**

1. 在 https：//[https://console.aws.amazon.com/appmesh/](https://console.aws.amazon.com/appmesh/) 開啟 App Mesh 主控台。

1. 選擇您要在其中建立路由的網格。會列出您擁有且已與您[共用](sharing.md)的所有網格。

1. 在左側導覽中，選擇 **Virtual routers (虛擬路由器)**。

1. 選擇您要與新路由建立關聯的虛擬路由器。如果沒有列出，則需要先[建立虛擬路由器](virtual_routers.md#create-virtual-router)。

1. 在 **Routes (路由)** 表中，選擇 **Create route (建立路由)**。若要建立路由，您的帳戶 ID 必須列為路由**的資源擁有者**。

1. 對於 **Route name (路由名稱)**，指定您的路由要使用的名稱。

1. 針對**路由類型**，選擇您要路由的通訊協定。您選取的通訊協定必須符合您為虛擬路由器選取的接聽程式通訊協定，以及您路由流量的虛擬節點。

1. （選用） 對於**路由優先順序**，請指定 0-1000 的優先順序，以用於您的路由。將依指定值比對路由，0 為最高優先順序。

1. （選用） 選擇**其他組態**。從下面的通訊協定中，選擇您為 **Route 類型**選取的通訊協定，並視需要在主控台中指定設定。

1. 針對**目標組態**，選取要將流量路由到的現有 App Mesh 虛擬節點，並指定**權重**。您可以選擇**新增目標**以新增其他目標。所有目標的百分比最多必須加 100。如果未列出任何虛擬節點，則您必須先[建立一個](virtual_nodes.md#vn-create-virtual-node)。如果選取的虛擬節點有多個接聽程式，**則需要****目標連接埠**。

1. 針對**相符**組態，指定：

   ***比對**組態不適用於 `tcp`*
   + 

     如果 **http/http2** 是選取的類型：
     + （選用） **方法** - 指定要在傳入 **http**/**http2** 請求中比對的方法標頭。
     + （選用） **連接埠比對** - 比對傳入流量的連接埠。如果此虛擬路由器具有多個接聽程式，**則需要**連接埠比對。
     + （選用） **Prefix/Exact/Regex 路徑** - 符合 URL 路徑的方法。
       + **字首相符** - 根據預設`/`，閘道路由的相符請求會重寫至目標虛擬服務的名稱，相符字首則會重寫至 。視您設定虛擬服務的方式而定，它可以使用虛擬路由器，根據特定字首或標頭，將請求路由到不同的虛擬節點。
**注意**  
如果您啟用**路徑**/**字首**型比對，App Mesh 會啟用路徑標準化 ([normalize\$1path](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) 和 [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))，以將路徑混淆漏洞的可能性降至最低。  
當參與請求的各方使用不同的路徑表示法時，會發生路徑混淆漏洞。
       + **完全相符** - 精確參數會停用路由的部分相符項目，並確保只有在路徑符合目前的 URL 時才傳回路由。
       + **Regex 比對** - 用於描述多個 URLs可能實際識別網站上的單一頁面的模式。
     + （選用） **查詢參數** - 此欄位可讓您比對查詢參數。
     + （選用） **標頭** - 指定 **http** 和 **http2** 的標頭。它應該符合路由至目標虛擬服務的傳入請求。
   + 

     如果 **grpc** 是選取的類型：
     + **服務名稱** - 符合請求的目的地服務。
     + **方法名稱** - 符合請求的目的地方法。
     + （選用） **中繼資料** - `Match` 根據中繼資料的存在來指定 。所有 都必須符合才能處理請求。

1. 選取**建立路由**。

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

**使用 建立路由 AWS CLI。**

使用下列命令和輸入 JSON 建立 gRPC 路由 （使用您自己的值取代*紅色*值）：

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

如需使用 AWS CLI 適用於 App Mesh 的 建立路由的詳細資訊，請參閱 AWS CLI 參考中的 [create-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-route.html) 命令。

------

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

### （選用） **相符**

+ （選用） 輸入要比對請求的目的地服務的服務**名稱**。如果您未指定名稱，則會比對對任何服務的請求。
+ （選用） 輸入要比對請求之目的地方法**的方法名稱**。如果您未指定名稱，則會比對任何方法的請求。如果您指定方法名稱，則必須指定服務名稱。

### （選用） **中繼資料**


選擇 **Add metadata** (新增中繼資料)。
+ （選用） 輸入您要根據其路由的**中繼資料名稱**，選取**相符類型**，然後輸入**相符值**。選取**反轉**將與相反。例如，如果您指定 的**中繼資料名稱**`myMetadata`、**Exact** 的**相符類型**、 的**相符值**`123`，然後選取**反轉**，則路由會針對中繼資料名稱開頭為 以外的任何請求進行比對`123`。
+ （選用） 選取**新增中繼資料**以新增最多十個中繼資料項目。

### （選用） **重試政策**


重試政策可讓用戶端保護自己免於間歇性的網路故障或間歇性的伺服器端故障。重試政策是選用的，但建議使用。重試逾時值會定義每次重試的逾時 （包括初始嘗試）。如果您未定義重試政策，則 App Mesh 可能會自動為每個路由建立預設政策。如需詳細資訊，請參閱[預設路由重試政策](envoy-defaults.md#default-retry-policy)。
+ 針對**重試逾時**，輸入逾時持續時間的單位數。如果您選擇任何通訊協定重試事件，則需要值。
+ 針對**重試逾時單位**，選取單位。如果您選擇任何通訊協定重試事件，則需要值。
+ 針對**重試次數上限**，輸入請求失敗時的重試次數上限。如果您選擇任何通訊協定重試事件，則需要值。我們建議的值至少為兩個。
+ 選取一或多個 **HTTP 重試事件**。我們建議至少選取 **stream-error** 和 **gateway-error**。
+ 選取 **TCP 重試事件**。
+ 選取一或多個 **gRPC 重試事件**。我們建議至少選取**已取消**和**無法使用**。

### **（選用） 逾時**

+ 預設值為 15 秒。如果您指定**了重試政策**，則您在此處指定的持續時間應始終大於或等於重試持續時間乘以您在**重試政策**中定義的重試**次數上限**，以便您的重試政策可以完成。如果您指定的持續時間大於 15 秒，請確保為任何虛擬節點**目標**的接聽程式指定的逾時也大於 15 秒。如需詳細資訊，請參閱[虛擬節點](https://docs.aws.amazon.com/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 路由。

### （選用） 標頭

+ （選用） 選取**新增標頭**。輸入您要根據其路由的**標頭名稱**，選取**相符類型**，然後輸入**相符值**。選取**反轉**將與相反。例如，如果您使用`clientRequestId`**字首** 指定名為 的標頭`123`，然後選取**反轉**，則路由會比對任何標頭開頭為 以外的請求`123`。
+ （選用） 選取**新增標頭**。您最多可以新增十個標頭。

### **（選用） 重試政策**


重試政策可讓用戶端保護自己免於間歇性的網路故障或間歇性的伺服器端故障。重試政策是選用的，但建議使用。重試逾時值會定義每次重試的逾時 （包括初始嘗試）。如果您未定義重試政策，則 App Mesh 可能會自動為每個路由建立預設政策。如需詳細資訊，請參閱[預設路由重試政策](envoy-defaults.md#default-retry-policy)。
+ 針對**重試逾時**，輸入逾時持續時間的單位數。如果您選擇任何通訊協定重試事件，則需要值。
+ 針對**重試逾時單位**，選取單位。如果您選擇任何通訊協定重試事件，則需要值。
+ 針對**重試次數上限**，輸入請求失敗時的重試次數上限。如果您選擇任何通訊協定重試事件，則需要值。我們建議的值至少為兩個。
+ 選取一或多個 **HTTP 重試事件**。我們建議至少選取 **stream-error** 和 **gateway-error**。
+ 選取 **TCP 重試事件**。

### **（選用） 逾時**

+ **請求逾時** – 預設值為 15 秒。如果您指定**了重試政策**，則您在此處指定的持續時間應始終大於或等於重試持續時間乘以您在**重試政策**中定義的重試**次數上限**，以便您的重試政策可以完成。
+ **閒置持續時間** – 預設值為 300 秒。
+ 值為 `0` 會停用逾時。

**注意**  
 如果您指定的逾時大於預設值，請確定為所有虛擬節點參與者的接聽程式指定的逾時也大於預設值。不過，如果您將逾時減少到低於預設值的值，您可以選擇更新虛擬節點的逾時。如需詳細資訊，請參閱[虛擬節點](https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_nodes.html)。

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

### **（選用） 逾時**

+ **閒置持續時間** – 預設值為 300 秒。
+ 值為 `0` 會停用逾時。

## 刪除路由
<a name="delete-route"></a>

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

**使用 刪除路由 AWS 管理主控台**

1. 在 https：//[https://console.aws.amazon.com/appmesh/](https://console.aws.amazon.com/appmesh/) 開啟 App Mesh 主控台。

1. 選擇您要從中刪除路由的網格。會列出您擁有和已與您[共用](sharing.md)的所有網格。

1. 在左側導覽中，選擇 **Virtual routers (虛擬路由器)**。

1. 選擇您要從中刪除路由的路由器。

1. 在**路由**表中，選擇您要刪除的路由，然後選取右上角的**刪除**。

1. 在確認方塊中，輸入 **delete**，然後按一下**刪除**。

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

**使用 刪除路由 AWS CLI**

1. 使用下列命令來刪除您的路由 （使用您自己的值取代*紅色*值）：

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

如需使用 AWS CLI 適用於 App Mesh 的 刪除路由的詳細資訊，請參閱 AWS CLI 參考中的 [delete-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/delete-route.html) 命令。

------