gRPC (gRPC Remote Procedure Calls) est un framework RPC (Remote Procedure Call) moderne, open source et haute performance développé par Google. Il est conçu pour faciliter la communication efficace entre les systèmes distribués, le rendant particulièrement adapté aux architectures de microservices. Ci-dessous se trouve une explication de gRPC et de son rôle dans la communication des microservices:
Qu’est-ce que gRPC?
gRPC est un protocole qui permet aux applications client et serveur de communiquer de manière transparente, facilitant la construction de systèmes distribués. Il utilise HTTP/2 pour le transport, Protocol Buffers (Protobuf) comme langage de définition d’interface (IDL), et offre des fonctionnalités telles que l’authentification, l’équilibrage de charge, et plus encore.
Voici quelques caractéristiques de gRPC:
- Agnostique du langage. gRPC prend en charge plusieurs langages de programmation, dont Java, Python, Go, C++, et plus encore.
- Communication efficace. Il utilise une sérialisation binaire avec Protobuf, qui est plus rapide et plus compact que les formats basés sur du texte comme JSON.
- Basé sur HTTP/2. gRPC exploite HTTP/2, permettant des fonctionnalités telles que le multiplexage, le streaming et une latence réduite.
- Fortement typé. Les services et les messages sont définis en utilisant Protobuf, assurant la sécurité des types et réduisant les erreurs.
- Support de streaming. gRPC prend en charge quatre types de streaming : unidirectionnel, streaming côté serveur, streaming côté client et streaming bidirectionnel.
Comment fonctionne gRPC
1. Définir les services et les messages
En utilisant Protobuf, vous définissez l’interface de service (méthodes) et la structure des messages à échanger.
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
2. Générer du code
Le compilateur Protobuf (protoc
) génère du code client et serveur dans le langage de programmation de votre choix.
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
3. Implémenter le serveur
Implémentez la logique côté serveur pour le service défini.
4. Créer un client
Utilisez le code client généré pour appeler les méthodes du serveur.
Rôle de gRPC dans la communication des microservices
Les architectures de microservices impliquent de découper les applications en services plus petits et indépendants qui communiquent via le réseau. gRPC joue un rôle crucial dans ce contexte en raison de son efficacité et de sa flexibilité.
1. Hautes performances
- gRPC utilise une sérialisation binaire avec Protobuf, qui est plus rapide et plus compacte que les formats basés sur du texte comme JSON ou XML.
- HTTP/2 réduit la latence et améliore le débit en permettant le multiplexage et la compression des en-têtes.
2. Définition de contrat solide
- Protobuf impose un contrat strict entre les services, réduisant ainsi la probabilité d’erreurs de communication.
- Les modifications de la définition du service peuvent être gérées avec la versioning, garantissant la compatibilité ascendante.
3. Capacités de streaming
- gRPC prend en charge le streaming bidirectionnel, ce qui le rend idéal pour la communication en temps réel, comme les applications de chat ou les flux de données en direct.
- Le streaming côté serveur et côté client permet de gérer efficacement de grands ensembles de données ou des flux de données continus.
4. Interopérabilité
- gRPC est indépendant du langage, permettant aux microservices écrits dans différents langages de communiquer sans problème.
- Cela est particulièrement utile dans des environnements de microservices polyglottes.
5. Fonctions intégrées
- gRPC fournit un support intégré pour des fonctionnalités telles que l’authentification, le chiffrement (via TLS) et l’équilibrage de charge, réduisant le besoin de bibliothèques ou d’outils supplémentaires.
6. Scalabilité
- La nature légère de gRPC et sa communication efficace le rendent adapté aux déploiements de microservices à grande échelle.
- Il s’intègre bien avec des plateformes d’orchestration de conteneurs comme Kubernetes.
Cas d’utilisation de gRPC dans les microservices
- Communication inter-services. gRPC est idéal pour la communication entre microservices, en particulier dans des scénarios critiques pour la performance.
- Systèmes en temps réel. Ses capacités de streaming le rendent adapté aux applications en temps réel comme les jeux, l’IoT ou l’analyse en direct.
- Environnements polyglottes. Lorsque les microservices sont écrits dans différents langages, gRPC garantit une communication fluide.
- Applications cloud-native. gRPC s’intègre bien avec des technologies cloud-native comme Kubernetes et des maillages de services (par exemple, Istio).
Avantages de gRPC
- Efficacité. La sérialisation binaire et HTTP/2 rendent gRPC plus rapide et plus économe en ressources.
- Sécurité des types. Protobuf garantit un typage fort, réduisant les erreurs d’exécution.
- Support multi-langages. Fonctionne avec plusieurs langages de programmation.
- Streaming. Prend en charge des modèles de streaming avancés pour la communication en temps réel.
Difficultés de gRPC
- Complexité. La configuration de gRPC peut être plus complexe que REST en raison de la nécessité de définitions Protobuf et de génération de code.
- Outils. Le débogage et les tests des services gRPC peuvent être plus difficiles par rapport à REST, car des outils comme Postman ne sont pas nativement conçus pour gRPC.
- Support du navigateur. gRPC n’est pas pris en charge nativement dans les navigateurs, nécessitant des outils comme gRPC-Web pour les clients web.
Pourquoi utiliser gRPC avec Spring Boot?
Spring Boot est un framework populaire pour la construction d’applications Java, et le combiner avec gRPC permet aux développeurs de créer des services performants, évolutifs et interopérables. Avec l’auto-configuration et l’injection de dépendances de Spring Boot, l’intégration de gRPC devient simple.
Étapes pour construire l’application
Nous allons construire un service gRPC simple appelé Greeter
qui permet à un client d’envoyer un nom au serveur et de recevoir une réponse « Hello, {nom} ! ». Voici comment nous allons le faire:
- Définissez le service gRPC en utilisant Protocol Buffers.
- Générez les classes Java à partir du fichier
.proto
. - Implémentez le serveur gRPC dans Spring Boot.
- Implémentez le client gRPC dans Spring Boot.
- Ajoutez un contrôleur REST pour invoquer le client gRPC pour les tests.
- Exécutez l’application et testez la communication.
1. Définissez le service gRPC (Fichier .proto)
La première étape consiste à définir le service gRPC en utilisant Protocol Buffers. Créez un fichier nommé greeter.proto
dans le répertoire src/main/proto
:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "GreeterProto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
Ce fichier définit :
- Un service
Greeter
avec une méthode RPCSayHello
. - Un message
HelloRequest
contenant un champname
. - Un message
HelloResponse
contenant un champmessage
.
2. Ajoutez les dépendances
Pour utiliser gRPC avec Spring Boot, ajoutez les dépendances suivantes à votre fichier pom.xml
:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Boot Web for REST Controller -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- gRPC dependencies -->
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>2.14.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.54.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.54.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.54.0</version>
</dependency>
<!-- Protobuf Java Format -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.22.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Protobuf Compiler Plugin -->
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ces dépendances incluent :
- Spring Boot Starter pour la configuration de base de l’application.
- Spring Boot Web pour le support du contrôleur REST.
- Les bibliothèques gRPC pour l’implémentation du serveur et du client.
- Protobuf pour la sérialisation et la désérialisation.
3. Générez les classes Java
Exécutez la commande Maven suivante pour générer les classes Java à partir du fichier .proto
:
mvn clean compile
Cela générera les classes GreeterGrpc
et les classes associées dans le répertoire target/generated-sources
.
4. Implémenter le serveur gRPC
Ensuite, implémentez le serveur gRPC dans Spring Boot. Créez une classe nommée GreeterService
:
package com.example.grpc.server;
import com.example.grpc.GreeterGrpc;
import com.example.grpc.GreeterProto.HelloRequest;
import com.example.grpc.GreeterProto.HelloResponse;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
@GrpcService
public class GreeterService extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver responseObserver) {
String name = request.getName();
String message = "Hello, " + name + "!";
HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
// Envoyer la réponse
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
Cette classe étend GreeterGrpc.GreeterImplBase
généré et implémente la méthode sayHello
pour gérer les requêtes entrantes.
5. Implémenter le client gRPC
Maintenant, implémentez le client gRPC dans Spring Boot. Créez une classe nommée GreeterClient
:
package com.example.grpc.client;
import com.example.grpc.GreeterGrpc;
import com.example.grpc.GreeterProto.HelloRequest;
import com.example.grpc.GreeterProto.HelloResponse;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.springframework.stereotype.Service;
@Service
public class GreeterClient {
private final GreeterGrpc.GreeterBlockingStub blockingStub;
public GreeterClient() {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090)
.usePlaintext()
.build();
this.blockingStub = GreeterGrpc.newBlockingStub(channel);
}
public String sayHello(String name) {
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
return response.getMessage();
}
}
Ce client se connecte au serveur gRPC et envoie une requête à la méthode SayHello
.
6. Ajouter un contrôleur REST pour les tests
Pour faciliter les tests du client gRPC, nous ajouterons un contrôleur REST qui expose un point de terminaison pour invoquer le GreeterClient
. Créez une classe nommée GreeterController
:
package com.example.grpc.controller;
import com.example.grpc.client.GreeterClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreeterController {
private final GreeterClient greeterClient;
@Autowired
public GreeterController(GreeterClient greeterClient) {
this.greeterClient = greeterClient;
}
@GetMapping("/greet")
public String greet(@RequestParam String name) {
return greeterClient.sayHello(name);
}
}
Ce contrôleur expose un point de terminaison /greet
qui accepte un paramètre name
et renvoie la réponse du serveur gRPC.
7. Créer l’application Spring Boot
Enfin, créez une application Spring Boot pour exécuter le serveur et le client :
package com.example.grpc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GrpcApplication {
public static void main(String[] args) {
SpringApplication.run(GrpcApplication.class, args);
}
}
8. Configurer le port du serveur
Ajoutez la configuration suivante dans application.properties
:
# Port du serveur gRPC
grpc.server.port=9090
# Port du serveur Spring Boot
server.port=8080
9. Exécuter l’application
- Démarrer l’application Spring Boot.
- Le serveur gRPC démarrera sur le port
9090
. - Le contrôleur REST sera disponible sur le port
8080
.
Vous pouvez tester l’application en envoyant une requête GET à l’endpoint /greet
:
curl http://localhost:8080/greet?name=World
La réponse sera:
"Hello, World!"
Choisir la bonne bibliothèque gRPC pour Spring Boot
Lors de la construction d’applications Spring Boot qui nécessitent une intégration gRPC, les développeurs sont souvent confrontés au choix entre plusieurs bibliothèques. Les options les plus couramment discutées sont net.devh.grpc
, org.lognet.grpc
et org.springframework.grpc
.
Chacune de ces bibliothèques a ses propres forces, faiblesses et cas d’utilisation. Explorons les différences entre ces bibliothèques, leurs fonctionnalités et celle que vous devriez utiliser pour votre projet.
1. net.devh.grpc (grpc-spring-boot-starter)
net.devh.grpc
, également connu sous le nom de grpc-spring-boot-starter
, est une bibliothèque largement utilisée pour intégrer gRPC avec Spring Boot. Elle est activement entretenue et offre un ensemble robuste de fonctionnalités pour construire des serveurs et des clients gRPC dans une application Spring Boot.
Principales fonctionnalités
- Auto-configuration. Simplifie la configuration des serveurs et clients gRPC.
- Intégration Spring. Prise en charge de l’injection de dépendances et d’autres fonctionnalités Spring.
- Sécurité Spring. S’intègre facilement avec Spring Security pour une communication sécurisée.
- Contrôles de santé. Fournit des contrôles de santé via Spring Boot Actuator.
- Communication synchrone et asynchrone. Prend en charge les deux styles de communication.
Pourquoi l’utiliser?
- Maintenance active. La bibliothèque est activement entretenue et mise à jour.
- Documentation complète. Bien documenté avec une grande communauté pour le support.
- Prêt pour la production. largement utilisé dans les environnements de production.
Quand l’utiliser?
- Si vous créez une nouvelle application Spring Boot et que vous avez besoin d’une intégration gRPC fiable et riche en fonctionnalités.
- Si vous souhaitez une intégration transparente avec les fonctionnalités de Spring Boot telles que l’injection de dépendances, la sécurité et les vérifications de santé.
2. org.lognet.grpc (grpc-spring-boot-starter)
org.lognet.grpc
est une autre bibliothèque pour l’intégration de gRPC avec Spring Boot. Cependant, elle est moins activement entretenue que net.devh.grpc
et manque de certaines des fonctionnalités avancées offertes par cette dernière.
Principales caractéristiques
- Configuration de base de gRPC. Fournit un support de base pour les serveurs et les clients gRPC.
- Intégration avec Spring Boot. Fonctionne avec Spring Boot mais avec moins de fonctionnalités.
Pourquoi l’utiliser?
- Utilisation historique. C’était l’une des premières bibliothèques pour l’intégration de gRPC et Spring Boot.
- Simplicité. Convient aux cas d’utilisation simples.
Quand l’utiliser?
- Si vous travaillez sur un ancien projet qui utilise déjà cette bibliothèque.
- Non recommandé pour les nouveaux projets en raison d’une maintenance limitée et de moins de fonctionnalités.
3. org.springframework.grpc (Spring gRPC)
org.springframework.grpc
est un effort expérimental ou communautaire visant à intégrer gRPC avec Spring. Ce n’est pas un projet officiel de Spring et peut ne pas être aussi mature ou riche en fonctionnalités que net.devh.grpc
.
Principales fonctionnalités
- Intégration basique de gRPC. Fournit un support de base pour les serveurs et les clients gRPC.
- Alignement avec l’écosystème Spring. Conçu pour s’aligner étroitement avec l’écosystème Spring.
Pourquoi l’utiliser ?
- Utilisation expérimentale. Convient pour l’expérimentation ou la contribution au projet.
- Alignement avec Spring. Si vous préférez utiliser quelque chose qui s’aligne étroitement avec Spring.
Quand l’utiliser ?
- Uniquement si vous explorez ou contribuez au projet.
- Non recommandé pour une utilisation en production en raison de sa nature expérimentale.
Lequel devriez-vous utiliser ?
Pour les nouveaux projets
Utilisez net.devh.grpc
(grpc-spring-boot-starter). C’est l’option la plus mature, activement maintenue et riche en fonctionnalités pour intégrer gRPC avec Spring Boot. Son intégration transparente avec les fonctionnalités de Spring Boot en fait le meilleur choix pour les nouveaux projets.
Pour les projets existants
Si vous utilisez déjà org.lognet.grpc
, envisagez de migrer vers net.devh.grpc
pour bénéficier d’un meilleur support et de fonctionnalités. Alors que org.lognet.grpc
peut fonctionner pour les anciens projets, il manque la maintenance active et les fonctionnalités avancées de net.devh.grpc
.
Pour une utilisation expérimentale
Si vous explorez ou contribuez à l’intégration Spring gRPC, vous pouvez vous intéresser à org.springframework.grpc
. Cependant, il n’est pas recommandé pour une utilisation en production en raison de sa nature expérimentale.
Principaux points à considérer
- Support de la communauté.
net.devh.grpc
bénéficie d’une communauté plus large et d’une meilleure documentation, ce qui facilite la recherche d’aide et de ressources. - Prêt pour la production.
net.devh.grpc
est largement utilisé dans des environnements de production et est considéré comme stable et fiable. - Facilité d’utilisation.
net.devh.grpc
propose une auto-configuration et une intégration transparente avec Spring Boot, réduisant la complexité de la configuration.
Conclusion
gRPC est un outil puissant pour la communication entre microservices, offrant des performances élevées, un typage fort et des fonctionnalités avancées telles que le streaming. Bien qu’il nécessite une configuration initiale plus importante par rapport à REST, son efficacité et sa scalabilité en font un excellent choix pour les systèmes modernes et distribués.
À mesure que les architectures de microservices deviennent de plus en plus complexes, gRPC joue un rôle de plus en plus important en permettant une communication transparente entre les services. Dans cet article, nous avons construit une application client et serveur gRPC simple en utilisant Spring Boot 3, en définissant un service gRPC avec des Protobuf, en générant des classes Java, en implémentant le serveur et le client, et en ajoutant un contrôleur REST pour faciliter les tests. Cet exemple met en avant la puissance et la simplicité de gRPC pour la construction de services performants, évolutifs et interopérables. Vous pouvez l’étendre davantage avec des services plus complexes, du streaming ou une gestion des erreurs. Bon codage !
Dépôt GitHub : grpc-client-and-server-with-spring-boot.
Source:
https://dzone.com/articles/understanding-grpc-and-its-role-in-microservices-c