将 java grpc 服务打包为 jar 时报告“UNIMPLEMENTED: Method not found”

问题描述 投票:0回答:0

我有一个 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
}

这是服务器实现:

  • 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
    }
}

奇怪的是,当我在 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 重写客户端代码,并得到相同的行为。

环境:

  • java 17
  • springboot 3.0.4
  • grpc-java 1.54.0
  • grpc-spring-boot-starter(net.devh) 2.14.0.RELEASE

我也试过去掉springboot和grpc-starter改写成prue grpc服务,但是没用😰

java jar grpc
© www.soinside.com 2019 - 2024. All rights reserved.