iris原生不支持run()或listen()直接监听多端口,必须手动创建多个http.server实例并复用app.router;连续调用listen会因阻塞导致第二个失败。

iris.Run() 不支持直接多端口监听
Iris 原生不提供 app.Run() 或 app.Listen() 同时绑定多个端口的能力。调用一次 Run() 只启动一个 http.Server 实例,对应单个监听地址。试图传入多个地址(如 iris.Addr(":8080"), iris.Addr(":9000"))会编译失败或 panic——函数签名根本不接受多个参数。
用多个 http.Server 实例手动管理多端口
真正可行的方式是:自己创建多个 http.Server,分别绑定不同端口,并把 Iris 的 Router(即 app.Router)复用给它们。Iris v12+ 的 app.Router 是标准的 http.Handler,可被任意 http.Server 复用。
常见错误现象:app.Listen(":8080") 和 app.Listen(":9000") 连续调用——后者会报错 listen tcp :9000: bind: address already in use,因为第一个 Listen() 已阻塞主线程,第二个根本不会执行。
实操建议:
- 先调用
app.Build()(可选,显式触发路由构建,避免并发问题) - 用
http.Server{Addr: ":8080", Handler: app.Router}启动第一个服务 - 用
http.Server{Addr: ":9000", Handler: app.Router}启动第二个服务 - 两个服务需分别
go server.ListenAndServe(),否则会阻塞 - 注意处理
http.ErrServerClosed,避免日志误报
不同端口走不同路由?得靠子路由器或中间件分流
如果目标是「:8080 走 API 路由,:9000 走管理后台路由」,不能靠端口自动区分——app.Router 是共享的,所有路由对两个端口都可见。必须主动隔离。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
推荐做法是用 Iris 的 Party(子路由器)配合中间件判断请求来源端口:
- 定义
api := app.Party("/api")和admin := app.Party("/admin") - 在
admin的中间件里加if ctx.Request().Host != "localhost:9000" { ctx.StatusCode(403); return } - 或者更稳妥:启动两个独立
iris.Application实例,各自注册不同路由,再分别绑定端口 - 若共用一份代码逻辑,可用环境变量控制路由注册分支,例如
if os.Getenv("PORT") == "9000" { app.Get("/dashboard", ...)
HTTPS 和 HTTP 端口共存要特别注意 TLS 配置
想同时开 :80(HTTP)和 :443(HTTPS),不能只靠改端口。HTTPS 必须用 http.Server 手动配置 TLSConfig,且 app.TLS() 仅作用于 Run() 内部默认 server,无法复用于自定义 server。
关键点:
-
app.TLS("cert.pem", "key.pem")本身不启动服务,只是预设 TLS 配置 - 若要用自定义
http.Server启 HTTPS,必须显式设置server.TLSConfig = &tls.Config{...} - 证书文件路径需为绝对路径,相对路径在 systemd 服务中常失效
- Go 1.20+ 默认禁用 TLS 1.0/1.1,确保客户端兼容;必要时用
MinVersion: tls.VersionTLS12
最易被忽略的是:两个端口的日志、超时、中断信号需分别处理。比如 server.SetKeepAlivesEnabled(false) 或 server.ReadTimeout,漏配一个就可能让某个端口响应缓慢或连接堆积。










