You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure Functions中用单个function.json管理多Gin端点?

解决方案:用单个function.json托管所有Gin路由到Azure Functions

完全可以通过Azure Functions的**自定义处理器(Custom Handler)**实现用单个function.json注册所有Gin端点,无需为每个路由单独创建函数文件夹。以下是具体实现步骤:

1. 修正你的Go代码(main.go)

调整main.go,确保Gin路由正确对接Azure Functions自定义处理器,同时修复代码中的未定义函数问题:

package main

import (
    "net/http"
    "os"

    "github.com/gin-gonic/gin"
    "github.com/Azure/azure-functions-go-sdk/azfunc"
    "github.com/guilherm5/brapoio/routes"
)

// 抽离路由初始化逻辑,方便复用
func setupRouter() *gin.Engine {
    Router := gin.New()
    Router.Use(gin.LoggerWithWriter(gin.DefaultErrorWriter))

    // 加载所有业务路由
    routes.ConfiguracaoSistema(Router)
    routes.ConfiguracaoModulo(Router)
    routes.ModuloSistema(Router)
    routes.ArvoreMenu(Router)
    routes.ModuloArvoreMenu(Router)

    routes.Usuario(Router)
    routes.EmpresaUsuario(Router)
    routes.CampoTabelaUsuario(Router)
    routes.ProgramaUsuario(Router)
    routes.FuncionalidadeProgramaUsuario(Router)
    routes.TabelaUsuario(Router)
    routes.ParametroFiltroTabelaUsuario(Router)
    routes.JWTAutentication(Router)

    return Router
}

func main() {
    // 对接Azure Functions自定义处理器
    handler := azfunc.HTTPHandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        setupRouter().ServeHTTP(w, r)
    })

    // 判断是否在Azure Functions环境中运行
    if _, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); exists {
        azfunc.Main(handler)
        return
    }

    // 本地开发时启动Gin服务器
    listenAddr := ":1000"
    if val, ok := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); ok {
        listenAddr = ":" + val
    }
    setupRouter().Run(listenAddr)
}

2. 创建单个function.json文件

在项目中新建一个函数文件夹(比如命名为GinApi),在其中创建function.json,配置为接收所有HTTP请求的触发器:

{
  "bindings": [
    {
      "authLevel": "anonymous", // 可根据需求调整为function/admin
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["GET", "POST", "PUT", "DELETE", "PATCH"], // 覆盖你需要支持的HTTP方法
      "route": "{*route}" // 通配符匹配所有路由路径
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ],
  "scriptFile": "../main" // 指向编译后的Go二进制文件(相对function.json的路径)
}

3. 项目结构调整

最终保持以下简洁结构即可:

项目根目录/
├── GinApi/
│   └── function.json
├── main.go
├── routes/
│   ├── campotabela.go
│   ├── configsystem.go
│   └── ...(其他路由文件)
└── go.mod

4. 编译与部署

  • 编译Linux兼容的二进制文件:Azure Functions默认使用Linux环境,执行以下命令编译:
    env GOOS=linux GOARCH=amd64 go build -o main
    
  • 部署到Azure Functions:将根目录下的main二进制文件、GinApi文件夹、go.mod等文件一并部署到你的Azure Functions应用即可。

这样所有Gin中定义的路由(如/api/config、/api/fieldTable等)都会通过这单个function.json被Azure Functions托管,无需为每个端点单独创建函数文件夹。

内容的提问来源于stack exchange,提问作者Guilherme Rodrigues

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:09:24