为了账号安全,请及时绑定邮箱和手机立即绑定

带有 mustEmbedUnimplemented*** 方法的 grpc

带有 mustEmbedUnimplemented*** 方法的 grpc

Go
MMTTMM 2022-07-18 10:02:00
最近,grpc-go 引入了 mustEmbedUnimplemented*** 方法。它用于向前兼容。简单来说,我无法理解它是如何提供帮助的,如果没有它,我们将面临哪些问题?现在在我的结构中,我使用添加以下语句但是,我不知道为什么......type server struct {     pdfpb.UnimplementedGreetServiceServer}在 Github 问题中 - https://github.com/grpc/grpc-go/issues/3669他们对此进行了辩论,有人可以简单地解释一下它是如何提供帮助的,如果没有它,我们会在多早之前遇到什么问题?
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

那是相当基本的。

UnimplementedGreetServiceServer是具有所有已实现方法的结构。

当我添加pdfpb.UnimplementedGreetServiceServer时,我可以调用UnimplementedGreetServiceServer定义的方法。

就是这样,如果我在 proto 文件中添加更多 RPC 服务,那么我不需要添加所有导致向前兼容的 RPC 方法。

演示代码位于:https ://github.com/parthw/fun-coding/tree/main/golang/understanding-grpc-change



查看完整回答
反对 回复 2022-07-18
?
繁花不似锦

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选项用于设置路径元素。


查看完整回答
反对 回复 2022-07-18
?
精慕HU

TA贡献1845条经验 获得超8个赞

对于任何仍然有问题的人,如Github IssuemustEmbededUnimplementedServiceServer中所建议的那样。最好的解决方案就是更新您的 ServerStruct。


前任。


type AuthenticationServiceServer struct {

}

至。


type AuthenticationServiceServer struct {

    service.UnimplementedAuthenticationServiceServer

}

这将解决 Go 在执行此操作时抛出的异常。


grpcService.RegisterAuthenticationServiceServer(grpcServer, controller.AuthenticationServiceServer{})


查看完整回答
反对 回复 2022-07-18
  • 3 回答
  • 0 关注
  • 943 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号