MorningGo : Gin WebApp Project Skeleton


中文文档
A Web develop project skeleton base on Gin which just for reference.
More efficiency,
Faster and clear,
Easier to deploy
Suitable for simple project. ko、kit、go-micro、kite are better choice for the middle and large project.
Environment Requirements
Installation And Run
Via moroingo installer or use docker
Install
go get github.com/chenhg5/morningo-installer
cd $GOPATH/src
$GOPATH/bin/morningo-installer --project-name web
Load Dependency
cd web
make deps
Test
make test
Graceful Restart
make restart
Run It
make
visit by browser: http://localhost:4000/api/index
Deploy
First build the executable file
make build # for Linux
make cross # for mac/windows
Then put files of the build in your server and set the path of log and static file(html/css/js),and run the executable file.If 80 port is not allowed to use,consider the nginx proxy,or use the gin middleware gin-reverseproxy instead, which has some example in routers.go. When the project start running, it will generate the pidfile in the root path of the project. Excute the following command to update your project.
kill -INT $(cat pid) && ./morningo # graceful stop the process and restart
Project Structure
.
├── Makefile
├── README.md
├── cli
│ └── cli.go
├── config global config
│ ├── connections.go
│ ├── cookie.go
│ ├── jwt.go
│ └── env.go
├── connections store connection
│ ├── database
│ │ ├── mongodb
│ │ └── mysql
│ └── redis
│ └── redis.go
├── controllers controller
│ └── MainController.go
├── filters middleware
│ ├── auth auth middleware
│ │ ├── drivers auth engine
│ │ └── auth.go
│ └── filter.go middleware initer
├── frontend frontend resource
│ ├── assets
│ │ ├── css
│ │ ├── images
│ │ └── js
│ ├── dist
│ └── templates
│ └── index.tpl
├── handle.go global error handler
├── main.go
├── models model
│ └── User.go
├── module module of project
│ │── schedule
│ │ └── schedule.go
│ │── logger
│ │ └── logger.go
│ └── server
│ └── server.go
├── routers routers
│ └── api_routers.go
├── routers.go router initer
├── routers_test.go unit test for api
├── storage
│ ├── cache cache file
│ └── logs log file
│ ├── access.log
│ ├── info.log
│ └── error.log
└── vendor govendor vendor
What`s in the box
HTTP (based on Gin)
- Router
- Middleware
- Controller
- Request
- Response
- View
- Session
Frontend
Security
- Authentication
- Authorization
- Encryption
- Hash
Digging Deeper
- Dancer Command
- Cache System
- Error and Log
- Schedule
Database
ORM(based on gorm)
test
Example
https://github.com/chenhg5/morningo/blob/master/controllers/MainController.go
Project Dependency
- web framework:github.com/gin-gonic/gin
- orm:github.com/jinzhu/gorm
- redis:github.com/go-redis/redis
- mysql:github.com/go-sql-driver/mysql
- wechat:github.com/silenceper/wechat
- schedule:github.com/robfig/cron
Benchmark
wrk -c100 -d30s -t4 http://localhost:4000/api/index
Running 30s test @ http://localhost:4000/api/index
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.03ms 4.17ms 72.72ms 89.95%
Req/Sec 7.40k 1.67k 11.20k 67.75%
884816 requests in 30.03s, 107.17MB read
Non-2xx or 3xx responses: 884816
Requests/sec: 29462.96
Transfer/sec: 3.57MB
TODO
- Logger
- Test
- Cache/Session
- Queue of task
- Read & Write Connections
- Redis cluster
- Profiling(Laravel/Swoole;beego)
- Command tool
- Interaction command env
- Fast CRUD Generator
ChangeLog
- Add Reverse Proxy
- Fixed the path
- Add session/cache and Auth middleware
- Add test
- Add graceful restart
- Add schedule module
- Add installer of project
- Add access.log and error.log
- Add database transcation