HTTP接口404但gRPC连通,说明服务进程存活但HTTP路由未注册:需确认http.NewServer()传入了正确handler、internal/server/http.go调用了RegisterXXXHTTPServer、proto已用protoc-gen-go-grpc插件生成且路径前缀匹配。

Kratos框架服务启动后看不到HTTP接口响应,但gRPC能连上,说明服务已运行却无法通过浏览器或curl访问REST接口,这通常源于端口监听与路由注册的错位。
服务启动命令与基础验证
执行 kratos run 启动项目,默认会加载 configs/config.yaml 并启动两个独立服务实例。
启动成功后控制台会输出两行关键日志:
INFO msg=[gRPC] server listening on: [::]:9000
INFO msg=[HTTP] server listening on: [::]:8000
这两行不是装饰——【9000是gRPC默认端口,8000是HTTP默认端口,二者完全分离,不共用】。
立刻验证HTTP是否可达:运行 curl 'http://127.0.0.1:8000/helloworld/kratos',预期返回 {"message":"Hello kratos"}。
HTTP接口404但gRPC连通的根源定位
这是新手最常卡住的点:Kratos默认把HTTP和gRPC绑定在同一端口(如8000),但路由注册逻辑藏在 internal/server/http.go 的 RegisterGreeterHandler 里,不是自动扫包。
方法一:检查 cmd/server/main.go 中是否调用了 http.NewServer 并传入了正确 handler:
确认存在类似代码:httpSrv := http.NewServer(http.Address(":8000"), http.Middleware(...), http.Handler(h))
其中 h 必须是已注册路由的 http.Handler 实例,不能是空的 http.NewServeMux()。
方法二:确认 internal/server/http.go 是否真正执行了 greeter.RegisterGreeterHTTPServer 调用——该函数由 protoc-gen-go-grpc 生成,若缺失此插件,整个HTTP路由注册链就断了。
【proto 编译后没有 RegisterXXXServiceServer 方法,缺的是 protoc-gen-go-grpc 插件】。
修改默认端口的实操步骤
第一步:打开 configs/config.yaml,找到 server 配置块。
第二步:修改 http 下的 addr 字段,例如改为 addr: ":8080";同理可改 grpc.addr: ":9090"。
第三步:保存后重新执行 kratos run,观察日志中是否显示新端口已监听。
第四步:用新端口测试,例如 curl http://127.0.0.1:8080/helloworld/kratos。
注意:改完端口后若仍404,请回退检查第二步——YAML缩进错误会导致字段未被加载,Kratos不会报错,只会静默忽略该配置项。


















