gin框架
# 安装gin
go get -u github.com/gin-gonic/gin
简单的案例:
package main
import "github.com/gin-gonic/gin"
func main() {
//Default返回一个默认的路由引擎
// 也可以自行创建 gin.New()
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
/ 以json格式输出response
c.JSON(200, gin.H{
"message": "index",
})
})
r.Run(":8888") // listen port 8888
}
上面的代码可以直接:
go run main.go # 之后浏览器访问:localhost:8888
这是最简单的使用,几行代码就可以完成一个简单的web服务器.
更多的内容可以查看gin的中文文档:
目录结构
-
然而我们在实际使用中尝尝需要各种各样的组件,以及封装各种各样的常用工具函数,及其麻烦,所以在这里我对常用的组件、工具函数进行了封装,开箱即用;
-
详细的目录结构
├─apps 程序入口
├─common 常用的项目公共代码
│ ├─error 项目全局错误信息
│ ├─global 项目全局参数
│ ├─logger 项目日志
│ └─response 项目统一响应
├─config 项目配置
├─deploy 项目部署文件
├─http_server 业务处理
│ ├─controllers 控制层
│ ├─manager 实际处理业务层
│ ├─models 数据库模型
│ └─routes 服务路由
├─internal 项目服务核心组件
│ ├─db 数据库组件
│ ├─elasticsearch es组件相关实现
│ ├─grpc grpc相关案例
│ ├─kafka kafka消息队列组件
│ ├─redis redis组件
│ └─sessions session实现
├─middlewares 中间件
├─proto proto文件存放目录
└─utils 常用工具函数
request -> apps -> router -> controller -> manager -> controller -> response
在使用的过程中我们不需要在关注细枝末节的信息,可以更加专注于业务的开发,其中业务的处理主要放在了http_server
routes
gin_server.go
// 该目录主要封装路由相关方法
package routes
import (
"context"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"time"
"github.com/gin-gonic/gin"
"github.com/scliang-strive/webServerTools/config"
middleware "github.com/scliang-strive/webServerTools/middlewares"
)
// 封装路由
func InitApiRouter() {
var router *gin.Engine
if config.GetConfig().Debug {
gin.DefaultWriter = ioutil.Discard
router = gin.New()
// 载入gin的中间件,关键是第二个中间件,我们对它进行了自定义重写,将可能的 panic 异常等
router.Use(middleware.CustomRecovery())
} else {
gin.SetMode(gin.ReleaseMode)
router = gin.Default()
}
// 常用的中间件,查看定义的中间价在middlewares文件夹中
router.Use(middleware.LoggerMiddleware())
router.Static("../static", "./static")
// 处理路由组 router.go
ApiRouter(router)
runHttpServer(router)
}
// runHttpServer 自定义http配置
func runHttpServer(router *gin.Engine) {
srv := &http.Server{
Addr: fmt.Sprintf(":%d", config.GetConfig().WebConfig.Port),
Handler: router,
}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
}
router.go
package routes
import (
"github.com/gin-gonic/gin"
)
func ApiRouter(router *gin.Engine) {
// 对路由进行分组,处理不同的分组,根据自己的需求定义即可
server := router.Group("")
serverRouter(server)
}
func serverRouter(group *gin.RouterGroup) {
}
models
定义数据模型
controller
访问控制层
manager
实际业务处理层