Получение нереализованного desc = unknown service error gRPC

В одной из моих служб, которая является моим балансировщиком нагрузки, я получаю следующую ошибку при вызове метода сервера в одной из моих развернутых служб:

Ошибка 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 и работают нормально. Также мои прото-файлы настроены правильно, так что это не проблема.

сервер, которому я звоню:

 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 верны, также с правильным именем и портами.


person MATT SHALLOW    schedule 11.05.2018    source источник
comment
Когда он говорит «неизвестная служба fooService.FooService», я думаю, это говорит о том, что нет службы grpc, зарегистрированной с этим путем grpc. Вы уверены, что зарегистрировали службу с точно таким же путем?   -  person dolan    schedule 12.05.2018
comment
@dolan После того, как я выполнил свой файл .proto, он дал мне файл .pb.go, в котором в качестве имени службы указывается fooService.FooService. Это то же самое, что и другие файлы .pb.go, которые у меня есть для разных служб, которые работают нормально. Я реализовал код точно так же. Единственное, что отличает эту настройку, - это то, что я предоставил порт для службы, на которой выполняется клиентский код grpc. Есть ли способ вручную добавить службу или проверить путь? Не слишком уверен, как бы я это сделал.   -  person MATT SHALLOW    schedule 12.05.2018
comment
unknown service fooServcie.FooService это опечатка?   -  person Hana Alaydrus    schedule 13.05.2018
comment
@HanaAlaydrus да, прости.   -  person MATT SHALLOW    schedule 13.05.2018
comment
Как упоминалось в @dolan, сообщение об ошибке указывает на то, что служба не зарегистрирована на сервере. Еще раз проверьте, что сервис зарегистрирован на сервере? Кроме того, вы упомянули балансировщик нагрузки, может быть, также убедитесь, что запрос отправлен на правильный сервер?   -  person menghanl    schedule 16.05.2018
comment
@menghanl Я думаю, что проблема могла быть в том, что ImagePullPolicy не был объявлен в моем файле развертывания. Это означает, что использовалось не самое последнее изображение. Мне нужно будет проверить это, когда у меня будет время позже. Спасибо!   -  person MATT SHALLOW    schedule 17.05.2018
comment
Ваш вопрос не имеет ничего общего с google-kubernetes-engine или google-cloud-platform, поэтому я удалил эти теги. Пожалуйста, не добавляйте к своим вопросам нерелевантные теги.   -  person Ahmet Alp Balkan    schedule 20.05.2018


Ответы (1)


спасибо @ dolan's за комментарий, он решил проблему.

В основном мы должны убедиться, что значение метода должно быть одинаковым как на сервере, так и на клиенте (вы даже можете скопировать имя метода из файла pb.go, сгенерированного на стороне сервера)

func (cc * ClientConn) Invoke (ctx context.Context, строка метода, аргументы, интерфейс ответа {}, opts ... CallOption) error {

эта функция вызова будет присутствовать во всех методах, которые вы реализовали в службе gRPC.

person Sharath BJ    schedule 04.07.2020