在此單元中,您將學習將 node.js 應用程式部署為 Application Load Balancer (ALB) 之後的一組互連服務。接著會使用 ALB,將流量從巨型應用程式順暢轉換至微型服務。 開始建置

您可遵循此程序來部署微型服務,並將應用程式流量安全地轉離巨型應用程式。

架構概觀
  1. 轉換流量
    這是初始組態。在 Amazon ECS 的容器中執行的巨型 node.js 應用程式。
  2. 啟動微型服務
    您會使用在上個單元中建立並推送至 Amazon ECR 的三個容器映像,在現有的 Amazon ECS 叢集中啟動三個微型服務。
  3. 設定目標群組
    如同第 2 單元,您會為每項服務新增目標群組,並更新 ALB 規則以連接新的微型服務。
  4. 關閉巨型應用程式
    您會藉由變更 ALB 中的一項規則,開始將流量路由至執行中的微型服務。驗證流量重新路由後,關閉巨型應用程式。

依照以下的逐步說明來部署微型服務。選取每一個步驟號碼可展開相應部分內容。

break-the-monolith
  • 步驟 1.為您的服務編寫任務定義

    您將部署三項新服務至第 2 單元中啟動的叢集。與第 2 單元一樣,您將為每項服務編寫任務定義

    ⚐ 注意:可以將多個容器新增至一個任務定義中。這意味著您可以將所有三項微型服務作為單一服務中的不同容器來執行。但是,由於每個容器都需要根據服務線性擴展,因此該方法仍然具有整體性。您的目標是擁有三項獨立的服務。每項服務需要其自身的任務定義,其執行具有相應服務映像的容器。

    您可以從 Amazon ECS 主控台建立這些任務定義,也可以透過將其編寫為 JSON 來加速處理。若要將任務定義寫為 JSON 檔案,請遵循下列步驟:

    1. Amazon Container Services 主控台的「Amazon ECS」項下,選取「任務定義」。
    2. 在「任務定義」頁面中,選取「建立新的任務定義」按鈕。
    3. 選取啟動類型相容性頁面中,選取「EC2」選項,然後選取「下一步」。
    4. 在設定任務和容器定義頁面中,捲動至「磁碟區」區段,然後選取「透過 JSON 設定」按鈕。
    5. 複製以下程式碼片段並貼至 JSON 欄位,以替換現有程式碼。
      請記住要替換 [service-name]、[account-ID]、[region] 和 [tag] 預留位置。

    ⚐ 注意:任務定義的參數如下:

    • Name = [service-name: posts, threads, and users] 
    • Image = [Amazon ECR repository image URL]:latest 
    • cpu = 256 
    • memory = 256 
    • Container Port = 3000 
    • Host Post = 0
    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.[region].amazonaws.com/[service-name]:[tag]",
                "memoryReservation": "256",
                "cpu": "256",
                "essential": true,
                "portMappings": [
                    {
                        "hostPort": "0",
                        "containerPort": "3000",
                        "protocol": "tcp"
                    }
                ]
            }
        ],
        "volumes": [],
        "networkMode": "bridge",
        "placementConstraints": [],
        "family": "[service-name]"
    }

    ♻ 重複以上步驟,為每項服務建立任務定義:

    • 文章
    • 討論串
    • 使用者
  • 步驟 2.設定 Application Load Balancer:目標群組

    如同第 2 單元中所述,為每項服務 (文章、討論串和使用者) 設定目標群組。目標群組有助於流量正確到達指定的服務。您將使用 AWS CLI 設定目標群組。但是,在繼續之前,確保您採用了適用於本教學的正確 VPC 名稱:

    • 瀏覽至 EC2 主控台的「Load Balancer」區段
    • 選中示範旁邊的核取方塊,選取「描述」標籤,然後尋找「VPC」屬性 (採用以下格式:vpc-xxxxxxxxxxxxxxxxx)。
      ⚐ 注意:在設定目標群組時需要 VPC 屬性。

    設定目標群組

    在終端機中,輸入以下命令,為每項服務 (文章、討論串和使用者) 建立目標群組。此外,您會建立一個目標群組 (drop-traffic) 以避免流量在微型服務全面運作後傳達到巨型應用程式。請記住要替換以下預留位置:[region]、[service-name] 和 [vpc-attribute]。

    服務名稱:poststhreadsusersdrop-traffic

    aws elbv2 create-target-group --region [region] --name [service-name] --protocol HTTP --port 80 --vpc-id [vpc-attribute] --healthy-threshold-count 2 --unhealthy-threshold-count 2 --health-check-timeout-seconds 5 --health-check-interval-seconds 6
    目標群組
  • 步驟 3.設定接聽程式規則

    接聽程式會檢查 ALB 內送連線請求,以正確路由流量。

    現在,所有的四項服務 (巨型應用程式和三項微型服務) 皆已於相同的負載平衡器後方運作。為了從巨型應用程式轉換至微型服務,您會開始將流量路由至微型服務,並不再將流量路由至巨型應用程式。

    存取接聽程式規則

    • 瀏覽至 EC2 主控台的「Load Balancer」區段
    • 尋找名稱為「demo」的 Load Balancer,然後選中其旁邊的核取方塊,以查看 Load Balancer 的詳細資訊。
    • 選取「接聽程式」標籤。

    更新接聽程式規則

    此標籤中僅列出一個接聽程式。請執行以下步驟來編輯接聽程式規則:

    • 在「規則」列下,選取「檢視/編輯規則」。
    • 在「規則」頁面上,選取加號 (+) 按鈕。
      插入規則」選項即出現在頁面上。 
    • 使用以下規則範本來插入必要的規則,其中包含一項規則用於維護存取巨型應用程式的流量,另一項規則用於每項微型服務:
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
        例如:IF Path = /api/posts* THEN Forward to posts
      • 按以下順序插入規則:
        • api: /api* forwards to api
        • users: /api/users* forwards to users
        • threads: /api/threads* forwards to threads
        • posts: /api/posts* forwards to posts
    • 選取「儲存」。
    • 選取頁面左上角的向後箭頭,以返回 Load Balancer 主控台。
    設定 Application Load Balancer 接聽程式規則
  • 步驟 4.部署微型服務

    將三項微型服務 (文章、討論串和使用者) 部署至您的叢集。對三項微型服務逐項重複以下步驟:

    • 瀏覽至 Amazon ECS 主控台,然後從左側功能表欄中選取「叢集」。
    • 選取叢集「BreakTheMonolith-Demo」,選取「服務」標籤,然後選取「建立」。
    • 設定服務頁面上,編輯以下參數 (對於以下未列出的參數,保留預設值):
      • 對於「啟動類型」,選取「EC2」。
      • 對於「任務定義」,選取「輸入值」按鈕,以自動選取最高修訂值。
        例如:api:1 
      • 對於「服務名稱」,輸入服務名稱 (「posts」、「threads」或「users」)。
      • 對於「任務數目」,輸入「1
    • 選取「下一步」。
    • 在「設定網路」頁面的「負載平衡」區段中,執行以下操作:
      • 對於「負載平衡器類型」,選取「Application Load Balancer」。
      • 對於「服務 IAM 角色」,選取「BreakTheMonolith-Demo-ECSServiceRole」。
      • 對於「負載均衡器名稱」,請確認已選擇「demo」。
      • 在「負載平衡的容器」區段中,選取「新增至負載平衡器」按鈕並進行以下編輯:
        • 對於「生產接聽程式連接埠」,設定為「80:HTTP」。
        • 對於「目標群組名稱」,選取適當的群組: (posts」、「threads」或「users」)
    • 選取「下一步」。
    • 在「設定 Auto Scaling」頁面上,選取「下一步」。
    • 在「審查」頁面上,選取「建立服務」。
    • 選取「檢視服務」。

    啟動您的所有服務只需幾秒鐘。繼續之前,請再次核查所有服務和任務是否正在執行並處於作用中狀態。

    Amazon ECS 部署微型服務
  • 步驟 5.將流量轉換至微型服務

    微型服務現已在執行中,但所有流量仍流向巨型應用程式服務。若要將流量重新路由至微型服務,請執行以下步驟以更新接聽程式規則:

    • 瀏覽至 EC2 主控台的「Load Balancers」區段
    • 選中「demo」旁邊的核取方塊,以查看 Load Balancer 詳細資訊。
    • 選取「接聽程式」標籤。
      只能列出一個接聽程式。
    • 在「規則」列下,選取「檢視/編輯規則」。
    • 在「規則」頁面上,從頂部功能表中選取減號 (-) 按鈕。
    • 選中規則旁邊的核取方塊,可刪除第一項規則 (/api* forwards to api)。
    • 選取「刪除」。
    • 更新預設規則以轉發至 drop-traffic:
      • 從頂部功能表中選取編輯 (鉛筆) 按鈕。
      • 選取預設規則 (HTTP 80: default action) 旁邊的編輯 (鉛筆) 圖示。
      • 選取「THEN」列中的編輯 (鉛筆) 圖示,以編輯「Forward to」。
      • 在「目標群組」欄位中,選取「drop-traffic」。
      • 選取「更新」按鈕。

    有關更新規則的範例,請參閱以下螢幕擷取畫面。

    Amazon EC2 將流量轉換至微型服務

    停用巨型應用程式:流量現已流向至微型服務,您可以停用巨型應用程式服務。

    • 瀏覽回 Amazon ECS 叢集「BreakTheMonolith-Demo-ECSCluster」。
    • 在「服務」標籤中,選中「api」旁邊的核取方塊,然後選取「更新」。
    • 在「設定服務」頁面上,尋找「任務數」,然後輸入「0」。
    • 選取「跳過以審查」。
    • 選取「更新服務」。

    Amazon ECS 現在將從服務部署的叢集上的容器中清空連接,然後停止容器。若約 30 秒後重新整理「部署」或「任務」清單,則會看到任務數降至 0。該服務仍處於作用中,因此,若出於任何原因需要復原,則只需對其更新即可部署更多任務。

    您也可以選擇刪除 api 服務。在「服務」標籤中,選中「api」旁邊的核取方塊,選取「刪除」,然後確認刪除。

    您現可將 node.js 從巨型應用程式完全轉換至微型服務,無須停機!

  • 步驟 6.驗證部署

    尋找服務 URL:這與您在本教學第 2 單元中使用的 URL 相同。

    • 瀏覽至 EC2 主控台的「Load Balancers」區段
    • 選中「demo」旁邊的核取方塊,以查看 Load Balancer 詳細資訊。
    • 在「描述」標籤中,尋找 DNS 名稱,然後選取 URL 末尾的複製圖示。 
    • 將 DNS 名稱貼至新的瀏覽器標籤或視窗。

    您應看到訊息「準備接收請求」。

    查看每項微型服務的值:ALB 會根據請求 URL 來路由流量。若要查看每項服務,只需將服務名稱增加至 DNS 名稱末尾:

    • http://[DNS 名稱]/api/users
    • http://[DNS 名稱]/api/threads
    • http://[DNS 名稱]/api/posts
    查看每項微型服務的值

    ⚐ 注意:這些 URL 的執行與巨型應用程式部署完全相同。這非常重要,因為這能確保任何希望連接至此應用程式的 API 或使用者都不會因您所做變更受影響。從巨型應用程式轉換至微型服務,無須變更基礎設施的其他部分。

    您還可以使用 Postman 等工具來測試 API。