Rumah >pembangunan bahagian belakang >Golang >Gagal mendapatkan deskriptor RPC

Gagal mendapatkan deskriptor RPC

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBke hadapan
2024-02-08 21:39:091314semak imbas

获取 RPC 描述符失败

editor php Strawberry akan memperkenalkan anda kepada masalah biasa hari ini: semasa melakukan panggilan prosedur jauh (RPC), anda mungkin menghadapi ralat "Gagal mendapatkan deskriptor RPC". Ralat ini biasanya bermakna bahawa pelanggan tidak boleh mewujudkan sambungan yang sah dengan pelayan, yang mungkin disebabkan oleh masalah rangkaian, ralat konfigurasi sisi pelayan atau isu kebenaran. Dalam artikel ini, kami akan menerangkan punca ralat ini secara terperinci dan menyediakan beberapa penyelesaian untuk membetulkannya. Sama ada anda seorang pemula atau pembangun berpengalaman, anda akan mendapat maklumat berguna daripada artikel ini tentang menyelesaikan ralat "Gagal mendapatkan deskriptor RPC".

Kandungan soalan

Saya mempunyai fail prototaip berikut:

service_myservice.proto

service MyService {
    rpc GetData(GetRequest) returns (GetResponse) {}
}

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
}

Kemudian dalam pakej utama saya panggil fungsi ini

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")
    }
}

Saya menggunakan evans (https://github.com/ktr0731/evans) untuk menguji panggilan grpc saya. Pelayan gRPC saya sedang berjalan dan saya boleh menggunakan evans untuk menyambung ke localhost pada port tertentu (9090).

Namun, apabila saya menghubungi show service dalam Evans, saya mendapat respons berikut:

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

Saya rasa jika saya masuk Server 结构中添加 pb.UnimplementedMyServiceServer maka ini serasi ke hadapan. Tetapi jelas, saya kehilangan beberapa kod.

Apa yang tiada untuk menjadikan MyService serasi ke hadapan? MyService 向前兼容,缺少什么部分?

解决方法

REPL模式下使用evans时,调用show service前应选择包,调用call GetData

Penyelesaian🎜🎜Apabila menggunakan evans dalam mod REPL, pakej harus dipilih sebelum memanggil 🎜 dan perkhidmatan harus dipilih sebelum memanggil panggilan GetData kod>. 🎜 <pre class="brush:php;toolbar:false;">localhost:9090&gt; show package +-------------------------+ | PACKAGE | +-------------------------+ | example | | grpc.reflection.v1 | | grpc.reflection.v1alpha | +-------------------------+ localhost:9090&gt; package example example@localhost:9090&gt; show service +-----------+---------+--------------+---------------+ | SERVICE | RPC | REQUEST TYPE | RESPONSE TYPE | +-----------+---------+--------------+---------------+ | MyService | GetData | GetRequest | GetResponse | +-----------+---------+--------------+---------------+ example@localhost:9090&gt; service MyService example.MyService@localhost:9090&gt; call GetData id (TYPE_INT32) =&gt; 1</pre>

Atas ialah kandungan terperinci Gagal mendapatkan deskriptor RPC. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam