有很多关于如何编写服务的资料,首先您需要选择要使用的框架,然后是处理程序、配置、日志、存储等的连接,更不用说在某处部署该服务了。我们编写服务已经有一段时间了,而且通常情况下,您只想跳过所有这些将东西粘合在一起的繁琐过程,而只是编写一些有用的代码。
这就是为什么我们创建了一个名为 Mify 的工具——它是一个开源基础设施样板生成器,可以帮助您构建服务,采用迄今为止使用的最佳实践。因此,在本教程中,我们将通过一个经典示例展示如何使用 Mify 创建一个简单的服务——一个待办事项应用程序。
在开始本教程之前,这里是完整示例的链接: https://github.com/mify-io/todo-app-example
安装 Mify 后,要启动项目,您需要创建工作区:
$ mify init todo-app $ cd todo-app
进入新工作区后,运行:
$ mify add service todo-backend
现在,这将为您的待办事项后端创建一个 Go 模板。这是包含所有生成文件的工作区的简化树:
. ├── 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 松散地遵循一种常见的 Go 布局,适用于一个存储库中的多个服务。在internal/pkg/generated
中有用于配置、日志和指标的公共库,可以重复用于多个服务。您的服务转到目录位于internal/todo-backend
。
此时此服务还很简单,因此我们需要向其添加 API。
您可以在schemas/todo-backend/api/api.yaml
文件中找到 todo-backend 的 OpenAPI 模式。工作区根目录下的 Schemas 目录是存放所有与 Mify 相关的服务配置的地方。
让我们为您的待办事项后端创建一个简单的 CRUD API:
POST /todos
用于添加新的待办事项。PUT,GET,DELETE /todos/{id}
用于更新、检索和删除它们。
以下是您的 OpenAPI 模式查找此 API 的方式:
https://gist.github.com/chebykinn/5dc7b30a2a57a1ab4584895131295e1f
将之前的模式替换为这个模式并运行mify generate
。您可以在每次更新架构时运行它,它将重新生成所有更改的内容。
$ cd go-services $ go mod tidy $ go run ./cmd/todo-backend
您应该看到这样的启动日志:
您可以在starting api server
日志消息中看到服务端口,将其复制到 Postman,然后尝试调用一些 API 处理程序:
您可以看到处理程序未返回任何内容,这是预期的,因为正如错误所暗示的那样,它尚未实现。
首先,我们需要为待办事项创建一个模型,我们将把它放在domain
包中
在go-services/internal/todo-backend/domain/todo.go
中:
这也是定义存储接口的好地方,这对于将持久性逻辑与应用程序解耦很有用。在本教程中,我们将在内存中使用模拟存储,但 Mify 还支持 Postgres,我们可以在后续文章中添加。让我们将存储放在go-services/internal/todo-backend/storage/todo_mem.go:
这就是逻辑,我们只需要将它添加到处理程序中。
go-services/internal/todo-backend/handlers/todos/service.go
对于 POST 方法,和
go-services/internal/todo-backend/handlers/todos/id/service.go
对于其他人。
下面是 POST 方法的存根示例:
现在,让我们实现所有处理程序。
go-services/internal/todo-backend/handlers/todos/service.go
:
不要忘记更新导入:
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
:
这也是他们的进口产品:
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" )
处理程序的逻辑非常简单,我们只是将生成的 OpenAPI 模型转换为我们的应用程序并返回,为了避免代码重复,这里有一个用于创建 TodoNode 响应的帮助程序,它在这些实现中使用:
go-services/internal/todo-backend/handlers/common.go
:
首先,我们可以使用 POST 请求添加一个新的待办事项:
检查是否添加了 GET 请求:
使用 PUT 请求更新它:
删除它:
并再次运行 GET 以检查它是否被删除:
持久存储,如 Postgres,
配置,
认证中间件,
部署到云端。
大多数内容都包含在我们的文档中,因此请查看它们:https: //mify.io/docs ,但请继续关注下一篇文章。
也在这里发布