การพูดของ SpringCloud Circuit ทำให้ฉันนึกถึงการบุกเข้าสู่ตลาดหุ้นเมื่อปีที่แล้ว ฉันได้ตระหนักถึงความเจ็บปวดหลายครั้ง ผลกระทบของการแตกวงจรแบบสุ่มในระบบทั้งหมดเป็นหายนะ มาพูดถึงเรื่องร้ายแรงต่อไป
ฟิวส์
เอฟเฟกต์หิมะถล่ม
ในสถาปัตยกรรม microservice มักจะมีหลายชั้นบริการที่จะโทร ความล้มเหลวของบริการพื้นฐานอาจนำไปสู่ความล้มเหลวของน้ำตกซึ่งจะทำให้ระบบทั้งหมดไม่สามารถใช้งานได้ ปรากฏการณ์นี้เรียกว่า Service Avalanche Effect Service Avalanche Effect เป็นกระบวนการที่ความไม่พร้อมใช้งานของ "ผู้ให้บริการ" นำไปสู่การไม่พร้อมใช้งานของ "ผู้บริโภคบริการ" และค่อยๆขยายความไม่พร้อมใช้งาน
หากตัวเลขด้านล่างแสดงให้เห็นว่า: A คือผู้ให้บริการ B คือผู้บริโภคบริการของ A และ C และ D เป็นผู้บริโภคบริการของ B. ความไม่พร้อมของสาเหตุที่ไม่พร้อมใช้งานของ B และเมื่อความไม่พร้อมใช้งานขยายเป็น C และ D เหมือนก้อนหิมะ
วงจรเบรกเกอร์
หลักการของฟิวส์นั้นง่ายมากเช่นตัวป้องกันการโอเวอร์โหลดพลังงาน มันสามารถบรรลุความล้มเหลวอย่างรวดเร็ว หากตรวจพบข้อผิดพลาดที่คล้ายกันมากมายในช่วงระยะเวลาหนึ่งมันจะบังคับให้การโทรที่ตามมาจะล้มเหลวอย่างรวดเร็วและไม่สามารถเข้าถึงเซิร์ฟเวอร์ระยะไกลได้อีกต่อไปดังนั้นจึงป้องกันไม่ให้แอปพลิเคชันพยายามดำเนินการล้มเหลวอย่างต่อเนื่องทำให้แอปพลิเคชันดำเนินการต่อโดยไม่ต้องรอการแก้ไขข้อผิดพลาด ฟิวส์ยังสามารถเปิดใช้งานแอปพลิเคชันเพื่อวินิจฉัยว่าข้อผิดพลาดได้รับการแก้ไขหรือไม่และหากได้รับการแก้ไขแอปพลิเคชันจะพยายามเรียกการดำเนินการอีกครั้ง
โหมดฟิวส์เป็นเหมือนพร็อกซีที่สามารถนำไปสู่การดำเนินการที่ไม่ถูกต้องได้อย่างง่ายดาย พร็อกซีนี้สามารถบันทึกจำนวนข้อผิดพลาดที่เกิดขึ้นในการโทรล่าสุดจากนั้นตัดสินใจใช้การดำเนินการอนุญาตให้ดำเนินการต่อหรือส่งคืนข้อผิดพลาดทันที
ตรรกะของการแปลงสวิทช์ฟิวส์ซึ่งกันและกันมีดังนี้:
ฟิวส์เป็นสายสุดท้ายของการป้องกันเพื่อปกป้องความพร้อมใช้งานของบริการสูง
คุณสมบัติ Hystrix
1. กลไกเบรกเกอร์
เบรกเกอร์เป็นเรื่องง่ายที่จะเข้าใจ เมื่อคำสั่ง Hystrix ร้องขอบริการแบ็คเอนด์ความล้มเหลวเกินกว่าสัดส่วนที่กำหนด (เริ่มต้น 50%) เบรกเกอร์จะเปลี่ยนเป็นสถานะเปิด (เปิด) ในเวลานี้คำขอทั้งหมดจะล้มเหลวโดยตรงโดยไม่ส่งไปยังบริการแบ็คเอนด์ หลังจากเบรกเกอร์วงจรยังคงอยู่ในสถานะเปิดเป็นระยะเวลาหนึ่ง (เริ่มต้น 5 วินาที) มันจะเปลี่ยนไปเป็นสถานะครึ่งเปิดโดยอัตโนมัติ (ครึ่งเปิด) ในเวลานี้สถานะการส่งคืนของคำขอถัดไปจะถูกตัดสิน หากคำขอสำเร็จตัวเบรกเกอร์จะเปลี่ยนกลับไปเป็นสถานะวงจรปิด (ปิด) มิฉะนั้นจะเปลี่ยนไปใช้สถานะเปิด (เปิด) เบรกเกอร์ของ Hystrix เป็นเหมือนฟิวส์ในวงจรบ้านของเรา เมื่อไม่สามารถใช้บริการแบ็คเอนด์เบรกเกอร์วงจรจะตัดลิงก์คำขอโดยตรงเพื่อหลีกเลี่ยงการส่งคำขอที่ไม่ถูกต้องจำนวนมากเพื่อส่งผลกระทบต่อปริมาณงานของระบบ เบรกเกอร์มีความสามารถในการตรวจจับตัวเองและกู้คืน
2. Fallingback
ทางเลือกนั้นเทียบเท่ากับการลดระดับการลดระดับ สำหรับการดำเนินการแบบสอบถามเราสามารถใช้วิธีทางเลือก เมื่อมีข้อยกเว้นเกิดขึ้นในบริการย้อนกลับที่ร้องขอค่าที่ส่งคืนโดยวิธีทางเลือกสามารถใช้ได้ ค่าส่งคืนของวิธีทางเลือกโดยทั่วไปจะถูกกำหนดโดยค่าเริ่มต้นหรือมาจากแคช
3. การแยกทรัพยากร
ใน Hystrix การแยกทรัพยากรส่วนใหญ่ทำได้ผ่านพูลเธรด โดยปกติเมื่อใช้งานเราจะแบ่งพูลหลายเธรดตามบริการระยะไกลที่เราเรียก ตัวอย่างเช่นคำสั่งที่เรียกว่าบริการผลิตภัณฑ์จะถูกวางลงในพูลเธรดและคำสั่งที่เรียกใช้บริการบัญชีจะถูกวางลงในพูลเธรด B ข้อได้เปรียบหลักของสิ่งนี้คือสภาพแวดล้อมการวิ่งถูกแยกออก ด้วยวิธีนี้แม้ว่ารหัสที่เรียกว่าบริการจะถูกบั๊กหรือพูลเธรดที่ใช้เนื่องจากเหตุผลอื่น ๆ มันจะไม่ส่งผลกระทบต่อบริการอื่น ๆ ของระบบ อย่างไรก็ตามค่าใช้จ่ายคือการรักษาพูลหลายเธรดจะนำค่าใช้จ่ายเพิ่มเติมมาสู่ระบบ หากคุณมีข้อกำหนดด้านประสิทธิภาพที่เข้มงวดและคุณมั่นใจว่าจะไม่มีปัญหากับรหัสลูกค้าที่เรียกว่าบริการคุณสามารถใช้โหมดสัญญาณของ Hystrix (สัญญาณ) เพื่อแยกทรัพยากร
การแสร้งทำเป็น hystrix
เนื่องจาก Circuit Breaker ทำงานได้เฉพาะในตอนท้ายของบริการเราจึงต้องเปลี่ยนรหัสที่เกี่ยวข้องของโครงการ Spring-Cloud-Consumer ตามรหัสตัวอย่างในบทความก่อนหน้า เนื่องจากการแสร้งขึ้นอยู่กับ Hystrix จึงไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ กับการกำหนดค่า Maven
1. ไฟล์กำหนดค่า
เพิ่มสิ่งนี้ลงใน Application.properties:
feign.hystrix.enabled = true
2. สร้างคลาสการโทรกลับ
สร้างการสืบทอดการสืบทอดคลาส Helloremotehystrix และ Helloremote เพื่อใช้การโทรกลับ
@ComponentPublic คลาส HelloremoteHyStrix ใช้ HelloRemote {@Override Public String สวัสดี (@requestparam (value = "name") ชื่อสตริง) {return "hello" +name +"ข้อความนี้ส่งล้มเหลว"; -3. เพิ่มแอตทริบิวต์ทางเลือก
เพิ่มคลาสทางเลือกที่ระบุไว้ในคลาส Helloremote และส่งคืนเนื้อหาในคลาสทางเลือกเมื่อบริการหมุนเวียน
@feignClient (name = "Spring-Cloud-Producer", fallback = helloremotehystrix.class) อินเตอร์เฟสสาธารณะ helloremote {@requestmapping (value = "/hello") สตริงสาธารณะสวัสดี (@requestparam (value = "ชื่อ") ชื่อสตริง);}}นี่คือจุดของการเปลี่ยนแปลงมันง่ายมาก
4. ทดสอบ
จากนั้นลองทดสอบเพื่อดูเอฟเฟกต์
เริ่มต้นโครงการสามโครงการ Spring-Cloud-Eureka, Spring-Cloud-Producer และ Spring-Cloud-Consumer
ป้อนในเบราว์เซอร์: http: // localhost: 9001/hello/neo
return: สวัสดีนีโอนี่เป็นข้อความแรก
หมายความว่าหลังจากเพิ่มข้อมูลที่เกี่ยวข้องกับเบรกเกอร์แล้วมันจะไม่ส่งผลกระทบต่อการเข้าถึงปกติ ต่อไปเราหยุดโครงการ Spring-Cloud-Producer ด้วยตนเองและทดสอบอีกครั้ง:
ป้อนในเบราว์เซอร์: http: // localhost: 9001/hello/neo
return: สวัสดีนีโอข้อความนี้ส่งล้มเหลว
ตามผลการส่งคืนเบรกเกอร์ได้รับการระบุสำเร็จ
รหัสตัวอย่าง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น