บทนำสู่ RabbitMQ
RabbitMQ เป็นระบบส่งข้อความขององค์กรที่สมบูรณ์และสามารถนำกลับมาใช้ใหม่ได้ตาม AMQP
MQ เป็นชื่อเต็มของคิวข้อความ คิวข้อความ (MQ) เป็นวิธีการสื่อสารระหว่างแอปพลิเคชันและแอปพลิเคชัน แอปพลิเคชันสื่อสารโดยการอ่านและเขียนข้อความที่รอคิว (ข้อมูลสำหรับแอปพลิเคชัน) โดยไม่ต้องเชื่อมต่อโดยเฉพาะเพื่อเชื่อมโยงพวกเขา การส่งข้อความหมายถึงการสื่อสารระหว่างโปรแกรมโดยการส่งข้อมูลในข้อความแทนที่จะโทรติดต่อกันโดยตรงมักจะใช้การโทรโดยตรงโดยตรงในเทคนิคเช่นการโทรขั้นตอนระยะไกล การเข้าคิวหมายถึงแอปพลิเคชันที่สื่อสารผ่านคิว การใช้คิวช่วยลดข้อกำหนดที่ทั้งการรับและการส่งแอปพลิเคชันดำเนินการพร้อมกัน
AMQP เป็นโปรโตคอลโปรโตคอลการสื่อสารข้อความที่เป็นนามธรรมระดับสูง
แม้ว่าจะมีมาตรฐานสาธารณะมากมายในโลกของการส่งข้อความแบบซิงโครนัส (เช่น Cobar IIOP หรือ SOAP ฯลฯ ) นี่ไม่ใช่กรณีในการประมวลผลข้อความแบบอะซิงโครนัส มีเพียง บริษัท ขนาดใหญ่เท่านั้นที่มีการใช้งานเชิงพาณิชย์ (เช่น MSMQ ของ Microsoft, WebSphere MQ ของ IBM ฯลฯ ) ดังนั้นในเดือนมิถุนายน 2549 ซิสโก้เรดแฮทอิมาทิกซ์และอื่น ๆ ร่วมกันมาตรฐานสาธารณะกำหนดมาตรฐานสำหรับ AMQP กล่าวอีกนัยหนึ่ง AMQP เป็นโปรโตคอลสำหรับการสื่อสารแบบอะซิงโครนัส
สถานการณ์การใช้งาน RabbitMQ
ในโครงการการดำเนินการที่ใช้เวลานานซึ่งไม่ต้องการผลตอบแทนทันทีจะถูกสกัดและประมวลผลแบบอะซิงโครนัส การประมวลผลแบบอะซิงโครนัสนี้จะช่วยประหยัดเวลาตอบสนองของเซิร์ฟเวอร์ได้อย่างมากซึ่งจะเป็นการปรับปรุงปริมาณงานของระบบ อย่างไรก็ตามส่วนใหญ่ไม่เพียง แต่ไม่จำเป็นต้องกลับมาทันทีและไม่สำคัญว่าการดำเนินการจะประสบความสำเร็จหรือไม่ หากคุณต้องการผลตอบแทนทันทีคุณสามารถใช้ Dubbo Spring Boot รวมเข้ากับ Dubbo คุณสามารถรับชม Dubbox Integration Spring Boot Integration
การพึ่งพา RabbitMQ
RabbitMQ ไม่ใช่แพ็คเกจ JAR อย่างง่าย (แพ็คเกจ JAR มีฟังก์ชั่นการสื่อสารพื้นฐานบางอย่างกับ RabbitMQ เท่านั้น) คล้ายกับ Dubbo RabbitMQ ยังต้องการให้ซอฟต์แวร์อื่นทำงาน ต่อไปนี้เป็นซอฟต์แวร์ที่จำเป็นสำหรับ RabbitMQ ในการทำงาน
1. Erlang
เนื่องจากซอฟต์แวร์ RabbitMQ ได้รับการพัฒนาตาม ERLANG หากคุณต้องการเรียกใช้ RabbitMQ คุณต้องติดตาม Erlang ก่อน
เว็บไซต์ทางการของ Erlang
erlang ดาวน์โหลดที่อยู่
RabbitMQ
RabbitMQ เป็นแกนหลักของการใช้คิวข้อความ
เว็บไซต์ทางการ RabbitMQ
ดาวน์โหลด rabbitmq
การกำหนดค่า RABBITMQ
หลังจากการติดตั้งเสร็จสมบูรณ์คุณจะต้องทำการกำหนดค่าให้เสร็จสมบูรณ์ก่อนที่จะใช้ RabbitMQ คุณสามารถใช้ CMD โดยตรงไปยังไดเรกทอรี SBIN ภายใต้ไดเรกทอรีการติดตั้งของ RabbitMQ ผ่านการกำหนดค่าคำสั่งหรือคุณสามารถค้นหาพรอมต์คำสั่ง RABBITMQ โดยตรง (SBIN DIR) ในเมนูเริ่มต้นเพื่อเรียกใช้ SBIN โดยตรงไปยังไดเรกทอรีการติดตั้งของ RabbitMQ เพื่อความสะดวกเราเปิดใช้งานปลั๊กอินการจัดการและดำเนินการคำสั่ง
rabbitmq-plugins.bat เปิดใช้งาน rabbitmq_management
ถูกต้องโปรด ทราบว่านี่อยู่ภายใต้ Windows ถ้าเป็น Linux จะไม่มีคำต่อท้ายของค้างคาว จากนั้นเราเพิ่มผู้ใช้เนื่องจากการเชื่อมต่อไม่สามารถสำเร็จได้หากไม่มีผู้ใช้ในสภาพแวดล้อมเครือข่ายภายนอก ดำเนินการคำสั่งเพิ่มผู้ใช้
rabbitmqctl.bat add_user springboot รหัสผ่าน
Springboot เป็นชื่อผู้ใช้และรหัสผ่านคือรหัสผ่าน
จากนั้นเพื่อความสะดวกในการสาธิตเราให้สิทธิ์ผู้ดูแล Springboot เพื่ออำนวยความสะดวกในการเข้าสู่หน้าการจัดการ
rabbitmqctl.bat set_user_tags ผู้ดูแลระบบ Springboot
ให้สิทธิ์บัญชี
rabbitmqctl.bat set_permissions -p / springboot.*.*.*.*.*.*.*.
จากนั้นเริ่มบริการ RabbitMQ และเยี่ยมชมหน้าการจัดการ RabbitMQ http: // localhost: 15672 เพื่อดูหน้าเข้าสู่ระบบ หากไม่มีผู้ใช้สร้างขึ้นคุณสามารถใช้แขกและแขกเพื่อเข้าสู่ระบบหากมีผู้ใช้ที่สร้างขึ้นให้ใช้ผู้ใช้ที่สร้างขึ้นเพื่อเข้าสู่ระบบหากมีผู้ใช้ที่สร้างขึ้นให้ใช้ผู้ใช้ที่สร้างขึ้นเพื่อเข้าสู่ระบบ
สร้างโครงการ Springboot
เนื่องจากฉันได้พูดถึงการสร้างโครงการสปริงบูตในบทความก่อนหน้าหลายครั้งฉันจะไม่พูดมากที่นี่
เพิ่มการพึ่งพาที่เกี่ยวข้องกับ RabbitMQ
<!-rabbitmq-> <cendency> <roupId> org.springframework.boot </groupid> <ratifactid> Spring-Boot-Starter-Amqp </artifactid>
ถูกต้องเพียงแค่การกำหนดค่าเล็กน้อย แต่ฉันอาจไม่เข้าใจด้วยวิธีนี้ดังนั้นฉันควรโพสต์การกำหนดค่าทั้งหมด
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/MANCMMMMMMMMMMMMMMMMMMMMMMMMMMBM http://maven.apache.org/xsd/maven-4.0.0.xsd "> <moderVersion> 4.0.0 </modelversion> <moderversion> <moderversion> <name> demo1 </name> <url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <ArtIfactId> Spring-Boot-Starter-Parent </ArtifactId> <Sersion> 1.4.0.Release </เวอร์ชัน> </Parent> <pendencies> <perdency> <perdency> <scendency> <RoupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </artifactid> </permentency> <!-RabbitMQ-> <การพึ่งพา </การพึ่งพา> </project>
เนื่องจากไม่มีการดำเนินการอื่น ๆ โครงการส่วนใหญ่อาศัยสองโมดูลหนึ่งคือการบูต Sprig หนึ่งและหนึ่ง rabbitmq
เพิ่มคลาสการกำหนดค่า
แพ็คเกจ wang.raye.rabbitmq.demo1; นำเข้า org.springframework.amqp.core.acknowledGemode; นำเข้า org.springframework.amqp.core.binding; นำเข้า org.springframework.amqp.core.binding; นำเข้า org.springframework.amqp.core.bindingbuilder; นำเข้า org.springframework.amqp.core.directExchange; นำเข้า org.springframework.amqp.core.message; นำเข้า org.springframework.amqp.core.queue; นำเข้า org.springframework.amqp.rabbit.connection.cachingconnectionfactory; นำเข้า org.springframework.amqp.rabbit.connection.connectionfactory; นำเข้า org.springframework.amqp.rabbit.core.channelawaremessagelistener; นำเข้า org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration;/*** คลาสการกำหนดค่า RabbitMq* @author raye* @Since 12 ตุลาคม 2016 10:57:44*/ @การกำหนดค่าระดับสาธารณะ RabbitMqConfig {/** ชื่อของสวิตช์ข้อความ / ** คิวคีย์ 1*/ สตริงสุดท้ายคงที่การกำหนดเส้นทางสตริงคีย์ 1 = "queue_one_key1"; / ** คิวคิว 2*/ สตริงสุดท้ายคงที่การกำหนดเส้นทางคีย์คีย์ 2 = "queue_one_key2"; / *** ข้อมูลการกำหนดค่าลิงค์* @return*/ @bean Public ConnectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = ใหม่ CachingConnectionFactory ("127.0.0.1", 5672); ConnectionFactory.setUserName ("Springboot"); ConnectionFactory.SetPassword ("รหัสผ่าน"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.SetPublisherConfirms (จริง); // return connectionFactory จะต้องตั้งค่า; } / *** กำหนดค่าสวิตช์ข้อความ* กำหนดค่า fanoutexchange สำหรับผู้บริโภค: แจกจ่ายข้อความไปยังคิวที่ถูกผูกไว้ทั้งหมดโดยไม่ต้องมีแนวคิดของการจัดเส้นทางส่วนหัวของ Keyexchange: จับคู่ DirectExchange โดยการเพิ่มคีย์-ค่าคีย์: แจกจ่าย queue ที่ระบุ } / ** * กำหนดค่าคิวข้อความ 1 * กำหนดค่าสำหรับผู้บริโภค * @return * / @bean สาธารณะคิวคิว () {ส่งคืนคิวใหม่ ("queue_one", จริง); // ปริมาณถาวร}/*** ผูกคิวข้อความ 1 พร้อมสวิตช์* กำหนดค่าสำหรับผู้บริโภค* @return*/@bean การเชื่อมโยงสาธารณะที่มีผลผูกพัน () {ส่งคืน bindingbuilder.bind (คิว ()). ถึง (defaultExchange () } / ** * กำหนดค่าคิวข้อความ 2 * กำหนดค่าสำหรับผู้บริโภค * @return * / @bean สาธารณะคิวคิว 1 () {ส่งคืนคิวใหม่ ("queue_one1", จริง); // การคงอยู่อย่างรวดเร็ว}/*** ผูกคิวข้อความ 2 พร้อมสวิตช์* กำหนดค่าสำหรับผู้บริโภค* @return*/@bean การเชื่อมโยงสาธารณะการเชื่อมโยงสาธารณะ 1 () {ส่งคืน bindingbuilder.bind (queue1 ()) ไปยัง (defaultExChange () } / *** ยอมรับการฟังข้อความผู้ฟังนี้จะรับข้อความจากคิวข้อความ 1* กำหนดค่าสำหรับผู้บริโภค* @return* / @bean สาธารณะ SimpleMessageListenerContainer Messagecontainer () {SimpleMessageListenerContainer container.setqueues (คิว ()); container.setexposelistenerChannel (จริง); container.setMaxConcurrentConsumers (1); container.setCurrentConsumers (1); container.setackNowLEDGEMODE (ACKNOWLEDGEMODE.MANUAL); // ตั้งค่าโหมดการยืนยันด้วยตนเองยืนยัน container.setMessageListener (ช่องใหม่ channelawareMessageListener () {โมฆะสาธารณะ onMessage (ข้อความข้อความ, com.rabbitmq.client.channel channel) โยนข้อยกเว้น {byte [] body.getbody (); ระบบ. channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); ส่งคืนคอนเทนเนอร์; } / *** ยอมรับการฟังข้อความผู้ฟังนี้จะยอมรับข้อความจากคิวข้อความ 1* การกำหนดค่าสำหรับผู้บริโภค* @return* / @bean สาธารณะ SimpleMessageListenerContainer MessageContainer2 () {SimpleMessagelistenerContainer container.setqueues (queue1 ()); container.setexposelistenerChannel (จริง); container.setMaxConcurrentConsumers (1); container.setCurrentConsumers (1); container.setackNowLEDGEMODE (ACKNOWLEDGEMODE.MANUAL); // ตั้งค่าโหมดการยืนยันด้วยตนเองยืนยันคอนเทนเนอร์ SetMessAgelistener (ช่องใหม่ channelawareMessageListener () {โมฆะสาธารณะ onMessage (ข้อความข้อความ, com.rabbitmq.client.channel channel) โยนข้อยกเว้น {byte [] body = message.getbody () channel.basicack (message.getMessageProperties (). getDeliveryTag (), false); ส่งคืนคอนเทนเนอร์; -โปรดทราบว่าเพื่อแสดงให้เห็นถึงวิธีการกำหนดค่าที่ดีขึ้นฉันกำหนดค่าคิวข้อความสองรายการ ยกเว้นที่กำหนดค่าการกำหนดค่าลิงค์ส่วนที่เหลือของคลาสนี้จะถูกกำหนดเป้าหมายที่ผู้บริโภคข้อความ แน่นอนทั้งผู้บริโภคข้อความและผู้ผลิตข้อความจำเป็นต้องกำหนดค่าข้อมูลลิงก์ เพื่อความสะดวกผู้บริโภคข้อความและผู้ผลิตโครงการนี้ทั้งคู่อยู่ในโครงการนี้ โดยทั่วไปโครงการจริงจะไม่อยู่ในโครงการเดียวกัน เนื่องจากความคิดเห็นมีรายละเอียดมากฉันจะไม่พูดอะไรมากมาย
ส่งข้อความ
เพื่ออำนวยความสะดวกในการส่งข้อความฉันเขียนคอนโทรลเลอร์โดยตรงเพื่อเรียกวิธีการส่งข้อความโดยการเข้าถึงอินเทอร์เฟซ โดยไม่ต้องกังวลใจเพิ่มเติมโปรดเพิ่มรหัส
แพ็คเกจ wang.raye.rabbitmq.demo1; นำเข้า java.util.uuid; นำเข้า org.springframework.amqp.rabbit.core.rabbittemplate; นำเข้า org.springframework.amqp.rabbit.support.correlationData; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.restcontroller;/** * ทดสอบคอนโทรลเลอร์สำหรับ RabbitMq เพื่อส่งข้อความ * @author raye * */ @restcontrollerpublic คลาส sendcontroller ใช้ Rabbittemplate.confirmcallback /*** กำหนดค่า Rabbittemplate เพื่อส่งข้อความ เนื่องจากเป็นตัวสร้างสปริงจะถูกฉีดโดยอัตโนมัติโดยไม่มีคำอธิบายประกอบ (ควรเป็นคุณลักษณะของเวอร์ชันใหม่) * @param Rabbittemplate */ SendController สาธารณะ // ตั้งค่าการโทรกลับการบริโภค this.rabbittemplate.setConfirmCallback (นี่); } / ** * ส่งข้อความไปยังคิวข้อความ 1 * @param msg * @return * / @requestmapping ("send1") สตริงสาธารณะ send1 (String msg) {string uuid = uuid.randomuiD () toString (); correlationData การติดต่อ = new CorrelationData (UUID); Rabbittemplate.ConvertandSend (RabbitMqConfig.exchange, RabbitMqConfig.routingKey1, MSG, RegortenceId); คืนค่า null; } / ** * ส่งข้อความไปยังคิวข้อความ 2 * @param msg * @return * / @requestmapping ("send2") สตริงสาธารณะ send2 (string msg) {string uuid = uuid.randomuuid () toString (); correlationData correlationId = new CorrelationData (UUID); Rabbittemplate.ConvertandSend (RabbitMqConfig.exchange, RabbitMqConfig.routingKey2, MSG, CorrelationId); คืนค่า null; } / *** การเรียกกลับข้อความส่วนใหญ่ใช้ Rabbittemplate.ConfirmCallback อินเตอร์เฟส* โปรดทราบว่าการเรียกกลับข้อความสามารถแสดงข้อความที่ประสบความสำเร็จที่ส่งไปยังเซิร์ฟเวอร์ RabbitMQ และไม่สามารถแสดงข้อความที่ประสบความสำเร็จได้ if (ack) {system.out.println ("การบริโภคข้อความล้มเหลว:" + สาเหตุ + "/n resend"); -ควรสังเกตว่าการโทรกลับข้อความสามารถแสดงข้อความที่ประสบความสำเร็จที่ถูกส่งไปยังเซิร์ฟเวอร์ RabbitMQ เท่านั้น
จากนั้นเราเริ่มโครงการและเยี่ยมชม http: // localhost: 8082/send1? msg = aaaa และคุณจะพบว่าเอาต์พุตคอนโซลคือ
ได้รับข้อความ: AAAA
ID การโทรกลับ: CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
การบริโภคข่าวที่ประสบความสำเร็จ
แน่นอนว่ารหัสโทรกลับอาจแตกต่างกัน ถ้าเราเยี่ยมชม http: // localhost: 8082/send2? msg = bbbb ผลลัพธ์จะเป็น
Queue1 ได้รับข้อความ: BBBB
ID การโทรกลับ: CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
การบริโภคข่าวที่ประสบความสำเร็จ
ไม่กี่คำในตอนท้าย
เนื่องจากบทความนี้ส่วนใหญ่อธิบายวิธีการรวม RabbitMQ จากศูนย์ถึง Springboot จึงไม่มีคำอธิบายสำหรับข้อมูลจำนวนมากและการใช้ RabbitMQ หากคุณไม่คุ้นเคยกับ RabbitMQ เองคุณสามารถตรวจสอบบทความอื่น ๆ เกี่ยวกับ RabbitMQ และแนบการสาธิตของบทความนี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น