├── .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 |
5 |
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 |
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 |
6 |
7 |
8 |
9 |
10 |
11 |
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 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 | true
102 | DEFINITION_ORDER
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
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 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
--------------------------------------------------------------------------------