Phát triển ứng dụng web theo hướng Microservices và Micro-Frontends

MỤC LỤC

Ki ¿ n trúc micro-frontends

T ổ ng quan v Á micro-frontends

• Lần đầu tiên khi có yêu cầu gửi tới máy chÿ web, nái dung cÿa toàn bá trang HTML được n¿p về phía trình duyệt. • à những lần tiếp theo, khi có yêu cầu chuyển trang hoặc thực hiện mát tác vụ nào đó, máy khách sẽ gửi các yêu cầu Ajax lên máy chÿ web. • Phía máy khách nhận dữ liệu trả về và thực hiện việc cập nhật các phần nái dung trên trang web bằng cách sử dụng JavaScript và DOM để tương tác với tài liệu HTML.

Dữ liệu thay đổi phần nào thì sẽ cập nhật l¿i phần đó, mà không cần phải n¿p l¿i toàn bátrang như trong mô hình web truyền tháng. Nhiều hãng công nghệ lớn trên thế giới như Google, Facebook đều lựa chán SPA để t¿o ra những āng dụng web nhằm tận dụng tỏi đa những lợi ớch mà nú đem l¿i, đồng thòi làm tăng tớnh trải nghiệm cho ngưòi dựng. Với cách tiếp cận mới, micro-frontends hướng vào việc chuyển đổi āng dụng web nguyên khái, từ mát kiến trúc sử dụng chung mát cấu trúc mã nguồn duy nhất sang mát kiến trúc được kết hợp bái nhiều āng dụng phía giao diện.

Tư tưỏng cỏt lừi trong cỏch tiếp cận cÿa micro-frontends là tập trung vào việc xõy dựng mát āng dụng web như là mát tập hợp cÿa nhiều thành phần con, các thành phần này được xây dựng bái các đái ngũ lập trình khác nhau. Tuy nhiên, việc đưa ý tưáng này để áp dụng cho phần giao diện thì vẫn còn khá xa l¿ so với các mô hình làm web truyền tháng trước đây, bái các ph¿m trù liên quan đến micro- frontends mới chỉ xuất hiện trong khoảng thòi gian từ 5 đến 6 năm trỏ l¿i đõy. Bá cục cÿa trang này gồm ba thành phần: <Search= – thực hiện tính năng tìm kiếm sản phẩm, <Product List= – hiển thò danh sỏch sản phẩm và <Product Details= – hiển thò thụng tin chi tiết cÿa mỏt sản phẩm mòi khi ngưòi dựng chỏn vào mỏt sản phẩm bờn phần <Product List=.

Theo hướng tiếp cận cÿa micro-frontends, để xây dựng trang thông tin sản phẩm á trờn, ngưòi ta sẽ phỏt triển riờng biệt ba thành phần: <Search=, <Product List= và. Ba module này là ba āng dụng riêng biệt, được giao cho ba đái phát triển, mòi đỏi cú thể lựa chỏn cỏc cụng nghệ khỏc nhau tựy theo thế m¿nh cÿa mỡnh. Sau khi xây dựng xong, các module này sẽ được tích hợp l¿i để làm thành mát trang hiển thò thụng tin sản phẩm hoàn thiện.

Đái với nhóm phát triển, chúng ta thấy rằng công việc được phân phái cho từng đái với tớnh chuyờn mụn húa rừ ràng. Mòi đỏi phụ trỏch mỏt phần việc chuyờn biệt, và nhò đó tác đá xây dựng sản phẩm được đẩy lên cao do giảm được sự phụ thuác chặt giữa các thành phần. Như vậy, micro-frontends là mát hướng kiến trúc được đề xuất cho sự phát triển āng dụng web mà ỏ đú ngưòi ta phõn tỏch mỏt āng dụng theo hướng nguyờn khỏi thành nhiều thành phần con.

Hình 2.4. Ba mô hình tri ể n khai web truy ề n th ố ng
Hình 2.4. Ba mô hình tri ể n khai web truy ề n th ố ng

Đỏnh giỏ °u nh°ÿc đià m và bài h ỏ c kinh nghi ò m

