我有一个 grpc 服务,这里是代码摘录: 原型:
// proto/campus/graduate/v1/graduate.proto
syntax = 'proto3';
package wusthelper.campus.graduate.v1;
option java_package = 'cn.wustlinghang.wusthelper.rpc.graduate.v1';
option java_outer_classname = 'GraduateProto';
option java_generic_services = true;
service GraduateRequestAgent {
// Login Login service for graduate
rpc Login (UsernamePasswordReq) returns (AgentReply);
// GetStudentInfo Get the student info
rpc GetStudentInfo (CookieReq) returns (AgentReply);
//... more
}
service GraduateParser {
// ParseScores Parse the score page
rpc ParseScores (PlainText) returns (ScoreParseReply);
//... more
}
这是服务器实现:
package cn.wustlinghang.wusthelper.campus.graduate.service;
import net.devh.boot.grpc.server.service.GrpcService;
@GrpcService
public class GraduateRequestAgentImpl extends GraduateRequestAgentGrpc.GraduateRequestAgentImplBase {
@Override
public void login(CampusCommonProto.UsernamePasswordReq request,
StreamObserver<CampusCommonProto.AgentReply> responseObserver) {
//...implements
}
//... other implements
}
package cn.wustlinghang.wusthelper.campus.graduate.service;
import net.devh.boot.grpc.server.service.GrpcService;
@GrpcService
public class GraduateParserImpl extends GraduateParserGrpc.GraduateParserImplBase {
@Override
public void parseScores(CommonProto.PlainText request,
StreamObserver<GraduateProto.ScoreParseReply> responseObserver) {
// ...implements
}
}
奇怪的是,当我在 idea 中启动服务器并调用
login()
或 ParseScores()
时,一切都如我所料。
但是当我将服务器项目打包成jar文件时,如果我调用login()
等方法,我会收到io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method not found: wusthelper.campus.graduate.v1.GraduateRequestAgent/Login
异常。只有当我将服务器打包成jar文件时才会出现问题。
如果我使用像
grpcurl
或evans
这样的grpc调试工具,无论我将服务器打包为jar还是直接在idea中运行,它们都可以正常工作,但我无法从客户端调用。 😰😫
client使用的生成的protocode和server使用的是一样的,server log显示确实加载了implement service:
2023-04-06T20:23:37.358+08:00 INFO 27868 --- [ main] g.s.a.GrpcServerFactoryAutoConfiguration : Detected grpc-netty-shaded: Creating ShadedNettyGrpcServerFactory
2023-04-06T20:23:37.507+08:00 INFO 27868 --- [ main] n.d.b.g.s.s.AbstractGrpcServerFactory : Registered gRPC service: wusthelper.campus.graduate.v1.GraduateParser, bean: graduateParserImpl, class: cn.wustlinghang.wusthelper.campus.graduate.service.GraduateParserImpl
2023-04-06T20:23:37.507+08:00 INFO 27868 --- [ main] n.d.b.g.s.s.AbstractGrpcServerFactory : Registered gRPC service: wusthelper.campus.graduate.v1.GraduateRequestAgent, bean: graduateRequestAgentImpl, class: cn.wustlinghang.wusthelper.campus.graduate.service.GraduateRequestAgentImpl
2023-04-06T20:23:37.507+08:00 INFO 27868 --- [ main] n.d.b.g.s.s.AbstractGrpcServerFactory : Registered gRPC service: grpc.health.v1.Health, bean: grpcHealthService, class: io.grpc.protobuf.services.HealthServiceImpl
2023-04-06T20:23:37.507+08:00 INFO 27868 --- [ main] n.d.b.g.s.s.AbstractGrpcServerFactory : Registered gRPC service: grpc.reflection.v1alpha.ServerReflection, bean: protoReflectionService, class: io.grpc.protobuf.services.ProtoReflectionService
2023-04-06T20:23:37.632+08:00 INFO 27868 --- [ main] n.d.b.g.s.s.GrpcServerLifecycle : gRPC Server started, listening on address: 0.0.0.0, port: 19090
2023-04-06T20:23:37.640+08:00 INFO 27868 --- [ main] c.w.w.c.graduate.GraduateServiceMain : Started GraduateServiceMain in 1.024 seconds (process running for 1.417)
调试日志也和正常运行时一样
甚至我尝试用 Golang 重写客户端代码,并得到相同的行为。
环境:
我也试过去掉springboot和grpc-starter改写成prue grpc服务,但是没用😰