Saya baru dalam GRPC dan tidak dapat menyelesaikan masalah. Adakah mungkin untuk mencipta fail protobuff apabila aplikasi sudah berjalan?
Sebagai contoh, saya menerima json
daripada pengguna seperti ini:
"protobuf_file": "protobuf.proto", // File will be also recieved from user "service_name": "Unary", "method_name": "GetServerResponse", "request_data_serializer_name": "MessageRequest", "body": "grpc_request_data.json", // File will be also recieved from user
Di sini saya mempunyai .proto
fail, nama perkhidmatan, kaedah dan mesej, dan satu lagi json dengan data untuk mengisi mesej.
Sekarang saya perlu membuka sambungan dan memanggil kaedah yang diperlukan dengan data yang disediakan.
TY!
PS .proto
Fail (daripada Panduan Mendapatkan Arahan) ialah:
syntax = "proto3"; package protobuf_all_modes; service Unary { rpc GetServerResponse(MessageRequest) returns (MessageResponse) {} } message MessageRequest { string message = 1; } message MessageResponse { string message = 1; int32 random_int32 = 2; }
Yang kedua json
ialah:
{ "message": "hello World!" }
Saya tidak tahu di mana hendak mencari penyelesaian. Sebarang cadangan amat dihargai
Jika sesiapa mempunyai masalah yang sama, terdapat perpustakaan yang sangat bagus - https://pkg.go.dev/github.com/jhump/[ email protected] /dynamic dan sub-pakejhttps://pkg.go.dev/github. com/jhump/[emel dilindungi]/dynamic/grpcdynamic
Coretan kod ialah:
parser
func NewGrpcObject(operation *BaseOperation) *GrpcObject { fns, err := protoparse.ResolveFilenames([]string{"./"}, operation.ProtoFile) // prase .proto file if err != nil { log.Error(err) } parser := protoparse.Parser{} fds, err := parser.ParseFiles(fns...) if err != nil { log.Error(err) } descriptor := fds[0] // In my case there will be only one .proto pkg := descriptor.GetPackage() serviceDescriptor := descriptor.FindService(pkg + "." + operation.ServiceName) // name of service descriptor will be with package name first methodDescriptor := serviceDescriptor.FindMethodByName(operation.MethodName) requestDescriptor := methodDescriptor.GetInputType() // You can get types for request and response responseDescriptor := methodDescriptor.GetOutputType() return &GrpcObject{ RequestDesc: requestDescriptor, MethodDesc: methodDescriptor, ResponseDesc: responseDescriptor, } }
caller
// connect conn, _ := grpc.Dial(operation.Host, grpc.WithTransportCredentials(credentials.NewTLS(c.TLSClientConfig.NewTLSConfig()))) stub = grpcdynamic.NewStub(conn) // call message := dynamic.NewMessage(operation.GrpcObject.RequestDesc) // from parser message.UnmarshalJSON(operation.Body) // here a JSON to fill message resp, err := stub.InvokeRpc(ctx, operation.GrpcObject.MethodDesc, message) if err != nil { // handle err } respMessage := dynamic.NewMessage(operation.GrpcObject.ResponseDesc) // descriptor from parser respMessage.ConvertFrom(resp) // convert message from raw response
Atas ialah kandungan terperinci GO dan GRPC: Mencipta kelas protobuff 'dengan cepat'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!