1. บทนำ
ในระบบสถาปัตยกรรม Microservice เรามักจะใช้นายหน้าข้อความที่มีน้ำหนักเบาเพื่อสร้างหัวข้อข้อความทั่วไปเพื่อเชื่อมต่ออินสแตนซ์ microservice ทั้งหมดในระบบ เนื่องจากข้อความที่สร้างขึ้นในหัวข้อนี้จะได้รับการฟังและบริโภคโดยทุกกรณีเราจึงเรียกมันว่าบัสข้อความ
2. ข้อความพร็อกซี
นายหน้าข้อความเป็นรูปแบบสถาปัตยกรรมของการตรวจสอบข้อความการส่งและการกำหนดเส้นทาง มันทำหน้าที่เป็นตารางการสื่อสารระหว่างแอปพลิเคชันและลดการพึ่งพาระหว่างแอปพลิเคชันเพื่อให้แอปพลิเคชันสามารถแยกกระบวนการสื่อสารได้อย่างมีประสิทธิภาพ นายหน้าข้อความเป็นผลิตภัณฑ์มิดเดิลแวร์ หลักของมันคือโปรแกรมการกำหนดเส้นทางข้อความที่ใช้ในการรับและแจกจ่ายข้อความและส่งต่อไปยังแอปพลิเคชันที่ถูกต้องตามโฟลว์การประมวลผลข้อความที่ตั้งไว้ มันรวมถึงการสื่อสารอิสระและโปรโตคอลการส่งข้อความทำให้การสื่อสารเครือข่ายภายในและระหว่างองค์กร จุดประสงค์ในการออกแบบพร็อกซีคือการผ่านข้อความจากแอปพลิเคชันและดำเนินการพิเศษบางอย่าง ต่อไปนี้เป็นสถานการณ์ในแอปพลิเคชันองค์กรที่เรามักจะต้องใช้ข้อความพร็อกซี:
มีผลิตภัณฑ์โอเพ่นซอร์สมากมายให้ทุกคนใช้เช่น:
3. SpringCloud+RabbitMQ
(1) บทนำ RabbitMQ และการติดตั้งจะไม่ถูกต้อง
(2) pom.xml
<การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Amqp </artifactid> </sdercture> <dermentrency> </predency> </dependencies>
(3) Application.yml
ฤดูใบไม้ผลิ: แอปพลิเคชัน: ชื่อ: RabbitMq-Hello RabbitMQ: โฮสต์: ***. ***. ***. ***. *** พอร์ต: 5672 ชื่อผู้ใช้: แขกรหัสผ่าน: แขก
(4) ผู้ส่ง
@Component ผู้ส่งคลาสสาธารณะ {logger สุดท้ายคงที่ logger log = loggerFactory.getLogger (sender.class); @autowired ส่วนตัว amqptemplate amqptemplate; โมฆะสาธารณะส่ง () {String Context = "Hello" + New Date (); log.info ("ผู้ส่ง:" + บริบท); this.amqptemplate.convertandsend ("สวัสดี" บริบท); -(5) ผู้รับ
@Component @RabBitListener (queues = "hello") ตัวรับสัญญาณระดับสาธารณะ {logger สุดท้ายคงที่ logger log = loggerFactory.getLogger (receiver.class); @rabbithandler กระบวนการโมฆะสาธารณะ (สตริงสวัสดี) {log.info ("ตัวรับสัญญาณ:" + สวัสดี); -(6) สร้างคลาสการกำหนดค่า rabbitmq rabbitconfig
@Configuration คลาสสาธารณะ rabbitConfig {@bean สาธารณะคิว helloqueue () {ส่งคืนคิวใหม่ ("สวัสดี"); - (7) สร้างคลาสทดสอบหน่วยเพื่อเรียกการผลิตข้อความ
@runwith (springjunit4classrunner.class) @springboottest (คลาส = springcloudbusrabbitmqapplication.class) คลาสสาธารณะ helloapplicationtests {@autowired ผู้ส่งผู้ส่งส่วนตัว; @Test โมฆะสาธารณะสวัสดี () พ่นข้อยกเว้น {SENDER.SEND (); - (8) ทดสอบดำเนินการ helloapplicationtests
(9) เยี่ยมชมโฮสต์: 15672
4. แปลง config-client (รวมบัส SpringCloud)
(1) pom.xml
<การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Config </artifactid> </dependency> <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-eureka </artifactid> </serpendency> <การพึ่งพาอาศัย> <roupid> org.springframework.cloud </groupid> <RoupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-actuator </artifactid> </serpendency> <pendency> <sderction> </dependencies>
(2) Bootstrap.properties
Spring.application.name = configspace spring.cloud.config.label = master spring.cloud.config.profile = dev spring.cloud.config.uri = http: // localhost: 5588/eureka.client.serviceurl.defaultzone = http: //558 Spring.rabbitmq.host = 118.89.237.88 Spring.rabbitmq.port = 5672 Spring.rabbitmq.username = Guest Spring.rabbitmq.password = การจัดการแขก
(3) ไม่จำเป็นต้องเปลี่ยนคนอื่น
V. ทดสอบ
(1) การเตรียมการทดสอบ
ศูนย์ลงทะเบียนบริการ Eurekaserver, พอร์ต 5555;
ศูนย์การกำหนดค่าแบบกระจาย, configserver, กับพอร์ต 5588;
การกำหนดค่าแบบกระจายสองแบบกำหนดค่าพอร์ตคือ 5589 และ 5590; (2) เยี่ยมชม http: // localhost: 5589/จาก
(3) เยี่ยมชม http: // localhost: 5590/จาก
RabbitMQ:
(4) ไปที่คลังสินค้าเพื่อแก้ไขค่ารหัสผ่าน
จาก = git-dev-v1.0 โดย SpringCloud config-server username = password springcloud = 1234567890
(5) คำขอโพสต์ http: // localhost: 5589/บัส/รีเฟรชหรือ http: // localhost: 5590/บัส/รีเฟรช
หลังจากคำขอที่ประสบความสำเร็จ CONFIGN-CLIENT จะอ่านไฟล์การกำหนดค่าอีกครั้ง
(6) เยี่ยมชมอีกครั้ง
หากคำขอโพสต์: http: // localhost: 5590/bus/รีเฟรชกรุณาเยี่ยมชม http: // localhost: 5589/จาก
นอกจากนี้อินเตอร์เฟส/บัส/รีเฟรชสามารถระบุบริการนั่นคือใช้พารามิเตอร์ "ชื่อผู้ใช้" เช่น "/บัส/รีเฟรชหรือไม่ปลายทาง = ชื่อผู้ใช้: **" เพื่อรีเฟรชบริการทั้งหมดที่ชื่อบริการเป็นชื่อผู้ใช้โดยไม่คำนึงถึงที่อยู่ IP
(7) สถาปัตยกรรม
(8) การปรับสถาปัตยกรรม
เนื่องจากอินเทอร์เฟซ /บัส /รีเฟรชของ SpringCloud Bus ให้พารามิเตอร์สำหรับการอัปเดตการกำหนดค่าสำหรับบริการและอินสแตนซ์สถาปัตยกรรมของเรายังสามารถทำการปรับเปลี่ยนได้บ้าง ในสถาปัตยกรรมก่อนหน้าการอัปเดตการกำหนดค่าของบริการที่จำเป็นในการส่งคำขอไปยังอินสแตนซ์ในบริการเฉพาะจากนั้นทริกเกอร์การอัปเดตการกำหนดค่าของคลัสเตอร์บริการทั้งหมด แม้ว่าฟังก์ชั่นสามารถนำไปใช้งานได้ แต่ผลลัพธ์ก็คืออินสแตนซ์แอปพลิเคชันที่เราระบุจะแตกต่างจากอินสแตนซ์แอปพลิเคชันอื่น ๆ ในคลัสเตอร์ซึ่งจะเพิ่มความซับซ้อนภายในคลัสเตอร์และเป็นอันตรายต่อการทำงานและการบำรุงรักษาในอนาคต ตัวอย่างเช่นหากอินสแตนซ์ของบริการจำเป็นต้องอพยพเราต้องแก้ไขการกำหนดค่าในเว็บเบ็ด ฯลฯ ดังนั้นเราต้องทำให้แต่ละโหนดในกลุ่มบริการคลัสเตอร์ให้มากที่สุด
ดังนั้นเราได้ทำการปรับเปลี่ยนสถาปัตยกรรมก่อนหน้าดังแสดงในรูปด้านล่าง:
มีการเปลี่ยนแปลงต่อไปนี้:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น