Home > Backend Development > Golang > Failed to get RPC descriptor

Failed to get RPC descriptor

WBOY
Release: 2024-02-08 21:39:09
forward
1245 people have browsed it

获取 RPC 描述符失败

#php editor Strawberry will introduce you to a common problem today: when making a remote procedure call (RPC), you may encounter the error "Failed to obtain RPC descriptor". This error usually means that the client cannot establish a valid connection with the server, which may be caused by network problems, server-side configuration errors, or permission issues. In this article, we will explain the cause of this error in detail and provide some solutions to fix it. Whether you are a beginner or an experienced developer, you will get useful information from this article on resolving the "Failed to get RPC descriptor" error.

Question content

I have the following prototype file:

service_myservice.proto

service MyService {
    rpc GetData(GetRequest) returns (GetResponse) {}
}
Copy after login

server.go

type Server struct {
    pb.UnimplementedMyServiceServer
    config util.Config
}

// NewServer creates a new gRPC server.
func NewServer(config util.Config) (*Server, error) {
    server := &Server{
        config: config,
    }

    return server, nil
}
Copy after login

Then I call this function in the main package

func runGrpcServer(config util.Config) {
    server, err := gapi.NewServer(config)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot create server")
    }

    grpcLogger := grpc.UnaryInterceptor(gapi.GrpcLogger)
    grpcServer := grpc.NewServer(grpcLogger)
    pb.RegisterMyServiceServer(grpcServer, server)
    reflection.Register(grpcServer)

    listener, err := net.Listen("tcp", config.GRPCServerAddress)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot create listener")
    }

    log.Info().Msgf("start gRPC server at %s", listener.Addr().String())
    err = grpcServer.Serve(listener)
    if err != nil {
        log.Fatal().Err(err).Msg("cannot start gRPC server")
    }
}
Copy after login

I'm using evans (https://github.com/ktr0731/evans) to test my grpc calls. My gRPC server is running and I can use evans to connect to localhost on a specific port (9090).

However, when I call show service in Evans, I get the following response:

localhost:9090> show service
+---------+-----+--------------+---------------+
| SERVICE | RPC | REQUEST TYPE | RESPONSE TYPE |
+---------+-----+--------------+---------------+
+---------+-----+--------------+---------------+
localhost:9090> call GetData
command call: failed to get the RPC descriptor for: GetData: service unselected
Copy after login

I think if I add pb.UnimplementedMyServiceServer in the Server structure, then this is forward compatible. But obviously, I'm missing some code.

What parts are missing to make MyService forward compatible?

Solution

REPLWhen using evans in mode, you should select the package and call ## before calling show service Service should be selected before #call GetData.

localhost:9090> show package
+-------------------------+
|         PACKAGE         |
+-------------------------+
| example                 |
| grpc.reflection.v1      |
| grpc.reflection.v1alpha |
+-------------------------+

localhost:9090> package example

example@localhost:9090> show service
+-----------+---------+--------------+---------------+
|  SERVICE  |   RPC   | REQUEST TYPE | RESPONSE TYPE |
+-----------+---------+--------------+---------------+
| MyService | GetData | GetRequest   | GetResponse   |
+-----------+---------+--------------+---------------+

example@localhost:9090> service MyService

example.MyService@localhost:9090> call GetData
id (TYPE_INT32) => 1
Copy after login

The above is the detailed content of Failed to get RPC descriptor. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template