ใน Microservices เราแบ่งระบบออกเป็นหน่วยบริการจำนวนมากและแต่ละหน่วยจะพึ่งพาซึ่งกันและกันผ่านการลงทะเบียนบริการและการใช้การสมัครสมาชิก แต่จะเกิดอะไรขึ้นถ้าบริการบางอย่างมีปัญหา?
ตัวอย่างเช่นมีบริการสามบริการ (ABC) การโทร B และ B CALL C. เนื่องจากความล่าช้าของเครือข่ายหรือปัญหารหัสของ C B จะไม่ได้รับการตอบกลับเป็นเวลานานดังนั้นการร้องขอ B การโทร C จะถูกระงับและรอ
ในกรณีของการเข้าถึงที่เกิดขึ้นพร้อมกันสูงเธรดที่ถูกระงับเหล่านี้ไม่สามารถปล่อยออกมาได้ทำให้การร้องขอที่ตามมาจะถูกบล็อกและในที่สุด B ก็จะวางสาย โดยการเปรียบเทียบอาจวางสายอาจทำให้ทั้งระบบล้มเหลว
เพื่อแก้ปัญหาทั้งหมดสปริงคลาวด์ใช้ Hystrix สำหรับการป้องกันความผิดพลาดในการบริการรวมถึงชุดของฟังก์ชั่นการป้องกันเช่นเบรกเกอร์วงจรและการแยกเธรด วันนี้เราจะดูวิธีการใช้เบรกเกอร์วงจรผ่าน Hystrix
1. Spring Cloud Hystrix คืออะไร? เบรกเกอร์คืออะไร?
Spring Cloud Hystrix ดำเนินการตามกรอบโอเพ่นซอร์สของ Netflix, Hystrix และวัตถุประสงค์ของมันคือการให้ความทนทานต่อความผิดพลาดที่แข็งแกร่งสำหรับความล่าช้าและความล้มเหลวโดยการควบคุมโหนดเหล่านั้นที่เข้าถึงระบบระยะไกลบริการและบุคคลที่สาม
เบรกเกอร์นั้นคล้ายกับเบรกเกอร์วงจรรั่วที่ใช้ในกล่องไฟฟ้าที่แข็งแกร่งในบ้านของเรา เมื่อหน่วยบริการล้มเหลว (คล้ายกับการลัดวงจรของอุปกรณ์ไฟฟ้า) การตอบสนองข้อผิดพลาดจะถูกส่งกลับไปยังผู้โทรผ่านฟังก์ชั่นการตรวจสอบความผิดพลาดของเบรกเกอร์ (คล้ายกับฟิวส์) หลีกเลี่ยงการรอคอยระยะยาว
2. หากไม่มีเบรกเกอร์วงจรแสดงหน้า
คุณยังจำบริการทั้งสามในซีรีย์ Introduction Spring Cloud 2: การใช้ยูเรก้าสำหรับการกำกับดูแลบริการ (ยูเรก้า/สวัสดี-บริการ/สวัสดีผู้บริโภค) ที่เราเขียนไว้ก่อนหน้านี้? เราทำการทดลองตามสิ่งนี้
1. เริ่มศูนย์ลงทะเบียนบริการยูเรก้าด้วยหมายเลขพอร์ต 1111
2. เริ่มต้นผู้ให้บริการ Hello-Service ที่นี่เราเริ่มบริการสองบริการด้วยหมายเลขพอร์ต 9090, 9091 ตามลำดับ
3. เริ่มต้น Hello-Consumer เพื่อให้บริการผู้บริโภคด้วยหมายเลขพอร์ต 9999; ในเวลานี้เราไม่มีปัญหาในการเยี่ยมชม http: // localhost: 9999/hello-consumer หลายครั้ง
4. ปิดบริการด้วยหมายเลขพอร์ต 9091 จากนั้นเยี่ยมชม http: // localhost: 9999/hello-consumer หลายครั้งและมีรายงานข้อผิดพลาด
PS: ที่นี่เราอธิบายว่าทำไมเราต้องเข้าถึงหลายครั้งเพราะเราประสบความสำเร็จในการโหลดบาลานซ์ผ่านริบบิ้น เมื่อเราเข้าถึง http: // localhost: 9999/hello-consumer เราจะสำรวจบริการสองบริการที่เข้าถึง Hello-Service จะมีการรายงานข้อผิดพลาดเมื่อเข้าถึงบริการด้วยหมายเลขพอร์ต 9091 จะไม่มีปัญหาในการเข้าถึงบริการด้วย 9090
3. การใช้รหัสเบรกเกอร์วงจร
ถัดไปมาดูวิธีการใช้รหัส เราไม่ได้ปรับเปลี่ยนศูนย์ลงทะเบียนบริการและผู้ให้บริการเราจำเป็นต้องปรับเปลี่ยนบริการผู้บริโภค Hello-Consumer
1. แก้ไขไฟล์ POM และแนะนำการพึ่งพา Hystrix
<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> <roupid> com.sam </groupId> <ArtIfactid> hello-consumer </artifactid> <RoupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Parent </artifactid> <sersion> 1.5.1.release </เวอร์ชัน> </parent> <properties> <javaversion> 1.8 </javaversion> <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Dependencies </artifactid> <persion> camden.sr6 </version> <ply> pom </type> <pope> นำเข้า </scope> <RoupID> org.springframework.cloud </groupId> <ratifactId> Spring-Cloud-Starter-Eureka </artifactId> </erperency> <!-แนะนำการพึ่งพาริบบิ้นเพื่อใช้การปรับสมดุลโหลด เราเพิ่งใช้ที่นี่และจะไม่แนะนำที่อื่น-> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-ribbon </artifactid> </การพึ่งพา> <! <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Hystrix </artifactid>
2. แก้ไขคลาสเริ่มต้นเพิ่มคำอธิบายประกอบ @EnableCircuitBreaker และเปิดใช้งานเบรกเกอร์วงจร
@enablecoveryclient@springbootapplication@enablecircuitbreakerpublic คลาส ConsumerApp {//@bean ใช้กับวิธีการและใช้ในการตั้งค่าวิธีการส่งคืนวิธีการเป็นถั่ว @bean @loadbalankanced //@loadbalanced } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (consumerapp.class, args); -ในเวลานี้คุณจะพบว่าคลาสเริ่มต้นนี้มีสามคำอธิบายประกอบ มันไม่ลำบากมากเหรอ? ไม่สำคัญเราสามารถใช้คำอธิบายประกอบ @SpringCloudapplication
@SpringCloudApplicationPublic คลาส ConsumerApp {// @bean ถูกนำไปใช้กับวิธีการและใช้ในการตั้งค่าวิธีการส่งคืนค่าเป็นถั่ว @bean @loadbalanced // @loadbalanced เพื่อให้ได้ RESTTEMPLATE Public Resttemplate () {ส่งคืน RESTTEMPLATE ใหม่ (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (consumerapp.class, args); -@SpringCloudApplication = @EnableDiscoveryClient +@springbootapplication +@enableCircuitbreaker คุณสามารถดูได้จากซอร์สโค้ด:
@Target (ElementType.type) @retention (RetentionPolicy.runtime)@documented@สืบทอด@springbootapplication@enablecoveryclient@enablecircuitbreakerpublic @interface SpringCloudapplication {}3.ADD บริการ
@ServicePublic คลาสผู้บริโภค {@autowired restTemplate restTemplate; @HyStrixCommand (fallbackMethod = "errormsg") ผู้บริโภคสตริงสาธารณะ () {// โทรหาบริการ hello-service โปรดทราบว่าชื่อบริการถูกใช้ที่นี่ไม่ใช่ ip+พอร์ตที่เฉพาะเจาะจง resttemplate.getForobject ("http: // hello-service/hello", string.class); กลับ "สวัสดีผู้บริโภคเสร็จสิ้น !!!"; } สตริงสาธารณะ errormsg () {return "ข้อผิดพลาด !!!"; -เราวางการใช้งานการเรียกใช้ RestTemplate ของคอนโทรลเลอร์ดั้งเดิมลงในบริการและระบุวิธีการโทรกลับผ่าน @hystrixCommand และเรียกใช้วิธีนี้เมื่อเกิดข้อผิดพลาด
4. แก้ไขคอนโทรลเลอร์
/** *RestTemplate ไม่ได้เรียกโดยตรงที่นี่อีกต่อไป *แต่ถูกนำไปใช้โดยการโทรบริการ * */ @restControllerPublic consumerController { @ @AutoWired // restTemplate restTemplate; บริการผู้บริโภค; @requestmapping ("/hello-consumer") สตริงสาธารณะ helloconsumer () {// // โทรหาบริการ hello-service โปรดทราบว่าชื่อบริการถูกใช้ที่นี่ไม่ใช่ IP+พอร์ตเฉพาะ // resttemplate.getForObject ("http: // hello-service/hello", string.class); ส่งคืน service.consumer (); -5. ทดสอบการเข้าชมหลายครั้งและเมื่อมีการรายงานข้อผิดพลาดเนื้อหาต่อไปนี้จะปรากฏขึ้น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น