La liaison des messages est entre les programmes d'application En échangeant des «messages» tels que des données et en traitant des demandes Un mécanisme pour lier plusieurs applications de manière asynchrone.
Dans la conception de microservices En conservant temporairement le message et en introduisant un middleware qui intervient dans cette livraison La politique est de garder chaque service clairsemé et d'améliorer l'évolutivité.
Tout le monde aime Spring Framework et Spring Boot Réaliser un développement léger de services qui gèrent la liaison de messages Le projet Spring Cloud Stream attire l'attention.
Parlons de la liaison des messages à l'aide de Spring Cloud Stream.
Le code complété est ici. Bien que cela ne soit pas expliqué dans l'article, il est livré avec une classe de test.
Le diagramme de configuration est ci-dessous. Si vous ne comprenez pas en lisant, veuillez regarder en arrière.
Si vous souhaitez connaître l'image de fonctionnement, veuillez d'abord lire le chapitre "Contrôle de fonctionnement" en bas de page.
L'environnement de l'auteur est le suivant.
Spring Tool Suite 3
Version: 3.9.9.RELEASE
Build Id: 201906181741
Platform: Eclipse 2019-06 (4.12.0)
$ docker version
Client: Docker Engine - Community
Version: 19.03.2
API version: 1.40
Go version: go1.12.8
(Omission)
Server: Docker Engine - Community
Engine:
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.8
(Omission)
containerd:
Version: v1.2.6
(Omission)
runc:
Version: 1.0.0-rc8
(Omission)
docker-init:
Version: 0.18.0
(Omission)
$
$ java --version
java 9
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
$
Rabbit MQ est adopté car il est facile à introduire.
Extrayez l'image de DockerHub et démarrez le conteneur avec run. Le manuel du conteneur Rabbit MQ est ici.
$ docker pull rabbitmq
//Commande de démarrage
$ docker run -p 15672:15672 -p 5672:5672 rabbitmq:3-management
Une fois lancé, vous pouvez accéder à la console d'administration. L'URL est ci-dessous. http://localhost:15672/
L'ID et le PW sont guest: guest par défaut.
Spring Cloud Stream reçoit des données extérieures au service, telles que l'API REST Le service qui relie (OUTPUT) à la plate-forme de messagerie est appelé Source.
Le code complet est ici.
Tout d'abord, définissez le nom de la file d'attente cible de l'infrastructure de messagerie dans application.properties.
spring.cloud.stream.bindings.output.destination=hello-processor
Puis avec l'annotation @EnableBinding Associez la classe POJO à la file d'attente cible de la plateforme de messagerie.
De plus, DI l'objet Source Appelez la méthode Source.output.send () pour envoyer un message.
(Omis)
@EnableBinding(Source.class)
public class HelloSourceApplication {
private final Source source;
public HelloSourceApplication(Source source) {
this.source=source;
}
(Omis)
@PostMapping
public void tweet(@RequestBody Tweet tweet) {
source.output().send(MessageBuilder.withPayload(tweet).build());
}
public static class Tweet {
public String tweet;
}
}
Contrairement à Source, il reçoit INPUT de la plateforme de messagerie Un service qui relie les données au back-end Appelé Sink dans Spring Cloud Stream.
Le code complet est ici.
Tout d'abord, définissez le nom de la file d'attente cible de l'infrastructure de messagerie dans application.properties.
spring.cloud.stream.bindings.input.destination=hello-sink
Puis avec l'annotation @EnableBinding Associez la classe POJO à la file d'attente cible de la plateforme de messagerie. Aussi, avec l'annotation @StreamListener Associez directement le message reçu de la file d'attente au DTO.
Cette fois, le DTO reçu est émis vers la sortie standard et le processus se termine.
(Omis)
@EnableBinding(Sink.class)
public class HelloSinkApplication {
(Omis)
@StreamListener(Sink.INPUT)
public void print(Tweet tweet) {
System.out.println("Received " + tweet.tweet);
}
public static class Tweet {
public String tweet;
}
}
Reçu INPUT de la plateforme de messagerie Un service qui relie (OUTPUT) à une plate-forme de messagerie est appelé un processeur.
Cliquez ici pour le code complet (https://gitlab.com/kyosuke_yamagata/hello-messaging/blob/master/hello-processor/src/main/java/com/example/helloprocessor/HelloProcessorApplication.java)
Tout d'abord, définissez le nom de la file d'attente cible de l'infrastructure de messagerie dans application.properties. Dans cet exemple, le nom de la file d'attente cible auquel le service Sink s'abonne est défini dans OUTPUT. En outre, comme INPUT, le nom de la file d'attente cible à laquelle Source envoie un message est défini.
spring.cloud.stream.bindings.output.destination=hello-sink
spring.cloud.stream.bindings.input.destination=hello-processor
Puis avec l'annotation @EnableBinding Associez la classe POJO à la file d'attente cible de la plateforme de messagerie.
De plus, le message reçu est lié au DTO à l'aide de l'annotation @StreamListener. De plus, avec l'annotation @SendTo La file d'attente cible pour envoyer le message et le corps du message sont liés au DTO qui est la valeur de retour de la méthode.
En conséquence, lorsque vous recevez le message La valeur est traitée ("traitement!" Est ajouté après elle) et le message est envoyé.
(Omis)
@EnableBinding(Processor.class)
public class HelloProcessorApplication {
(Omis)
@StreamListener(Processor.INPUT)
@SendTo(Processor.OUTPUT)
public Tweet transform(Tweet tweet) {
tweet.tweet += " processing!";
return tweet;
}
public static class Tweet {
public String tweet;
}
}
Exécutez le package maven clean pour chaque projet. Démarrez chaque Jar généré sous la cible comme suit.
$ java -jar target/hello-source-0.0.1-SNAPSHOT.jar --server.port=8080
$ java -jar target/hello-sink-0.0.1-SNAPSHOT.jar --server.port=8082
$ java -jar target/hello-processor-0.0.1-SNAPSHOT.jar --server.port=8090
Envoyez une requête POST à Source avec curl.
$ curl -v localhost:8080 -d '{"tweet":"Hello"}' -H 'Content-Type: application/json'
Un message est envoyé à la console qui a lancé Sink's Jar.
Received Hello processing!
Utilisation de Spring Boot, Rabbit MQ et Spring Cloud Stream J'ai appris à concevoir / implémenter la liaison de messages de microservices.
Veuillez commencer et jouer avec chaque service.
Stream Processing with RabbitMQ
Communication entre microservices avec Spring Cloud Stream
Recommended Posts