Web服务器

基础介绍

due 框架中,Web 服务器是基于 fiber 框架的二次封装。在继承 fiber 框架的所有优点的同时,还提供了符合 due 框架的调用接口,为游戏开发中的 Web 场景提供完善的解决方案。

跨域支持

框架原生支持跨域,你只需要在启动配置里设置跨域配置即可开启跨域。

Swagger 支持

为了为广大开发者提供较好的开发体验,Web 服务器已原生支持了 Swagger 的组件。使用方法也非常简单,只需要通过配置项开启即可打开 swagger 访问支持。

  1. 安装 swag
$ go install github.com/swaggo/swag/cmd/swag@latest
  1. 生成 swagger 文件
$ swag init --parseDependency
  1. 删除无用的 go 文件
$ rm -rf ./docs/docs.go

全局中间件

你可以在创建 Web 服务器的时候使用 http.WithMiddlewares() 来设置全局中间件。中间件支持 http.Handlerfiber.Handler 两种类型的中间件

示例代码

以下完整示例详见: web-example

  1. 创建项目
$ mkdir web-example
  1. 安装依赖
$ cd web-example
$ go mod init web-example
$ go get github.com/dobyte/due/v2@v2.4.2
$ go get github.com/dobyte/due/component/http/v2@e5cd009
  1. 启动配置

文件位置: web-example/etc/etc.toml

# 进程号
pid = "./run/due.pid"
# 开发模式。支持模式:debug、test、release(设置优先级:配置文件 < 环境变量 < 运行参数 < mode.SetMode())
mode = "debug"
# 统一时区设置。项目中的时间获取请使用xtime.Now()
timezone = "Local"
# 容器关闭最大等待时间。支持单位:纳秒(ns)、微秒(us | µs)、毫秒(ms)、秒(s)、分(m)、小时(h)、天(d)。默认为0
shutdownMaxWaitTime = "0s"
 
[http]
    # 服务器名称
    name = "http"
    # 服务器监听地址,默认为:8080
    addr = ":8080"
    # 是否启用控制台输出,默认为false
    console = false
    # body大小,支持单位: B | K | KB | M | MB | G | GB | T | TB | P | PB | E | EB | Z | ZB,默认为4 * 1024 * 1024
    bodyLimit = "4M"
    # 最大并发连接数,默认为256 * 1024
    concurrency = 262144
    # 是否启用严格路由模式,默认为false,启用后"/foo"与"/foo/"为两个不同的路由
    strictRouting = false
    # 是否区分路由大小写,默认为false, 启用后"/FoO"与"/foo"为两个不同的路由
    caseSensitive = false
    # 秘钥文件
    keyFile = ""
    # 证书文件
    certFile = ""
    # 跨域配置
    [http.cors]
        # 是否启用跨域
        enable = false
        # 允许跨域的请求源。默认为[],即为允许所有请求源
        allowOrigins = []
        # 允许跨域的请求方法。默认为["GET", "POST", "HEAD", "PUT", "DELETE", "PATCH"]
        allowMethods = []
        # 允许跨域的请求头部。默认为[],即为允许所有请求头部
        allowHeaders = []
        # 当允许所有源时,根据CORS规范不允许携带凭据。默认为false
        allowCredentials = false
        # 允许暴露给客户端的头部。默认为[],即为允许暴露所有头部
        exposeHeaders = []
        # 浏览器缓存预检请求结果的时间。默认为0
        maxAge = 0
        # 是否允许来自私有网络的请求。设置为true时,响应头Access-Control-Allow-Private-Network会被设置为true。默认为false
        allowPrivateNetwork = false
    # swagger文档配置
    [http.swagger]
        # 是否启用文档
        enable = true
        # API文档标题
        title = "API文档"
        # URL访问基础路径
        basePath = "/swagger"
        # swagger文件路径
        filePath = "./docs/swagger.json"
        # swagger-ui-bundle.js地址。当系统默认的cdn失效时可替换为自己的cdn地址,默认为空,使用系统默认https://unpkg.com/swagger-ui@5.28.1/dist/swagger-ui.js
        swaggerBundleUrl = ""
        # swagger-ui-standalone-preset.js地址。当系统默认的cdn失效时可替换为自己的cdn地址,默认为空,使用系统默认https://unpkg.com/swagger-ui@5.28.1/dist/swagger-ui-standalone-preset.js
        swaggerPresetUrl = ""
        # swagger-ui.css地址。当系统默认的cdn失效时可替换为自己的cdn地址,默认为空,使用系统默认https://unpkg.com/swagger-ui@5.28.1/dist/swagger-ui.css
        swaggerStylesUrl = ""
  1. 编写示例

文件位置: web-example/main.go

package main
 
import (
	"fmt"
	"github.com/dobyte/due/component/http/v2"
	"github.com/dobyte/due/v2"
	"github.com/dobyte/due/v2/codes"
	"github.com/dobyte/due/v2/log"
	"github.com/dobyte/due/v2/utils/xtime"
)
 
// @title API文档
// @version 1.0
// @host localhost:8080
// @BasePath /
func main() {
	// 创建容器
	container := due.NewContainer()
	// 创建HTTP组件
	component := http.NewServer()
	// 初始化应用
	initApp(component.Proxy())
	// 添加网格组件
	container.Add(component)
	// 启动容器
	container.Serve()
}
 
// 初始化应用
func initApp(proxy *http.Proxy) {
	// 路由器
	router := proxy.Router()
	// 注册路由
	router.Get("/greet", greetHandler)
}
 
// 请求
type greetReq struct {
	Message string `json:"message"`
}
 
// 响应
type greetRes struct {
	Message string `json:"message"`
}
 
// 路由处理器
// @Summary 测试接口
// @Tags 测试
// @Schemes
// @Accept json
// @Produce json
// @Param request body greetReq true "请求参数"
// @Response 200 {object} http.Resp{Data=greetRes} "响应参数"
// @Router /greet [get]
func greetHandler(ctx http.Context) error {
	req := &greetReq{}
 
	if err := ctx.Bind().JSON(req); err != nil {
		return ctx.Failure(codes.InvalidArgument)
	}
 
	log.Info(req.Message)
 
	return ctx.Success(&greetRes{
		Message: fmt.Sprintf("I'm server, and the current time is: %s", xtime.Now().Format(xtime.DateTime)),
	})
}
  1. 生成文档
  • 生成 swagger 文件
$ cd web-example
$ swag init --parseDependency   # 生成swagger文件
$ rm -rf ./docs/docs.go         # 删除无用的docs.go文件
  1. 启动服务
$ cd web-example
$ go run main.go
                    ____  __  ________
                   / __ \/ / / / ____/
                  / / / / / / / __/
                 / /_/ / /_/ / /___
                /_____/\____/_____/
┌──────────────────────────────────────────────────────┐
| [Website] https://github.com/dobyte/due              |
| [Version] v2.4.2                                     |
└──────────────────────────────────────────────────────┘
┌────────────────────────Global────────────────────────┐
| PID: 3456                                            |
| Mode: debug                                          |
| Time: 2025-10-30 18:32:09.2954402 +0800 CST          |
└──────────────────────────────────────────────────────┘
┌─────────────────────────Http─────────────────────────┐
| Name: http                                           |
| Url: http://192.168.2.202:8080                       |
| Swagger: http://192.168.2.202:8080/swagger           |
| Registry: -                                          |
| Transporter: -                                       |
└──────────────────────────────────────────────────────┘

更多文档

due 框架的 Web 服务器严格遵循 fiber 框架的开发规范,如需了解更多的开发问题请移步 fiber开发文档