Проблема с подключением к gRPC: как выяснить, сервер это или клиент? - PullRequest
0 голосов
/ 07 сентября 2018

Я читаю книгу о Голанге под названием «Иди к чертям». Итак, одна из глав посвящена внедрению микросервиса. И связь с этим сервисом может быть http или gRPC. Я думаю, что все сделал правильно, однако я не могу заставить работать коммуникацию gRPC. Когда я пытаюсь запросить сервер у клиента, я получаю эту ошибку:

rpc error: code = Unimplemented desc = unknown service Vault

Мой вопрос: как начать отладку этого? Как я могу проверить, если проблема в сервере или в клиенте?

1 Ответ

0 голосов
/ 07 сентября 2018

В вашей реализации имя службы было неверным, когда вы инициализировали конечные точки для Hash и Validate. Это должно быть pb.Vault вместо Vault. Таким образом, метод New должен выглядеть следующим образом:

func New(conn *grpc.ClientConn) vault.Service {
    var hashEndpoint = grpctransport.NewClient(
        conn, "pb.Vault", "Hash",
        vault.EncodeGRPCHashRequest,
        vault.DecodeGRPCHashResponse,
        pb.HashResponse{},
    ).Endpoint()
    var validateEndpoint = grpctransport.NewClient(
        conn, "pb.Vault", "Validate",
        vault.EncodeGRPCValidateRequest,
        vault.DecodeGRPCValidateResponse,
        pb.ValidateResponse{},
    ).Endpoint()

    return vault.Endpoints{
        HashEndpoint:     hashEndpoint,
        ValidateEndpoint: validateEndpoint,
    }
}

В общем, вам следует обратиться к сгенерированному .pb.go файлу соответствующего proto о том, как вещи названы. Как видите, это не так просто и, вероятно, зависит от реализации генераторов proto.

В вашем случае, вот как это выглядит:

grpc.ServiceDesc{
    ServiceName: "pb.Vault",
    HandlerType: (*VaultServer)(nil),
    Methods: []grpc.MethodDesc{
        {
            MethodName: "Hash",
            Handler:    _Vault_Hash_Handler,
        },
        {
            MethodName: "Validate",
            Handler:    _Vault_Validate_Handler,
        },
    },
    Streams:  []grpc.StreamDesc{},
    Metadata: "vault.proto",
}
...