Với kiến trúc microservices, chúng ta sẽ triển khai một hệ thống phân tán (distributed system) bao gồm rất nhiều thành phần kĩ thuật xoay quanh các service về business chính. Hệ thống phân tán sẽ có lợi thế về tính linh hoạt giữa các dịch vụ nhưng sẽ gặp khó khăn khi các phân phối thay đổi. Bài viết này sẽ đưa ra các thành phần quan trọng của kiến trúc microservice và tầm ảnh hưởng của chúng trong xây dựng và triển khai hệ thống.
Containers và Orchestration
Container là thành phần compute chính trong kiến trúc microservices, có chức năng chạy các ứng dụng tương tự như Máy chủ ảo (VM) ở các kiến trúc cũ. Sự khác biệt cốt lõi giữa container và VM nằm ở công nghệ ảo hóa: Containerization và Virtualization. Tuy nói microservices là kiến trúc của ứng dụng, không phân biệt chạy trên Container hay VM, nhưng do giới hạn về khả năng provisioning, scaling và HA nên VM rất ít tương thích với các concept của microservices.
Container được thiết kế chủ yếu để cô lập các tiến trình hoặc các ứng dụng với nhau và với hệ điều hành. Cài đặt và chạy một ứng dụng trên container rất đơn giản, nhưng sẽ thế nào nếu cần cài đặt những container này cho một hệ thống, lúc này số container sẽ lên tới hàng chục cho tới hàng trăm và hơn nữa. Đi kèm với hệ thống là các cài đặt về mạng, lưu trữ cho database, lưu trữ các biến môi trường, config của ứng dụng, các nhu cầu về auto scaling, khôi phục tự động… Lúc này sẽ cần một “nhạc trưởng” để quản lý và điều phối (orchestrated) hoạt động của các container và hệ sinh thái đi kèm. Một số container orchestration có thể kể đến như K8S, Google container engine, Amazon ECS.
API gateway
API gateway là thành phần thiết yếu của kiến trúc microservices. Do trong một hệ thống phân tán có rất nhiều service, hệ thống cần giới hạn lại các entry point để có thể quản lý được các request ra vào hệ thống, đây chính là tác dụng quan trọng nhất của API gateway. Hệ thống microservices thường được tổ chức theo cách chỉ có API gateway được facing ra ngoài internet, còn các dịch vụ bên trong sẽ giao tiếp với nhau qua internal endpoint hoặc messaging system.
Với vai trò như cổng trung gian giữa hệ thống, network và system khác, API gateway có thể đảm nhiệm các chức năng:
- Routing: API gateway hoạt động bằng cách cấu hình mapping giữa địa chỉ của dịch vụ với một pattern URL của request gọi đến. Lúc này, các hệ thống bên ngoài sẽ chỉ nhìn thấy một endpoint duy nhất của API gateway. Gateway sẽ thực hiện forward request và response của request vào và ra khỏi hệ thống, tới các dịch vụ. Do đó nó cũng có tác dụng che giấu kiến trúc các thành phần bên trong.
- Quản lý truy cập tập trung: Hệ thống luôn có nhu cầu thực hiện authentication, auditing, logging…tập trung với các request vào hệ thống. API gateway trở thành bộ phận hoàn hảo để đặt các tính năng này.
- Quản lý quota truy cập: Tính năng giới hạn tần suất của request đến hệ thống, các yếu tố detect có thể là URL, IP, authentication factor, session… giúp ngăn chặn DDOS hệ thống hoặc crawl data.
- Handle request/response: API gateway có thể được sử dụng để detect các metadata của request hoặc status của response để thực hiện các công việc như custom response hoặc redirect.
- Caching: Một vài API thường rất ít khi thay đổi dữ liệu trả về, việc cache lại ở Gateway và response ngay lập tức mà ko phải request vào nguồn dữ liệu sẽ giảm tải cho hệ thống.
- Load balancing: Chia tải (request) tới các địa chỉ khác nhau để giảm tải cho một instance.
- API health monitoring: Nhóm chức năng này giúp gateway có thể detect được trạng thái available của dịch vụ, từ đó có thể chuyển hướng request tới các dịch vụ hoặc thực hiện các kịch bản dự phòng.
Một số giải pháp gateway: NGINX, Spring gateway, Kong gateway
Service Discovery
Service Discovery giúp quản lý các deployment và phân bố tải giữa các dịch vụ trong quá trình vận hành hệ thống. Trên thực tế, các instance của các dịch vụ được triển khai trên khắp các node của hệ thống, các IP/host của instance có thể bị thay đổi trong khi runtime, start một instance mới hay thay đổi instance khi tăng số instance, service request sẽ không biết được địa chỉ cụ thể của các instance để request đến. Service discovery sẽ giúp giải quyết vấn đề này, nó đóng vai trò như một nhà ga trung tâm, luôn quản lý danh sách các instance đang active. Service Discovery hoạt động với 3 thành phần chính:
- Service provider: Service cung cấp dịch vụ
- Service consumer: Ứng dụng/ dịch vụ đang yêu cầu cung cấp địa chỉ của một service để tiến hành request.
- Service registry: Tồn tại như một database giúp lưu trữ địa chỉ các instance đang available của dịch vụ.
Các hoạt động của Service Discovery:
- Service provider khi được sinh ra sẽ đăng kí dịch vụ với service registry location/address của instance
- Service consumer sẽ request đến Server registry để lấy địa chỉ của dịch vụ thông qua tên dịch vụ\
- Service registry trả về địa chỉ của Service provider đang active
- Service consumer sẽ request đến Service provider theo địa chỉ nhận được
Service discovery bao gồm hai pattern chính là server-side và client-side. Client-site hoạt động tương tự cách mô tả ở trên, còn server-side sẽ hoạt động hơi khác một chút, sau bước 2, sau khi đã định vị được địa chỉ của service provider, router sẽ forward request tới service tương ứng.
Với một số giải pháp microservices tự xây dựng, người dùng sẽ cần cài đặt riêng thành phần service discorvey. Ngoài ra, nếu sử dụng các giải pháp container orchestration thì người dùng không cần phải quan tâm đến thành phần này, hầu hết đã được build in trong giải pháp, mà chỉ cần quan tâm đến các container phục vụ business.