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

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

架構概觀
  1. 已部署的巨型應用程式
    此為開始組態。整合型 node.js 應用程式會在 Amazon ECS 的容器中運作。
  2. 啟動微型服務
    您會使用在上個單元中建立並推送至 Amazon ECR 的三個容器映像,在現有的 Amazon ECS 叢集中啟動三個微型服務。
  3. 設定目標群組
    如同「第 2 單元」,您會為每個服務新增目標群組,並更新「ALB 規則」以連接新的微型服務。
  4. 切換流量與關閉巨型應用程式
    您會藉由變更 ALB 中的一項規則,開始將流量路由至執行中的微型服務。若一切運作正常,則關閉巨型應用程式。

依照以下的逐步說明來部署微型服務。按一下各個步驟編號以展開區段。

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

    您會將三個新的微型服務,部署至已從「第 2 單元」執行的同個叢集。如同「第 2 單元」,您會為每個服務撰寫「任務定義」。

    ⚐ 注意:您可將多個容器新增至任務定義 – 因此您可在單一服務上,以不同容器形式來執行所有的三個微型服務。不過,由於每個容器必須透過服務線性擴展,故此做法仍具整合性質。您的目標是具有三個獨立的服務,每個服務必須具備專屬的任務定義,且該定義會運用個別服務的適用映像來執行容器。

    您可在主控台 UI 中撰寫這些「任務定義」,或者亦可將其撰寫為 JSON 以加快作業速度。若要將任務定義撰寫為 JSON 檔案,請在新「Task Definition (任務定義)」畫面的底部選取「Configure via JSON (透過 JSON 設定)」。

    任務定義的參數如下:

    • Name = [service-name] 
    • Image = [service ECR repo URL]:latest 
    • cpu = 256 
    • memory = 256 
    • Container Port = 3000 
    • Host Post = 0



    或若使用 JSON:

    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.us-west-2.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 單元」,您會為每個服務設定目標群組。目標群組可讓流量正確地傳達到每個服務。

    檢查 VPC 名稱:AWS CloudFormation 堆疊具有專屬的 VPC,其絕有可能不是預設 VPC。請務必使用正確的 VPC 來設定「目標群組」。

    • 導覽至 EC2 主控台的 Load Balancer 區段
    • 您應會發現 Load Balancer 已具有命名的示範。
    • 選取核取方塊以查看 Load Balancer 詳細資訊。
    • 記下位於詳細資訊頁面的 VPC 屬性值。

     

    設定目標群組

    • 導覽至 EC2 主控台的「Target Group (目標群組)」區段
    • 選取「Create target group (建立目標群組)」。
    • 設定目標群組 (若未在此處指定,請勿修改預設值):Name = [service-name] Protocol = HTTP Port = 80 VPC = 選取與上個步驟之「負載平衡器」相符的 VPC
      • 進階運作狀態檢查設定:Healthy threshold = 2 Unhealthy threshold = 2 Timeout = 5 Interval = 6
    • 選取「Create (建立)」。

     

    ♻ 重覆此程序,以建立每項服務的目標群組:

    • 文章
    • 討論串
    • 使用者

     

    最後,建立第四目標群組

    • drop-traffic

    此目標群組為「虛擬」目標。您會使用該目標來避免流量在微型服務完整運作後,傳達到巨型應用程式。在表格中應會具有共 5 個目標群組。

    目標群組
  • 步驟 3. 設定接聽程式規則

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

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

    開啟接聽程式

    • 導覽至 EC2 主控台的 Load Balancer 區段
    • 您應會發現 Load Balancer 已具有命名的示範。
    • 選取核取方塊以查看 Load Balancer 詳細資訊。
    • 選取「Listeners (接聽程式)」標籤。

     

    更新接聽程式規則

    • 針對接聽程式,選取「View/edit rules (檢視/編輯規則) >)」。
    • 選取 + 並插入規則。
    • 規則條件如下:
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
      • For example: Path = /api/posts* 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
    • 選取頁面左上方的上一步箭號,回到負載平衡器主控台。
    設定接聽程式規則
  • 步驟 4. 部署微型服務

    您現會將三個服務部署至叢集。針對所有的三個服務,重覆執行這些步驟:

    • 導覽至 Amazon ECS 主控台左側的 'Clusters' 功能表。
    • 選取您的叢集:BreakTheMonolith-Demo-ECSCluster
    • 在服務標籤下方,選取 Create。
    • 設定服務 (請勿修改任何預設值) Task definition = select the highest value for X: [service-name]:X (X should = 1 for most cases) Service name = [service-name] Number of tasks = 1
    • 選取「Configure ELB (設定 ELB)」
      • ELB Type = Application Load Balancer
      • 針對 IAM 角色,選取 BreakTheMonolith-Demo-ECSServiceRole
      • 選取「負載平衡器」示範
      • 選取「Add to ELB (新增至 ELB)」
    • 將服務新增至目標群組:
      • Listener port = 80:HTTP
      • Target group name = select your group: [service-name]
    • 選取「Save (儲存)」。
    • 選取「Create Service (建立服務)」。
    • 選取「View Service (檢視服務)」。


    所有的服務應僅需數秒鐘時間即會啟動。再三檢查所有服務和任務的執行及運作狀態,然後再繼續操作。

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

    微型服務現已在運作中,但所有流量仍流向巨型應用程式服務。

    更新接聽程式規則器,以將流量重路由至微型服務:

    • 導覽至 EC2 主控台的 Load Balancer 區段
    • 針對示範負載平衡器,選取「View/edit rules > (檢視/編輯規則 >)」。
    • 刪除第一個規則 (/api* forwards to api)。
    • 更新預設規則,以轉送至 drop-traffic。

    規則看起來應會類似如下內容:

    將流量切換至微型服務

    關閉巨型應用程式:流量現已流向至微型服務,您可關閉「巨型應用程式」服務。

    • 導覽回 Amazon ECS 叢集 BreakTheMonolith-Demo-ECSCluster。
    • 選取 API 服務,然後再選取「Update (更新)」。
    • 將「Number of Tasks (任務數)」變更為 0
    • 選取「Update Service (更新服務)」。

     

    Amazon ECS 現會清空服務已部署於叢集的所有容器連線,然後停止容器。若您在約 30 秒後重新整理「Deployments (部署)」或「Tasks (任務)」清單,則會發現任務數會降為 0。此服務仍在作用中,因此若您基於任何原因而需要回復,可逕行更新該服務以部署更多任務。

    • 選取 API 服務,然後再選取「Delete (刪除)」並確認刪除。


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

  • 步驟 6. 驗證部署

    尋找服務 URL:此為與您在本教學「第 2 單元」中所用相同的 URL。

    • 導覽至 EC2 主控台的 Load Balancers 區段。
    • 選取負載平衡器示範-微型服務。
    • 將 DNS 名稱複製並貼至瀏覽器。
    • 您應會看見 'Ready to receive requests' 訊息。

     

    查看每個微型服務的值:ALB 會根據請求 URL 來路由流量。若要查看每個服務,只要將服務名稱新增至「DNS 名稱」的結尾即可,例如:

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

    ⚐ 注意:這些 URL 的執行方式完全與部署巨型應用程式時相同。這點非常重要,因為所有 API 或消費者皆希望連線至此應用程式,而不會受到任何變更所影響。從巨型應用程式轉換至微型服務,無須變更基礎設施的其他部分。

    您亦可使用諸如 Postman 等工具來測試 API。