Xây dựng quy trình DevSecOps cho ứng dụng Web Trello dựa trên kiến trúc Microservices

Building a DevSecOps Pipeline for Trello Web Application Based on Microservices Architecture

Trong bối cảnh các ứng dụng web hiện đại đòi hỏi khả năng mở rộng, bảo trì và triển khai linh hoạt, kiến trúc microservices nổi lên như một giải pháp ưu việt thay thế kiến trúc nguyên khối (monolith) truyền thống. Khoá luận này trình bày và thực hiện quá trình chuyển đổi một ứng dụng web thương mại điện tử từ kiến trúc monolith ban đầu sang một hệ thống dựa trên mô hình microservices, đồng thời ứng dụng một quy trình CI/CD hoàn chỉnh để tự động hoá việc triển khai dự án lên nền tảng Kubernetes.

Hệ thống được thiết kế và triển khai theo kiến trúc microservices, nơi dịch vụ backend được xây dựng bằng Java Spring Boot, được chia thành các dịch vụ riêng biệt như quản lý toàn bộ thông tin sản phẩm, xử lý nghiệp vụ cho việc tạo, quản lý đơn hàng, thanh toán và giao tiếp qua API RESTful. Một service Nginx đóng vai trò là Reverse Proxy và phục vụ tài nguyên tĩnh. Dữ liệu được lưu trữ trên MariaDB.

Về triển khai hạ tầng, toàn bộ hệ thống được container hoá bằng Docker và triển khai lên cụm Kubernetes trên hạ tầng on-premise. Các Docker image cho từng microservice được lưu trữ trên GitLab Container Registry. Việc điều phối các container được thực hiện trên cụm Kubernetes, với các tài nguyên được định nghĩa dưới dạng mã (IaC).

Bên cạnh đó, dự án được xây dựng và tích hợp thành công một pipeline CI/CD tự động trên nền tảng GitLab. Quy trình được kích hoạt khi có một tag phiên bản ứng dụng mới. Để hoàn tất quy trình, một phiên bản ứng dụng mới được cập nhật trên một repository GitOps. Việc triển khai lên Kubernetes được thực hiện theo mô hình GitOps pull-based: một GitLab Agent for Kubernetes, được cài đặt trong cụm K8s, kết nối an toàn và theo dõi repository B.

Như vậy, dự án sẽ đảm bảo tính nhất quán, tự động và khả năng rollback dễ dàng thông qua lịch sử Commit của Git.

TÁC GIẢ

Nguyễn Quang Thịnh

GIẢNG VIÊN HƯỚNG DẪN

NGÀNH

Năm:

Tổng quan

Sự phát triển mạnh mẽ của thương mại điện tử trong những năm gần đây đã mang lại nhiều cơ hội và thách thức cho doanh nghiệp, nhất là trên các sàn thương mại điện tử. Nhằm đáp ứng nhu cầu thực tế này, đề tài “Xây dựng quy trình DevSecOps cho ứng dụng Web bán hàng dựa trên kiến trúc Microservices” được thực hiện nhằm cung cấp dịch vụ mua hàng trực tuyến với hiệu năng cao, vận hành ổn định và khả năng mở rộng linh hoạt nhờ các công nghệ và giải pháp hiện đại.

Trong thời đại số hoá diễn ra mạnh mẽ, hoạt động kinh doanh trên môi trường trực tuyến ngày càng cạnh tranh và đang dần trở thành xu hướng tất yếu. Người tiêu dùng ngày càng có xu hướng mua sắm trực tuyến để tiết kiệm thời gian, dễ dàng so sánh sản phẩm và nhận được trải nghiệm cá nhân hóa. Tuy nhiên, hiện tại vẫn còn nhiều website thương mại điện tử chưa đáp ứng tốt về hiệu suất, tính linh hoạt trong quản trị và khả năng tích hợp các công nghệ hiện đại. 

Đề tài này hướng đến việc xây dựng một website bán hàng thời trang trực tuyến, chuyên cung cấp các sản phẩm quần áo, giày dép với giao diện thân thiện, cùng các quy trình tự động hoá triển khai (CI/CD). Mục tiêu là mang lại trải nghiệm mua sắm tiện lợi cho khách hàng, đồng thời giúp doanh nghiệp tối ưu hoá vận hành và dễ dàng mở rộng quy mô. 

