最近,grpc-go引入了mustEmbedUnimplemented*方法。它用于向前兼容。
简而言之,我无法理解它是如何帮助我们的,以及在没有它的情况下,我们面临的问题是什么?在我现在的结构中,我用来添加下面的语句,但是,我不知道为什么...
type server struct {
pdfpb.UnimplementedGreetServiceServer
}在Github issue - https://github.com/grpc/grpc-go/issues/3669中,他们就此展开了辩论,有人能简单地解释一下它是如何帮助我们的,以及在没有它的情况下,我们面临的问题是什么?
发布于 2020-12-02 00:58:32
这是非常基本的。
UnimplementedGreetServiceServer是一个包含所有已实现方法的结构。当我添加pdfpb.UnimplementedGreetServiceServer时,我能够调用UnimplementedGreetServiceServer定义的方法。
这就是为什么,如果我在proto文件中添加更多的RPC服务,那么我不需要添加所有导致向前兼容性的RPC方法。
演示代码可在https://github.com/parthw/fun-coding/tree/main/golang/understanding-grpc-change上找到
发布于 2021-10-07 11:19:33
此错误来自较新版本的protoc-gen-grpc-go编译器。服务器实现现在必须是向前兼容的。
在此更改之前,每当您注册服务器实现时,都会执行以下操作:
pb.RegisterFooBarServiceServer(
server,
&FooBarServer{}, // or whatever you use to construct the server impl
)如果您的服务器缺少一些方法实现,这将导致编译时错误。
在较新的proto编译器版本中,向前兼容性变成了opt-out,这意味着两件事:
UnimplementedFooBarServiceServer,如错误消息所示。正如我所说的,当你没有显式地实现新的方法时,这不会产生编译器错误(这就是向前兼容性的意思)。但是,如果您尝试调用您没有(或忘记)显式实现的RPC,则会导致codes.Unimplemented出现运行时错误。Unsafe前缀)来选择退出UnsafeFooBarServiceServer的前向兼容性。此接口仅声明mustEmbedUnimplementedFooBarServiceServer()方法,该方法可以消除问题中的错误,而不会在您没有显式实现新处理程序的情况下放弃编译器错误。举个例子:
// Implements the grpc FooBarServiceServer
type FooBarService struct {
grpc.UnsafeFooBarServiceServer // consciously opt-out of forward compatibility
// other fields
}您还可以通过在protoc-gen-grpc-go插件(source)上设置一个选项来生成不具有前向兼容性的代码:
protoc --go-grpc_opt=require_unimplemented_servers=false发布于 2021-09-23 15:18:02
对于Github Issue上建议的mustEmbededUnimplementedServiceServer仍有问题的任何人。最好的解决方案就是更新你的ServerStruct。
例如。
type AuthenticationServiceServer struct {
}转到。
type AuthenticationServiceServer struct {
service.UnimplementedAuthenticationServiceServer
}这将解决Go在执行此操作时抛出的异常。
grpcService.RegisterAuthenticationServiceServer(grpcServer, controller.AuthenticationServiceServer{})https://stackoverflow.com/questions/65079032
复制相似问题