โหมดเบรกเกอร์ Curcuit
ในสภาพแวดล้อมแบบกระจายโดยเฉพาะอย่างยิ่งในระบบกระจายที่มีโครงสร้าง microservice เป็นเรื่องธรรมดามากสำหรับระบบซอฟต์แวร์หนึ่งระบบที่จะเรียกระบบระยะไกลอื่น Callee ของการโทรระยะไกลนี้อาจเป็นกระบวนการอื่นหรือโฮสต์อื่นทั่วทั้งเครือข่าย ความแตกต่างที่ใหญ่ที่สุดระหว่างการโทรระยะไกลนี้และการโทรภายในของกระบวนการคือการโทรระยะไกลอาจล้มเหลวหรือแขวนโดยไม่มีการตอบกลับใด ๆ จนกว่าจะหมดเวลา ยิ่งไปกว่านั้นหากผู้โทรหลายคนเรียกบริการที่รอดำเนินการเดียวกันก็มีความเป็นไปได้สูงที่การรอการหมดเวลาของการบริการจะแพร่กระจายไปยังระบบกระจายทั้งหมดอย่างรวดเร็วทำให้เกิดปฏิกิริยาลูกโซ่และใช้ทรัพยากรจำนวนมากของระบบกระจายทั้งหมด ในที่สุดมันอาจนำไปสู่ระบบอัมพาต
โหมดเบรกเกอร์คือการป้องกันภัยพิบัติที่เกิดจากปฏิกิริยาลูกโซ่เหมือนน้ำตกในระบบกระจาย
เมื่อเครื่องใช้ไฟฟ้าบางอย่างมีปัญหาฟิวส์ของวงจรจะระเบิดเพื่อป้องกันภัยพิบัติ เบรกเกอร์วงจรคล้ายกับฟิวส์วงจร แนวคิดการใช้งานนั้นง่ายมาก พวกเขาสามารถห่อหุ้มบริการระยะไกลที่ต้องการการป้องกันและตรวจสอบจำนวนความล้มเหลวภายใน เมื่อจำนวนความล้มเหลวถึงเกณฑ์ที่แน่นอนการโทรไปยังบริการที่ตามมาทั้งหมดจะส่งคืนข้อผิดพลาดโดยตรงไปยังผู้โทรหลังจากสกัดกั้นวงจรเบรกเกอร์และจะไม่เรียกบริการที่มีปัญหาอยู่แล้วดังนั้นจึงบรรลุวัตถุประสงค์ในการปกป้องผู้โทร ระบบทั้งหมดจะไม่ประสบกับปฏิกิริยาลูกโซ่น้ำตกที่เกิดจากการหมดเวลา
1. โหมดพื้นฐาน
รูปด้านบนเป็นโครงสร้างของเบรกเกอร์ (Curcuit Breaker) ซึ่งมีสองสถานะพื้นฐาน (ปิดและเปิด) และการดำเนินการตามการเดินทางขั้นพื้นฐาน:
ในสถานะปิดลูกค้าขอบริการไปยังซัพพลายเออร์โดยตรงผ่านตัวเบรกเกอร์โดยไม่มีอุปสรรคใด ๆ ค่าส่งคืนของซัพพลายเออร์จะถูกส่งกลับโดยตรงไปยังลูกค้าโดยเบรกเกอร์วงจร
ในสถานะเปิดหลังจากลูกค้าเริ่มร้องขอบริการไปยังซัพพลายเออร์เบรกเกอร์จะไม่โอนคำขอไปยังซัพพลายเออร์ แต่จะส่งคืนลูกค้าโดยตรงและเส้นทางระหว่างลูกค้าและซัพพลายเออร์จะเสีย
การเดินทาง: ในสถานะใกล้ชิดหากซัพพลายเออร์ยังคงหมดเวลาและข้อผิดพลาดหลังจากถึงเกณฑ์ที่ระบุการเดินทางจะเกิดขึ้นในเบรกเกอร์วงจรจากนั้นสถานะเบรกเกอร์วงจรจะเข้าเปิดจากปิด
2. โหมดขยาย
ในโหมดเบรกเกอร์พื้นฐานช่วยให้มั่นใจได้ว่าเบรกเกอร์จะไม่ถูกเรียกเมื่อเบรกเกอร์วงจรอยู่ในสถานะเปิด แต่เรายังต้องการมาตรการเพิ่มเติมเพื่อรีเซ็ตเบรกเกอร์หลังจากซัพพลายเออร์คืนค่าบริการ วิธีหนึ่งที่เป็นไปได้คือการตรวจสอบอย่างสม่ำเสมอว่าบริการของซัพพลายเออร์ได้รับการกู้คืนหรือไม่และเมื่อได้รับการกู้คืนสถานะจะถูกตั้งค่าให้ปิด สถานะของวงจรเบรกเกอร์ลองเปิดครึ่ง
3. ใช้โอกาสสำหรับเบรกเกอร์วงจร:
ซัพพลายเออร์โดยทั่วไปมีเสถียรภาพมาก หากเมื่อเกิดความล้มเหลวการตรวจสอบและการกู้คืนใช้เวลานานและไม่สามารถซ่อมแซมได้อย่างรวดเร็วในเวลาอันสั้นบริการนี้เหมาะสำหรับการใช้โหมดเบรกเกอร์ มิฉะนั้นก็มีแนวโน้มที่จะนำไปสู่เอฟเฟกต์ปิงปอง
3. เบรกเกอร์ไม่เหมาะสำหรับโอกาส:
เพื่อป้องกันไม่ให้แอปพลิเคชันพยายามเรียกใช้บริการระยะไกลหรือเข้าถึงทรัพยากรที่ใช้ร่วมกันรูปแบบนี้อาจไม่เหมาะสมหากการดำเนินการมีแนวโน้มที่จะล้มเหลวอย่างมาก
สำหรับการประมวลผลแอปพลิเคชันที่เข้าถึงทรัพยากรเฉพาะในท้องถิ่นเช่นโครงสร้างข้อมูลภายในหน่วยความจำ ในสภาพแวดล้อมนี้มักจะไม่เหมาะสมและการใช้เบรกเกอร์จะเพิ่มค่าใช้จ่ายของระบบเท่านั้น
ต่อไปนี้เป็นการแนะนำโดยตรงเกี่ยวกับวิธีการใช้เบรกเกอร์วงจรของ Spring Cloud
SpringCloud Netflix ใช้ชื่อของไลบรารีเบรกเกอร์ที่เรียกว่า Hystrix ภายใต้สถาปัตยกรรม Microservice มักจะมีการโทรบริการหลายระดับ ต่อไปนี้เป็นแผนผังแผนผังของเบราว์เซอร์ที่เข้าถึง Microservices แบ็กเอนด์ผ่าน API ภายใต้สถาปัตยกรรม Microservice:
ความล้มเหลวของการหมดเวลา microservice อาจนำไปสู่ปฏิกิริยาลูกโซ่น้ำตก ในรูปด้านล่าง Hystrix ป้องกันไม่ให้สิ่งนี้เกิดขึ้นผ่านตัวเบรกเกอร์ข้อเสนอแนะแบบอิสระ
บริการ B ในรูปล้มเหลวด้วยเหตุผลบางอย่างและไม่สามารถใช้งานได้ การโทรไปยังบริการ B ทั้งหมดจะหมดเวลา เมื่อการโทรไปยัง B ล้มเหลวในการเข้าถึงเกณฑ์เฉพาะ (20 ความล้มเหลวเกิดขึ้นภายใน 5 วินาทีคือค่าเริ่มต้นที่กำหนดโดย Hystrix) ลิงค์จะอยู่ในสถานะเปิดและจากนั้นการโทรไปยังบริการ B ทั้งหมดจะไม่ถูกเรียกใช้แทนข้อความทางเลือก Hystrix จัดเตรียมกลไกที่สอดคล้องกันที่ช่วยให้นักพัฒนาสามารถกำหนดข้อความ Fallbak นี้ได้
ลิงค์ของ Open บล็อกข้อผิดพลาดของน้ำตกทำให้บริการที่ถูกน้ำท่วมหรือไม่ถูกต้องมีเวลาแก้ไข ทางเลือกทางเลือกนี้อาจเป็นอีกการโทรที่ได้รับการป้องกัน Hystrix ข้อมูลแบบคงที่หรือค่า NULL ทางกฎหมาย ทางเลือกสามารถสร้างโครงสร้างโซ่ได้ดังนั้นการโทรกลับครั้งแรกที่เรียกบริการธุรกิจอื่น ๆ ที่ด้านล่างเพื่อส่งคืนข้อมูลคงที่
ถัดไปมาถึงจุดเพิ่มเบรกเกอร์วงจรไปยังกลุ่มบริการ Hello World สองกลุ่มก่อนหน้านี้เพื่อป้องกันไม่ให้โลกสวัสดีหนึ่งโลกที่หย่อนลงทำให้ระบบไม่สามารถใช้เวลาหมดเวลาได้
1. เพิ่มไลบรารี Hystrix เพื่อรองรับเบรกเกอร์วงจรในโครงการ POM.XML ของโครงการ Maven (โครงการริบบิ้นหรือโครงการปลอมแปลงที่แนะนำในบทก่อนหน้า)
<การพึ่งพา> <roupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Hystrix </artifactId>
2. ใช้เบรกเกอร์วงจรในการใช้งานริบบิ้น
1). เพิ่ม @enableCircuitbreaker คำอธิบายประกอบในคลาสสปริงบูตเริ่มต้น
@springbootapplication@enablecoveryclient@enablecircuitbreakerpublic คลาส serviceribbonapplication {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (serviceribbonapplication.class, args); -2). หมายเหตุประกอบวิธีการเข้าถึงบริการด้วย @HyStrixCommand Annotation
@ServicePublic คลาส HelloService {@autowired restTemplate restTemplate; @HyStrixCommand (FallbackMethod = "ServiceFailure") สตริงสาธารณะ gethellocontent () {return restTemplate.getForObject ("http: // service-helloworld/", string.class); } Public String ServiceFailure () {return "Hello World Service ไม่สามารถใช้ได้!"; -คำอธิบายประกอบ @hystrixCommand กำหนดเบรกเกอร์วงจรที่ห่อหุ้มวิธี gethellocontant () เมื่อการเข้าถึงบริการที่สามารถเข้าถึงได้ไม่สามารถไปถึงเกณฑ์ได้จะไม่ถูกเรียกให้ใช้บริการอีกต่อไป แต่จะส่งคืน Method ServiceFailure () ที่กำหนดโดย FlackMethod มีสองจุดที่ต้องได้รับความสนใจเป็นพิเศษเมื่อกำหนดวิธีการเลือกกลับที่กำหนดโดยคำอธิบายประกอบ @hystrixCommand:
ขั้นแรกค่าส่งคืนและประเภทพารามิเตอร์ของ FlackMethod จะต้องเหมือนกับวิธีการที่มีคำอธิบายประกอบโดย @hystrixCommand มิฉะนั้นจะมีข้อยกเว้นจะถูกโยนลงในรันไทม์ ตัวอย่างเช่นในตัวอย่างนี้ค่าส่งคืนของ ServiceFailure () และค่าส่งคืนของวิธี gethellocontant () เป็นทั้งสตริง
ประการที่สองเมื่อบริการพื้นฐานล้มเหลว FallbackMethod ไม่ได้แทนที่วิธีทั้งหมดที่มีคำอธิบายประกอบโดย @hystrixCommand (gethellocontant ในตัวอย่างนี้) แต่เฉพาะบริการเฉพาะที่เข้าถึงได้ผ่าน RestTemplate คุณสามารถดูได้จากเอาต์พุตระบบว่าแม้ว่ามันจะล้มเหลว แต่ก็ยังมี "การโทรหาบริการ-ม่าน" ในเอาต์พุตคอนโซล
เริ่มต้นบริการยูเรก้าเริ่มต้นบริการ HelloWorld เพียงสองบริการจากนั้นขัดจังหวะหนึ่งในนั้น (จำลองหนึ่งในไมโครไซต์ที่ถูกระงับ) เยี่ยมชม http: // localhost: 8901/จากนั้นรีเฟรชเนื่องจากโหลดสมดุล คุณจะเห็นว่าบริการที่รอดำเนินการครั้งที่สองจะถูกแทนที่ด้วยวิธีการจัดการข้อผิดพลาดที่กำหนดไว้ในริบบิ้น
4. ใช้เบรกเกอร์วงจรในแอปพลิเคชันแสร้งทำเป็น
1). Feign รองรับเบรกเกอร์วงจรอยู่แล้วดังนั้นคุณไม่จำเป็นต้องคิดเกี่ยวกับวิธีการของ Ribbon เพิ่มคำอธิบายประกอบพิเศษให้กับคลาส Spring Boot Startup
2). เพิ่มคลาสทางเลือกด้วย @feignclient Annotation ซึ่งจะต้องใช้อินเตอร์เฟสที่แก้ไขโดย @feignlient
@feignClient (name = "service-helloworld", fallback = helloWorldServiceFailure.class) อินเตอร์เฟสสาธารณะ helloWorldService {@requestmapping (value = "/", method = requestMethod.get) สตริงสาธารณะ Sayshello (); -3). ในการสร้างคลาส HelloWorldServiceFailure คุณต้องใช้อินเตอร์เฟส HelloWorldService ที่แก้ไขโดย @FeignClient โปรดทราบว่าคุณเพิ่ม @component หรือ @Service Annotation เพื่อสร้างถั่วในภาชนะสปริง
@componentpublic คลาส HelloWorldServiceFailure ใช้ HelloWorldService {@Override Public String Sayshello () {System.out.println ("Hello World Service ไม่พร้อมใช้งาน!"); กลับ "Hello World Service ไม่มีให้บริการ!"; -4). ในเวอร์ชัน Brixton ก่อนฤดูใบไม้ผลิคลาวด์ Feign จะเปิดใช้งานวงจรเบรกเกอร์โดยอัตโนมัติ แต่รุ่น Dalston ล่าสุดได้เปลี่ยนการกำหนดค่าเริ่มต้นเพื่อห้าม
ด้วยเหตุผลโปรดดูที่: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277 ให้ความสนใจกับจุดนี้ ดังนั้นในการใช้เบรกเกอร์วงจรในการแสร้งทำเป็นคุณต้องเพิ่มการกำหนดค่าต่อไปนี้ใน application.yml:
Feign: Hystrix: เปิดใช้งาน: จริง
5). เปิดตัวแอปพลิเคชัน Feign และเยี่ยมชม http: // localhost: 8902/สวัสดีเพื่อดูเอฟเฟกต์เช่นเดียวกับริบบิ้น
การอ้างอิง: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น