CHƯƠNG 1: TỔNG QUAN VỀ KIẾN TRÚC MICROSERVICES 1.1 Microservices là gì? Microservices [1] là một kiểu kiến trúc phần mềm. Được hiểu một cách ngắn gọn là chúng ta chia một phần mềm lớn thành nhiều phần khác nhau được gọi là service, mỗi service sẽ đảm nhiệm một nhiệm vụ riêng biệt và độc lập với những service khác. Mỗi service sẽ được đặt trên một server riêng để có thể dễ dàng nâng cấp cũng như phát triển ứng dụng.1 Hình ảnh tổng quan về kiến trúc Microservices Một framework microservices xây dựng một hệ thống phân tán, có khả năng mở rộng và quy mô lớn, giúp giảm thiểu hiện tượng tắc nghẽn cho cơ sở dữ liệu trung tâm. Đồng thời kiến trúc này còn cải thiện các khả năng kinh doanh cho doanh nghiệp, chẳng hạn như cho phép các ứng dụng phân phối và triển khai liên tục, tiếp cận các hệ thống công nghệ hiện đại.2 Ví dụ về mô hình kiến trúc Microservices − Tổng quan về API [2] API là các phương thức, giao thức kết nối các ứng dụng khác nhau để chia sẻ tài nguyên và dữ liệu.
Nó là viết tắt của Application Programming Interface – giao diện lập trình ứng dụng. API có khả năng cung cấp khả năng truy xuất đến một tập các hàm hay dùng và từ đó có thể trao đổi dữ liệu giữa các ứng dụng với nhau.3 Mô tả API 8 Theo như hình trên ta có thể hiểu một cách đơn giản thì API đóng vai trò là một người trung gian (bồi bàn) có nhiệm vụ nhận yêu cầu của khách hàng và chuyển về cho đầu bếp, Sau đó bồi bàn sẽ đưa món ăn nhà bếp làm theo yêu cầu của khách hàng. RESTful API [3] là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource. Nó chú trọng vào tài nguyên hệ thống (tệp văn bản, ảnh, âm thanh, video, hoặc dữ liệu động…), bao gồm các trạng thái tài nguyên được định dạng và được truyền tải qua HTTP hoặc HTTPS.
Chức năng quan trọng nhất của REST là quy định cách sử dụng các HTTP method (như GET, POST, PUT, DELETE…) và cách định dạng các URL cho ứng dụng web để quản các resource. RESTful không quy định logic code ứng dụng và không giới hạn bởi ngôn ngữ lập trình ứng dụng, bất kỳ ngôn ngữ hoặc framework nào cũng có thể sử dụng để thiết kế một RESTful API. • GET (SELECT): Trả về dữ liệu hoặc một mảng dữ liệu • POST (CREATE): Tạo mới một dữ liệu • PUT (UPDATE): Cập nhật dữ liệu • DELETE (DELETE): Xoá dữ liệu Đối với trang web lấy ý kiến trực tuyến về công tác giảng dạy của giảng viên cũng vậy, sẽ sử dụng API để giao tiếp giữa Client và Server. Và để tăng tính bảo mật cho API em có sử dụng thêm JWT (JSON Web Token) để đảm bảo rằng việc giao tiếp giữa Client và Server không bị phá hoại bởi những người khác.
− Tổng quan về JWT [4] JWT là một phương tiện đại diện cho các yêu cầu chuyển giao giữa hai bên Client – Server, các thông tin trong chuỗi JWT được định dạng bằng JSON. Trong đó chuỗi TOKEN phải có 3 phần header, payload và signature được ngăn bằng dấu “. Cả 3 phần phải được mã hoá bằng một mã bí mật để tạo ra một JWT hoàn chỉnh. 9 JWT dùng để xác định xem người dùng là ai sau khi đã đăng nhập vào hệ thống.
Mỗi khi có một yêu cầu lấy dữ liệu qua API thì JWT sẽ được tạo ra và gửi đi kèm theo request và khi đó Server sẽ xác thực lại JWT đảm bảo rằng người dùng có được phép sử dụng các dữ liệu đã request trước đó hay không. Header: Phần header sẽ chứa kiểu dữ liệu và thuật toán được sử dụng để mã hoá chuỗi JWT. Payload: Phần Payload là nơi sẽ chứa những thông tin mà mình muốn gửi đến cho Server, ngoài ra còn có thời gian hết hạn của TOKEN cũng như thời gian TOKEN được tạo ra. Signature: Phần signature sẽ được tạo ra bằng cách mã hoá phần header, payload theo như thuật toán ở phần header với một mã khoá bí mật.
Kết hợp 3 phần lại ta sẽ có một JWT hoàn chỉnh.4 Cấu trúc của JWT 10 Như vậy, khoá bí mật sẽ chỉ được lưu ở phía các Server để xác thực các lượt truy cập từ phía client thông qua API. Chúng ta không nên để lộ khoá bí mật và khoá chỉ được biết bởi những người có trách nhiệm về phần mềm được biết để tránh những việc lộ thông tin cũng như giả danh người dùng. Theo như sơ đồ trên là một thể hiện của mô hình Microservice. Một ứng dụng sẽ được chia thành một bộ các microservice, mỗi microservice thực chất là một service có thể được triển khai và chạy độc lập.
Chúng tách biệt về mặt mã nguồn, về hoạt động và dữ liệu. Mỗi microservice có nơi chứa dữ liệu của riêng của nó và chỉ có nó có quyền truy cập vào vùng dữ liệu này. Do các microservice là độc lập, chúng không giao tiếp trực tiếp với nhau mà qua một thành phần trung gian được gọi là API gateway. Có thể thấy vai trò của API gateway rất quan trọng trong mô hình microservice.
Nó là điểm đến và đi của mọi yêu cầu hay phản hồi.2 Monolith Application là gì? Trái với khái niệm Microservices, Monolith Application [5] được thiết kế để xử lý nhiều tác vụ liên quan với nhau, thường là những ứng dụng phức tạp và có nhiều tính năng có mối liên hệ chặt chẽ với nhau. Toàn bộ hệ thống có thể sẽ chứa ở một server vì vậy thường sẽ có một khối lượng code rất lớn. Một thay đổi nhỏ trong bất kỳ chức năng nào cũng có thể cần phải biên dịch và thử nghiệm lại toàn bộ nền tảng.1 Mô phỏng Monolith và microservices 1.3 Kiến trúc microservices là gì? Kiến trúc microservices [6] xem mỗi chức năng của một ứng dụng như một dịch vụ độc lập, có thể thay đổi, cập nhật hay gỡ bỏ mà không ảnh hưởng gì đến những phần còn lại của ứng dụng.1 kiến trúc microservices là gì? Các ứng dụng truyền thống được xây dựng theo kiến trúc monolithic. Khi đó, việc bổ sung tính năng mới yêu cầu phải cấu hình và cập nhật lại mọi thứ: từ quy trình, giao tiếp cho đến các vấn đề bảo mật trong ứng dụng.
Các ứng dụng monolithic truyền thống thường có vòng đời dài, chu kỳ cập nhật không ổn định và các thay đổi thường có hiệu lực lên toàn bộ hệ thống ứng dụng. Việc này sẽ tốn nhiều chi phí và đôi khi có thể gây trì trệ quá trình phát triển ứng dụng trong một doanh nghiệp. Đây là một trong những nguyên nhân chính dẫn đến sự ra đời của kiến trúc microservices. Trong đó, mọi dịch vụ được xây dựng và phát triển độc lập hoàn toàn với nhau.
Khi đó các doanh nghiệp có thể dễ dàng mở rộng dịch vụ của mình dựa trên từng nhu cầu kinh doanh cụ thể. Bên cạnh đó, các dịch vụ cũng có thể được thay đổi và cập nhật nhanh chóng mà không cần ảnh hưởng đến những thành phần khác.2 hình minh hoạ ứng dụng xây dựng theo kiến trúc microservices 1.4 Các đặc trưng của mô hình Microservices − Micro-service: Đặc trưng này được thể hiện ngay từ tên của kiến trúc. Nó là microservice chứ không phải là miniservice hay nanoservice. Trên thực tế không tồn tại mô hình kiến trúc cho miniservice hay nanoservice.
Từ microservice được sử dụng để giúp người thiết kế có cách tiếp cận đúng đắn. Một ứng dụng lớn cần được chia nhỏ ra thành nhiều phần, các thành phần đó cần tách biệt về mặt dữ liệu (Database) và phải đủ nhỏ cả về mặt kích cỡ và độ ảnh hưởng của nó trong hệ thống, khi thêm một microservice vào hệ thống cũng nên đảm bảo rằng nó đủ nhỏ để dễ dàng tháo gỡ, xoá bỏ khỏi hệ thống mà không ảnh hưởng nhiều đến các thành phần khác − Tính độc lập: Các microservice hoạt động tách biệt nhau trong hệ thống, do vậy việc build một microservice cũng độc lập với việc build các microservice khác. Thông thường, để tiện cho việc phát triển và duy trì các microservice, người phát triển nên viết các built script khác nhau cho mỗi microservice. Do tính tách biệt này mà mỗi microservice đều dễ dàng thay thế và mở rộng.
Hơn thế nữa, nó còn giúp việc phát triển các microservice linh động hơn, các microservice có thể được phát triển bởi các team khác nhau, dùng các ngôn ngữ khác nhau và tiến độ phát triển dự án cũng nhanh hơn do không có sự phụ thuộc giữa các team, mỗi team có thể chủ động quản lý phần việc riêng của mình. − Giao tiếp qua API: Các microservice giao tiếp với nhau thông qua API (Application Programming Interface). Điều này giúp giảm sự phụ thuộc 14 trực tiếp giữa các thành phần và tạo điều kiện cho việc thay đổi và mở rộng dễ dàng. − Tính chuyên biệt: Mỗi microservice là một dịch vụ chuyên biệt, có thể hoạt động độc lập, thông thường mỗi microservice đại diện cho một tính năng mà các công ty/ doanh nghiệp muốn cung cấp tới người dùng, do vậy người thiết kế hệ thống microservice cần hiểu rõ về hoạt động kinh doanh của công ty.
Các đầu vào đầu ra và chức năng của mỗi microservice cần được định nghĩa rõ ràng. − Phòng chống lỗi: Kiến trúc microservice sinh ra là để dành cho các hệ thống từ lớn đến vô cùng lớn. Nó áp dụng phương pháp chia để trị, phương pháp này giúp việc áp dụng các công cụ, kỹ thuật cho việc giám sát, phòng chống lỗi phần mềm, lỗi hệ thống hiệu quả. Khi một thành phần trong hệ thống bị lỗi, nó có thể được thay thế bằng các thành phần dự phòng một cách dễ dàng, trong quá trình thay thế thành phần bị lỗi, các thành phần khác vẫn hoạt động bình thường, do vậy hoạt động của toàn bộ hệ thống sẽ không hoặc ít bị gián đoạn.
Tuy kiến trúc microservices mang lại nhiều lợi ích như sự linh hoạt, mở rộng dễ dàng và phát triển song song, nhưng cũng đòi hỏi một quá trình quản lý phức tạp hơn vì số lượng và sự phức tạp của các microservice. Cần đảm bảo quản lý và giám sát chúng một cách hiệu quả để đảm bảo tính sẵn sàng và hiệu suất của hệ thống.5 Các ưu và nhược điểm của Microservices Hình 1.1 Hình ảnh cấu trúc của monolithic và microservices − Kiến trúc ứng dụng nguyên khối (monolithic application) Với kiến trúc nguyên khối toàn bộ ứng dụng là một khối lớn, trong khối lớn ấy có chia thành các mô đun nhỏ, mỗi mô đun thực hiện một nhiệm vụ riêng và các mô đun thường gọi nhau qua function call.