Từ những lý do đó, em quyết định chọn đề tài: “Xây dựng quy trình DevSecOps cho ứng dụng web bán hàng dựa trên kiến trúc Microservices”.

Mục tiêu 

Mục tiêu của đề tài là thiết kế và xây dựng một hệ thống website thương mại điện tử chuyên về lĩnh vực thời trang, đáp ứng nhu cầu mua sắm trực tuyến các sản phẩm quần áo, giày dép một cách tiện lợi, nhanh chóng. Hệ thống không chỉ dừng lại ở việc cung cấp chức năng bán hàng cơ bản mà còn tích hợp các công nghệ hiện đại như CI/CD pipeline nhằm tự động hóa quy trình kiểm thử, đóng gói và triển khai phần mềm; giám sát hệ thống nhằm đảm bảo hiệu suất và độ ổn định. Ngoài ra, đề tài còn hướng đến việc xây dựng một quy trình triển khai chuẩn hóa, có khả năng mở rộng linh hoạt. 

Đối tượng 

Đối tượng nghiên cứu của dự án này bao gồm ba nhóm chính: người dùng cuối, doanh nghiệp vận hành, và các thành phần công nghệ được áp dụng. 

• Người dùng cuối: Là những người có nhu cầu tìm kiếm, xem thông tin và mua sắm các sản phẩm giày dép, thời trang thể thao trực tuyến. Hệ thống hiện tại cung cấp các chức năng cốt lõi như xem danh sách sản phẩm, thêm sản phẩm vào giỏ hàng và thực hiện quy trình đặt hàng. 

• Các doanh nghiệp hoặc quản trị viên hệ thống: Có nhu cầu quản lý, vận hành dịch vụ bán hàng một cách hiệu quả. Hệ thống cung cấp một nền tảng quản trị để xử lý đơn hàng, quản lý danh mục sản phẩm. Mục tiêu là xây dựng một nền tảng hiện đại, dễ vận hành, dễ dàng mở rộng khi có nhu cầu kinh doanh mới. 

• Các thành phần kỹ thuật và công nghệ: Dự án tập trung vào việc nghiên cứu và áp dụng quy trình chuyển đổi từ kiến trúc một khối (monolith) sang kiến trúc microservices, đồng thời xây dựng một pipeline CI/CD hoàn chỉnh theo các thực hành DevOps hiện đại.

Phạm vi nghiên cứu 

Phạm vi nghiên cứu của đồ án tập trung vào việc hiện thực hóa một hệ thống microservices hoàn chỉnh ở mức độ MVP (Minimum Viable Product), với đầy đủ các thành phần từ backend, hạ tầng, đến quy trình CI/CD tự động. 

Đồ án sẽ tập trung vào quá trình chuyển đổi một ứng dụng nguyên khối (monolith) thành các microservices độc lập (product-service, order-service, backend, frontend) và xây dựng một pipeline CI/CD hoàn chỉnh theo mô hình GitOps để triển khai chúng lên Kubernetes. Các công nghệ cốt lõi trong phạm vi nghiên cứu bao gồm Spring Boot, Docker, Docker Compose, GitLab CI, Kubernetes (K8s), Nginx Ingress, và MariaDB. 

Đồ án sẽ không đi sâu vào việc xây dựng một hệ thống thanh toán online thực tế hay tối ưu hóa hệ thống cho lượng truy cập lớn, những vấn đề này chỉ được đề cập ở mức định hướng phát triển trong tương lai.

Kiến trúc hệ thống

Kiến trúc ứng dụng Kiến trúc ứng dụng của “Shoe Shop” được thiết kế theo mô hình microservices, kết hợp với một lớp giao diện người dùng và cổng API được tách biệt nhằm đảm bảo tính linh hoạt, khả năng mở rộng và dễ dàng bảo trì. 

