kratos http服务需显式构造http.server实例、绑定路由、注入配置并在cmd/main.go启动,任一缺失将导致静默无响应;须在server.toml中配置[server.http] addr与timeout,http.go中显式传入http.address(c.http.addr)和注册路由的router,proto注解路径须与group前缀一致,启动后通过日志和lsof验证监听状态。

Kratos 的 HTTP 服务不是“开个开关”就能跑起来的,必须显式构造 http.Server 实例、绑定路由、注入配置,并在 cmd/main.go 中启动——漏掉任一环节,服务就静默不响应,curl 会直接超时或返回空。
server.toml 里必须配好 addr 和超时参数
打开 configs/server.toml,确保存在且正确填写了 [server.http] 段落:
[server.http] addr = "0.0.0.0:8000" timeout = "1s"
注意:addr 必须带端口号,不能写成 ":8000"(虽然 Go 允许,但 Kratos v2.10+ 部分版本会因解析失败 fallback 到默认值);timeout 是读写超时,不是连接超时,若不设,某些中间件(如限流)可能无法生效。
internal/server/http.go 必须用 http.New() 构造并传入 Address
检查 internal/server/http.go 中的 NewHTTPServer 函数,核心是这行:
srv := http.NewServer(
http.Address(c.HTTP.Addr),
http.Middleware(...),
http.Router(r),
)
关键点:
-
http.Address(c.HTTP.Addr)必须显式传入,否则监听地址会退化为":8000"(硬编码),和配置文件脱节 -
http.Router(r)的r必须是你注册过路由的*bm.Engine实例,不能是空的bm.Default() - 如果用了自定义中间件,确保它们不 panic 或阻塞 —— 比如日志中间件里调用了未初始化的
log.Logger,会导致整个 HTTP server 启动失败但无报错
proto 注解和路由注册必须对得上
Kratos 不会自动扫描 proto 文件生成路由,它靠两层绑定生效:
- 第一层:proto 中的
option (google.api.http) = { get: "/v1/hello" };—— 路径必须以/开头,动词后跟英文冒号,变量名大小写和字段完全一致 - 第二层:
http.go里调用srv.Group("/v1")并在该 Group 下注册 handler,否则路径变成//v1/hello或/hello,404 就不可避免 - 如果你没用 proto 自动生成路由(比如手动上传文件),就得自己调用
r.POST("/v1/upload", handler)显式注册,且路径前缀要和 Group 一致
启动后必须验证日志和端口监听状态
执行 kratos run 后,不要只看 “started”,盯住这两行日志:
INFO server/http.go:45 [http] start http server at [::]:8000 INFO server/server.go:123 [server] start http server at [::]:8000
如果只有第二行、没有第一行,说明 NewHTTPServer 根本没被调用;如果第一行 port 是 :8000 但你配的是 :8080,说明 http.Address 没传或传错。另外建议补一句:
lsof -i :8000 | grep LISTEN
确认进程确实在监听,而不是被其他服务占了端口 —— 这个细节在本地多服务联调时最容易被忽略。











