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

Gagal mendapatkan deskriptor RPC

WBOY
Lepaskan: 2024-02-08 21:39:09
ke hadapan
1244 orang telah melayarinya

获取 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) {}
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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")
    }
}
Salin selepas log masuk

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
Salin selepas log masuk

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. 🎜
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
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan