gRPC pour Go (Golang) : bibliothèques et exemples
gRPC est un framework d'appel de procédure distante (RPC) haute performance de Google, basé sur HTTP/2 et Protocol Buffers (protobuf). Pour le langage Go, il existe une implémentation officielle grpc-go qui permet de créer des microservices efficaces avec prise en charge du streaming bidirectionnel, du chiffrement TLS et des intercepteurs (interceptors). Dans cet article, vous trouverez une description complète des outils, des exemples de serveur et de client, ainsi que des recommandations pratiques.
Bibliothèques principales pour gRPC en Go
- google.golang.org/grpc — la bibliothèque principale gRPC pour Go. Inclut les parties serveur et client, la prise en charge des flux, des métadonnées et de l'équilibrage de charge.
- google.golang.org/protobuf — package pour travailler avec les messages protobuf : compilation, sérialisation, désérialisation.
- github.com/golang/protobuf/protoc-gen-go — plugin pour le compilateur
protoc, générant du code Go à partir de fichiers.proto. - github.com/grpc-ecosystem/grpc-gateway — utilitaire pour créer un proxy REST au-dessus de gRPC (utile pour la compatibilité avec les navigateurs).
Installation et configuration
Avant de commencer, installez le compilateur protobuf et les plugins :
# Installation de protoc (Linux/macOS)sudo apt install protobuf-compiler # Ubuntu/Debianbrew install protobuf # macOS
# Installation des plugins pour Gogo install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latestAprès l'installation, mettez à jour PATH en ajoutant $GOPATH/bin.
Définition du service via un fichier .proto
Créez un fichier hello.proto :
syntax = "proto3";
package hello;
option go_package = "example.com/grpc-demo/hello";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); rpc SayHelloStream (HelloRequest) returns (stream HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Générez le code Go avec la commande :
protoc --go_out=. --go-grpc_out=. hello.protoLes fichiers hello.pb.go (messages) et hello_grpc.pb.go (service) apparaîtront.
Exemple de serveur en Go
package main
import ( "log" "net"
pb "example.com/grpc-demo/hello" "google.golang.org/grpc")
type server struct { pb.UnimplementedGreeterServer}
func (s *server) SayHello(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // RPC normal return stream.Send(&pb.HelloReply{Message: "Hello, " + req.Name})}
func (s *server) SayHelloStream(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // Réponse en streaming for i := 0; i < 5; i++ { if err := stream.Send(&pb.HelloReply{Message: "Hello " + req.Name + " #" + string(rune(i))}); err != nil { return err } } return nil}
func main() { lis, _ := net.Listen("tcp", ":50051") s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) log.Println("Server listening on :50051") if err := s.Serve(lis); err != nil { log.Fatalf("Failed to serve: %v", err) }}Exemple de client en Go
package main
import ( "context" "log" "time"
pb "example.com/grpc-demo/hello" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure")
func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close()
client := pb.NewGreeterClient(conn) ctx, ca