Einführung in Rabbitmq
Rabbitmq ist ein vollständiges und wiederverwendbares Unternehmensnachrichtensystem basierend auf AMQP
MQ ist der vollständige Name der Nachrichtenwarteschlange. Message Queue (MQ) ist eine Kommunikationsmethode zwischen Anwendungen und Anwendungen. Anwendungen kommunizieren durch Lesen und Schreiben von Nachrichten (Daten für Anwendungen) ohne dedizierte Verbindung, um sie zu verknüpfen. Die Zustellung der Nachrichten bezieht sich auf die Kommunikation zwischen den Programmen, indem Daten in Nachrichten gesendet werden, und nicht durch direkte Aufrufen voneinander. Direkte Anrufe werden normalerweise in Techniken wie Remote -Prozeduranrufen verwendet. Warteschlange bezieht sich auf die Anwendung, die über eine Warteschlange kommuniziert. Die Verwendung von Warteschlangen beseitigt die Anforderung, dass sowohl die Empfangs- als auch die Senden -Anwendung gleichzeitig ausführen.
AMQP ist ein Protokoll, ein hochrangiges Abstraktionsschicht-Nachrichtenkommunikationsprotokoll.
Obwohl es in der Welt der synchronen Nachrichten (wie COBAR IIOP oder SOAP usw.) viele öffentliche Standards gibt, ist dies bei der asynchronen Nachrichtenverarbeitung nicht der Fall. Nur große Unternehmen verfügen über kommerzielle Implementierungen (wie MSMQ von Microsoft, WebSphere MQ von IBM usw.). Im Juni 2006 formulierte Cisco, Redhat, Imatix und andere gemeinsame öffentliche Standards für AMQP. Mit anderen Worten, AMQP ist ein Protokoll für eine asynchrone Kommunikation.
Rabbitmq -Nutzungsszenarien
Im Projekt werden einige zeitaufwändige Operationen, die keine sofortige Rendite erfordern, asynchron extrahiert und verarbeitet. Diese asynchrone Verarbeitung speichert die Anfrageantwortzeit des Servers erheblich und verbessert damit den Durchsatz des Systems. Die meisten von ihnen sind jedoch nicht nicht sofort erforderlich, um sofort zurückzukehren, und es spielt keine Rolle, ob die Ausführung erfolgreich ist oder nicht. Wenn Sie sofortige Rückgabe benötigen, können Sie Dubbo verwenden. Spring Boot ist in Dubbo integriert. Sie können Spring Boot Integration Dubbox ansehen
Rabbitmq -Abhängigkeit
RabbitMQ ist kein einfaches JAR -Paket (das JAR -Paket bietet nur einige grundlegende Kommunikationsfunktionen mit Rabbitmq selbst). Ähnlich wie bei Dubbo benötigt Rabbitmq auch andere Software aus. Das Folgende ist die Software, die für Rabbitmq erforderlich ist.
1. Erlang
Da die Rabbitmq -Software selbst basierend auf Erlang entwickelt wird, müssen Sie zuerst Erlang folgen, wenn Sie Rabbitmq ausführen möchten
Offizielle Website von Erlang
Erlang Download -Adresse
Rabbitmq
Rabbitmq ist der Kern der Implementierung von Nachrichtenwarteschlangen
Offizielle Website von Rabbitmq
Rabbitmq Download
Konfigurieren von Rabbitmq
Nach Abschluss der Installation müssen Sie vor der Verwendung von Rabbitmq eine gewisse Konfiguration abschließen. Sie können CMD direkt mit dem SBIN -Verzeichnis unter dem Installationsverzeichnis von Rabbitmq über die Befehlskonfiguration verwenden oder direkt im Startmenü die Eingabeaufforderung (Rabbitmq -Eingabeaufforderung) finden, um SBIN direkt auf das Installationsverzeichnis von Rabbitmq auszuführen. Für den Einfachheit halber aktivieren wir zunächst das Management-Plug-In und führen die Befehle aus.
Rabbitmq-plugins.bat aktivieren Rabbitmq_Management
Das ist richtig, beachten Sie, dass dies unter Windows liegt. Wenn es Linux ist, gibt es kein Fledermaus -Suffix. Dann fügen wir einen Benutzer hinzu, da die Verbindung ohne Benutzer in der externen Netzwerkumgebung nicht erfolgreich sein kann. Führen Sie den Befehl Benutzer hinzufügen aus
Rabbitmqctl.bat add_user Springboot -Passwort
Springboot ist der Benutzername und Passwort ist das Passwort
Für die Bequemlichkeit der Demonstration geben wir Springboot die Administratorberechtigungen, um die Anmeldung auf der Verwaltungsseite zu erleichtern
Rabbitmqctl.bat set_user_tags Springboot Administrator
Kontoberechtigungen geben
RabbitMqctl.bat set_permissions -p / Springboot.*.*.*
Starten Sie dann den Rabbitmq -Service und besuchen Sie die Rabbitmq -Verwaltungsseite http: // localhost: 15672, um die Anmeldeseite anzuzeigen. Wenn kein Benutzer erstellt wird, können Sie sich mit Gast und Gast anmelden. Wenn ein Benutzer erstellt wurde, verwenden Sie den erstellten Benutzer, um sich anzumelden. Wenn ein Benutzer erstellt wird, verwenden Sie den erstellten Benutzer, um sich anzumelden.
Erstellen Sie das Springboot -Projekt
Da ich bereits oft erwähnt habe, dass im vorherigen Artikel ein Spring Boot -Projekt erstellt wurde, werde ich hier nicht viel sagen
Fügen Sie rabbitmq -verwandte Abhängigkeiten hinzu
<!-Rabbitmq-> <depeopcy> <gruppe> org.springframework.boot </Groupid> <artifactid> Spring-Boot-Starter-Amqp </artifactid> </abhängig>
Das ist richtig, nur eine kleine Konfiguration, aber ich verstehe vielleicht nicht so, also würde ich besser alle Konfigurationen veröffentlichen
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </modelversion> <gruppe> wang.raye.rabbitmq </Groupid> <artifactid> Demo1 </artifactid> <Version> 0.0.1-1-Snapshot </Version> </artifactid> <Name> Demo1 </name> <URL> http://maven.apache.org </url> <properties> <projekt.build.SourceEncoding> utf-8 </project.build.SourceCoding> </properties> <Troup. <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Springboot --> <dependency> <gruppe> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Web </artifactId> </abhängig> <!-Rabbitmq-> <Depopentcy> <GroupId> org.springFramework.boot </gruppen> <artifactid> spring-boot-starter-amqp </artifactid> artifactid> </abhängig> </project>
Da keine anderen Operationen durchgeführt werden, stützt sich das Projekt derzeit haupt
Konfigurationsklasse hinzufügen
Paket 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.message; 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.ImPlemessagelistenercontainer; import org.springframework.context.annotation.bean; import org.springframework.context.annotation / ** Warteschlange Key1*/ public static Final String RoutingKey1 = "queue_one_key1"; / ** Warteschlange Key2*/ public static Final String RoutingKey2 = "Queue_one_key2"; / *** Konfigurationsverbindungsinformationen* @return*/ @Bean public ConnectionFactory Connectory ConnectoryFactory () {CachingConnectionFactory Connectory ConnectoryFactory = new CachingConnectionFactory ("127.0.0.1", 5672); ConnectionFactory.Setusername ("Springboot"); ConnectionFactory.SetPassword ("Passwort"); ConnectionFactory.setVirtualHost ("/"); ConnectionFactory.SetPublisherConFirms (true); // return ConnectionFactory muss festgelegt werden. } /** * Configure message switch* Configure FanoutExchange for consumers: Distribute messages to all bound queues, without the concept of routingkey HeadersExchange: match DirectExchange by adding attribute key-value: Distribute to the specified queue according to routingkey TopicExchange: Multi-key matching*/ @Bean public DirectExchange defaultExchange() { return new DirectExchange(EXCHANGE, true, false); } / ** * Message Queue 1 * Konfigurieren Sie für Verbraucher * @return * / @Bean public Queue queue () {return New Queue ("queue_one", true); // Quantität persistent}/*** Binden Sie die Meldungswarteschlange 1 mit Switch* Konfigurieren Sie für Verbraucher* @return*/@bean public binding binding () {return bindingBuilder.bind (queue ()). To (defaultExchange ()). Mit (Rabbitmqconfig.routingkey1); } / ** * Konfigurieren Sie die Meldungswarteschlange 2 * Konfigurieren Sie für Verbraucher * @return * / @Bean public Queue Queue1 () {neue Warteschlange zurückgeben ("queue_one1", true); // Schnelle Persistenz}/*** Binden Sie die Meldungswarteschlange 2 mit dem Switch* Konfigurieren Sie für Verbraucher* @return*/@bean public binding binding1 () {return bindingBuilder.bind (queue1 ()). To (defaultExchange ()). Mit (Rabbitmqconfig.routingKey2); } / *** Akzeptiere das Anhören von Nachrichten. Dieser Hörer akzeptiert die Nachricht von Message Queue 1* Konfigurieren Sie für Verbraucher* @return* / @Bean public SimpleMessagelistenContainer MessageContainer () {SimpleMessagelistenContainer Container = new SimpleMessagelistenContainer (ConnectionFactory (); Container.Setqueue (Queue ()); container.setExposelistenerchannel (true); Container.SetMaxConcurrentConsumers (1); Container.SetConcurrentConsumers (1); Container.SetacknowledGemode (detaalledgeMode.manual); // Bestätigungsmodus manuell bestätigen. Channel.Basicack (message.getMessageProperties (). getDeliveryTag (), false); Rückkehrbehälter; } / *** Akzeptiere das Anhören von Nachrichten. Dieser Hörer akzeptiert die Nachricht von Message Queue 1* Konfiguration für Verbraucher* @return* / @Bean public SimpleMessagelistenContainer MessageContainer2 () {SimpleMessagelistenContainer = New SimpleMessagelistenContainer (connectionFactory (); Container.Setqueue (Queue1 ()); container.setExposelistenerchannel (true); Container.SetMaxConcurrentConsumers (1); Container.SetConcurrentConsumers (1); Container.SetacknowledGemode (detaalledgeMode.manual); // Setzen Sie den Bestätigungsmodus manuell bestätigen Container. Channel.Basicack (message.getMessageProperties (). getDeliveryTag (), false); Rückkehrbehälter; }}Beachten Sie, dass ich zwei Nachrichtenwarteschlangen konfiguriert habe, um besser zu demonstrieren, wie man konfiguriert wird. Abgesehen davon, wo die Linkkonfiguration konfiguriert ist, richtet sich der Rest dieser Klasse auf Nachrichtenverbraucher. Natürlich müssen sowohl Nachrichtenverbraucher als auch Nachrichtenhersteller Linkinformationen konfigurieren. Die Botschaft der Verbraucher und Hersteller dieses Projekts sind beide in diesem Projekt. Im Allgemeinen befindet sich das eigentliche Projekt nicht im selben Projekt. Da die Kommentare sehr detailliert sind, werde ich nicht viel sagen.
Senden Sie eine Nachricht
Um das Senden von Nachrichten zu erleichtern, habe ich direkt einen Controller geschrieben, um die Methode zum Senden von Nachrichten durch den Zugriff auf die Schnittstelle aufzurufen. Fügen Sie ohne weiteres den Code hinzu
Paket 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;/** * Testen Sie den Controller für Rabbitmq, um Nachrichten zu senden * @Author Raye * */ @rastControllerPublic -Klasse SendController implements Rabbittemplate.ConfirMcallback {private rabbittemplatemplate; /*** Konfigurieren Sie die Kaninchenplatte, um Nachrichten zu senden. Da es sich um einen Konstruktor handelt, wird der Frühling automatisch ohne Annotation injiziert (es sollte eine Funktion der neuen Version sein) * @param Rabbittemplate */ public sendController (Rabbittemplate Rabbittemplate) {this.rabbittemplate = Rabbittemplate; // Konsumrückruf this.rabbittemplate.setConFirmCallback (this); } / ** * Senden Sie eine Nachricht an Message Queue 1 * @param msg * @return * / @RequestMapping ("send1") public String send1 (String msg) {String uUid = uUid.randomuuid (). ToString (); KorrelationData correspondecId = neue korrelationData (uUid); Rabbittemplate.ConvertandSend (Rabbitmqconfig.exchange, Rabbitmqconfig.routingKey1, MSG, Korrespondenz); null zurückkehren; } / ** * Senden Sie eine Nachricht an Message Queue 2 * @param msg * @return * / @RequestMapping ("send2") public String send2 (String msg) {String uUid = uUid.randomuuid (). ToString (); Correlationdata correlationId = neue korrelationData (uUid); Rabbittemplate.ConvertandSend (Rabbitmqconfig.exchange, Rabbitmqconfig.routingkey2, MSG, CorrelationID); null zurückkehren; } / *** Nachrichtenrückruf, wobei hauptsächlich die Rabbittemplate implementiert wird. CONFIRMCALLBACK -Schnittstelle* Beachten Sie, dass Nachrichten -Rückrufe nur erfolgreiche Nachrichten darstellen können, die an den Rabbitmq -Server gesendet werden können, und können erfolgreiche Nachrichten nicht darstellen, die verarbeitet und akzeptiert werden* / public void bestätigen (KorrelationData corresponcedata, boolean ackk, starken correation). if (ack) {system.out.println ("Nachrichtenverbrauch fehlgeschlagen:" + Ursache + "/n resend"); }}}Es ist zu beachten, dass Nachrichten -Rückrufe nur die erfolgreiche Nachricht an den Rabbitmq -Server darstellen können.
Dann starten wir das Projekt und besuchen http: // localhost: 8082/send1? Msg = aaaa und Sie werden feststellen, dass die Konsolenausgabe ist
Empfangene Nachricht: AAAA
Rückruf-ID: CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
Erfolgreicher Nachrichtenkonsum
Natürlich kann die Rückruf -ID unterschiedlich sein. Wenn wir http: // localhost: 8082/send2? Msg = bbbbbs besuchen, wird die Ausgabe sein
Queue1 Empfangen Sie Nachricht: BBBB
Rückruf-ID: CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
Erfolgreicher Nachrichtenkonsum
Ein paar Worte am Ende
Da dieser Artikel hauptsächlich erklärt, wie man Rabbitmq von Null zu Springboot integriert, gibt es keine Erklärung für viele Informationen und die Verwendung von Rabbitmq. Wenn Sie mit Rabbitmq selbst nicht vertraut sind, können Sie sich andere Artikel über Rabbitmq ansehen und die Demo dieses Artikels anschließen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.