1. Tổng quan
Microservices là một cách tiếp cận để xây dựng phần mềm bằng cách tách ứng dụng thành các phần nhỏ hơn, được gọi là dịch vụ. Mỗi dịch vụ có thể hoạt động độc lập với các dịch vụ khác và được phát triển và triển khai độc lập. Kiến trúc microservices giúp phát triển và quản lý ứng dụng một cách linh hoạt và hiệu quả hơn, đồng thời đáp ứng tốt hơn với sự thay đổi và tăng trưởng của doanh nghiệp.
Trong thời đại số hóa hiện nay, việc triển khai microservices trên cloud đang trở thành xu hướng phát triển phần mềm phổ biến. Điều này là do việc triển khai kiến trúc microservices trên cloud giúp tối ưu hóa việc phát triển và triển khai phần mềm, đồng thời đảm bảo tính sẵn sàng cao hơn cho các dịch vụ và ứng dụng. Microservices trên cloud cung cấp cho người dùng sự linh hoạt trong việc mở rộng các dịch vụ, quản lý tài nguyên và cân bằng tải tự động, từ đó giúp tăng tính khả dụng và đáp ứng nhanh chóng với sự thay đổi trong nhu cầu của khách hàng. Với việc sử dụng các dịch vụ đám mây, các tổ chức có thể giảm thiểu chi phí về phát triển, triển khai và quản lý phần mềm, đồng thời cung cấp môi trường linh hoạt để phát triển các ứng dụng có tính khả dụng cao. Vì vậy, xu hướng triển khai microservices trên cloud đang ngày càng được ưa chuộng trong cộng đồng phát triển phần mềm hiện nay.
Tuy nhiên, việc triển khai microservices trên Cloud thường được đánh đồng với sự phức tạp, đòi hỏi sự cẩn trọng và chuyên môn cao cũng như am hiểu sâu về nền tảng Cloud.
Trong bài viết này, tôi sẽ giới thiệu cho các bạn cách để triển khai một ứng dụng đơn giản theo kiến trúc microservices một cách dễ dàng nhờ sự trợ giúp của nền tảng Sunteco Cloud.
2. Kiến trúc ứng dụng
Ứng dụng gồm 2 thành phần: 1 Database và 1 Backend service.
Trong ví dụ này ta sẽ sử dụng MySQL làm Database, phần Backend service sẽ xử lý các request từ phía người dùng như đăng ký mới tài khoản, đăng nhập, tạo task, lấy danh sách các task.
3. Triển khai ứng dụng
Giờ là lúc để triển khai ứng dụng trên Cloud. Mình sẽ sử dụng Spinner Container của Sunteco Cloud để triển khai cả cả Database và Backend service.
Để triển khai ứng dụng, trước hết bạn cần có tài khoản và khởi tạo một Workspace mới. Bạn có thể đăng ký tài khoản mới tại Sunteco Cloud.
Triển khai Database
Để khởi tạo một Database bằng Spinner Container, ta chọn New Service → Sun Spinner Container → Stateful Application → Sunteco Cloud.
Bước kế tiếp là khởi tạo cấu hình cho Database
General
Spinner Name: mysql-database
Security Context Constraints: root
Image config
Container name: mysql
Image Source: mysql
Image Version: 8 Hardware config
CPU: 1vCPU
RAM: 2GB
Temporary Storage Plan: 4GB Environment
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: "demo_db"
Storage resource
Trong Storage Resource, ta sẽ tạo một vùng Persistent Storage để lưu trữ vĩnh viễn Database kể cả khi Spinner gặp lỗi.
Khởi tạo Storage
Storage name: mysql-storage
Storage Size: 10GB
Sau khi chọn xong cấu hình, bấm SUBMIT
Bên tab Mount, ta chọn Add Volume Mount là Storage
Container name: mysql
Resource: mysql-storage
Mount Path: /var/lib/mysql
Sau khi đã hoàn tất việc điền mọi thông tin, bấm REVIEW & DEPLOY → DEPLOY để khởi tạo Database bằng Spinner.
Đợi vài phút và ta có một Database khởi tạo bằng Spinner Container thành công
Truy cập Spinner
Bấm vào ACCESS để xem thông tin của Spinner vừa khởi tạo trong màn hình quản lý Spinner
PODs
Trong PODs, ta có thể truy cập vào Terminal và xem Logs của từng container trong Spinner
Truy cập vào Terminal của mysql container để khởi tạo các Table bằng cách chọn PODs, click vào tên Pod trong danh sách và chọn tab Terminal, sau đó bấm Connect.
Trên giao diện Terminal, truy cập vào database và khởi tạo các table
sh-4.4# mysql -u root
mysql> USE demo_db;
mysql> CREATE TABLE `auths` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL, `auth_type` enum('email_password','gmail','facebook') DEFAULT 'email_password', `email` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `salt` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL, `password` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL, `facebook_id` varchar(35) CHARACTER SET utf8mb4 DEFAULT NULL, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) USING BTREE, KEY `user_id` (`user_id`) USING BTREE, KEY `facebook_id` (`facebook_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; mysql> CREATE TABLE `tasks` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL, `title` varchar(150) DEFAULT NULL, `description` text, `status` enum('doing','done','deleted') DEFAULT 'doing', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `status` (`status`) USING BTREE, KEY `user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `first_name` varchar(30) CHARACTER SET utf8mb4 NOT NULL, `last_name` varchar(30) CHARACTER SET utf8mb4 NOT NULL, `email` varchar(255) CHARACTER SET utf8mb4 NOT NULL, `phone` varchar(30) DEFAULT NULL, `avatar` json DEFAULT NULL, `gender` enum('male','female','unknown') DEFAULT 'unknown', `dob` date DEFAULT NULL, `system_role` enum('sadmin','admin','user') DEFAULT 'user', `status` enum('active','waiting_verify','banned') DEFAULT 'active', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
App Publishing
Chọn ** App Publishing**, ở đây có chứa đường dẫn service "mysql-database-service.microservicedemo.svc:3306" mà ta sẽ dùng để kết nối từ Backend Service đến ở phần sau.
Triển khai Backend Service
Việc khởi tạo Backend Service bằng Spinner Container cũng tương tự như khởi tạo Database, tuy nhiên ta sử dụng Stateless Application thay vì Stateful Application.
Chọn New Service → Sun Spinner Container → Stateless Application → Sunteco Cloud.
Bước kế tiếp là khởi tạo cấu hình cho Service.
General
Spinner name: backend
Image config
Image Source: nautiam/microservice-demo
Image Version: latest
Hardware config
CPU: 1vCPU
RAM: 1GB
Temporary Storage Plan: 2GB
Environment
DB_DSN: "root:@tcp(mysql-database-service.microservicedemo.svc:3306)/demo_db?charset=utf8mb4&parseTime=True&loc=Local"
JWT_SECRET: "very-important-please-change-it!"
GIN_PORT: "3000"
GRPC_PORT: "3300"
Chú ý: Đường dẫn trỏ đến Database service được lấy từ App Publishing của Spinner Database mà ta đã triển khai ở mục trước
Đối với Backend service trong ví dụ này, ta không sử dụng Storage Resource, bấm **REVIEW & DEPLOY → DEPLOY **để khởi tạo Service bằng Spinner.
Truy cập Spinner
Bấm vào ACCESS để xem thông tin của Spinner vừa khởi tạo.
App Publishing
Intenal Publish
Mục này cho phép ta expose Port từ container để các service trong cùng Workspace có thể giao tiếp được.
Chọn App Publishing, trong cửa sổ Client Access, chọn Internal Publish, tạo Port 3000 để expose port từ container ra ngoài.
Bấm + New Port, điền Port 3000 và bấm Save.
Internet Publish
Mục này cho phép ta tạo đường dẫn để truy cập Service từ ngoài Internet.
Trong cửa sổ Client Access, chọn INTERNET PUBLISH (using Sunteco domain), bấm +NEW ROUTE
Điền các thông tin sau đó bấm Save
Route Name: microservice-demo
Port Name: container-0-3000-TCP
Hệ thống sẽ tự sinh ra một đường dẫn URL cho phép bạn gọi API đến Backend Service từ ngoài Internet.
Vậy là ta đã hoàn thành việc tạo một ứng dụng theo kiến trúc microservice khá là đơn giản. Ở mục kế tiếp, ta sẽ tạo thử một vài request đến đường dẫn này để kiểm tra xem ứng dụng của ta đã chạy chính xác chưa.
4. Chạy thử ứng dụng
Ta có thể mở Terminal và sử dụng câu lệnh curl để kiểm thử ứng dụng.
- Đăng ký account mới
$ curl --location 'https://microservice-demo-60.sunteco.cloud/v1/register' --header 'Content-Type: application/json' --data-raw '{ "email": "info@sunteco.io", "password": "12345678", "last_name": "Microservices", "first_name": "Sunteco Demo "
}'
{"data":true}
- Đăng nhập
$ curl --location 'https://microservice-demo-60.sunteco.cloud/v1/authenticate' \
--header 'Content-Type: application/json' \
--data-raw '{ "email": "info@sunteco.io", "password": "12345678"
}'
{"data":{"access_token":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnR3pUQlVScWhhakciLCJleHAiOjE2ODI4NzEzMzksIm5iZiI6MTY4MjI2NjUzOSwiaWF0IjoxNjgyMjY2NTM5LCJqdGkiOiJiNzQ1MTNmNC0yYzZmLTRmMzMtOWQ0ZC1jOTJkNGRiOTVmNDYifQ.1Toe7eroN1RZGrRC3E8QKZVJYp4-rfdG8ke5HFdC1bo","expire_in":604800}}}
- Tạo Task mới bằng Token trước đó
$ curl --location 'https://microservice-demo-60.sunteco.cloud/v1/tasks' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnR3pUQlVScWhhakciLCJleHAiOjE2ODI4NzEzMzksIm5iZiI6MTY4MjI2NjUzOSwiaWF0IjoxNjgyMjY2NTM5LCJqdGkiOiJiNzQ1MTNmNC0yYzZmLTRmMzMtOWQ0ZC1jOTJkNGRiOTVmNDYifQ.1Toe7eroN1RZGrRC3E8QKZVJYp4-rfdG8ke5HFdC1bo' \
--header 'Content-Type: application/json' \
--data '{ "title": "This is a new task", "description": "Start a simple microservice demo"
}'
{"data":"e532sJ4XpCi8"}
- Lấy danh sách các Task
$ curl --location 'https://microservice-demo-60.sunteco.cloud/v1/tasks' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJnR3pUQlVScWhhakciLCJleHAiOjE2ODI4NzEzMzksIm5iZiI6MTY4MjI2NjUzOSwiaWF0IjoxNjgyMjY2NTM5LCJqdGkiOiJiNzQ1MTNmNC0yYzZmLTRmMzMtOWQ0ZC1jOTJkNGRiOTVmNDYifQ.1Toe7eroN1RZGrRC3E8QKZVJYp4-rfdG8ke5HFdC1bo'
{"data":[{"id":"e532sJ4XpCi8","created_at":"2023-04-23T16:19:18Z","updated_at":"2023-04-23T16:19:18Z","title":"This is a new task","description":"Start a simple microservice demo","status":"doing","user":{"id":"gGzTBURqhajG","last_name":"Microservices","first_name":"Sunteco Demo","avatar":null}}],"paging":{"page":1,"limit":10,"total":1,"cursor":"","next_cursor":""},"extra":{}}
Đến đây thì có thể thấy là ứng dụng triển khai theo mô hình microservice trên Cloud đã được triển khai thành công rồi. Thật đơn giản và dễ dàng phải không nào (big grin)
5. Kết luận
Sau khi đã triển khai thành công ứng dụng này, các bạn có thể phát triển thêm các tính năng cho nó, như thiết lập user/ pass cho database, thêm các handler cho backend service, viết frontend service để tương tác với user... Tất cả các tính năng này đều có thể triển khai trên nền tảng Sunteco Cloud một cách dễ dàng.
Cảm ơn các bạn đã dành thời gian đọc hết bài viết khá dài của mình. Hy vọng là qua bài viết các bạn có thể có một cái nhìn rõ ràng hơn về cách thức triển khai một ứng dụng theo kiến trúc microservice như thế nào.
Dùng thử Sun Spinner và nền tảng Sunteco Cloud ngay hôm nay: https://dashboard.sunteco.vn/