Phần giao diện người dùng (Frontend) được phục vụ bởi một Nginx container, chuyên trách xử lý các tài nguyên tĩnh (CSS, JavaScript, hình ảnh) và đóng vai trò như một Reverse Proxy. Các trang HTML được render phía server (Server Side Rendering) bởi một Backend service, sử dụng Java Spring Boot và Thymeleaf. Cấu trúc này giúp giảm tải cho các service nghiệp vụ và tạo ra một điểm vào duy nhất cho hệ thống. 

Phần backend được phát triển trên nền tảng Java Spring Boot, được phân rã từ một ứng dụng nguyên khối (monolith) thành các microservice chuyên biệt, bao gồm: 

• Product Service: Quản lý toàn bộ vòng đời của sản phẩm, bao gồm thông tin, giá cả, và hình ảnh. Service này cung cấp các API RESTful cho các dịch vụ khác truy vấn và thao tác dữ liệu sản phẩm. 

• Order Service: Chịu trách nhiệm xử lý logic đặt hàng, từ việc nhận thông tin giỏ hàng, tạo đơn hàng, cho đến lưu trữ chi tiết đơn hàng. Service này hoạt động độc lập và đảm bảo tính toàn vẹn của dữ liệu đơn hàng bằng cách lưu lại “ảnh chụp nhanh” (snapshot) thông tin sản phẩm tại thời điểm mua. 

• Backend/UI Service: Là phần còn lại của ứng dụng monolith ban đầu, được tinh gọn để chỉ còn nhiệm vụ chính là render các trang HTML Thymeleaf. Nó tổng hợp dữ liệu bằng cách gọi API từ các microservice khác (như Product Service và Order Service) trước khi trả về giao diện hoàn chỉnh cho người dùng. 

Tất cả các thành phần trong hệ thống, bao gồm cả database MariaDB, đều được container hóa bằng Docker. Việc khởi chạy và quản lý môi trường phát triển cục bộ được thực hiện thông qua Docker Compose, giúp thiết lập một môi trường nhất quán và dễ dàng tái tạo. 

Để chuẩn bị cho việc vận hành chuyên nghiệp, kiến trúc này được định hướng triển khai lên cụm Kubernetes on-premise. Quy trình CI/CD sẽ được xây dựng trên GitLab CI, áp dụng mô hình Polyrepo (mỗi service một repository) và GitOps với GitLab Agent for Kubernetes. Điều này cho phép mỗi service được build, test và triển khai một cách độc lập, tự động hóa hoàn toàn từ lúc đẩy code lên Git cho đến khi ứng dụng được cập nhật trên K8s. 

Toàn bộ việc quản lý, giám sát và tương tác với cụm Kubernetes được thực hiện một cách tập trung và trực quan thông qua nền tảng Rancher. Rancher cung cấp một giao diện quản lý mạnh mẽ, đơn giản hóa các tác vụ vận hành K8s phức tạp. 

Kiến trúc này không chỉ giúp giải quyết các thách thức của một ứng dụng monolith đang phát triển mà còn đặt nền móng vững chắc cho việc bảo trì, mở rộng và tích hợp các công nghệ mới trong tương lai.

image 34

 Kiến trúc hạ tầng on-premise

Toàn bộ hệ thống được triển khai trên hạ tầng máy chủ vật lý (on-premise), tận dụng sự linh hoạt và khả năng kiểm soát của các tài nguyên nội bộ. Kiến trúc được xây dựng theo hướng cloud-native, ứng dụng các công nghệ container và điều phối hiện đại nhằm đảm bảo hệ thống hoạt động ổn định, tự động hóa và dễ dàng bảo trì. Các thành phần chính của hạ tầng bao gồm: 

• Kubernetes (cài đặt bằng kubeadm): Là nền tảng chính để triển khai và quản lý toàn bộ hệ thống container hóa. Các microservices như product-service, order-service được đóng gói dưới dạng container và triển khai bằng Helm 25 hoặc kubectl lên cụm K8s. Hệ thống không sử dụng autoscaling hay service mesh, nhưng đảm bảo hoạt động ổn định và dễ mở rộng thủ công khi cần. 

