3 回答

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

TA贡献1851条经验 获得超4个赞
此错误来自较新版本的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 FooBarServiceServer
type 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选项用于设置路径元素。

TA贡献1845条经验 获得超8个赞
对于任何仍然有问题的人,如Github IssuemustEmbededUnimplementedServiceServer中所建议的那样。最好的解决方案就是更新您的 ServerStruct。
前任。
type AuthenticationServiceServer struct {
}
至。
type AuthenticationServiceServer struct {
service.UnimplementedAuthenticationServiceServer
}
这将解决 Go 在执行此操作时抛出的异常。
grpcService.RegisterAuthenticationServiceServer(grpcServer, controller.AuthenticationServiceServer{})
- 3 回答
- 0 关注
- 943 浏览
添加回答
举报