Kratos中gRPC服务对外提供接口需完成两步:一是实现业务逻辑并保留接口断言,二是手动注册到gRPC Server实例;缺一不可,否则客户端调用返回Unavailable错误或超时。

要在Kratos中让gRPC服务真正对外提供接口,必须完成两件事:先写出符合协议的业务逻辑实现体,再把它注册进运行中的gRPC Server实例;漏掉任一环节,客户端调用时都会返回rpc error: code = Unavailable或直接连接超时。
编写gRPC服务实现结构体
打开internal/service/greeter_service.go,找到自动生成的GreeterService结构体。它默认嵌入了UnimplementedGreeterServer,这是为了兼容未实现的方法——但你不能依赖它。
在SayHello方法体内删掉return nil, errors.New("unimplemented"),替换成真实逻辑:
这一步操作起来很简单,直接把return &v1.HelloReply{Message: "Hello " + req.GetName()}, nil写进去就行。
【必须保留var _ pb.GreeterServer = (*GreeterService)(nil)这一行断言】——它在编译期强制检查GreeterService是否完整实现了pb.GreeterServer接口。删掉后即使代码能编译通过,运行时一旦调用未实现的方法就会panic。
将服务实例注册到gRPC Server
服务实现写完了,但Kratos不会自动把它挂载到gRPC Server上。注册动作必须手动完成,且只能在internal/server/grpc.go中进行。
第一步:确认grpc.go里已创建*grpc.Server实例,通常形如grpc.NewServer(grpc.ServerOption...);
第二步:在该文件末尾的NewGRPCServer函数返回前,插入注册语句:pb.RegisterGreeterServer(srv, &service.GreeterService{});
第三步:确保这个srv变量被传入了kratos.New()的kratos.Server(...)参数列表里——否则注册只是对一个没启动的Server实例操作,毫无意义。
注意:如果项目根本不需要gRPC,就别写service.Register(),也别调用pb.RegisterXXXServer。HTTP路由完全独立,不依赖gRPC注册链。
启动服务并验证注册生效
方法一:执行kratos run启动项目,观察控制台日志是否出现grpc server listening on [::]:9000;
方法二:用grpcurl测试连通性:grpcurl -plaintext localhost:9000 list,应返回helloworld.v1.Greeter;
方法三:调用具体方法验证业务逻辑:grpcurl -plaintext -d '{"name": "Kratos"}' localhost:9000 helloworld.v1.Greeter/SayHello,预期返回{"message":"Hello Kratos"}。
如果grpcurl list报错Failed to list services: rpc error: code = Unavailable desc = connection closed,说明grpc.Server没启动、没注册服务、或监听地址写成了localhost:9000(某些容器环境无法解析localhost)——请改用0.0.0.0:9000。


















