带有 mustEmbedUnimplemented*** 方法的 grpc

最近,grpc-go 引入了 mustEmbedUnimplemented*** 方法。它用于向前兼容。


简单来说,我无法理解它是如何提供帮助的,如果没有它,我们将面临哪些问题?现在在我的结构中,我使用添加以下语句但是,我不知道为什么......


type server struct {

     pdfpb.UnimplementedGreetServiceServer

}

在 Github 问题中 - https://github.com/grpc/grpc-go/issues/3669他们对此进行了辩论,有人可以简单地解释一下它是如何提供帮助的,如果没有它,我们会在多早之前遇到什么问题?


MMTTMM
浏览 944回答 3
3回答

青春有我

那是相当基本的。UnimplementedGreetServiceServer是具有所有已实现方法的结构。当我添加pdfpb.UnimplementedGreetServiceServer时,我可以调用UnimplementedGreetServiceServer定义的方法。就是这样,如果我在 proto 文件中添加更多 RPC 服务,那么我不需要添加所有导致向前兼容的 RPC 方法。演示代码位于:https ://github.com/parthw/fun-coding/tree/main/golang/understanding-grpc-change

繁花不似锦

此错误来自较新版本的protoc-gen-grpc-go编译器。服务器实现现在必须是前向兼容的。在此更改之前,每当您注册服务器实现时,您都会执行以下操作:        pb.RegisterFooBarServiceServer(            server,            &FooBarServer{}, // or whatever you use to construct the server impl        )如果您的服务器缺少一些方法实现,这将导致编译时错误。使用较新的 proto 编译器版本,前向兼容性变为 opt-out,这意味着两件事:您现在必须 embed UnimplementedFooBarServiceServer,如错误消息所示。正如我所说,当您没有显式实现新方法时,这不会产生编译器错误(这就是前向兼容性的含义)。codes.Unimplemented尽管如果您尝试调用您没有(或忘记)显式实现的 RPC,它将导致运行时错误。您仍然可以通过嵌入UnsafeFooBarServiceServer(带Unsafe前缀)来选择退出前向兼容性。此接口仅声明mustEmbedUnimplementedFooBarServiceServer()使问题中的错误消失的方法,而不会放弃编译器错误,以防您没有显式实现新的处理程序。例如:// Implements the grpc FooBarServiceServertype FooBarService struct {    grpc.UnsafeFooBarServiceServer // consciously opt-out of forward compatibility    // other fields}您还可以通过在protoc-gen-grpc-go插件(source)上设置选项来生成没有前向兼容性的代码:protoc --go-grpc_out=require_unimplemented_servers=false:.注意:.after--go-grpc_out选项用于设置路径元素。

精慕HU

对于任何仍然有问题的人,如Github IssuemustEmbededUnimplementedServiceServer中所建议的那样。最好的解决方案就是更新您的 ServerStruct。前任。type AuthenticationServiceServer struct {}至。type AuthenticationServiceServer struct {    service.UnimplementedAuthenticationServiceServer}这将解决 Go 在执行此操作时抛出的异常。grpcService.RegisterAuthenticationServiceServer(grpcServer, controller.AuthenticationServiceServer{})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go