Chào mọi người 👋, tiếp nối phần trước – Microsevices #1 – Sự lựa chọn, trong bài viết này mình xin chia sẻ về việc Triển khai microservices "tinh gọn" để bắt đầu dễ dàng hơn, bài chia sẻ dựa trên góc nhìn cá nhân mong nhận được sự đón nhận của các bạn.
Trước tiên, mình muốn nói rằng bài này không phù hợp lắm với người đã có kinh nghiệm mà sẽ phù hợp cho người mới hoặc team mới tiếp cận microservices như mình trước đây. Những người vừa phải tiếp cận hàng trăm thuật ngữ và kiến thức mới, vừa phải tìm hiểu từng cái một để xem ứng dụng nó như thế nào ở "vũ trụ microservice" này.

Kế tiếp, mình sẽ chia sẻ các từ khóa hoặc công nghệ mình đã dùng. Điều này có thể giúp bạn bớt "gánh nặng" hơn, biết cái nào nên ôm vào làm, cái nào nên xài hàng có sẵn. Mục tiêu là sớm dựng được hệ thống chạy microservices đàng hoàng nhưng vẫn tinh gọn và tiết kiệm được nhiều công sức.

Để xây dựng microservices, đúng là có quá nhiều vấn đề cần quan tâm. Chưa hết, bạn còn phải đọc hằng hà sa số kiến thức (hàn lâm, cao siêu) từ những người đi trước. Cái nào thấy cũng hay, rồi cắm đầu vào làm cho bằng hết rồi.. chìm luôn.

Nếu bình tĩnh lại để phân tích: năng lực và kiến thức hiện tại của mình, những nguồn lực mình đang có và tổ chức mình đang thực sự cần gì. Bạn sẽ bớt bị "sa lầy" hơn đấy, tin mình đi.

Các vấn đề cần giải quyết vừa nêu trên khi làm Microservices gồm:

  • Decomposition
  • Data management
  • Testing
  • Deployment
  • Communication
  • Security
  • Observability

Lược đồ dưới đây sẽ cung cấp cho bạn cái nhìn tổng quan
MicroservicePatternLanguage
Hình ảnh được trích từ microservices.io
Chi tiết xem tại microservices.io – patterns

Chúng ta có thể thấy có rất nhiều thứ cần được triển khai, nhưng trong giai đoạn đầu có những thứ là chưa thật sự cần thiết (thực ra có khi cũng không làm tốt hết được).

Vì vậy dưới đây là những gì mình sẽ triển khai cho EGANY 2.0 sau khi đã có nguyên rổ hành ở lần đầu tiên 🤪. Xin lưu ý, vì NodeJS được sử dụng chính trong các dự án của EGANY, do đó những nội dung dưới đây sẽ thiên về NodeJS hơn, nào bắt đầu thôi.

1. Core

Core là những thành phần cốt lõi để xây dựng ứng dụng, nó là bất kỳ thứ gì như framework, nền tảng, ngôn ngữ lập trình.. , ở đây mình sẽ bàn Framework.

Framework

Thay vì việc tự triển khai các module để triển khai microservices như các module dùng để giao tiếp (communication), logger, tracking, service discovery… Thì việc lựa chọn một framework chuyên dụng là một lựa chọn không hề tồi, việc còn lại là tập trung phát triển nghiệp vụ chính. Ở đây mình đã chọn moleculer.service, một framework dành cho NodeJS có gần như là đủ các module để phát triển microservices một cách nhanh chóng. Ok, giờ đã xác định những thành phần của core, giờ xem ta cần những gì tiếp theo.

2. API Gateway

Đây cũng là service khá thông dụng trong microservices vì vậy có dịch vụ trả phí, cũng như project mã nguồn mở. Ở đây để tiết kiệm chi phí và nếu đó là những gì bạn quan tâm thì việc ưu tiên tìm kiếm các project mã nguồn mở, uy tín và chất lượng sẽ là một lựa chọn ổn.
Trong trường hợp moleculer.service cũng có hỗ trợ xây dựng API Gateway thông qua moleculer web, vì vậy việc dùng chung một stack của moleculer để tận dụng các tính năng mà nó cung cấp thì còn gì bằng 👏

Richardson-microservices-part2-3_api-gateway.png
Hình ảnh được trích từ nginx.com

3. Auth Service

Nếu yêu cầu về bảo mật chưa cần nâng cao thì hoàn toàn có thể lựa chọn tự triển khai một auth service đơn giản với access token. Một vấn đề trong security là việc auth giữa các service với nhau, tuy nhiên nếu trong trường hợp không cần thiết thì bạn có thể để sau.

auth-sequence-auth-code.png
Hình ảnh được trích từ auth0.com

4. Service Communication

Ở đây ta có thể có hai cách giao tiếp chính là Remote Procedure InvocationMessaging. Khi sử dụng framework thường sẽ có transporter đảm nhận việc giao tiếp giữa các service với nhau.

sync-vs-async-patterns-across-microservices.png
Hình ảnh được trích từ docs.microsoft.com

Trong trường hợp moleculer thì chỉ cần cấu hình loại transporter mong muốn và sau đấy mọi thứ sẽ hoạt động ^^. Chia sẻ thêm mình dùng NATS cho transporter vì việc cấu hình chạy ở chế độ cluster rất đơn giản.

networking.svg
Hình ảnh được trích từ moleculer.services

5. Data Management

Data là một phần không thể thiếu trong hầu như mọi ứng dụng, đối với microservices sẽ có các chiến lược triển khai database riêng để đảm bảo hiệu quả nó. Có những hướng triển như CQRS, Shared database, nhưng với các dự án thông thường ít khi triển khai. Vì vậy hãy tiếp cận những thứ gần gũi hơn như Database per Service, Domain event, và API Composition.

6. Docker

Với docker ta có docker enginedocker hub đơn giản để tìm hiểu, sử dụng, miễn phí, hỗ trợ đầy đủ để deploy và quản lý service.
Ngoài ra nếu bạn muốn có giao diện để xem trực quan có thể sử dụng thêm portainer

architecture.svg
Hình ảnh được trích từ docs.docker.com

Trên đây là những thành phần cơ bản nhất để bạn có thể bắt đầu triển khai microservices. Còn lại là việc phát triển các service khác phục vụ cho nhu cầu sản phẩm của bạn.

Tới đây đã đủ đồ chơi rồi đó anh em, hy vọng bài này giúp cho mọi người có thêm thông tin giá trị và một góc nhìn khác về việc triển khai microservice. Bắt tay vào làm thôi..

Chưa bắt đầu làm thì sao biết là không được 😉

Cảm ơn mọi người đã chịu khó đọc tới đây!

Tham khảo

Nội dung bài viết có tham khảo, sử dụng hình ảnh, nội dung từ các nguồn sau: