paint-brush
Xây dựng dịch vụ API RESTful trong Go mà không cần có bản soạn sẵn lặp đi lặp lạitừ tác giả@ichebykin
1,178 lượt đọc
1,178 lượt đọc

Xây dựng dịch vụ API RESTful trong Go mà không cần có bản soạn sẵn lặp đi lặp lại

từ tác giả Mify6m2023/03/06
Read on Terminal Reader

dài quá đọc không nổi

Chúng tôi đã viết các dịch vụ trong một thời gian khá dài và thường thì bạn chỉ muốn bỏ qua tất cả quy trình tẻ nhạt này để ghép các thứ lại với nhau và chỉ viết mã hữu ích, vì vậy chúng tôi đã tạo Mify - một trình tạo bản soạn sẵn cơ sở hạ tầng nguồn mở. 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.
featured image - Xây dựng dịch vụ API RESTful trong Go mà không cần có bản soạn sẵn lặp đi lặp lại
Mify HackerNoon profile picture



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.

điều kiện tiên quyết

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

Tạo dự án

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ó.

Định nghĩa API

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.

Xây dựng và thử nghiệm

 $ 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.

Thêm mô hình và lưu trữ giả

Đầ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ý.

Trình xử lý triển khai

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 :

Kiểm tra lại

Đầ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:

Cái gì tiếp theo

  • 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