[JAVA] La coopération des messages a commencé avec Spring Boot

table des matières

  1. Qu'est-ce que la liaison de messages?
  2. Objet de l'article
  3. Environnement prérequis
  4. Construisez une infrastructure de messagerie
  5. Créer la source 1.Faire un évier 1.Faire un processeur
  6. Contrôle de fonctionnement
  7. Résumé

Qu'est-ce que la liaison de messages?

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.

Spring Cloud Stream

Objet de l'article

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. image.png

Si vous souhaitez connaître l'image de fonctionnement, veuillez d'abord lire le chapitre "Contrôle de fonctionnement" en bas de page.

Environnement prérequis

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)
$ 

Construire une infrastructure de messagerie

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. image.png

Créer la source

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;
	}

}

Faire évier

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;
	}
}

Faire un processeur

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;
	}
}

Contrôle de fonctionnement

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!

Résumé

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.

Les références

Stream Processing with RabbitMQ

Communication entre microservices avec Spring Cloud Stream

Spring Cloud Stream Tutorial

Recommended Posts

La coopération des messages a commencé avec Spring Boot
La coopération des messages a commencé avec l'édition Spring Boot Apache Kafka
Démarrez avec Spring Boot
Premiers pas avec Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Modifier le message de validation Spring Boot
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Utiliser l'authentification de base avec Spring Boot
gRPC sur Spring Boot avec grpc-spring-boot-starter
Déploiement à chaud avec le développement Spring Boot
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Sortie de message (Spring boot)
Obtenez des résultats de validation avec Spring Boot
(Intellij) Hello World avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI
J'ai essayé Flyway avec Spring Boot
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Traitement lors du démarrage d'une application avec Spring Boot
Hello World avec Eclipse + Spring Boot + Maven
Envoyez des notifications régulières avec LineNotify + Spring Boot
Effectuer un test de confirmation de transaction avec Spring Boot
HTTPS avec Spring Boot et Let's Encrypt
Essayez d'utiliser Spring Boot avec VS Code
Démarrez le développement d'applications Web avec Spring Boot
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Traitement asynchrone avec Spring Boot en utilisant @Async
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
(IntelliJ + gradle) Hello World avec Spring Boot
Comment diviser un fichier de message Spring Boot
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Défi Spring Boot
Forme de botte de printemps
Spring Boot Rappelez-vous
gae + botte à ressort
Créez un site Web avec Spring Boot + Gradle (jdk1.8.x)
Configurer l'application Spring Boot avec le module multiple maven
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Jusqu'à l'acquisition de données avec Spring Boot + MyBatis + PostgreSQL
Créez une application de recherche simple avec Spring Boot