这是我参与「第五届青训营」笔记创作活动的第8天。
介绍
cloudwego/biz-demo 是一组使用 Go 语言编写的示例应用程序,包括 easy_note,rpcx_service,greet,grpc_service 等。这些示例应用程序使用的框架和库有 go-zero,rpcx,gRPC 等。在本篇笔记中,我们将重点关注 easy_note 应用程序的代码分析。
代码分析
cmd/server/main.go
main.go 是服务程序的入口文件。在该文件中,我们可以看到以下操作:
- 加载配置文件
- 初始化服务依赖项(如数据库连接)
- 注册服务
- 启动服务器
func main() {
config.MustLoad(configFile)
ctx := svc.NewServiceContext()
server := rest.MustNewServer(config.Cfg.Server.RestConf)
defer server.Stop()
note.RegisterHandlers(server, &handler.ServiceContext{
Service: ctx,
})
server.Start()
}
其中,MustLoad 函数从配置文件中读取配置信息,NewServiceContext 函数初始化服务上下文,MustNewServer 函数创建 REST 服务器,RegisterHandlers 函数将服务路由器和请求处理程序注册到服务器上,Start 函数启动 REST 服务器。
configs/config.toml
config.toml 是配置文件,其中包括以下内容:
- 服务配置信息,包括端口号、日志文件路径等
- 数据库配置信息,包括数据库类型、连接地址、用户名、密码等
[server]
port = 8888
rest_conf = "etc/server.yaml"
log_path = "log"
access_log_path = "log/access.log"
error_log_path = "log/error.log"
[demo]
db_type = "mysql"
db_user = "root"
db_password = "root"
db_host = "localhost"
db_name = "notes"
db_table_prefix = "notes_"
dao/note.go
note.go 中实现了数据库的相关操作,包括增删改查等操作。note.go 中的结构体 Note 用来表示笔记信息,包括 ID、标题、内容等属性。
type Note struct {
ID int64 `db:"id"`
Title string `db:"title"`
Content string `db:"content"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
在 main.go 中,我们可以看到 easy_note 的入口函数 main。这个函数首先解析命令行参数,读取配置文件并加载日志记录器和数据库连接器,然后注册路由和中间件。最后,它监听来自 config.yaml 文件中指定的端口的 HTTP 请求,如果有请求到来则分派路由。当程序终止时,它会记录一条日志,并关闭数据库连接。
在 api/handler 目录中,我们可以找到所有的路由处理程序。这些处理程序负责将 HTTP 请求映射到相关的服务函数。例如,在 note_handler.go 中,我们可以找到一个名为 createNoteHandler 的处理程序,它将 POST 请求映射到名为 CreateNote 的服务函数。这个函数从 HTTP 请求中提取参数并将它们传递给 note 服务。这个服务会将新的笔记写入数据库中,并返回新笔记的 ID。
在 internal/service 目录中,我们可以找到 easy_note 的所有服务。这些服务实现了业务逻辑。例如,在 note_service.go 中,我们可以找到一个名为 CreateNote 的服务函数,它负责创建新的笔记。这个函数将笔记的标题和内容写入数据库,并返回新笔记的 ID。
在 internal/dao 目录中,我们可以找到所有的数据访问对象。这些对象负责与数据库进行交互。例如,在 note_dao.go 中,我们可以找到一个名为 CreateNote 的 DAO 函数,它负责将新的笔记写入数据库中。这个函数使用 Go 语言的 database/sql 包与数据库进行交互。
在 internal/model 目录中,我们可以找到所有的模型对象。这些对象描述了 easy_note 在数据库中存储的数据。例如,在 note.go 中,我们可以找到一个名为 Note 的模型对象,它描述了一条笔记的标题和内容。
在 pkg/errcode 目录中,我们可以找到 easy_note 使用的错误码。这些错误码是一种用于标识错误的数字编码。例如,错误码 10001 表示无效的参数。错误码是可配置的,并且在 config.yaml 文件中进行配置。
最后,我们还可以看到 easy_note 为日志记录、配置文件读取、数据库连接等功能封装了一些辅助函数和组件。例如,在 pkg/logger 目录中,我们可以找到 zap 日志记录器的封装。在 pkg/setting 目录中,我们可以找到 viper 配置文件读取器的封装。在 pkg/database 目录中,我们可以找到 Gorm 数据库连接器的封装。