Luận văn đó làm rừ cỏc ph¿m trự cơ bản trong phương phỏp phỏt triển phần mềm theo hướng microservices và micro-frontends như áp dụng các nguyên tắc thiết kế, sử dụng cỏc mẫu thiết kế cỏt lừi để xõy dựng hệ thỏng và vận dụng kỹ thuật thiết kế hướng miền để phân ho¿ch, thiết kế chương trình. Micro-frontends là hướng kiến trúc mới, và việc sử dụng single-spa để tích hợp các āng dụng SPA theo hướng micro-frontends đã được trình bày trong luận văn trên các khía c¿nh như kiến trúc tổng thể cÿa single-spa, cơ chế tích hợp, điều hướng và giao tiếp giữa các micro-frontends. Trên nền tảng Java, Spring Boot và Spring Cloud được xem là các framework mã nguồn mỏ tỏt nhất tớnh đến thòi điểm hiện t¿i để xõy dựng microservices.

Khi sử dụng single-spa để tích hợp các micro-frontends (viết bằng Angular, ReactJS), cần cân nhắc việc sử dụng cơ chế <build-time= hoặc <run-time= cũng như sự tháng nhất về phiên bản cÿa thư viện giữa các module web. Các kết quả thu được về mặt lý thuyết cũng như thực hành (kỹ thuật, công nghệ) đã và đang được áp dụng vào các dự án theo hướng <xây dựng hoặc chuyển đổi hệ thống monolithic sang microservices và micro-frontends= mà tác giả tham gia t¿i công ty phần mềm FPT. Vấn đề thứ nhất: các microservices giao tiếp bằng cách gửi thông điệp cho nhau, và khi sá lượng các microservices nhiều thì việc tương tác này có thể gặp sự cá, ví dụ như việc gửi và phản hồi thụng điệp bò trỡ hoón, tỏc đỏ truyền tải dữ liệu bòảnh hưỏng.

Vấn đề thứ hai: do tính triển khai đác lập về mặt cơ sá dữ liệu cũng như phân tán trờn cỏc mỏy cho nờn việc đảm bảo tớnh toàn vẹn cho cỏc giao dòch phõn tỏn là mỏt điều khụng dễ dàng. Vấn đề thứ ba: việc thực hiện kiểm thử tự đỏng cho từng dòch vụ trong mỏt hệ thỏng microservices nhiều khi cần phải kết hợp với việc ch¿y cỏc dòch vụ con mà nú phụ thuác. Vấn đề thứ tư: khi mỏt hệ thỏng microservices lớn (gồm vài chục đến vài trăm dòch vụ) thì vấn đề quản lý quá trình phát triển và triển khai cài đặt không hềđơn giản.

Để đảm bảo tính hiệu quả, năng suất cho việc triển khai và vận hành hệ tháng, đái phát triển cần phải áp dụng quy trình tích hợp và chuyển giao liên tục (CI/CD62), và điều này đòi hòi mỏt sựđầu tư cho chi phớ h¿ tầng cũng như cụng nghệ. Nếu quan niệm việc tỏch chương trỡnh đến đỏ nhò ỏ māc chỉ từ vài chục đến vài trăm dòng lệnh, và coi đó là mát microservice thì điều này thực sự không hiệu quả, mà ngược l¿i nó còn làm tăng tính phāc t¿p cho cả hệ tháng. Các framework để làm tầng giao diện hiện nay rất nhiều và cơ chế quản lý gói thư viện giữa chỳng chưa được thỏng nhất và ổn đònh như cỏc cụng nghệ cho tầng dòch vụ.

Framework này ho¿t đáng khá tát với Angular nhưng nhiều khi l¿i khó tương thích với āng dụng viết bằng ReactJS vỡ mỏt sỏ thành phần trong <single-spa= chưa hò trợ cỏc. Ngoài ra, việc điều hướng giữa các micro-frontends nhiều khi gây ra mát sá vấn đề cho quá trình kết xuất phía giao diện, ví dụ: các thành phần CSS đôi khi ho¿t đáng không được mượt, việc t¿o và n¿p nhiều module web với dữ liệu phāc t¿p trên cùng mát trang sẽ ảnh hưáng đến tính hiệu năng cÿa āng dụng. Từ những ưu nhược điểm nêu trên, việc áp dụng microservices hay micro-frontends cần phải tính đến các yêu cầu về mặt nghiệp vụ, lo¿i hình kinh doanh (bài toán) cũng như cỏc yếu tỏ về mặt con ngưòi (chuyờn mụn, kỹnăng).