- Spine là framework web backend dựa trên Go, bộc lộ luồng thực thi một cách tường minh thay vì che giấu
- Một Pipeline duy nhất sở hữu toàn bộ thứ tự thực thi, còn Controller chỉ tập trung vào logic nghiệp vụ
- Chữ ký phương thức chính là hợp đồng API, không có tự động hóa dựa trên annotation hay convention
- Thứ tự xử lý request được thể hiện rõ ràng ngay trong code
- Tập trung vào khả năng bảo trì dài hạn và dễ theo dõi luồng thực thi hơn là năng suất ban đầu
- Sử dụng Echo làm HTTP Transport và có thiết kế độc lập với ORM, cho phép tự do chọn Bun/GORM v.v.
Tổng quan về Spine
Spine là một framework hướng đến việc bộc lộ tường minh luồng thực thi của các web request
Phần lớn framework che giấu thứ tự thực thi để tăng tính tiện lợi, còn Spine cố định thứ tự đó trong cấu trúc code
Nó hướng đến một cấu trúc có thể trả lời rõ ràng câu hỏi: "Request bắt đầu từ đâu, ai xử lý và được thực thi theo thứ tự nào"
Nguyên tắc thiết kế
Chính sách không phép thuật
- Thành phần duy nhất biết thứ tự thực thi là Pipeline
- Giảm thiểu tối đa các hành vi "tự động xử lý"
- Mọi phần mở rộng và quá trình thực thi đều được đăng ký tường minh và có thứ tự có thể dự đoán
Hợp đồng dựa trên chữ ký
- Chữ ký phương thức chính là hợp đồng API
- Việc tạo input do ArgumentResolver đảm nhiệm, còn xử lý output do ReturnValueHandler đảm nhiệm
- Không cho phép ánh xạ dựa trên annotation hoặc suy luận tự động dựa trên convention
Tính độc lập của Controller
- Controller không phụ thuộc vào các kiểu HTTP/Transport
- Chỉ sử dụng các kiểu mang ý nghĩa như path., query., httperr.*
- Không cần biết mô hình thực thi, nhưng nguồn gốc của input được chỉ rõ bằng kiểu
Tính năng chính
Routing và tham số
- Hỗ trợ Path Parameter (binding dựa trên thứ tự)
- Tiện ích Query Values (parse Int, String, Boolean)
- Tự động binding Body DTO
Xử lý phản hồi
- Tự động chuyển struct -> JSON bằng ReturnValueHandler
- Tự động ánh xạ error -> mã trạng thái HTTP
- Các kiểu lỗi theo ngữ nghĩa như httperr.NotFound, BadRequest
Mối quan tâm xuyên suốt
- Interceptor (PreHandle, PostHandle, AfterCompletion)
- Tích hợp sẵn CORS Interceptor
- IoC Container dựa trên constructor
Kiến trúc
- Tách biệt tầng Transport (hiện tại là Echo, được thiết kế để có thể thay thế)
- Thiết kế độc lập với ORM (có thể tự do dùng Bun, GORM v.v. ⚠️ hiện mới chỉ xác nhận tương thích với Bun)
Điểm mạnh trong môi trường quy mô lớn
Vì chỉ có một chủ thể duy nhất biết thứ tự thực thi nên chi phí theo dõi luồng request được giảm xuống
Các mối quan tâm xuyên suốt như logging, transaction, security chỉ được đặt trong Pipeline nên vị trí áp dụng và thời điểm thực thi có thể dự đoán được; đây là chiến lược chấp nhận hy sinh một phần năng suất ban đầu để hấp thụ sự phức tạp tăng dần về lâu dài bằng chính cấu trúc
Spine không phải là gì
- Không phải là bản thay thế cho Spring/NestJS
- Không phải là framework tối đa hóa năng suất
- Không phải là framework tự động hóa dựa trên annotation
- Không phải là framework tập trung vào HTTP Engine hay Router
Spine là một dự án cần được hỗ trợ
Spine vẫn chưa phải là một framework hoàn chỉnh và được công bố khi chủ đích vẫn để nhiều phần ở trạng thái chưa hoàn thiện
Cần kiểm chứng xem cấu trúc đã đủ dễ giải thích hay chưa, và mô hình thực thi có bộc lộ tốt các vấn đề thực tế hay không
Cách tham gia
- Nhấn ⭐️ trên GitHub để theo dõi dự án
- Dùng thử rồi để lại cảm nhận hoặc thắc mắc dưới dạng issue
- Để lại bình luận về các phê bình, đề xuất hoặc câu hỏi liên quan đến thiết kế
Liên kết tham khảo
- Dự án Spine: https://github.com/NARUBROWN/spine
- Spine + Bun ORM User Demo: https://github.com/NARUBROWN/spine-user-demo
2 bình luận
Có vẻ độ tin cậy sẽ cao hơn nếu chỉnh lại phần mô tả do AI tạo một chút để câu văn tự nhiên hơn.
Xin chào, thật sự cảm ơn bạn về phản hồi.
Ý bạn nói trông giống AI là đang nói đến bài viết trên GeekNews phải không?
Ở đây tôi cứ tưởng vốn dĩ phải viết như vậy ^^… Vì thấy các bài khác cũng như thế nên tôi cố tình viết theo như vậy.
https://spine.na2ru2.me/ko/
Ngoài ra, tôi cũng đã mở một trang web để học
spine.Nếu bạn quan tâm thì hãy xem cùng nhé, xin cảm ơn.