有很多关于如何编写服务的资料,首先您需要选择要使用的框架,然后是处理程序、配置、日志、存储等的连接,更不用说在某处部署该服务了。我们编写服务已经有一段时间了,而且通常情况下,您只想跳过所有这些将东西粘合在一起的繁琐过程,而只是编写一些有用的代码。 这就是为什么我们创建了一个名为 Mify 的工具——它是一个开源基础设施样板生成器,可以帮助您构建服务,采用迄今为止使用的最佳实践。因此,在本教程中,我们将通过一个经典示例展示如何使用 Mify 创建一个简单的服务——一个待办事项应用程序。 先决条件 安装 1.18+, Go Docker 从我们的 GitHub 获取 Mify: ://github.com/mify-io/mify https 安装 或 curl 来测试端点 Postman 在开始本教程之前,这里是完整示例的链接: 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。 定义API 您可以在 文件中找到 todo-backend 的 OpenAPI 模式。工作区根目录下的 Schemas 目录是存放所有与 Mify 相关的服务配置的地方。 schemas/todo-backend/api/api.yaml 让我们为您的待办事项后端创建一个简单的 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 您应该看到这样的启动日志: 您可以在 日志消息中看到服务端口,将其复制到 Postman,然后尝试调用一些 API 处理程序: starting api server 您可以看到处理程序未返回任何内容,这是预期的,因为正如错误所暗示的那样,它尚未实现。 添加模型和模拟存储 首先,我们需要为待办事项创建一个模型,我们将把它放在 包中 domain 在 中: go-services/internal/todo-backend/domain/todo.go https://gist.github.com/chebykinn/0c2905f07d76082bd9d63a56a720371c?embedable=true 这也是定义存储接口的好地方,这对于将持久性逻辑与应用程序解耦很有用。在本教程中,我们将在内存中使用模拟存储,但 Mify 还支持 Postgres,我们可以在后续文章中添加。让我们将存储放在 go-services/internal/todo-backend/storage/todo_mem.go: https://gist.github.com/chebykinn/1769d6881e929bfb225fc203c48e1496?embedable=true 这就是逻辑,我们只需要将它添加到处理程序中。 实施处理程序 对于 POST 方法,和 go-services/internal/todo-backend/handlers/todos/service.go 对于其他人。 go-services/internal/todo-backend/handlers/todos/id/service.go 下面是 POST 方法的存根示例: https://gist.github.com/chebykinn/e49b483330ea7c84a1b8082b0a86fc01?embedable=true 现在,让我们实现所有处理程序。 : go-services/internal/todo-backend/handlers/todos/service.go https://gist.github.com/chebykinn/6f88c03680167c4dc286f1b6226341f9?embedable=true 不要忘记更新导入: 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 https://gist.github.com/chebykinn/98d2d051671dfbefb464b1f59b159d15?embedable=true 这也是他们的进口产品: 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 https://gist.github.com/chebykinn/702f24abe035cd99dbc06c4447ecc755?embedable=true 再次测试 首先,我们可以使用 POST 请求添加一个新的待办事项: 检查是否添加了 GET 请求: 使用 PUT 请求更新它: 删除它: 并再次运行 GET 以检查它是否被删除: 下一步是什么 持久存储,如 Postgres, 配置, 认证中间件, 部署到云端。 大多数内容都包含在我们的文档中,因此请查看它们:https: ,但请继续关注下一篇文章。 //mify.io/docs 也在 发布 这里