Go语言 获取未实现的desc =未知服务错误gRPC

ars1skjm  于 2023-01-22  发布在  Go
关注(0)|答案(5)|浏览(206)

在我的一个服务中(恰好是我的负载平衡器),当我在我部署的一个服务中调用server方法时,我收到了以下错误:
rpc错误:代码=未实现的desc =未知的服务fooService.FooService
我有一些其他的服务设置与gRPC和他们的工作很好。它只是似乎是这一个,我想知道这是否是因为它是负载平衡器?

func GetResult(w http.ResponseWriter, r *http.Request) {

    conn, errOne := grpc.Dial("redis-gateway:10006", grpc.WithInsecure())       
    defer conn.Close()

    rClient := rs.NewRedisGatewayClient(conn)
    result , errTwo := rClient.GetData(context.Background(), &rs.KeyRequest{Key: "trump", Value: "trumpVal"}, grpc.WithInsecure())

    fmt.Fprintf(w, "print result: %s \n", result)   //prints nil
    fmt.Fprintf(w, "print error one: %v \n", errOne) // prints nil
    fmt.Fprintf(w, "print error two: %s \n", errTwo) // prints error

}

错误提示没有名为fooService.fooService的服务,这是真的,因为我调用的服务的dns名称是foo-service。但是,它与我使用gRPC的其他服务的设置完全相同,并且工作正常。此外,我的proto文件配置正确,所以这不是问题。
我正在呼叫的服务器:

func main() {

    lis, err := net.Listen("tcp", ":10006")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    grpcServer := grpc.NewServer()
    newServer := &RedisGatewayServer{}
    rs.RegisterRedisGatewayServer(grpcServer, newServer)

    if err := grpcServer.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }

}

我尝试从客户端访问的函数:

func (s *RedisGatewayServer) GetData(ctx context.Context, in *rs.KeyRequest)(*rs.KeyRequest, error) {

     return in, nil
}

我的docker和yaml文件都是正确的,也与正确的命名和端口。

i1icjdpr

i1icjdpr1#

我遇到了这样的问题,这是因为一个非常简单的错误:我在服务器启动 * 之后 * 调用了服务注册。代码如下所示:

err = s.Serve(listener)
if err != nil {
    log.Fatalf("[x] serve: %v", err)
}

primepb.RegisterPrimeServiceServer(s, &server{})

显然,应该在运行服务器之前调用注册:

primepb.RegisterPrimeServiceServer(s, &server{})

err = s.Serve(listener)
if err != nil {
    log.Fatalf("[x] serve: %v", err)
}
vawmfj5a

vawmfj5a2#

谢谢@dolan 's的评论,它解决了这个问题。
基本上,我们必须确保方法值在服务器端和客户端应该相同(您甚至可以从服务器端生成的pb.go文件中复制方法名称)
func(cc *ClientConn)调用(ctx上下文.上下文,方法字符串,参数,回复接口{},选项... CallOption)错误{
这个invoke函数将存在于你在gRPC服务中实现的所有方法中。

zy1mlcev

zy1mlcev3#

对我来说,我的客户端连接到错误的服务器端口。
我的服务器侦听本地主机:50052
我的客户端连接到本地主机:50051
因此我看到了这个错误。

ylamdve6

ylamdve64#

我遇到了同样的问题-我能够执行从 Postman 到服务的rpc调用,而 apigateway 能够连接到 service,但在方法调用时,它给出了错误代码12未知服务原因是在我的原始文件中,客户端在包X下,而服务器在包Y下
相当愚蠢,但是的 * 使包下的apigateway和服务都解决了我的问题 *。

8gsdolmq

8gsdolmq5#

这种情况有很多种,但基本问题似乎是相同的-GRPC服务器是可访问的,但不能为客户端请求提供服务。
我遇到的两种情况没有记录在前面的答案中,它们是:

1.客户端和服务器运行的合同版本 * 不 * 相同

协定中引入的中断更改可能会导致此错误。
在我的例子中,服务器运行的是旧版本的契约,而客户机运行的是最新版本的契约。
一个破坏性的更改意味着服务器无法解析我的客户机请求的服务,从而返回未实现的错误。

2.客户端连接到错误的GRPC服务器

客户端访问了不正确的服务器,该服务器未实现约定。
如果您正在运行多个不同的GRPC服务,请考虑这种情况,您可能会错误地拨错一个。

相关问题