Có rất nhiều tài liệu về cách viết dịch vụ, trong đó đầu tiên bạn cần chọn một số khung để sử dụng, sau đó là hệ thống xử lý, cấu hình, nhật ký, lưu trữ, v.v., chưa kể đến việc triển khai dịch vụ đó ở đâu đó. Chúng tôi đã viết các dịch vụ được một thời gian và thường xuyên hơn là bạn chỉ muốn bỏ qua tất cả quá trình tẻ nhạt này để dán các thứ lại với nhau và chỉ cần viết một số mã hữu ích.
Đó là lý do tại sao chúng tôi tạo ra một công cụ, có tên là Mify — đó là một trình tạo bản soạn sẵn cơ sở hạ tầng nguồn mở, sẽ giúp bạn xây dựng một dịch vụ, áp dụng các phương pháp hay nhất được sử dụng cho đến nay. Vì vậy, trong hướng dẫn này, chúng tôi sẽ trình bày cách tạo một dịch vụ đơn giản bằng Mify với một ví dụ cổ điển — một ứng dụng việc cần làm.
Nhận Mify từ GitHub của chúng tôi: https://github.com/mify-io/mify
Cài đặt Postman hoặc curl để kiểm tra các điểm cuối
Trước khi bắt đầu hướng dẫn này, đây là liên kết đến ví dụ hoàn chỉnh: https://github.com/mify-io/todo-app-example
Sau khi cài đặt Mify, để bắt đầu dự án, bạn cần tạo không gian làm việc:
$ mify init todo-app $ cd todo-app
Sau khi vào không gian làm việc mới, hãy chạy:
$ mify add service todo-backend
Bây giờ, thao tác này sẽ tạo mẫu Go cho chương trình phụ trợ việc cần làm của bạn. Đây là một cây không gian làm việc được đơn giản hóa với tất cả các tệp được tạo:
. ├── go-services │ ├── cmd │ │ ├── dev-runner │ │ │ └── main.go │ │ └── todo-backend │ │ ├── Dockerfile │ │ └── main.go │ ├── go.mod │ ├── go.sum │ └── internal │ ├── pkg │ │ └── generated │ │ ├── configs │ │ │ └── ... │ │ ├── consul │ │ │ └── ... │ │ ├── logs │ │ │ └── ... │ │ └── metrics │ │ └── ... │ └── todo-backend │ ├── app │ │ ├── request_extra.go │ │ ├── router │ │ │ └── router.go │ │ └── service_extra.go │ └── generated │ ├── api | | └── ... │ ├── app │ │ └── ... │ ├── apputil │ │ └── ... │ └── core │ └── ... ├── schemas │ └── todo-backend │ ├── api │ │ └── api.yaml │ └── service.mify.yaml └── workspace.mify.yaml
Mify tuân theo một cách lỏng lẻo một trong các bố cục phổ biến của Go, phù hợp với nhiều dịch vụ trong một kho lưu trữ. Trong internal/pkg/generated
có các thư viện chung dành cho cấu hình, nhật ký và số liệu có thể được sử dụng lại cho nhiều dịch vụ. Thư mục truy cập dịch vụ của bạn nằm trong internal/todo-backend
.
Tại thời điểm này, dịch vụ này khá trống, vì vậy chúng tôi cần thêm API vào nó.
Bạn có thể tìm lược đồ OpenAPI cho todo-backend trong tệp schemas/todo-backend/api/api.yaml
. Thư mục lược đồ trong thư mục gốc của không gian làm việc là nơi lưu trữ tất cả các cấu hình dịch vụ liên quan đến Mify.
Hãy tạo một API CRUD đơn giản cho phần phụ trợ việc cần làm của bạn:
POST /todos
để thêm ghi chú việc cần làm mới.PUT,GET,DELETE /todos/{id}
để cập nhật, truy xuất và xóa chúng.
Đây là cách lược đồ OpenAPI của bạn sẽ tìm kiếm API này:
https://gist.github.com/chebykinn/5dc7b30a2a57a1ab4584895131295e1f
Thay thế lược đồ trước đó bằng lược đồ này và chạy mify generate
. Bạn có thể chạy nó mỗi khi bạn cập nhật lược đồ và nó sẽ tạo lại tất cả những thứ đã thay đổi.
$ cd go-services $ go mod tidy $ go run ./cmd/todo-backend
Bạn sẽ thấy nhật ký khởi động như thế:
Bạn có thể thấy cổng dịch vụ khi starting api server
, sao chép nó vào Postman và thử gọi một số trình xử lý API:
Bạn có thể thấy rằng trình xử lý không trả lại kết quả nào, điều này được mong đợi vì như lỗi cho thấy, trình xử lý chưa được triển khai.
Đầu tiên, chúng ta cần tạo một model cho todo note, chúng ta sẽ đặt nó trong domain
package
trong go-services/internal/todo-backend/domain/todo.go
:
Đây cũng là một nơi tốt để xác định giao diện cho bộ lưu trữ, rất hữu ích để tách logic liên tục khỏi ứng dụng. Trong hướng dẫn này, chúng ta sẽ sử dụng lưu trữ mô phỏng, trong bộ nhớ, nhưng Mify cũng hỗ trợ Postgres, mà chúng ta có thể bổ sung sau trong bài viết tiếp theo. Hãy đặt dung lượng lưu trữ vào go-services/internal/todo-backend/storage/todo_mem.go:
Đó là tất cả về logic, chúng ta chỉ cần thêm nó vào bộ xử lý.
go-services/internal/todo-backend/handlers/todos/service.go
cho phương thức POST và
go-services/internal/todo-backend/handlers/todos/id/service.go
cho những người khác.
Đây là một ví dụ về sơ khai của phương thức POST:
Bây giờ, hãy triển khai tất cả các trình xử lý.
go-services/internal/todo-backend/handlers/todos/service.go
:
Đừng quên cập nhật nhập khẩu:
import ( "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" )
go-services/internal/todo-backend/handlers/todos/id/service.go
:
Và đây là nhập khẩu cho họ:
import ( "errors" "fmt" "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" "example.com/namespace/todo-app/go-services/internal/todo-backend/storage" )
Logic của trình xử lý khá đơn giản, chúng tôi chỉ chuyển đổi các mô hình OpenAPI đã tạo sang ứng dụng của chúng tôi và ngược lại, đồng thời để tránh trùng lặp mã, đây là trình trợ giúp để tạo phản hồi TodoNode, được sử dụng trong các triển khai này:
go-services/internal/todo-backend/handlers/common.go
:
Đầu tiên, chúng ta có thể thêm ghi chú việc cần làm mới với yêu cầu POST:
Kiểm tra xem nó có được thêm bằng yêu cầu GET không:
Cập nhật nó với yêu cầu PUT:
Xóa đi:
Và chạy GET một lần nữa để kiểm tra xem nó đã bị xóa chưa:
Lưu trữ liên tục, như Postgres,
Cấu hình,
Phần mềm trung gian xác thực,
Triển khai lên đám mây.
Hầu hết nội dung này đều có trong tài liệu của chúng tôi, vì vậy hãy xem chúng: https://mify.io/docs , nhưng hãy chú ý theo dõi các bài viết tiếp theo.
Cũng được xuất bản ở đây