├── .gitattributes ├── Server ├── pkg │ └── windows_amd64 │ │ └── github.com │ │ └── zheng-ji │ │ └── goSnowFlake.a ├── config.json ├── server.go ├── .idea │ ├── misc.xml │ ├── modules.xml │ ├── Server.iml │ └── workspace.xml ├── templates │ ├── success.html │ └── index.html ├── utils │ ├── resolveJson.go │ └── utils_uid.go ├── web │ ├── routerMethod.go │ └── webapp.go ├── controler │ └── control.go └── db │ └── operdb.go ├── .gitignore └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /Server/pkg/windows_amd64/github.com/zheng-ji/goSnowFlake.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wayne-yhp/golang-gin-mgo/HEAD/Server/pkg/windows_amd64/github.com/zheng-ji/goSnowFlake.a -------------------------------------------------------------------------------- /Server/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "databasename" : "test", 3 | "username" : "test1", 4 | "password" :"test1", 5 | "ip" : "127.0.0.1", 6 | "colname" : "server83", 7 | "port" : "27017" 8 | } -------------------------------------------------------------------------------- /Server/server.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "Server/web" 4 | 5 | /* 6 | 程序入口 7 | */ 8 | 9 | func main() { 10 | webapp := web.Newwebapp() 11 | webapp.Prepare() 12 | } 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Server/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Server/templates/success.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | insert 6 | 7 | 8 | Insert Successfully!! 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, build with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | -------------------------------------------------------------------------------- /Server/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Server/.idea/Server.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Server/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | hello 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | -------------------------------------------------------------------------------- /Server/utils/resolveJson.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "io/ioutil" 5 | "fmt" 6 | "encoding/json" 7 | ) 8 | 9 | func Resolve() map[string]string{ 10 | value := make(map[string]string) 11 | b ,err :=ioutil.ReadFile("config.json") 12 | if err != nil { 13 | fmt.Println(err.Error()) 14 | } 15 | json.Unmarshal(b,&value) 16 | return value 17 | } 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # golang-gin-mgo 2 | 该项目作为可作为golang 完整web项目的模版参考使用,可以接受高并发请求,使用了gin web框架,和mgo持久层框架,mongodb非关系型数据库。 3 | 4 | 5 | ### 程序流程讲述 6 | 1. 接收htpp请求,获取请求所有参数列表 7 | 2. 同时开启协程,监听请求数量,定时定量向数据库插入参数数据 8 | 3. 到达control层,参数解析,添加标志流水线字段 9 | 4. 到达数据库操作层,解析json配置文件,连接数据库,插入数据 10 | 11 | ### 代码结构讲解 12 | * server.go 程序入口 13 | * db包 数据库操作相关类 14 | * utils包 获取流水线唯一标志字的值和解析json配置文件的工具类 15 | * web包 路由接口路径定义和路由函数的定义类 16 | * control包 业务控制相关类 17 | * config文件 配置关于连接数据库信息(ip,端口,用户名,数据库名等等) 18 | -------------------------------------------------------------------------------- /Server/web/routerMethod.go: -------------------------------------------------------------------------------- 1 | package web 2 | 3 | import "Server/controler" 4 | import ( 5 | "github.com/gin-gonic/gin" 6 | ) 7 | /* 8 | 定义路由处理函数 9 | */ 10 | var handle *controler.Handle //逻辑处理对象 11 | 12 | func init() { 13 | handle = controler.NewHandle() 14 | } 15 | 16 | func IndexRouter(c *gin.Context) { 17 | if c.Request.Form == nil { //获取所有请求参数名和值 18 | c.Request.ParseMultipartForm(32 << 20) 19 | } 20 | handle.Insert_ser(c.Request.Form) 21 | 22 | //c.HTML(http.StatusOK, "index.html", nil) //页面跳转 23 | } 24 | -------------------------------------------------------------------------------- /Server/utils/utils_uid.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "fmt" 4 | import "github.com/zheng-ji/goSnowFlake" 5 | import "errors" 6 | 7 | /* 8 | uid生成类 9 | */ 10 | type Uid struct { 11 | iw *goSnowFlake.IdWorker 12 | } 13 | 14 | func Newuid() *Uid{ 15 | u := new(Uid) 16 | err := errors.New("") //错误信息 17 | u.iw,err = goSnowFlake.NewIdWorker(1) //唯一标志操作对象初始化 18 | if err != nil { 19 | fmt.Println(err) 20 | } 21 | return u 22 | } 23 | 24 | //获取新的一个uuid 25 | func (u *Uid)Getid() int64{ 26 | id ,_:= u.iw.NextId() 27 | return id 28 | } 29 | -------------------------------------------------------------------------------- /Server/web/webapp.go: -------------------------------------------------------------------------------- 1 | package web 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | ) 6 | 7 | /* 8 | 定义路由地址和对应路由地址的响应函数 9 | */ 10 | 11 | var appinstance *webapp //webapp单例对象 12 | type webapp struct { 13 | server *gin.Engine 14 | } 15 | 16 | func init(){ 17 | appinstance = new(webapp) 18 | appinstance.server = gin.Default() //获取web服务器对象 19 | //server.LoadHTMLGlob("Server/templates") //加载静态页面 20 | } 21 | 22 | func Newwebapp() *webapp{ 23 | return appinstance 24 | } 25 | 26 | func (app *webapp)Prepare() { 27 | app.server.GET("/do", IndexRouter) //创造一个GET请求的路由地址,并指定处理函数 28 | //app.server.POST("/do", IndexRouter) 29 | app.server.Run(":8080") 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /Server/controler/control.go: -------------------------------------------------------------------------------- 1 | package controler 2 | 3 | import ( 4 | "Server/db" 5 | "time" 6 | "Server/utils" 7 | ) 8 | 9 | var dbop *db.Operdb //数据库操作对象 10 | var uid_generator *utils.Uid 11 | 12 | func init() { 13 | dbop = db.Newoperdb() 14 | uid_generator = utils.Newuid() 15 | } 16 | 17 | type Handle struct { 18 | count int //对未插入数据库的请求进行计数 19 | } 20 | 21 | //返回初始化对象,并对对象初始化 22 | func NewHandle() *Handle{ 23 | handle := new(Handle) 24 | handle.count = 0 25 | go handle.gorount() 26 | return handle 27 | } 28 | 29 | //加上标志字段,将参数传递给数据库操作类进行插入 30 | func (handle *Handle)Insert_ser(arg map[string][]string) { 31 | arg1 := make(map[string]interface{}) //用于将map[string][]string 转换成 map[string]string 32 | for k, v := range arg{ 33 | arg1[k] = v[0] 34 | } 35 | id := uid_generator.Getid() //获取唯一流水线标志 36 | arg1["insertid"] = id 37 | dbop.BulkInset(arg1) 38 | handle.count++ 39 | } 40 | 41 | //协程,定期或定量向数据库批量插入 42 | func (handle *Handle)gorount() { 43 | for{ 44 | starttime := time.Now().UnixNano() 45 | for{ 46 | endtime := time.Now().UnixNano() 47 | interval := endtime - starttime //得到间隔时间 48 | if interval >= 100000000 || handle.count >= 100{ //如果间隔超过100毫秒或者数量超过100就插入数据库 49 | break 50 | } 51 | } 52 | dbop.BulkRun() 53 | handle.count = 0 54 | } 55 | } -------------------------------------------------------------------------------- /Server/db/operdb.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "gopkg.in/mgo.v2" 5 | "sync" 6 | "Server/utils" 7 | ) 8 | 9 | /* 10 | 数据库操作类 11 | */ 12 | var obj *Operdb 13 | type Operdb struct { 14 | mgo_session *mgo.Session //连接对象 15 | mgo_db *mgo.Database //数据库对象 16 | mgo_c *mgo.Collection //集合对象 17 | bulk *mgo.Bulk //批处理对象 18 | rwlock *sync.RWMutex //读写锁 19 | } 20 | 21 | func init() { 22 | infomap :=utils.Resolve() 23 | obj = new(Operdb) 24 | obj.rwlock = new(sync.RWMutex) 25 | obj.connect(infomap) 26 | } 27 | 28 | func Newoperdb() *Operdb { 29 | return obj 30 | } 31 | 32 | //数据库连接,对象初始化 33 | func (oper *Operdb)connect(info map[string]string){ 34 | ip := info["ip"] 35 | port := info["port"] 36 | url := ip + ":" + port 37 | oper.mgo_session, _ = mgo.Dial(url) 38 | oper.mgo_db = oper.mgo_session.DB(info["databasename"]) 39 | oper.mgo_db.Login(info["username"], info["password"]) 40 | oper.mgo_c = oper.mgo_db.C(info["colname"]) 41 | oper.bulk = oper.mgo_c.Bulk() 42 | } 43 | 44 | //关闭连接 45 | func (oper *Operdb)close() { 46 | oper.mgo_session.Close() 47 | } 48 | 49 | //批量插入 50 | func (oper *Operdb)BulkInset(arg interface{}) { 51 | oper.bulk.Insert(arg) //批量记录 52 | } 53 | 54 | //批量执行 55 | func (oper *Operdb)BulkRun() { 56 | oper.rwlock.Lock() //写锁 57 | oper.bulk.Run() //批量插入 58 | oper.bulk = oper.mgo_c.Bulk() 59 | oper.rwlock.Unlock() 60 | } -------------------------------------------------------------------------------- /Server/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 64 | 65 | 66 | 67 | true 68 | 69 | 70 | 76 | 77 | 78 | 97 | 98 | 99 | 100 | 101 | true 102 | DEFINITION_ORDER 103 | 104 | 105 | 106 | 107 | 108 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 |