• GitLab CI: Đóng vai trò là công cụ tự động hóa toàn bộ quy trình CI/CD, bao gồm các giai đoạn: build Docker image, push lên registry và deploy lên cluster. Pipeline được tổ chức theo từng stage rõ ràng giúp rút ngắn chu kỳ phát triển và triển khai phần mềm. 

• MariaDB: Được cài đặt trên một máy chủ riêng trong cùng mạng nội bộ với Kubernetes. Cơ sở dữ liệu này lưu trữ toàn bộ dữ liệu động như thông tin sản phẩm, người dùng, đơn hàng và cả dữ liệu tĩnh như ảnh, không sử dụng thêm dịch vụ lưu trữ riêng. 

• Kubernetes Secret: Được dùng để lưu trữ và quản lý các thông tin nhạy cảm như mật khẩu cơ sở dữ liệu, token truy cập,… đảm bảo an toàn bảo mật trong môi trường triển khai. 

• Rancher: Là công cụ giám sát và quản lý cụm Kubernetes. Rancher cung cấp giao diện trực quan để theo dõi trạng thái cluster, các pod, node và tài nguyên sử dụng, hỗ trợ việc vận hành và kiểm soát hệ thống dễ dàng hơn. 

• Ingress NGINX: Là thành phần điều phối lưu lượng truy cập từ bên ngoài vào hệ thống thông qua các ingress rule. Tuy hệ thống chưa triển khai HTTPS nhưng vẫn đảm bảo được khả năng routing chính xác tới các dịch vụ nội bộ. 

• Namespace theo môi trường: Mỗi môi trường (dev, staging, prod) được tổ chức riêng biệt bằng namespace, giúp cô lập tài nguyên, tránh xung đột và hỗ trợ quản lý vòng đời dịch vụ dễ dàng hơn. 

Tổng thể, các thành phần trên được kết nối chặt chẽ, tạo thành một hệ thống triển khai on-premise hiện đại, giúp hệ thống bán hàng: 

• Vận hành ổn định, dễ kiểm soát.

• Dễ dàng mở rộng hoặc thêm mới dịch vụ. 

• Triển khai liên tục và tự động qua GitLab CI pipeline. 

• Bảo mật tốt và giám sát tập trung thông qua Rancher. 

• Tách biệt rõ ràng các môi trường, dễ quản lý và bảo trì. 

image 35

Kết luận

Kết quả đạt được 

Sau quá trình nghiên cứu và triển khai, dự án đã đạt được nhiều kết quả quan trọng trên cả phương diện kiến trúc phần mềm và quy trình vận hành: 

• Chuyển đổi thành công sang kiến trúc Microservices: Từ một ứng dụng nguyên khối (monolith) ban đầu, hệ thống đã được phân rã thành các microservice độc lập (Product Service, Order Service, BFF/UI Service), mỗi dịch vụ đảm nhiệm một chức năng nghiệp vụ cụ thể. Điều này đã giải quyết được các thách thức về khả năng bảo trì và mở rộng của kiến trúc cũ. 

• Container hóa toàn bộ hệ thống: Tất cả các thành phần, từ các microservice backend (Java Spring Boot), Nginx reverse proxy cho đến database (MariaDB), đều đã được đóng gói thành các Docker image. Việc này, kết hợp với Docker Compose, đã tạo ra một môi trường phát triển (development) nhất quán, dễ dàng tái tạo và vận hành.

• Xây dựng được các API RESTful chuyên biệt: Các microservice mới cung cấp các API được định nghĩa rõ ràng, giúp các thành phần trong hệ thống giao tiếp với nhau một cách chuẩn hóa và tách rời, tạo nền tảng cho việc phát triển các client khác nhau (như ứng dụng di động) trong tương lai. 

• Hạ tầng K8s On-Premise: Xây dựng một môi trường vận hành mạnh mẽ, có khả năng tự phục hồi và mở rộng. 

• Quy trình GitOps với Polyrepo: Thiết lập một cấu trúc repository rõ ràng, với kho code riêng cho từng service và một kho cấu hình riêng, giúp quản lý trạng thái hệ thống một cách minh bạch và có kiểm soát. 

