Rumah >pembangunan bahagian belakang >Golang >GO dan GRPC: Mencipta kelas protobuff 'dengan cepat'

GO dan GRPC: Mencipta kelas protobuff 'dengan cepat'

PHPz
PHPzke hadapan
2024-02-06 11:06:031323semak imbas

GO 和 GRPC:“在飞行中”创建 protobuff 类

Kandungan soalan

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


Jawapan betul


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!

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