Implementando comunicação com API gRPC

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!


Se inscreva na nossa newsletter

* indicates required

Deixe uma resposta