• CI/CD Pipeline với GitLab: Tự động hóa quá trình từ build, test, đóng gói image cho đến kích hoạt triển khai, giảm thiểu sai sót do con người và tăng tốc độ đưa sản phẩm ra thị trường. 

• Hoàn thiện luồng nghiệp vụ cốt lõi: Hệ thống đã đảm bảo các chức năng chính như xem sản phẩm, quản lý giỏ hàng và đặt hàng hoạt động một cách liền mạch thông qua sự tương tác giữa các microservice. 

Kết quả triển khai thực tế cho thấy hệ thống hoạt động ổn định, dễ dàng mở rộng từng thành phần, và sẵn sàng cho các bước phát triển tiếp theo.

Hạn chế của đề tài 

Mặc dù đã đạt được các mục tiêu chính, dự án vẫn còn một số hạn chế cần được khắc phục trong các giai đoạn phát triển tiếp theo: 

• Quy mô triển khai: Hệ thống hiện tại mới chỉ được tách thành một vài microservice cốt lõi và được triển khai trên môi trường giả lập với Docker Compose. Việc vận hành thực tế trên một cụm Kubernetes on-premise hoàn chỉnh sẽ phát sinh thêm các thách thức về network, storage và security.

• Database dùng chung: Các microservice vẫn đang kết nối đến một database schema chung. Mặc dù đã tách biệt về logic, nhưng việc dùng chung database vẫn tạo ra một mức độ phụ thuộc nhất định và chưa hoàn toàn tuân thủ nguyên tắc “database per service” của kiến trúc microservices. 

• Hệ thống giám sát và Logging: Dự án chưa tích hợp các công cụ giám sát và logging tập trung chuyên nghiệp như Prometheus, Grafana, hay ELK Stack. Việc này gây khó khăn trong việc theo dõi hiệu suất hệ thống và gỡ lỗi khi có sự cố xảy ra trên nhiều service. 

• Bảo mật: Việc quản lý secrets mới chỉ dừng lại ở mức sử dụng Kubernetes Secrets hoặc biến môi trường, chưa tích hợp các giải pháp mạnh mẽ hơn như HashiCorp Vault. Giao tiếp giữa các service cũng chưa được mã hóa (mTLS). 

• Kiểm thử: Quy trình CI mới chỉ tập trung vào build và đóng gói, chưa tích hợp các bước kiểm thử tự động một cách toàn diện (unit test, integration test, end-to-end test). 

Hướng phát triển 

Dựa trên các kết quả đạt được và những hạn chế còn tồn tại, hệ thống “Shoe Shop” có thể được phát triển và hoàn thiện theo các hướng sau: 

• Triển khai các database schema riêng cho từng microservice để đạt được sự độc lập hoàn toàn về dữ liệu. 

• Tăng cường hệ thống CI/CD và DevOps: Tích hợp các công cụ quét chất lượng mã nguồn (SonarQube) và quét lỗ hổng bảo mật (Trivy, Snyk) vào pipeline. 

• Tự động hóa hoàn toàn việc triển khai hạ tầng on-premise bằng các công cụ Infrastructure as Code (IaC) như Ansible hoặc Terraform. 

• Xây dựng hệ thống giám sát và Logging toàn diện: Triển khai Prometheus và Grafana để thu thập và trực quan hóa metrics từ tất cả các microservice và hạ tầng K8s. Thiết lập một hệ thống logging tập trung (ví dụ: EFK Stack) để thu thập log từ tất cả các container. Tích hợp Distributed Tracing (Jaeger, Zipkin) để theo dõi các request đi qua nhiều service. 

• Hoàn thiện và tối ưu hóa kiến trúc: Áp dụng Auto-scaling (HPA) trên K8s để hệ thống có thể tự động mở rộng theo tải. 

• Triển khai một API Gateway chuyên dụng để quản lý API một cách tập trung, xử lý authentication, rate limiting,… 

• Xem xét sử dụng gRPC cho giao tiếp nội bộ giữa các service để tăng hiệu suất. 

• Phát triển ứng dụng di động (Mobile App): Xây dựng ứng dụng di động đồng bộ với hệ thống web, tận dụng các API RESTful đã có từ các microservice.