kratos http 404主因是路由未注册:漏调v1.registerxxxhttpserver、api/v1/xxx_http.pb.go未生成、或proto中http路径前缀(如/v1)与访问路径不匹配。

404 不是服务没起来,而是请求压根没走到后端——Kratos 网关层路由没绑、proto 路径没对、或注册函数根本不存在。
HTTP 路由注册失败:v1.RegisterXXXHTTPServer 没调用
服务日志显示 start http server at [::]:8000,但 curl http://localhost:8000/v1/say/hello 返回 404,第一排查点就是注册函数是否执行。
-
internal/server/http.go中必须显式调用v1.RegisterGreeterHTTPServer()(或你自己的v1.RegisterDeviceHTTPServer()),漏掉这行等于没挂路由 - 该函数来自
api/v1/greeter_http.pb.go,若make api没跑成功,这个文件就为空或缺失,编译不报错但运行时注册逻辑直接跳过 - 检查 proto 文件里
option (google.api.http)的路径是否带前缀,比如get: "/v1/say/hello"——生成的 Go 代码会把/v1当作硬编码前缀,访问时必须带,不能只写/say/hello
网关配置中路由不生效:YAML 字段名和值敏感
fregata 或自定义 Kratos Gateway 启动后能连通但转发 404,大概率是配置写错字段,且不会报错,静默失效。
-
upstream下必须是hosts数组,写成host: "127.0.0.1:9000"就完全不加载该 upstream -
timeout单位是毫秒,填5s或5000ms都可能被忽略,只认纯数字如5000 -
match.path必须以/开头(如/v1/route),match.method必须全大写("GET",不是"get") - 多个路由规则 path 冲突时,fregata 取第一个匹配项,不警告也不报错,得人工核对顺序和前缀覆盖关系
proto 未生成或注解缺失:HTTP ↔ gRPC 转换链断裂
网关返回 404,但下游 gRPC 服务本身健康、grpcurl 调用正常,说明问题出在协议转换环节。
- fregata 启动必须指定
--proto-dir=./api/proto,且目录下要有完整的.proto文件(含package和service定义) - proto 中必须有
option (google.api.http)注解,否则 fregata 只做透明 HTTP 转发,不会自动映射到 gRPC 方法 - package 名和 service 名要与下游 BFF 的 gRPC Service 严格一致,大小写、下划线都不能差,否则路径解析失败直接 404
- 如果用的是自定义网关(非 fregata),又没手动实现
http.Handler去解析 proto 并分发,那所有 HTTP 请求都会 fallback 到 404
kratos.New() 启动无 panic,但 HTTP 服务不可达
进程启动成功、端口监听了、gRPC 能连,唯独 HTTP 接口 404,说明 http.Server 实例根本没传进框架生命周期。
- 确认
kratos.New()的kratos.Server()参数里同时传入了httpSrv和grpcSrv,漏掉httpSrv就等于没启用 HTTP 监听 -
internal/server/http.go中创建的http.NewServer()必须传入有效handler(如*gin.Engine或http.ServeMux),空 handler 会导致 mux 无路由可 dispatch - 别依赖 “框架自动扫描”,Kratos 所有 HTTP 路由都靠手动生成 + 手动注册,没有反射式自动绑定机制
最常被忽略的一点:proto 文件改了、make api 却没重跑,导致 _http.pb.go 里的路径逻辑还是旧的;或者 config.yaml 改了但 gateway 进程没重启,配置压根没加载。这类问题不会报错,只会让请求在网关层悄无声息地掉进 404。











