Introduction à Rabbitmq
Rabbitmq est un système de messagerie d'entreprise complet et réutilisable basé sur AMQP
MQ est le nom complet de la file d'attente de messages. La file d'attente de messages (MQ) est une méthode de communication entre les applications et les applications. Les applications communiquent en lisant et en écrivant des messages en file d'attente (données pour les applications) sans connexion dédiée pour les lier. La livraison de messages fait référence à la communication entre les programmes en envoyant des données dans des messages, plutôt qu'en s'appelant directement, les appels directs sont généralement utilisés dans des techniques telles que les appels de procédure distante. La file d'attente se réfère à l'application communiquant par le biais d'une file d'attente. L'utilisation de files d'attente élimine l'exigence selon laquelle la demande de réception et d'envoi exécute simultanément.
AMQP est un protocole, un protocole de communication de message de couche d'abstraction de haut niveau.
Bien qu'il existe de nombreuses normes publiques dans le monde de la messagerie synchrone (comme Cobar IIOP ou SOAP, etc.), ce n'est pas le cas dans le traitement des messages asynchrones. Seules les grandes entreprises ont des implémentations commerciales (telles que le MSMQ de Microsoft, WebSphere MQ d'IBM, etc.). Par conséquent, en juin 2006, Cisco, Redhat, Imatix et d'autres ont formulé conjointement les normes publiques pour l'AMQP. En d'autres termes, l'AMQP est un protocole pour la communication asynchrone.
Scénarios d'utilisation du lapin
Dans le projet, certaines opérations longues qui ne nécessitent pas de rendement immédiat sont extraites et traitées de manière asynchrone. Ce traitement asynchrone enregistre considérablement le temps de réponse de la demande du serveur, améliorant ainsi le débit du système. Cependant, la plupart d'entre eux ne sont pas seulement tenus de revenir instantanément, et peu importe que l'exécution soit réussie ou non. Si vous avez besoin d'un retour instantané, vous pouvez utiliser Dubbo. Spring Boot s'intègre à Dubbo, vous pouvez regarder Spring Boot Integration Dubbox
Dépendance du lapin
RabbitMQ n'est pas un package JAR simple (le package JAR ne fournit que quelques fonctions de communication de base avec RabbitMQ lui-même). Semblable à Dubbo, RabbitMQ exige également que d'autres logiciels s'exécutent. Ce qui suit est le logiciel requis pour que RabbitMQ s'exécute.
1. Erlang
Étant donné que le logiciel RabbitMQ lui-même est développé sur la base d'Erlang, si vous souhaitez exécuter RabbitMQ, vous devez d'abord suivre Erlang
Site officiel d'Erlang
Adresse de téléchargement Erlang
Lapin
Rabbitmq est au cœur de la mise en œuvre des files d'attente de messages
Site officiel de Rabbitmq
Rabbitmq Download
Configuration de Rabbitmq
Une fois l'installation terminée, vous devez terminer une configuration avant d'utiliser RabbitMQ. Vous pouvez utiliser directement CMD dans le répertoire SBIN sous le répertoire d'installation de RabbitMQ via la configuration de commande, ou vous pouvez trouver directement l'invite de commande RabbitMQ (SBIN DIR) dans le menu Démarrer pour exécuter SBIN directement vers le répertoire d'installation de RabbitMQ. Pour plus de commodité, nous activons d'abord le plug-in de gestion et exécutons les commandes.
Rabbitmq-plugins.bat Activer Rabbitmq_Management
C'est vrai, notez que c'est sous Windows. Si c'est Linux, il n'y a pas de suffixe de chauve-souris. Ensuite, nous ajoutons un utilisateur, car la connexion ne peut pas réussir sans les utilisateurs dans l'environnement réseau externe. Exécuter la commande Ajouter un utilisateur
Rabbitmqctl.bat add_user Springboot Mot de passe
Springboot est le nom d'utilisateur et le mot de passe est le mot de passe
Ensuite, pour la commodité de la démonstration, nous donnons à Springboot les autorisations de l'administrateur pour faciliter la connexion à la page de gestion
Rabbitmqctl.bat set_user_tags Administrateur Springboot
Donner des autorisations de compte
Rabbitmqctl.bat set_permissions -p / springboot. *. *. *
Commencez ensuite le service Rabbitmq et visitez la page de gestion de Rabbitmq http: // localhost: 15672 pour voir la page de connexion. S'il n'y a pas d'utilisateur, vous pouvez utiliser l'invité et l'invité pour vous connecter. Si un utilisateur est créé, utilisez l'utilisateur créé pour vous connecter. Si un utilisateur est créé, utilisez l'utilisateur créé pour vous connecter.
Créer un projet Springboot
Comme j'ai déjà mentionné la création d'un projet de démarrage de Spring dans l'article précédent à plusieurs reprises, je ne dirai pas grand-chose ici
Ajouter les dépendances liées à RabbitMQ
<! - Rabbitmq -> <dependency> <proupId> org.springframework.boot </proupId> <ArtefactId> Spring-Boot-Starter-AMQP </ artifactid> </Dependency>
C'est vrai, juste une petite configuration, mais je ne comprends peut-être pas de cette façon, donc je ferais mieux de publier toutes les configurations
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <ModelVersion> 4.0.0 </ ModelVersion> <ProupId> Wang.Raye.Rabbitmq </rompuplid> <Artifactid> Demo1 </tatifactid> <version> 0.0.1-SNAPSHOT <name> DEMO1 </name> <url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <ArtefactId> Spring-Boot-Starter-Parent </ ArfactId> <Dersion> 1.4.0.release </DERNIERSE> </parent> <Dendences> <Dependency> <ProupId> JUnit </proupId> <Artefactive> JUnit </ ArtifactId> <Derence> 3.8.1 </DERNIFRES> <cope> Test </cope> </Dependency> <! <GroupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-web </ artifactid> </dEpendency> <! - Rabbitmq -> <dependency> <proupId> org.springframework.boot </prounid> <e-artifactid> spring-boot-starter-amqp </tifactive> </DENDENDENCES> </PROJET>
Étant donné qu'aucune autre opération n'est terminée, le projet s'appuie actuellement principalement sur deux modules, une botte SPRIG et un Rabbitmq
Ajouter une classe de configuration
package wang.raye.rabbitmq.demo1; import org.springframework.amqp.core.ackNowledGemode; import org.springframework.amqp.core.binding; import org.springframework.amqp.core.binding; import org.springframework.amqp.core.bindingBuilder; import org.springframework.amqp.core.directExchange; import org.springframework.amqp.core.sessage; import org.springframework.amqp.core.queue; import org.springframework.amqp.rabbit.connection.cachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.ChannelawareMessageListener; import org.springframework.amqp.rabbit.Listener.SimplessageListenerContainer; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; / ** * Classe de configuration Rabbitmq * @author Raye * @Since 12 octobre 2016 10:57:44 * / @ Configuration classe publique Rabbitmqconfig {/ ** Nom du commutateur de message * / public static final string exchange = "my-mq-exchange"; / ** file d'attente Key1 * / public static final string routingKey1 = "queue_one_key1"; / ** file d'attente Key2 * / public static final string routingKey2 = "queue_one_key2"; / ** * Informations de liaison de configuration * @return * / @Bean public ConnectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = new CachingConnectionFactory ("127.0.0.1", 5672); ConnectionFactory.SetUserName ("Springboot"); connectionFactory.SetPassword ("mot de passe"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.SetPublisherConFirms (true); // return ConnectionFactory doit être défini; } / ** * Configurer le commutateur de messages * Configurer Fanoutexchange pour les consommateurs: Distribuez des messages à toutes les files d'attente liées, sans le concept de RoutingKey HeadersExchange: Match DirectExChange en ajoutant l'attribut Key-Value: Distribuez à la file d'attente spécifiée selon RoutingKey TopicexChange: Multi-Key Matching * / @Bean Public DirectExchanged; } / ** * Configurer la file d'attente de messages 1 * Configurez pour les consommateurs * @return * / @bean public file d'attente () {return new Queue ("queue_one", true); // Quantité persistante} / ** * BIND FILLE DE MESSAGES 1 avec Switch * Configurer pour les consommateurs * @return * / @bean public Binding Binding () {return binkingBuilder.bind (queue ()). To (defauptExChange ()). Avec (RabbitmqConfig.RoutingKey1); } / ** * Configurer la file d'attente de messages 2 * Configurez pour les consommateurs * @return * / @bean publique queuet queue1 () {return new Queue ("queue_one1", true); // Persistance rapide} / ** * Bind Message Fitre 2 avec le commutateur * Configurez pour les consommateurs * @return * / @bean public Binding Binding1 () {return binkingBuilder.bind (queue1 ()). To (defaultExchange ()). Avec (labbitmqconfig.routingkey2); } / ** * Acceptez l'écoute du message, cet auditeur acceptera le message de la file d'attente de message 1 * Configurer pour les consommateurs * @return * / @bean public SimpleMeSageListenerContainer MessageContainer () {SimpleMessageListenContainer Container = New SimpleMesSageListenContainer (ConnectionFactory ()); contener.setQueues (queue ()); contener.setExposeListEnerChannel (true); contener.setMaxConcurrentConsumers (1); contener.setConcurrentConsumers (1); contener.setackNowledGemode (remobledGemode.manual); // Définir le mode de confirmation confirmer manuellement Container.SetMessageListener (new ChannelAwareMessageListener () {public void OnMessage (message Message, com.rabbitmq.client.channel canal) lève une exception {byte [] body = message.getbody (); system.out.println ("message reçu:" + New String (Body)); channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); conteneur de retour; } / ** * Acceptez l'écoute du message, cet auditeur acceptera le message de la file d'attente de message 1 * Configuration pour les consommateurs * @return * / @bean public SimpleMeSageListenerContainer MessageContainer2 () {SimpleMessageListenConainer Container = new SimpleMessageStencerConainer (ConnectionFactory ()); contener.setQueues (queue1 ()); contener.setExposeListEnerChannel (true); contener.setMaxConcurrentConsumers (1); contener.setConcurrentConsumers (1); contener.setackNowledGemode (remobledGemode.manual); // Définissez le mode de confirmation confirmer manuellement Container.SetMessageListener (new ChannelAwareMessageListener () {public void OnMessage (message de message, com.rabbitmq.client.channel canal) lève une exception {byte [] body = mess.getbody (); system.out.println ("message de file1 reçu:" + new string (body); channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); conteneur de retour; }}Notez que afin de mieux démontrer comment configurer, j'ai configuré deux files d'attente de messages. Sauf où la configuration du lien est configurée, le reste de cette classe est ciblé aux consommateurs de messages. Bien sûr, les consommateurs de messages et les producteurs de messages doivent configurer les informations de liaison. Pour plus de commodité, les consommateurs de message et les producteurs de ce projet sont tous deux dans ce projet. Généralement, le projet réel ne sera pas dans le même projet. Étant donné que les commentaires sont très détaillés, je ne dirai pas grand-chose.
Envoyer un message
Afin de faciliter l'envoi de messages, j'ai écrit directement un contrôleur pour appeler la méthode d'envoi de messages en accédant à l'interface. Sans plus tarder, veuillez ajouter le code
package wang.raye.rabbitmq.demo1; import java.util.uuid; import org.springframework.amqp.rabbit.core.rabbitTemplate; import org.springframework.amqp.rabbit.support.correlationData; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restController; / ** * Testez le contrôleur pour Rabbitmq pour envoyer des messages * @author Raye * * / @ RestControllerPublic classe SendController implémente RabbitTemplate.ConfirmCallback {privé RabbitTemplate RabbitTemplate; / ** * Configurez le lapin pour envoyer des messages. Parce qu'il s'agit d'un constructeur, le printemps sera automatiquement injecté sans annotation (il devrait être une fonctionnalité de la nouvelle version) * @param RabbitTlate * / public SendController (RabbitTlate RabbitTemplate) {this.rabbitTemplate = RabbitTemplate; // Définit le rappel de consommation this.rabbitTemplate.setConfirmCallback (this); } / ** * Envoyer un message à la file d'attente de messages 1 * @param msg * @return * / @requestmapping ("send1") public String send1 (String msg) {String uUid = uuid.randomuUid (). ToString (); CorrelationData correspondanceId = new CorrelationData (UUID); RabbitTemplate.ConvertandSend (RabbitMQConfig.Exchange, RabbitMQConfig.RoutingKey1, Msg, correspondanceID); retourner null; } / ** * Envoyer un message à la file d'attente de messages 2 * @param msg * @return * / @requestmapping ("send2") public String send2 (String msg) {String uUid = uuid.randomuUid (). ToString (); CorrelationData CorrelationId = new CorrelationData (UUID); RabbitTemplate.ConvertandSend (RabbitMQConfig.Exchange, RabbitMQConfig.RoutingKey2, Msg, CorrelationId); retourner null; } / ** * Rappel des messages, implémentant principalement l'interface RabbitTemplate.ConfirmCallback * Remarque que les rappels de messages ne peuvent représenter que des messages réussis envoyés au serveur RabbitMQ, et ne peuvent pas représenter des messages réussis en cours de traitement et accepté * / public void confirm (corrélationdata correspondant à la correspondance, Boolean ACK, Correlation) {System.out.println ("Callback Id:" Correlation); if (ack) {System.out.println ("La consommation de messages a échoué:" + cause + "/ n resend"); }}}Il convient de noter que les rappels de messages ne peuvent représenter que le message réussi envoyé au serveur RabbitMQ.
Ensuite, nous commençons le projet et visitons http: // localhost: 8082 / send1? Msg = aaaa et vous constaterez que la sortie de la console est
Message reçu: AAAA
ID de rappel: CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
Consommation réussie de nouvelles
Bien sûr, l'ID de rappel peut être différent. Si nous visitons http: // localhost: 8082 / send2? Msg = bbbb, la sortie sera
file d'attente1 Message reçu: BBBB
ID de rappel: CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
Consommation réussie de nouvelles
Quelques mots à la fin
Étant donné que cet article explique principalement comment intégrer le lapin de zéro à Springboot, il n'y a aucune explication pour beaucoup d'informations et d'utilisation de RabbitMQ. Si vous n'êtes pas familier avec RabbitMQ lui-même, vous pouvez consulter d'autres articles sur RabbitMQ et joindre la démo de cet article.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.