Trong mô-đun này, bạn sẽ tách ứng dụng node.js thành nhiều dịch vụ liên kết với nhau, sau đó chuyển ảnh của từng dịch vụ sang kho lưu trữ Amazon Elastic Container Registry (Amazon ECR). Bắt đầu xây dựng

Kiến trúc ứng dụng sau cùng sẽ dùng Amazon Elastic Container Service (Amazon ECS) và Cân bằng tải ứng dụng (ALB). 

tổng quan về kiến trúc

a. Máy khách
Máy khách thực hiện các yêu cầu lưu lượng truy cập qua cổng 80.

b. Cân bằng tải
ALB định tuyến lưu lượng truy cập bên ngoài đến dịch vụ phù hợp. ALB kiểm tra yêu cầu của máy khách rồi dùng các quy tắc định tuyến để chuyển yêu cầu sang một phiên bản và cổng cho nhóm mục tiêu khớp với quy tắc.

c. Nhóm mục tiêu
Mỗi dịch vụ đều có một nhóm mục tiêu. Nhóm này giúp theo dõi các phiên bản và cổng của từng bộ chứa đang chạy cho dịch vụ đó.

d. Vi dịch vụ
Amazon ECS triển khai mỗi dịch vụ vào một bộ chứa trên cụm EC2. Mỗi bộ chứa chỉ xử lý một tính năng duy nhất.

Cô lập lỗi
Kể cả các tổ chức kỹ thuật hàng đầu cũng có thể gặp những lỗi nghiêm trọng trong sản xuất. Ngoài việc làm theo tất cả những cách làm chuẩn hay nhất để xử lý lỗi một cách mượt mà, xây dựng các vi dịch vụ cũng là một cách có thể hạn chế ảnh hưởng của những lỗi như vậy. Một kiến trúc vi dịch vụ tốt sẽ phát huy tác dụng trong trường hợp một phần rất nhỏ của dịch vụ gặp lỗi, chỉ có phần đó bị ngừng hoạt động. Phần còn lại của dịch vụ vẫn tiếp tục hoạt động bình thường.

Cô lập để bảo mật
Trong ứng dụng đơn khối, nếu một tính năng của ứng dụng bị xâm phạm bảo mật, chẳng hạn như tồn tại một lỗ hổng cho phép thực thi mã từ xa, thì bạn phải giả định rằng kẻ tấn công có thể cũng đã chiếm được quyền truy cập vào mọi tính năng khác của hệ thống. Điều này có thể rất nguy hiểm nếu, chẳng hạn như, tính năng tải ảnh đại diện lên xảy ra sự cố bảo mật, hậu quả là cơ sở dữ liệu của bạn bị xâm phạm, dẫn đến lộ mật khẩu người dùng. Khi dùng Amazon ECS để tách các tính năng thành nhiều vi dịch vụ, bạn sẽ có thể bảo mật quyền truy cập vào tài nguyên AWS bằng cách gán vai trò AWS Identity and Access Management (IAM) cho từng dịch vụ. Khi tuân thủ những phương pháp tốt nhất dành cho vi dịch vụ, nếu kẻ tấn công xâm phạm một dịch vụ, chúng chỉ có thể truy cập được vào tài nguyên của dịch vụ đó, chứ không thể truy cập vào hàng loạt tài nguyên khác của các dịch vụ mà chúng chưa tấn công được.

Độc lập thay đổi quy mô
Khi tách tính năng thành các vi dịch vụ, bạn có thể tùy ý tăng và giảm số lượng phiên bản cũng như cơ sở hạ tầng mà mỗi lớp vi dịch vụ sử dụng. Điều này cho phép bạn dễ dàng tính toán chi phí cho từng tính năng và xác định xem cần tối ưu hóa những tính năng nào trước. Nếu một tính năng cụ thể gặp vấn đề về nhu cầu tài nguyên, thì các tính năng khác sẽ không bị ảnh hưởng và vẫn duy trì hoạt động ổn định.

Tốc độ phát triển
Vi dịch vụ giúp giảm thiểu rủi ro trong quá trình phát triển, nhờ đó các đội ngũ có thể xây dựng nhanh hơn. Trong đơn khối, việc thêm một tính năng mới có thể ảnh hưởng đến mọi tính năng khác có trong đơn khối đó. Nhà phát triển phải cân nhắc kỹ lưỡng tác động của bất kỳ mã nào họ thêm vào sao cho mọi thứ không bị phá vỡ. Mặt khác, một kiến trúc vi dịch vụ phù hợp sẽ có mã mới khi tính năng mới được thêm vào dịch vụ mới. Nhà phát triển có thể yên tâm rằng mọi mã họ viết sẽ không hề ảnh hưởng đến mã hiện có, trừ khi họ viết rõ ràng mối liên kết giữa hai vi dịch vụ.

