使用go进行web开发,前期经过一些选型,最终决定使用gin这个框架来做开发,gin和flask这类框架很像,一个文件就能起一个服务,但是当项目变得庞大复杂,一个文件是很难维护的,通常我们需要将其拆分为多个目录来存放代码,根据自己的需求实现各种mvc之类的模式。
pink-lady是根据我个人习惯整理而成的代码结构。开发时主要可以总结为ASM(apis services models)模式,开发时只需要关注这三个地方,主要流程是在apis中配置路由routes,编写路由处理方法,处理方法细分为apis接入层和可复用的services层,models定义db数据表结构。
pink-lady这个名字来源于gin,因为gin的名字应该是来源于martini,都是酒名,而pink lady是以gin酒作为基酒的国标鸡尾酒之一。
项目地址: https://github.com/axiaoxin/pink-lady
> tree -I "vendor" . ├── app // 源码目录 │ ├── apis // (开发时关注的地方)在这里新建包或者文件来编写你的API │ │ ├── init.go // 存放一些默认的api │ │ ├── init_test.go │ │ ├── router // gin的router,可在这里注册中间件 │ │ │ ├── router.go │ │ │ └── router_test.go │ │ ├── routes.go // (开发时关注的地方)在这里注册你的路由 │ │ └── routes_test.go │ ├── app.yaml // 配置文件 │ ├── docs // swag生成的api文档目录 │ │ ├── docs.go │ │ └── swagger │ │ ├── swagger.json │ │ └── swagger.yaml │ ├── main.go // main函数,运行一个可优雅停止的服务 │ ├── middleware // 存放中间件的目录,新加中间件应该放在这里 │ │ ├── errorhandler.go // 处理404和500为json返回的中间件 │ │ ├── errorhandler_test.go │ │ ├── ginlogrus.go // 日志中间件,使用logrus打印gin的日志 │ │ ├── ginlogrus_test.go │ │ ├── init.go │ │ ├── requestid.go // 请求中生成requestid,可以gin的日志中打印 │ │ └── requestid_test.go │ ├── models // (开发时关注的地方)在这里新建你的model │ │ ├── init.go // 提供一个BaseModel用来定义model │ │ └── init_test.go │ ├── services // (开发时关注的地方)在这里存放你可以复用的业务逻辑代码 │ │ ├── init.go │ │ ├── init_test.go │ │ └── retcode // 业务返回码在这里定义 │ │ ├── retcode.go │ │ └── retcode_test.go │ └── utils // 在这里存放通用的业务无关的工具类方法 │ ├── endless.go // 提供优雅重启的服务 │ ├── gorequest.go // 提供一个好用的http客户端 │ ├── gorm.go // 提供一个orm │ ├── gorm_test.go │ ├── init.go │ ├── jsontime.go // 提供一个可以自定义json时间字段的类型 │ ├── jsontime_test.go │ ├── logrus.go // 提供一个好用的日志工具 │ ├── logrus_test.go │ ├── pagination.go // 提供一个计算分页信息的工具 │ ├── pagination_test.go │ ├── redis.go // 提供redis客户端 │ ├── redis_test.go │ ├── response // 提供统一的json响应方法 │ │ ├── response.go │ │ └── response_test.go │ ├── testing.go // 提供一些单元测试会用到的方法 │ ├── viper.go // 提供一个解析配置的工具 │ └── viper_test.go ├── Gopkg.lock // 依赖管理工具dep生成的文件 ├── Gopkg.toml // 依赖管理工具dep生成的文件 ├── misc // 这里存放各种工具类脚本 │ ├── pre-push.githook // 一个git hook用于push前跑测试 │ ├── README.md │ ├── release.sh // 一个编译发布版本的工具脚本 │ └── supervisor.conf // supervisor配置示例 └── README.md
code
, message
, data
字段的json.misc/release.sh
,根据提示输入信息即可万无一失的为你打包发布新版二进制文件Clone pink-lady 到你的gopath下的src目录即可开始你的开发:
cd $(go env GOPATH)/src git clone git@github.com:axiaoxin/pink-lady.git cd pink-lady
vendor目录已包含所有依赖包,安装所有依赖使用
dep ensure
在你的项目中新加依赖包请使用dep进行安装后再编写代码
dep ensure --add xxxxxx
如果你想修改项目位置到其他位置或其他名称,除了把mv pink-lady以外,还需要替换掉import中的路径:
mv pink-lady GOPATH/src/XXX/YYY/ZZZ cd GOPATH/src/XXX/YYY/ZZZ/app sed -i "s|pink-lady|XXX/YYY/ZZZ|g" `grep "pink-lady" . -rl`
准备好项目骨架后便可以开始进行开发了,在apis
目录下编写你的api, 你可以在这里创建单文件或者子目录作为包来组织你的代码,写完逻辑handler后在 apis/routes.go
注册你的api,把handler注册到url上即可
在app
目录运行你的server:
cd app go test ./... go run main.go
4.发布你的api server, 运行 misc/release.sh
将会要你根据提示自动构建二进制文件并打成tar.gz包,打包前会对代码进行version的升级,测试,生成api文档并为这次发布提交commit和打上tag
cd misc ./release.sh
生成API文档的命令为:
cd app swag init -g apis/init.go
你可以通过http://pink-lady:4869/x/apidocs/index.html访问到你的api文档,当然你要为pink-lady配置host以便不同的机器部署
app/apis
目录下,可以是单文件或者包的形式,看具体情况,然后再app/apis/routes.go
中统一注册你所有的路由。app/middleware
目录下, 统一在app/apis/router/router.go
注册使用。app/models/init.go
中的BaseModel
来定义你的model并以单文件或者包的形式放在 app/models
目录下,如果需要自动migration,在model定义时的init函数中将model添加到models的MigrationModels中即可,参考demoapp/services
目录下。app/services/retcode/retcode.go
中统一定义业务返回码。app/utils
中。misc
目录。app
目录执行fresh
命令即可在文件发生变更时自动reload serverapis/demo
services/demo
models/demo
即可网友185.*.*.6[火星]2021-04-19 11:14
网友66.*.*.81[华盛顿州]2021-04-19 11:02
网友216.*.*.226[Seattle]2021-04-19 10:59
网友220.*.*.173[北京]2021-04-19 10:52
发表评论
亲~ 评论内容是必须的哟! o(∩_∩)o
昵称
邮箱
主页
评论