GO dan GRPC: Mencipta kelas protobuff 'dengan cepat'

PHPz
Lepaskan: 2024-02-06 11:06:03
ke hadapan
1249 orang telah melayarinya

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

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

Yang kedua json ialah:

{
    "message": "hello World!"
}
Salin selepas log masuk

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!