Dando continuidade na implementação de serviços utilizando gRPC, nesse post vamos implementar o lado cliente da comunicação.
Se você ainda não leu o post anterior, onde implementamos a API em gRPC, peço que leia, pois os passos para definição do arquivo proto e geração do código utilizando protoc
, foram feitos lá e não precisam ser repetidos.
Conexão com API
Vamos iniciar a implementação do client.go definindo as credenciais de conexão.
creds := grpc.WithTransportCredentials(insecure.NewCredentials())
Não se preocupe com o insecure.NewCredentials()
. Ele quer dizer que nossa conexão não utilizará um certificado de segurança. Agora, vamos iniciar a conexão com a API.
conn, err := grpc.Dial("localhost:9000", creds) if err != nil { panic(err) } defer conn.Close()
No primeiro parâmetro da função Dial
, passamos o endereço da API que queremos estabelecer conexão. Já do segundo parâmetro em diante – digo em diante pois ele é do tipo ...grpc.DialOption
-, definimos os valores opcionais para a conexão. No nosso caso, como disse anteriormente, definimos que a conexão não utilizará nenhum certificado de segurança.
Iniciando o Client
Com a conexão estabelecida, o próximo passo é iniciar o client para o serviço que iremos consumir.
client := pb.NewCategoryServiceClient(conn)
Feito isso, com o client em “mãos”, podemos executar qualquer um dos métodos que a API implementa.
resp, err := client.Find(context.Background(), &pb.CategoryFilterRequest{}) if err != nil { panic(err) }
No exemplo acima, utilizamos o context.Background
na chamada pelo fato de ser mais simples. No entanto, em para uma implementação no mundo real, recomendo que utilize contexts com timeout ou função de cancelamento.
Se você não sabe bem quando e como utilizar as várias opções do package context
, recomendo a leitura do post Onde e qual context utilizar.
Executando um método
Por fim, se tudo der certo, a variável resp
do exemplo acima terá uma struct do tipo *pb.CategoryListResponse
, que poderá ser iterada da seguinte forma.
for _, c := range resp.Categories { println(c.Id, c.Name) }
O exemplo completo, com todos os imports fica assim:
package main import ( "context" pb "github.com/aprendagolang/classificados/proto" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func main() { creds := grpc.WithTransportCredentials(insecure.NewCredentials()) conn, err := grpc.Dial("localhost:9000", creds) if err != nil { panic(err) } defer conn.Close() client := pb.NewCategoryServiceClient(conn) resp, err := client.Find(context.Background(), &pb.CategoryFilterRequest{}) if err != nil { panic(err) } for _, c := range resp.Categories { println(c.Id, c.Name) } }
Tendo o server em pé, ao executar um go run client.go
, obtemos a seguinte resposta.

Conclusão
Embora RESTfull ainda seja o padrão do mercado, principalmente em grandes empresas, vemos uma crescente na utilização de gRPC.
Inclusive, é possível expor uma API gRPC como se fosse REST. Mas isso é assunto para um outro post.
Espero que tenham gostado dos exemplos.
Até a próxima!