首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grpc with method *方法

grpc with method *方法
EN

Stack Overflow用户
提问于 2020-12-01 02:18:48
回答 3查看 4.1K关注 0票数 16

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

简而言之,我无法理解它是如何帮助我们的,以及在没有它的情况下,我们面临的问题是什么?在我现在的结构中,我用来添加下面的语句,但是,我不知道为什么...

代码语言:javascript
复制
type server struct {
     pdfpb.UnimplementedGreetServiceServer
}

在Github issue - https://github.com/grpc/grpc-go/issues/3669中,他们就此展开了辩论,有人能简单地解释一下它是如何帮助我们的,以及在没有它的情况下,我们面临的问题是什么?

EN

回答 3

Stack Overflow用户

发布于 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上找到

票数 6
EN

Stack Overflow用户

发布于 2021-10-07 11:19:33

此错误来自较新版本的protoc-gen-grpc-go编译器。服务器实现现在必须是向前兼容的。

在此更改之前,每当您注册服务器实现时,都会执行以下操作:

代码语言:javascript
复制
        pb.RegisterFooBarServiceServer(
            server,
            &FooBarServer{}, // or whatever you use to construct the server impl
        )

如果您的服务器缺少一些方法实现,这将导致编译时错误。

在较新的proto编译器版本中,向前兼容性变成了opt-out,这意味着两件事:

  1. 您现在必须嵌入UnimplementedFooBarServiceServer,如错误消息所示。正如我所说的,当你没有显式地实现新的方法时,这不会产生编译器错误(这就是向前兼容性的意思)。但是,如果您尝试调用您没有(或忘记)显式实现的RPC,则会导致codes.Unimplemented出现运行时错误。

  1. you仍然可以通过嵌入(带有Unsafe前缀)来选择退出UnsafeFooBarServiceServer的前向兼容性。此接口仅声明mustEmbedUnimplementedFooBarServiceServer()方法,该方法可以消除问题中的错误,而不会在您没有显式实现新处理程序的情况下放弃编译器错误。

举个例子:

代码语言:javascript
复制
// Implements the grpc FooBarServiceServer
type FooBarService struct {
    grpc.UnsafeFooBarServiceServer // consciously opt-out of forward compatibility
    // other fields
}

您还可以通过在protoc-gen-grpc-go插件(source)上设置一个选项来生成不具有前向兼容性的代码:

代码语言:javascript
复制
protoc --go-grpc_opt=require_unimplemented_servers=false
票数 4
EN

Stack Overflow用户

发布于 2021-09-23 15:18:02

对于Github Issue上建议的mustEmbededUnimplementedServiceServer仍有问题的任何人。最好的解决方案就是更新你的ServerStruct。

例如。

代码语言:javascript
复制
type AuthenticationServiceServer struct {
}

转到。

代码语言:javascript
复制
type AuthenticationServiceServer struct {
    service.UnimplementedAuthenticationServiceServer
}

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

代码语言:javascript
复制
grpcService.RegisterAuthenticationServiceServer(grpcServer, controller.AuthenticationServiceServer{})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65079032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档