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".
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
panggilan GetData kod>. 🎜
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 masukAtas ialah kandungan terperinci Gagal mendapatkan deskriptor RPC. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!