应使用 party 拆分路由组,按业务域组织如 usersapi := app.party("/api/v1/users"),支持嵌套与中间件自动继承;配合 mvc.configure 自动映射控制器方法,避免手动重复声明;禁用路由内条件分支,改用独立路由或中间件;启动前校验路由冲突,注意嵌套路由中间件执行顺序。

用 Party 拆分路由组,避免单层 app.Get 堆砌
当接口超过 20 个,尤其是路径有公共前缀(如 /api/v1/users、/api/v1/posts)时,全部写在 app.Get / app.Post 里会导致代码横向拉长、中间件难统一、模块边界模糊。直接后果是改一个用户路由,得翻半天找上下文。
正确做法是按业务域切分 Party,每个组内只管自己那块逻辑:
-
usersAPI := app.Party("/api/v1/users")后接usersAPI.Get("/profile", profileHandler) -
postsAPI := app.Party("/api/v1/posts", authMiddleware, rateLimitMiddleware),中间件自动作用于该组全部子路由 - 嵌套也支持:
adminAPI := app.Party("/admin"); usersAdmin := adminAPI.Party("/users")
注意:不要在 Party 后直接写 handler,必须用 .Get / .Post 等方法挂载;Party 返回的是新路由组实例,不是原 app。
用 mvc.Configure 统一注册控制器,减少重复路由声明
如果你的 handler 已按结构体方法组织(比如 type UserController struct{} + func (c *UserController) GetByUUID(ctx iris.Context)),硬写 usersAPI.Get("/id/{uuid}", userCtrl.GetByUUID) 就是自我重复。Iris 的 mvc.Configure 能自动映射方法名到 HTTP 方法和路径。
实操要点:
- 先创建 Party:
usersRouter := app.Party("/api/v1/users") - 再调用:
mvc.Configure(usersRouter, func(m *mvc.Application) { m.Register(new(UserController)) }) - 它会把
GetByUUID自动绑定为GET /api/v1/users/by-uuid(下划线转短横),PostCreate→POST /api/v1/users/create
这个机制依赖方法名前缀(Get/Post/Put/Delete)和后缀(驼峰转 kebab),不匹配就不会注册——别指望它猜你意图。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
避免在路由定义中做条件分支,把逻辑下沉到中间件或 handler 内部
常见错误写法:app.Get("/item/{id}", func(ctx iris.Context) { if ctx.Params().Get("id") == "admin" { ... } else { ... } })。这种写法让路由表失去可读性,且无法被 Swagger 工具识别,调试时也难定位。
应改为:
- 用独立路由明确语义:
app.Get("/item/admin", adminItemHandler)+app.Get("/item/{id:string regexp(^[0-9]+$)}", normalItemHandler) - 或统一入口 + 中间件鉴权:
itemRouter := app.Party("/item"); itemRouter.Use(itemAuthMiddleware),把权限判断收口 - 正则约束写在参数里比 runtime if 更早拦截,比如
{id:int}或{slug:string regexp(^[-a-z0-9]+)$}
参数正则一旦写错(比如漏掉 ^ 或 $),可能匹配过宽,导致本该 404 的请求落到错误 handler 上。
启动时检查路由冲突,别等上线才暴露问题
Iris 不会在 app.Listen 前报重复路由错误,而是静默覆盖——后注册的会顶掉前面的。比如不小心写了两次 app.Get("/health", health1) 和 app.Get("/health", health2),后者生效但毫无提示。
建议加一层校验:
- 启动前遍历
app.GetRoutes(),用 map 记录已注册路径,发现重复就 panic - 在 CI 流程中跑
go run main.go --dry-run(需自己实现 flag),只初始化路由不启动 server - 用
iris.WithConfiguration(iris.Configuration{DisableStartupLog: true})关闭默认日志后,自己打印所有路由,人工扫一眼
真正容易被忽略的是嵌套路由的中间件执行顺序:外层 Party 的中间件总在内层之前执行,但很多人以为 authMiddleware 写在 app.Party("/admin") 就只管 admin,其实它也会进 /admin/api/xxx ——而如果 /admin/api 又单独挂了另一套 auth,就可能 double check。










