gin

https://github.com/gin-gonic/gin

Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.

startup a gin server

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
// new engine
engine := gin.New()
engine.MaxMultipartMemory = 100 << 20 // limit file upload size to 100M
engine.Use(gin.Logger(), gin.Recovery()) // add middleware
engine.Use(other_middleware.Constructor()) // add custom middleware

// healthz
engine.GET("/healthz", func (ctx *gin.Context) {
ctx.String(http.StatusOK, "SERVING")
})

// router
apiGroup := engine.Group("/api-name")
apiGroup.Use(some_middleware.Constructor())

apiGroup.GET("/get", funcGet)
apiGroup.POST("/post", funcPost)
apiGroup.PUT("/put", funcPut)

// start up server
gwServer := &http.Server{
Addr: "ip:port", // you may want to bind on specify ip, or all ip if you pass ':80'
Handler: engine,
}

listener, err := net.listen("tcp", gwServer.Addr)
if err != nil {
panic("unable to listen on address")
}

if NoTls {
if err := gwServer.Serve(listener); err != nil {
if errors.Is(err, http.ErrServerClosed) {
// server close gracefully
} else {
// log and panic
panic("server shutdown")
}
}
}

if Tls {
if err := gwServer.ServeTLS(listener, CertPath, KeyPath); err != nil {
if errors.Is(err, http.ErrServerClosed) {
// server close gracefully
} else {
// log and panic
panic("server shutdown")
}
}
}

serve swagger docs

1
2
3
4
5
6
7
8
engine.StaticFS("/docs/", http.FS(swaggerDocEmbedFs))
engine.GET(
"/swagger/*any",
ginSwagger.WrapHandler(
swaggerFiles.Handler,
ginSwagger.URL("/docs/path/to/swagger/doc.json")
),
)

Grpc-Gateway