likes
comments
collection
share

手把手带你从0到1封装Gin框架:01 项目初始化

作者站长头像
站长
· 阅读数 17

前言

日常我们在开发中,有新项目的时候都需要一个干净简洁的骨架项目,然后在这个骨架项目上堆砌我们的业务代码,但是有的骨架项目过度封装,很臃肿,所以在这里从0开始封装一个我们自己的骨架项目

适用人群

  • 了解golang的基础语法即可
  • 有一点数据库基础(这个不强制,不过做后端开发肯定都没啥问题)

项目源码

Github

创建项目

mkdir eve_api

eve是项目名称,这个根据自己喜好取就可以

初始化git

cd eve_api

git init

touch .gitignore

编辑.gitignore添加忽略的目录,可以根据自己的编辑器来自己设定

/tmp  
config.yaml  
/.idea

这个没什么好说的,因为项目是从0开始搭建的,所以后边会有一些迭代,会推翻之前的东西重写,用git保留一个记录,每篇教程后边我都会把当前对应的commit-hash附在文末,方便大家直接checkout到对应的版本进行查看

初始化go mod

项目依赖很多第三方库,这里直接用官方的go mod来管理

go mod init eve

执行之后发现项目中多了一个go.mod文件,这个文件里边会记录项目所依赖的第三方库以及项目对应golang版本号

安装cobra

一般情况下,我们一个web项目是需要可以启动http服务,还需要可以执行一些脚本(临时脚本或者定时任务脚本)、生成一些文件(model文件生成)等功能,那我们的项目就需要支持多种子命令来执行不同的操作,我们可以通过在入口文件main.go中配置不同的参数来实现,当然也可以通过现有的一些库来实现,这里我们选择使用比较多的cobra库来实现命令管理与生成

Cobra 是一个 Go 语言开发的命令行(CLI)框架,它提供了简洁、灵活且强大的方式来创建命令行程序

Cobra分为cobracobra-cli两部分 cobra-cli用来初始化项目文件以及生成新的命令文件 cobra用来执行项目中生成的命令

使用cobra分三步

1、安装cobra-cli
go install github.com/spf13/cobra-cli@latest
2、使用cobra-cli初始化cobra

执行:

cobra-cli init

显示:

Your Cobra application is ready at
/.../your-project-dir

项目就初始化好了,通过tree命令可以看到项目当前的结构如下:

➜ eve_api tree
.
├── LICENSE
├── cmd
│   └── root.go
├── go.mod
├── go.sum
└── main.go

1 directory, 5 files

可以看到自动生成了main.go文件和cmd/root.go文件 main.go文件不需要再做任何改动 cmd/root.go文件是对项目的描述,可以修改里边的描述来更好的展示我们的项目信息

到这里我们直接执行main.go就可以看到输出了cmd/root.go里边配置好的文本信息

➜  eve_api go run main.go
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
3、创建http服务启动命令

我们想通过后边加start关键字来启动项目,那就可以执行:

➜  eve_api cobra-cli add start
start created at /your-project-dir/eve_api

执行完成之后可以发现生成了cmd/start.go文件,直接执行go run main.go start

➜  eve_api go run main.go start
start called

会提示start命令被执行了

安装Gin框架并启动一个简单的http服务

通过go get -u github.com/gin-gonic/gin来安装框架

➜  eve_api go get -u github.com/gin-gonic/gin
go: added github.com/bytedance/sonic v1.11.9
go: added github.com/bytedance/sonic/loader v0.1.1
go: added github.com/cloudwego/base64x v0.1.4
go: added github.com/cloudwego/iasm v0.2.0
go: added github.com/gabriel-vasile/mimetype v1.4.4
go: added github.com/gin-contrib/sse v0.1.0
go: added github.com/gin-gonic/gin v1.10.0
go: added github.com/go-playground/locales v0.14.1
go: added github.com/go-playground/universal-translator v0.18.1
go: added github.com/go-playground/validator/v10 v10.22.0
go: added github.com/goccy/go-json v0.10.3
go: added github.com/json-iterator/go v1.1.12
go: added github.com/klauspost/cpuid/v2 v2.2.8
go: added github.com/leodido/go-urn v1.4.0
go: added github.com/mattn/go-isatty v0.0.20
go: added github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: added github.com/modern-go/reflect2 v1.0.2
go: added github.com/pelletier/go-toml/v2 v2.2.2
go: added github.com/twitchyliquid64/golang-asm v0.15.1
go: added github.com/ugorji/go/codec v1.2.12
go: added golang.org/x/arch v0.8.0
go: added golang.org/x/crypto v0.25.0
go: added golang.org/x/net v0.27.0
go: added golang.org/x/sys v0.22.0
go: added golang.org/x/text v0.16.0
go: added google.golang.org/protobuf v1.34.2

由于依赖于github,所以速度可能有一点慢,可以耐心等待,有些打不开github的同学可以借助一点魔法,这里不过多解释

执行完成之后可以看到不止加载了gin框架对应的库,还加载了gin框架依赖的其他库,这里会自动加载,不需要我们手动干预

然后我们编辑cmd/start.go文件:

// Package cmd /*
package cmd

import (
	"github.com/gin-gonic/gin"
	"github.com/spf13/cobra"
)

// startCmd represents the start command
var startCmd = &cobra.Command{
	Use:   "start",
	Short: "start serve",
	Long:  `start serve`,
	Run: func(cmd *cobra.Command, args []string) {
		run()
	},
}

func init() {
	rootCmd.AddCommand(startCmd)

	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	// startCmd.PersistentFlags().String("foo", "", "A help for foo")

	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// startCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

func run() {
	r := gin.New()

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{"Message": "Hello World"})
	})

	err := r.Run(":8082")
	if err != nil {
		return
	}
}

可以看到运行start命令时会调用run方法,在run方法里启动了一个http服务,运行go run main.go start

➜  eve_api go run main.go start
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> eve_api/cmd.run.func1 (1 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8082

通过控制台可以看到启动了http服务并且监听8082端口,还提供了一个接,我们直接访问这个接口:

➜  ~ curl http://127.0.0.1:8082/
{"Message":"Hello World"}
➜  ~

可以看到返回了我们代码中配置的Hello World

本篇我们通过一系列的初始化操作搭建了一个依托Gin框架的HTTP服务,但是实际业务中,我们的业务逻辑不可能这么简单,肯定需要更多的组件,比如mysqlredisloggercrontab事件机制等,还需要支持更多的路由,以及中间件等来支撑我们的业务 当然这也是写这个系列的目的:从0开始封装一个属于自己的框架

总结

本篇文章讲述了

  • 做这个从0到1系列的初衷
  • 项目初始化
  • go mod的使用
  • cobra的使用
  • 创建简单的http服务

commit-hash: f4684a2

转载自:https://juejin.cn/post/7395218310399295523
评论
请登录