chương 1 trình bày các khái niệm nền tảng của kiến trúc microservices: dịch vụ, kiến trúc monolithic và định nghĩa kiến trúc microservices. Phần tiếp theo trình bày các mẫu thiết kế của kiến trúc microservices. Phần cuối chương trình bày các lợi ích của kiến trúc microservices cũng như thực trạng sử dụng kiến trúc microservices hiện nay. Dịch vụ Dịch vụ trong phần mềm là một thành phần ứng dụng có thể thực hiện một hoặc nhiều chức năng trong hệ thống mà không cần giao diện cho người dùng (1).
Các ứng dụng chạy trên các môi trường khác nhau đều có thể sử dụng dịch vụ để thực hiện một hoặc một vài chức năng trong hệ thống của mình. Dịch vụ phải có khả năng tái sử dụng, thích ứng với các môi trường khác nhau và có thể tự động phát hiện trên toàn hệ thống, đám mây, … Mỗi dịch vụ sẽ thực hiện xử lý các yêu cầu từ phía máy trạm và gửi lại các câu trả lời theo một chuẩn đã quy ước, đồng thời các dịch vụ cũng có thể kết nối đến nhau để cùng thực hiện một vài chức năng của hệ thống hoặc để tổ hợp thành một dịch vụ khác. Một dịch vụ bao gồm ba thành phần là giao diện (interface), các ràng buộc (contract) và cài đặt (implementation) (Hình 1. Các thành phần của dịch vụ Giao diện sẽ định nghĩa các phương thức để nhà cung cấp dịch vụ (service provider) thực hiện các yêu cầu của người dùng dịch vụ (service consumer).
Các ràng buộc sẽ quy định các chuẩn cho phép các nhà cung cấp dịch vụ và người dùng dịch vụ giao tiếp với nhau. Thành phần cài đặt sẽ thực hiện các chức năng của dịch vụ. Kiến trúc monolithic Trong phần mềm, kiến trúc monolithic là một kiểu kiến trúc cho phép xây dựng hệ thống thành một khối duy nhất, trong đó bao gồm ba thành phần: giao diện người dùng, xử lý nghiệp vụ logic và phần truy cập dữ liệu (2) (Hình 1. Các thành phần của kiến trúc Monolithic Giao diện người dùng: thông qua các thẻ HTML và javascript để giao tiếp giữa người dùng và hệ thống.
Nghiệp vụ logic: thực hiện các nghiệp vụ logic để thực hiện các yêu cầu HTTP đồng thời tổng hợp các thông tin từ cơ sở dữ liệu dưới dạng HTML và javascript để trả về giao diện người dùng. Dữ liệu truy cập: thực hiện các thao tác để chỉnh sửa, cập nhật cơ sở dữ liệu. Một hệ thống được xây dựng trên kiến trúc monolithic là một hệ thống hoàn toàn khép kín, độc lập với các hệ thống khác và nó chỉ được xây dựng trên một nền tảng duy nhất, do đó hệ thống được xây dựng trên monolithic rất dễ xây dựng, dễ quản lý. Cũng chính vì vậy mà các hệ thống xây dựng trên kiến trúc monolithic có một nhược điểm rất lớn là nếu có bất kỳ thay đổi nào dù là rất nhỏ trong một trong ba thành phần của hệ thống cũng khiến đội ngũ phát triển phải tạo ra một phiên bản mới cho cả hệ thống.
Ví dụ người dùng muốn thay đổi màu sắc của một nút ngoài giao diện người dùng thì cả hệ thống sẽ phải được điều z 13 chỉnh, tái kiểm thử, tái triển khai trên một phiên bản mới. Điều này khiến cho việc xây dựng và phát triển hệ thống trên monolithic là rất tốn kém và không linh hoạt. Đặc biệt là với các hệ thống lớn việc xây dựng phát triển hệ thống bằng kiểu kiến trúc monolithic sẽ trở lên rất phức tạp. Chi phí, thời gian dành cho việc xây dựng, phát triển, sửa lỗi và kiểm thử mỗi chức năng sẽ tăng lên theo độ lớn của hệ thống.
Mặc dù kiến trúc monolithic còn tồn tại nhiều nhược điểm nhưng nhờ các ưu điểm độc lập, dễ xây dựng và quản lý monolithic đã được sử dụng để xây dựng và phát triển thành các kiểu kiến phúc phần mềm khác rất phổ biến hiện nay như kiến trúc hướng dịch vụ. Microservices cũng là một kiểu kiến trúc được xây dựng và phát triển từ kiến trúc monolithic, mỗi dịch vụ trong kiến trúc microservices đều kế thừa các đặc điểm độc lập của kiến trúc monolithic. Kiến trúc microservices Tư tưởng chia để trị của kiến trúc microservices thực ra đã được đề xuất từ khá lâu trước đây nhưng phải đến tháng 03/2014 (3) Martin Fowler - tác giả của mô hình phát triển ứng dụng Agile và James Lewis đã có một bài giải thích chi tiết và thú vị trên trang web cá nhân về kiến trúc microservices. Sau đó tháng 07/2014 (4) Stefan Borjse – Giám đốc, đồng sáng lập công ty bán thiết bị Wi-fi Karma đã viết trên blog cá nhân của mình về quá trình xây dựng cửa hàng trực tuyến bán sản phẩm của Karma bằng cách chia nhỏ các ứng dụng thành các phần nhỏ hơn để thực hiện, nhưng ông và các nhân viên của mình đã gặp khó khăn trong khâu kiểm thử, vì việc kiểm thử các dịch vụ nhỏ thì tương đối dễ nhưng khi ghép chúng vào một hệ thống thì lại là một bài toán khó.
Tháng 11/2014 (5) Toby Clemson – một nhà phát triển của ThoughtWorks đã có một bài diễn thuyết cách tiếp cận đa lớp để thử lỗi trong các hệ thống xây dựng trên kiến trúc microservices. Tại đây Toby đã đề nghị thử lỗi cho từng microservice một cách độc lập để khắc phục các khó khăn trong khâu kiểm thử của hệ thống xây dựng trên microservices mà Stefan và các đồng nghiệp của ông đã gặp phải. Tất nhiên Toby cũng khuyến cáo việc tất cả các microservice chạy tốt thì không có nghĩa cả hệ thống sẽ chạy tốt. Vì vậy Toby cũng đề xuất một loạt các phương pháp về cách tích hợp các thành phần, tương tác, thử lỗi đầu cuối để các nhà phát triển phần mềm khắc phục được các khó khăn trong quá trình xây dựng phần mềm dựa trên kiến trúc microservices.
Kiến trúc microservices là một kiểu kiến trúc phần mềm dành cho các hệ thống được xây dựng dựa trên các dịch vụ, trong đó các dịch vụ này được chia thành các thành phần nhỏ và hoàn toàn độc lập với nhau, mỗi thành phần nhỏ z 14 này gọi là một microservice. Mỗi microservice chỉ tập trung vào giải quyết một chức năng duy nhất trong hệ thống và giao tiếp với nhau thông qua các API (6). Ví dụ một ứng dụng được xây dựng trên kiến trúc microservices được thể hiện trong Hình 1. Ứng dụng gồm ba microservie độc lập và giao tiếp với nhau để thực hiện các chức năng của ứng dụng và mỗi microservice đều có một cơ sở dữ liệu riêng và các microservice này giao tiếp với nhau thông qua các API.Ví dụ kiến trúc microservices Mô hình kiến trúc của microservices bao gồm ba thành phần chính: các hạ tầng phát triển (development), các hạ tầng hoạt động (operational) và kho dữ liệu (datastore).
Ngoài ra còn có một số thành phần hỗ trợ khác như các công cụ được trang bị (tooling), các công cụ dùng để cấu hình (configuration), định tuyến (routing) và truy tìm phân phối (observability). Các thành phần hỗ trợ này có thể có hoặc không. Mô hình kiến trúc của microservices (7) Hạ tầng phát triển (development) là các nền tảng được lựa chọn để xây dựng hệ thống như ngôn ngữ lập trình và ứng dụng đóng gói được sử dụng trong hệ thống. Hạ tầng hoạt động (operations) bao gồm các thành phần cơ sở hạ tầng để triển khai hệ thống như máy chủ, … Datastore quản lý các công nghệ mà hệ thống sử dụng để lưu trữ cơ sở dữ liệu.
Các thành phần hỗ trợ: sự trang bị (tooling), cấu hình (configuration), khám phá (discovery), định tuyến (routing) và truy tìm, phân phối (observability). Mỗi microservice trong kiến trúc microservices đều có những đặc điểm giống với các dịch vụ trong các hệ thống khác. Điều khác biệt lớn nhất là phạm vi của microservice, nó được giới hạn trong một chỉ tiêu nhất định mà trong định nghĩa được gọi là “nhỏ”. “Nhỏ” ở đây không phải được tính bởi số lượng dòng code được sử dụng trong mỗi microservice, mà nhỏ ở đây chính là phạm vi để thực hiện mỗi chức năng bất kỳ trong hệ thống - mỗi microservice trong kiến trúc microservices chỉ giải quyết một chức năng duy nhất của hệ thống.
Các microservice giao tiếp với nhau thông qua các API. Mỗi API dùng để kết nối các microservice sẽ có hai kiểu kết nối như sau: Đồng bộ: microservice A sử dụng API kết nối đến microservice B z 16 bằng cách gửi thông báo và chờ microservice B phản hồi. Bất đồng bộ: microservice A gửi thông báo đến microservice B sau đó tiếp tục chạy và sẽ xử lý phản hồi của B sau khi có câu trả lời. Mỗi microservice trong kiến trúc microservices sẽ gọi đến các microservice khác trên API bằng ba cách gọi sau: REST (Representational State Transfer): các thông báo được gửi qua HTTP để truy vấn, thao tác dữ liệu.
Kiểu dữ liệu sau truy vấn sẽ được trả về dạng XML, JSON, JSONb RPC (Remote Procedure Call): cách gọi này giống với mô hình Client- Server trong đó microservice gửi yêu cầu kết nối sẽ đảm nhiệm vai trò của Client và microservice nhận kết nối sẽ là Server. SOAP (Simple Object Access Protocol): các microservice truyền thông điệp cho nhau dưới dạng XML. Đối với các microservice dành cho người dùng đầu cuối sẽ không được kết nối trực tiếp vào các microservice khác mà chúng sẽ giao tiếp với nhau thông qua một cổng API. Cổng API này có nhiệm vụ phân tải, lưu trữ tạm thời và kiểm tra quyền truy cập của người dùng đầu cuối.
Mỗi microservice trong kiến trúc microservices có thể có một cơ sở dữ liệu riêng và chúng có thể có cách lưu trữ dữ liệu khác nhau. Đây là một điểm mới trong kiến trúc microservices, khác với cách lưu trữ dữ liệu tập trung của các kiến trúc khác. Mẫu thiết kế trong microservices Microservices là kiểu kiến trúc được hình thành từ các dịch vụ nên khi sử dụng kiểu kiến trúc này ta phải lựa chọn phương pháp để các máy trạm có thể kết nối với các microservice và cơ chế để các microservice phát hiện và giao tiếp với nhau trên mạng. Ứng với mỗi kiểu kết nối sẽ có một hoặc nhiều mẫu thiết kế riêng cho nó.
Các máy trạm kết nối đến các microservice thì kiến trúc microservices sẽ sử dụng mẫu thiết kế cổng API, để phát hiện dịch vụ thì có thể sử dụng một trong hai mẫu thiết kế phát hiện phía máy trạm (Client-side discovery) và phát hiện phía máy chủ (Server-side discovery). Để đăng ký dịch vụ thì kiến trúc microservices cho phép các microservice đăng ký dịch vụ với hai mẫu thiết kế tự đăng ký (self-registration) và đăng ký qua bên thứ ba (third- party registration).