Introduce To GoKit

- 3 mins

1. Sơ lược về Gokit

Golang là ngôn ngữ tuyệt vời cho việc phát triển hệ thống Microservices, Go thực sự mang lại những trãi nghiệm tốt về hiệu xuất lẫn sự đơn giản thân thiện đối với Developer. Sự phát triển mạnh mẽ của cộng đồng Gopher ngày càng mang đến cho chúng ta những Open Source rất hữu ích, đồng thời giúp cho việc phát triển phần mềm với Go trở nên dễ dàng hơn.

Gokit là một bộ toolkit tuyệt vời cho việc xây dựng các Microservices với Go. Gokit cung cấp cho chúng ta các quy tắc, ý tưởng về kiến trúc nhằm giúp Developer tập trung hơn vào việc phát triển Business Logic, tránh khỏi các mối quan tâm về Operational lẫn Infrastructural.

Gokit là bộ toolkit nhẹ nhàng nhưng cung cấp gần như đầy đủ các thư viện đồ chơi cho một hệ thống service mesh, từ Logging, Metrics, Tracing, Rate-Limiting, Circuit Breaking cho đến Service Discovery, Pub/Sub…

Tuy ban đầu Gokit được giới thiệu là thích hợp cho việc build các Microservices nhưng trong quá trình làm việc cá nhân mình thấy Gokit phù hợp với Monolith không kém. Với Gokit, Developer cần tuân theo một số nguyên tắc sau:

2. Kiến trúc của Gokit:

Gokit được chia làm ba Layer chính đó là

Service Layer:

Đây là tầng quan trọng nhất, nơi mà Developer cần chú trọng quan tâm nhất, là nơi chứa các domain của ứng dụng cũng như implementation của tất cả Business Logic cho ứng dụng. Service Layer được tổ chức tách biệt hoàn toàn với các phần còn lại.

Hai tầng Transport và Endpoint:

Hai tầng này nằm ở tầng Interface của Clean Architect như bài trước mình đã giới thiệu về Clean Architecture https://romeo.vn/clean-architecture/.

Tầng transaport được liên kết với các transaport protocol cụ thể như Http, gRPC, Pub/Sub nhằm lấy request từ client và encoding/decoding request.

Trong Gokit thì RPC là giao thức chính được ưu tiên nhất, mỗi service method trong Gokit sẻ được chuyển đổi thành một RPC Endpoint để giao tiếp giữa client và server. Mỗi endpoint sẻ expose một service method ra ngoài bằng cách sử dụng Transport liên kết với một giao thức Transport cụ thể như Http Rest/gRPC hay Pub/Sub.

Các Middlewares:

Giống như các ngôn ngữ OOP như Typescript, Java, C#. Việc tổ chức các Cross-Cutting Concern components( ví dụ như Logger, Circuit Breakers, Rate Limiting, Load Balancing, hay Distributed Tracing…) chúng ta thường dùng các Decorator. Với Gokit nói riêng và Go-lang nói chung chúng ta cũng dùng các Decorator. Tuy nhiên cách implement Decorator Patterns trong Golang có chút khác so với các ngôn ngữ khác, nhìn giống Middleware hơn.

Gokit Middlewares cho phép chúng ta bọc các Endpoints/Services bằng các hàm nhằm handle các Cross-Cutting Concern.

Dưới đây là một hình ảnh mô tả kiến trúc của Gokit mình copy từ trang web chính thức của Gokit

Atom

Note

Việc phụ thuộc vào một thư viện, tool kit là điều không nên khi xây dựng kiến trúc một phần mềm. Tuy nhiên việc tận dụng những gì sẳn có mà một thư viện toolkit nào đó cung cấp, những thứ khớp với mục đích của chúng ta có thể giúp chúng ta đẩy nhanh được tiến độ dự án. Bên cạnh đó với nhận thức về cái giá của dependencies thì chúng ta cũng có thể dễ dàng gở bỏ, thay thế những thư viện toolkit này một cách nhanh chóng và đơn giản trong tương lai.

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora