Skip to main content

micro gin 微应用方案

使用 Gin 作为微应用解决方案,可以通过模块化设计和服务间通信来实现。以下是一个基本的 Gin 微应用架构示例,展示如何使用 Gin 构建多服务应用,并通过主应用进行路由和管理。

目录结构

your_project/
├── main-app/
│ ├── main.go
│ └── router.go
├── service1/
│ ├── main.go
│ ├── handler.go
│ └── router.go
└── service2/
├── main.go
├── handler.go
└── router.go

主应用(main-app)

主应用将作为网关,负责路由请求到不同的子服务。

main.go

package main

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

func main() {
r := gin.Default()

service1Router := setupService1Router()
service2Router := setupService2Router()

// 路由到服务1
r.Any("/service1/*any", func(c *gin.Context) {
proxy(c, service1Router)
})

// 路由到服务2
r.Any("/service2/*any", func(c *gin.Context) {
proxy(c, service2Router)
})

r.Run(":8080")
}

func proxy(c *gin.Context, target *gin.Engine) {
target.HandleContext(c)
}

router.go

package main

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

func setupService1Router() *gin.Engine {
r := gin.New()
service1.RegisterRoutes(r)
return r
}

func setupService2Router() *gin.Engine {
r := gin.New()
service2.RegisterRoutes(r)
return r
}

服务 1(service1)

服务 1 负责处理特定的业务逻辑。

main.go

package main

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

func main() {
r := gin.Default()
RegisterRoutes(r)
r.Run(":8081")
}

handler.go

package service1

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

func HelloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello from Service 1",
})
}

router.go

package service1

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

func RegisterRoutes(r *gin.Engine) {
r.GET("/hello", HelloHandler)
}

服务 2(service2)

服务 2 负责处理另一部分的业务逻辑。

main.go

package main

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

func main() {
r := gin.Default()
RegisterRoutes(r)
r.Run(":8082")
}

handler.go

package service2

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

func HelloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello from Service 2",
})
}

router.go

package service2

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

func RegisterRoutes(r *gin.Engine) {
r.GET("/hello", HelloHandler)
}

运行示例

  1. 启动服务 1:
cd service1
go run main.go
  1. 启动服务 2:
cd service2
go run main.go
  1. 启动主应用:
cd main-app
go run main.go

测试

你可以通过以下 URL 测试服务:

  • 访问服务 1:http://localhost:8080/service1/hello
  • 访问服务 2:http://localhost:8080/service2/hello

总结

通过这种方式,你可以使用 Gin 构建一个模块化的微应用架构。主应用作为网关,负责路由和管理请求,而各个子服务则独立处理各自的业务逻辑。这种架构既保留了微服务的独立性,又简化了服务间的通信和管理。