Thời gian hoàn thành: 20 phút

Dịch vụ sử dụng:


Hãy làm theo hướng dẫn từng bước sau đây để tách đơn khối. Chọn số tương ứng của từng bước để mở rộng phần đó.

  • Bước 1. Cung cấp kho lưu trữ ECR

    Trong 2 mô-đun trước, bạn đã triển khai ứng dụng của mình theo dạng đơn khối bằng cách dùng kho lưu trữ ảnh một bộ chứa và một dịch vụ. Để triển khai ứng dụng này dưới dạng 3 vi dịch vụ, bạn sẽ phải cung cấp 3 kho lưu trữ trong Amazon ECR cho 3 vi dịch vụ đó.

    3 dịch vụ của chúng tôi là:

    1. người dùng
    2. chủ đề
    3. bài đăng

    Tạo 3 kho lưu trữ này bằng cách lặp lại các bước sau cho từng dịch vụ:

    • Chuyển đến bảng điều khiển Amazon ECR.
    • Chọn Tạo kho lưu trữ.
    • Trong trường Tên kho lưu trữ của trang Tạo kho lưu trữ, hãy tạo một kho lưu trữ cho dịch vụ (bài đăng, chủ đề hoặc người dùng).
      ⚐ Lưu ý: Đối với tùy chọn Tính bất biến của thẻ, hãy giữ nguyên cài đặt mặc định.

    Bạn sẽ có 4 kho lưu trữ trong Amazon ECR. Hãy ghi lại thông tin của kho lưu trữ cho từng vi dịch vụ bạn tạo. Bạn sẽ cần dùng đến thông tin này trong bước tiếp theo. Thông tin bạn cần sẽ có định dạng như sau:
    [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    kho lưu trữ
  • Bước 2. Xác thực Docker với AWS (không bắt buộc)

    Bạn sẽ cần truy cập vào Docker để xây dựng và chuyển ảnh cho từng dịch vụ. Bạn có thể bị đăng xuất khỏi Docker nếu không thể hoàn thành bài hướng dẫn này trong một lần. Trong trường hợp đó, hãy làm theo các bước sau để đăng nhập lại vào Docker.

    • Chạy $(aws ecr get-login --no-include-email --region [your-region])
      Thay thế [your-region], ví dụ: $(aws ecr get-login --no-include-email --region us-west-2)

    Nếu xác thực thành công thì bạn sẽ nhận được thông báo xác nhận: Đăng nhập thành công.

  • Bước 3. Xây dựng và chuyển ảnh cho từng dịch vụ

    Trong thư mục dự án amazon-ecs-nodejs-microservices/3-microservices/services, bạn sẽ có các thư mục chứa tệp cho từng dịch vụ. Nếu để ý, bạn sẽ thấy mỗi vi dịch vụ dường như là một bản sao của dịch vụ đơn khối ban đầu.

    Giờ đây, nếu so sánh tệp db.json trong từng dịch vụ và trong dịch vụ api đơn khối, bạn sẽ thấy từng dịch vụ đã được chuyên biệt hóa. Trước đây, bài đăng, chủ đề và người dùng được lưu trữ chung trong một tệp cơ sở dữ liệu duy nhất. Còn bây giờ, chúng được lưu trữ trong tệp cơ sở dữ liệu cho dịch vụ tương ứng.

    Hãy mở thiết bị đầu cuối của bạn rồi đặt đường dẫn thành ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Xây dựng và gắn thẻ từng ảnh

    • Trong đích, hãy chạy docker build -t [service-name] ./[service-name]
      Thay thế [service-name], ví dụ: docker build -t posts ./posts

    • Sau khi hoàn thành bản dựng, hãy gắn thẻ ảnh để có thể chuyển ảnh sang kho lưu trữ:
      docker tag [service-name]:latest [account-ID].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      Thay thế [service-name], [account-ID][region], ví dụ: docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • Chuyển ảnh sang ECR: docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      Thay thế [service-name], [account-ID][region].

    Nếu chuyển đến kho lưu trữ ECR, bạn sẽ thấy ảnh được gắn thẻ v1. 

    ♻ Lặp lại những bước này cho từng ảnh vi dịch vụ.  

    ⚐ LƯU Ý: Hãy đảm bảo dựng và gắn thẻ cả 3 ảnh.