在本單元中,您會將 node.js 應用程式分解成數個互連服務,並將每個服務的映像推送至 Amazon Elastic Container Registry (Amazon ECR) 儲存庫。 開始建置

最終應用程式架構使用 Amazon Elastic Container Service (Amazon ECS) 和 Application Load Balancer (ALB)。 

架構概觀

a.用戶端
用戶端透過連接埠 80 發出流量請求。

b.Load Balancer
ALB 會將外部流量路由至正確的服務。ALB 會偵測用戶端請求,並使用路由規則將請求引導至符合規則之目標群組的執行個體和連接埠。

c.目標群組
每個服務皆有目標群組,其會持續追蹤執行該服務之每個容器的執行個體和連接埠。

d.微型服務
Amazon ECS 會將每個服務部署至 EC2 叢集中的容器。每個容器只處理一個功能。

損毀狀況隔離
即使是最優異的工程組織,也必然會在生產過程中遇到嚴重的損毀狀況。除了妥善遵循所有標準最佳實務來處理損毀狀況之外,還有一種方式可以降低當機所造成的影響,即建置微型服務。良好的微型服務架構意味著,當服務的一小部分發生當機,則只有這部分服務無法正常運作。其他服務仍可繼續正常運作。

安全隔離
在巨型應用程式中,如果應用程式的其中一項功能存在安全漏洞,例如允許遠端程式碼執行的漏洞,那麼您就必須假設攻擊者也能同時存取系統中的其他所有功能。這種情況十分危險,例如,如果您的虛擬人物上傳功能存在安全性問題,最後則可能導致保存使用者密碼的資料庫遭到入侵,其後果將不堪設想。透過 Amazon ECS 將各項功能分成不同的微型服務,您可為每個服務設定自己的 AWS Identity and Access Management (IAM) 角色,從而確保安全存取 AWS 資源。若遵循微型服務最佳實務,當攻擊者入侵應用程式的其中一項服務時,則只能存取該項服務的資源,無法橫向存取其他服務中的其他資源,從而保證其他資源不被入侵。

獨立擴展
在將各項功能分解成不同的微型服務後,可獨立擴展和縮減每個微型服務類別使用的基礎設施數目和執行個體數量。如此一來,便能輕鬆估算特定功能的成本,並找出可能需要優先進行優化的功能。如果某個特定功能的資源需求發生問題,其他功能也不會受到影響,仍可確保可靠效能。

開發速度
微型服務可降低開發風險,從而加快團隊建置應用程式的速度。使用巨型應用程式時,新增功能可能會影響該巨型應用程式內的其他所有功能。開發人員必須仔細思考新增任何程式碼所帶來的影響,並確保這些程式碼不會造成任何損壞。相較之下,合適的微型服務架構可為新服務中加入的新功能提供全新的程式碼。開發人員可以確保自己所編寫的任何程式碼完全不會對現有的程式碼造成影響,除非明確編寫了兩個微型服務之間的連結。

完成時間:20 分鐘

使用的服務:


請遵循下方的逐步指示來分解巨型應用程式。選取每一個步驟號碼可展開相應部分內容。

break-the-monolith
  • 步驟 1.佈建 ECR 儲存庫

    在前兩個單元中,您已利用單一服務和單一容器映像儲存庫,將您的應用程式部署為巨型應用程式。若要將應用程式部署為三項微型服務,則您必須在 Amazon ECR 中佈建三個儲存庫 (每項服務使用一個儲存庫)。

    這三項服務為:

    1. 使用者
    2. 討論串
    3. 文章

    對每個服務重複以下步驟來建立三個儲存庫:

    • 瀏覽至 Amazon ECR 主控台
    • 選取「建立儲存庫」。
    • 建立儲存庫頁面的「儲存庫名稱」欄位,為服務 (文章、討論串或使用者) 建立儲存庫。
      ⚐ 注意:對於「標籤不變性」選項,請保留預設設定。

    Amazon ECR 中應有四個儲存庫。記錄您建立的每個微型服務的儲存庫資訊。在接下來的步驟中將會用到此資訊。您需要使用的資訊採用以下格式:
    [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    儲存庫
  • 步驟 2.使用 AWS 對 Docker 進行驗證 (選擇性步驟)

    您需要先存取 Docker,才能建置並推送每個服務的映像。如果您是在不同的時間點學習本教學,則您可能已登出 Docker。此情況下,請執行以下步驟,重新登入 Docker。

    • 執行 $(aws ecr get-login --no-include-email --region [your-region])
      替換 [your-region],例如:$(aws ecr get-login --no-include-email --region us-west-2)

    若驗證成功,您會收到確認訊息:登入成功

  • 步驟 3.建置並推送每個服務的映像

    amazon-ecs-nodejs-microservices/3-microservices/services 專案資料夾中,可查看多個資料夾,內含每個服務的檔案。請注意,每項微型服務都是先前巨型服務的複製品。

    透過比較每項服務和巨型 API 服務中的 db.json 檔案,即可查看每項服務目前如何專門儲存。以前,所有文章、討論串和使用者均儲存在一個資料庫檔案中。現在,每個文章、討論串和使用者都分別儲存在資料庫檔案中,以便各自的服務取用。

    開啟終端機,並將路徑設為 ~/amazon-ecs-nodejs-microservices/3-microservices/services

    建置映像,並為每個映像加上標籤

    • 在終端機中,執行 docker build -t [service-name] ./[service-name]
      替換 [service-name],例如:docker build -t posts ./posts

    • 建置完成後,為映像加上標籤,以便將其推送至儲存庫:
      docker tag [service-name]:latest [account-ID].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      替換 [service-name][account-ID][region],例如:docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • 將映像推送至 ECR:docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      替換 [service-name][account-ID][region]

    若瀏覽至 ECR 儲存庫,則應看到標籤為 v1 的映像。 

    ♻ 對所有的微型服務映像重複上述步驟。 

    ⚐ 注意:請務必建置共三個映像,並為所有映像加上標籤。