paint-brush
在没有重复样板的情况下用 Go 构建 RESTful API 服务经过@ichebykin
1,184 讀數
1,184 讀數

在没有重复样板的情况下用 Go 构建 RESTful API 服务

经过 Mify6m2023/03/06
Read on Terminal Reader

太長; 讀書

我们编写服务已经有一段时间了,而且通常情况下,您只是想跳过所有这些将东西粘合在一起的繁琐过程,而只是编写有用的代码,因此我们创建了 Mify——一个开源基础设施样板生成器。在本教程中,我们将通过一个经典示例展示如何使用 Mify 创建一个简单的服务——一个待办事项应用程序。
featured image - 在没有重复样板的情况下用 Go 构建 RESTful API 服务
Mify HackerNoon profile picture



有很多关于如何编写服务的资料,首先您需要选择要使用的框架,然后是处理程序、配置、日志、存储等的连接,更不用说在某处部署该服务了。我们编写服务已经有一段时间了,而且通常情况下,您只想跳过所有这些将东西粘合在一起的繁琐过程,而只是编写一些有用的代码。


这就是为什么我们创建了一个名为 Mify 的工具——它是一个开源基础设施样板生成器,可以帮助您构建服务,采用迄今为止使用的最佳实践。因此,在本教程中,我们将通过一个经典示例展示如何使用 Mify 创建一个简单的服务——一个待办事项应用程序。

先决条件

  • 安装Go 1.18+, Docker

  • 从我们的 GitHub 获取 Mify: https ://github.com/mify-io/mify

  • 安装Postman或 curl 来测试端点


在开始本教程之前,这里是完整示例的链接: 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

您可以在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 ,但请继续关注下一篇文章。


也在这里发布