打包Java gRPC服务为JAR时遭遇UNIMPLEMENTED: Method not found错误
gRPC服务打包JAR后方法调用触发UNIMPLEMENTED异常
IDEA中启动服务端后,调用login()或ParseScores()方法完全正常,但将服务打包成JAR文件后,调用这些方法会收到io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method not found: wusthelper.campus.graduate.v1.GraduateRequestAgent/Login异常,该问题仅在JAR打包后出现。
使用grpcurl、evans等gRPC调试工具时,无论服务是JAR运行还是IDEA直接运行都能正常调用,但客户端调用却失败。客户端使用的生成proto代码与服务端一致,且服务端日志显示已成功加载实现类。
相关代码片段
Proto文件
// 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 }
服务端实现类
GraduateRequestAgentImpl.java
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 }
GraduateParserImpl.java
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 } }
服务端日志
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)
环境信息
- Java 17
- SpringBoot 3.0.4
- grpc-java 1.54.0
- grpc-spring-boot-starter(net.devh) 2.14.0.RELEASE
已尝试的操作
- 移除SpringBoot和grpc-starter,改用纯gRPC服务,问题仍未解决。
内容的提问来源于stack exchange,提问作者lenfrex
相关产品推荐
相关产品推荐

