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, "访问成功")
})
}
}