跳转至

Gin 路由拆分成单独APP

Gin 路由拆分到不同的APP

有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP。

因此我们在项目目录下单独定义一个app目录,用来存放我们不同业务线的代码文件,这样就很容易进行横向扩展。大致目录结构如下:


myapp
│  go.mod
│  main.go
├─app
│  ├─blog
│  │      handler.go
│  │      router.go
│  │
│  └─shop
│          handler.go
│          router.go
│
└─routers
        route.go

main.go

package main

import (
   "fmt"
   "myapp/app/blog"
   "myapp/app/shop"
   "myapp/routers"
)

func main() {
   // 加载多个APP的路由配置
   routers.Include(shop.Routers, blog.Routers)
   // 初始化路由
   r := routers.Init()
   if err := r.Run(); err != nil {
      fmt.Println("startup service failed, err:%v\n", err)
   }
}

go.mod

module myapp

go 1.16

require github.com/gin-gonic/gin v1.7.3

route.go

package routers

import "github.com/gin-gonic/gin"

type Option func(*gin.Engine)

var options = []Option{}

// 注册app的路由配置
func Include(opts ...Option) {
   options = append(options, opts...)
}

// 初始化
func Init() *gin.Engine {
   r := gin.Default()
   for _, opt := range options {
      opt(r)
   }
   return r
}

app/shop/handler.go

package shop

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func helloShop(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "message": "Hello Shop!",
   })
}

app/shop/router.go

package shop

import "github.com/gin-gonic/gin"

func Routers(e *gin.Engine) {
    e.GET("/shop", helloShop)

}

app/blog/handler.go

package blog

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

func helloBlog(c *gin.Context) {
   c.JSON(http.StatusOK, gin.H{
      "message": "Hello Blog",
   })
}

app/blog/router.go

package blog

import (
   "github.com/gin-gonic/gin"
)

func Routers(e *gin.Engine) {
   e.GET("/Blog", helloBlog)
}

然后在终端运行

D:\idea\mygin>go mod tidy

项目运行,或者在goland中 main.go右键运行

D:\idea\mygin>go run main.go