Golang-gin 多端口模式简单实现

1,026 阅读2分钟

 golang多端口有什么好处?

1. 提高服务器并发处理能力:使用多端口可以让服务器在处理多个请求时更加高效和快速,提高服务器并发处理能力。

2. 提高系统可用性:多端口可以为系统提供更加可靠的服务,在一个端口出现问题时,其他端口可以继续提供服务。

3. 灵活配置端口:在多种不同的应用场景下,可以灵活配置不同的端口,以满足不同的需求和业务需求。

4. 更好的安全性:使用多个端口可以降低安全漏洞的风险,比如使用不同的端口提供不同的服务,可以隔离各个服务的网络流量,更好地保障系统安全。

如何开启多端口服务

package bootstrap

import (
	"gin/global"
	"gin/routers"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"golang.org/x/net/context"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

// 静态资源 和 web分组
func setupRouter() *gin.Engine {
	router := gin.Default()
	// 前端项目静态资源
	router.StaticFile("/", "./public/static/dist.index.html")
	router.Static("/assets", "./public/static/dist/assets")
	router.StaticFile("/favicon.ico", "./public/static/dist/favicon.ico")
	// 其他静态资源 public 和 storage
	router.Static("/public", "./public/static")
	router.Static("/storage", "./storage/app/public")
	// 注册 web 分组路由
	webGroup := router.Group("/web")
	// 调用分组

	routers.WebGroup(webGroup)
	return router
}

// api分组
func ApiRouter() *gin.Engine {
	router := gin.Default()
	// 注册 api 分组路由
	apiGroup := router.Group("/api")
	routers.ApiGroup(apiGroup)
	return router
}

// app分组
func AppRouter() *gin.Engine {
	router := gin.Default()
	// 注册 api 分组路由
	appGroup := router.Group("/app")
	routers.AppRouter(appGroup)
	return router
}

// RunServer 启动服务器
func RunServer() {
	r := setupRouter()
	api := ApiRouter()
	app := AppRouter()
	webSrv := &http.Server{
		Addr:    ":" + global.App.Config.App.WebPort,
		Handler: r,
	}
	apiSrv := &http.Server{
		Addr:    ":" + global.App.Config.App.ApiPort,
		Handler: api,
	}
	appSrv := &http.Server{
		Addr:    ":" + global.App.Config.App.AppPort,
		Handler: app,
	}

	go func() {
		if err := webSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			global.App.Log.Error("Router connect ping failed, err:", zap.Any("err", err))
			log.Fatalf("listen: %s\n", err)
		}
	}()

	go func() {
		if err := apiSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			global.App.Log.Error("Router connect ping failed, err:", zap.Any("err", err))
			log.Fatalf("listen: %s\n", err)
		}
	}()

	go func() {
		if err := appSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			global.App.Log.Error("Router connect ping failed, err:", zap.Any("err", err))
			log.Fatalf("listen: %s\n", err)
		}
	}()

	// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
	quit := make(chan os.Signal)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Println("Shutdown Server ...")

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := webSrv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	if err := apiSrv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	if err := appSrv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	log.Println("Server exiting")
}

这里端口我是设置了在config中去设置

app: # 应用基本配置 注:不能使用tab建否则会出意料之外的错误~!
    env: local # 环境名称
    debug: false
    webPort: 8800 # 服务监听端口号
    apiPort: 8801 # 服务监听端口号
    appPort: 8802 # 服务监听端口号

在路由界面就可以

package routers

import (
	"gin/app/common/json"
	"gin/app/middleware"
	"gin/app/service"
	"github.com/gin-gonic/gin"
)

func AppRouter(router *gin.RouterGroup) {

	router.POST("/login", func(c *gin.Context) {
		json.Jok(c, "访问成功")
	})
	appRouter := router.Group("").Use(middleware.JWTAuth(service.AppGuardName))
	{
		appRouter.POST("/logout", func(c *gin.Context) {
			json.Jok(c, "访问成功")
		})
	}
}