1: Hystrix คืออะไร
ในสภาพแวดล้อมแบบกระจายการพึ่งพาบริการจำนวนมากอาจล้มเหลวอย่างหลีกเลี่ยงไม่ได้ Hystrix เป็นไลบรารีที่ช่วยให้คุณควบคุมการมีปฏิสัมพันธ์ระหว่างบริการแบบกระจายเหล่านี้โดยการเพิ่มความทนทานต่อเวลาแฝงและตรรกะการทนต่อความผิดพลาด Hystrix ปรับปรุงความยืดหยุ่นโดยรวมของระบบโดยการแยกจุดเชื่อมต่อระหว่างบริการหยุดความล้มเหลวแบบเรียงซ้อนกันระหว่างและให้ตัวเลือกทางเลือก
Hystrix ได้รับการออกแบบให้ทำสิ่งต่อไปนี้
1: ให้การป้องกันและควบคุมเวลาแฝงและความล้มเหลวสำหรับการพึ่งพาที่เข้าถึงได้ผ่านไลบรารีไคลเอนต์บุคคลที่สาม (โดยปกติผ่านเครือข่าย)
2: แยกความล้มเหลวของ cascading ในระบบกระจายที่ซับซ้อน
3: ตรวจจับความผิดอย่างรวดเร็วและกู้คืนโดยเร็วที่สุด
4: ย้อนกลับและลดระดับอย่างสง่างามที่สุด
5: เปิดใช้งานการตรวจสอบแบบเรียลไทม์การแจ้งเตือนและการควบคุมการปฏิบัติงาน
2: ทำไมคุณถึงต้องการ Hystrix?
ในระบบกระจายขนาดใหญ่ไคลเอนต์หรือบริการขึ้นอยู่กับบริการภายนอก หากบริการหยุดทำงานเราจะตั้งเวลาการหมดเวลาระบบการโทรบริการซึ่งจะส่งผลกระทบต่อเวลาที่สอดคล้องกันอย่างหลีกเลี่ยงไม่ได้ ในกรณีของการเกิดขึ้นพร้อมกันสูงพูลเธรดของเซิร์ฟเวอร์ส่วนใหญ่จะถูกบล็อก (บล็อก) ซึ่งมีผลต่อความเสถียรของบริการออนไลน์ทั้งหมด
(รูปภาพอย่างเป็นทางการของภาพถ่าย)
เมื่อทุกอย่างมีสุขภาพดีคำขออาจมีลักษณะเช่นนี้
เมื่อหนึ่งในระบบบริการแบ็กเอนด์จำนวนมากลดลงผู้ใช้ทั้งหมดจะร้องขอ:
หากลูกค้าหลายรายเรียกบริการข้อยกเว้นเดียวกันสถานการณ์จะเกิดขึ้น:
3: Hystrix แก้ปัญหาอะไร?
แอปพลิเคชันในสถาปัตยกรรมแบบกระจายมีการพึ่งพาหลายสิบครั้งและการพึ่งพาแต่ละครั้งจะมีข้อยกเว้นในบางจุดอย่างหลีกเลี่ยงไม่ได้ หากแอปพลิเคชันไม่ได้แยกออกจากความล้มเหลวภายนอกเหล่านี้การบล็อกพูลเธรดอาจเกิดขึ้นทำให้ระบบหิมะถล่ม
ตัวอย่างเช่นสำหรับแอปพลิเคชันที่พึ่งพาบริการ 30 บริการแต่ละบริการมีเวลาทำงานอยู่ที่ 99.99%คุณสามารถ:
99.99% ของพลังงาน 30 = 99.7% uptime
0.3% ของคำขอ 1 พันล้านครั้ง = 3,000,000 ความล้มเหลว
2+ ชั่วโมงหยุดทำงาน/เดือนแม้จะมีการพึ่งพาทั้งหมด
เมื่อใช้ Hystrix สำหรับการแตกของวงจรการพึ่งพาแต่ละครั้งจะถูกแยกออกจากกันโดย จำกัด การอุดตันเมื่อเกิดความล่าช้า
สี่: Hystrix รวมกับ Feign
สร้างโครงการ EUREKA_FEIGN_HYSTRIX_Client
เนื้อหาไฟล์ pom.xml
<การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Feign </artifactid> </dependency> <predency> <RoupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </ArtifactId> </serpendency> <perdency> <sderndency> <RoupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-test </artifactid> <pope> ทดสอบ </cope> </perdency> </percterencies> <ArtIfactId> Spring-Cloud-Dependencies </artifactid> <sersion> Brixton.sr5 </version> <ply> pom </peple> <pope> นำเข้า </cope> </predency>
สร้างไฟล์เริ่มต้น
FeignhystrixApplication
@springbootapplication@enablediscoveryclient@enablefeignclientspublic คลาส feignhystrixapplication {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {springapplication.run (feignhystrixapplication.class, args); -ชั้นเรียน userclient
@feignClient (value = "biz-service-0", fallback = userclienthystrix.class) อินเตอร์เฟสสาธารณะ userclient {@requestmapping (method = requestmethod.get, value = "/getuser") ผู้ใช้สาธารณะ getUserInfo (); @RequestMapping (method = requestMethod.get, value = "/getUser") สตริงสาธารณะ getUserInFOSTR (); @RequestMapping (method = requestMethod.get, value = "/info") ข้อมูลสตริงสาธารณะ ();}สร้างคลาสแฟลชเบรกเกอร์ userclienthystrix
@ServicePublic คลาส USERCLIENTHYSTRIX ใช้ USERCLIENT {@Override ผู้ใช้สาธารณะผู้ใช้ GetUserInfo () {โยน nullpointerexception ใหม่ ("ผู้ใช้ getUserInfo () บริการไม่พร้อมใช้งาน .. "); } @Override Public String getUserInFOSTR () {return "userClienthyStrix getUserInFOSTR () เป็นบริการทางเลือกไม่พร้อมใช้งาน .. "; } @Override Public String Info () {return "USERCLIENTHYSTRIX INFO () เป็นบริการทางเลือกไม่พร้อมใช้งาน .. "; -เมื่อมีข้อยกเว้นเกิดขึ้นในเครือข่ายมันอาจข้ามไปยังคลาสการใช้งานโดยตรงที่นี่
สร้างคลาสแอ็คชั่น
usercontroller
@autowired userclient userclient; @RequestMapping (value = "/getUserInfo", method = requestMethod.get) ผู้ใช้สาธารณะ getUserInfo () {return userClient.getUserInfo (); } @RequestMapping (value = "/getUserInFoStr", method = requestMethod.get) สตริงสาธารณะ getUserInfOSTR () {return userClient.getUserInfOSTR (); } @RequestMapping (value = "/info", method = requestMethod.get) ข้อมูลสตริงสาธารณะ () {return userClient.info (); -เริ่มต้นโครงการ: โครงการ Eureka_register_service (ลงทะเบียนศูนย์)
จากนั้นเรียกใช้ FeignhystrixApplication ที่เราเขียน
ในเวลานี้เราพบว่าบริการ biz-service-0 ไม่ทำงานดังนั้นเราจึงเปิด http://127.0.0.1:8005/getuserinfostrtr
ปรากฏ
USERCLIENTHYSTRIX GETUSERINFOSTR () เป็นทางเลือกไม่สามารถใช้บริการได้ -
นี่คือผลการส่งคืนวงจรที่กำหนดเองของเรา
หากคุณไม่จำเป็นต้องทำลายหน้าเว็บสิ่งนี้จะปรากฏขึ้น
แอปพลิเคชันข้อผิดพลาดของ Whitelabel ไม่มีการแมปอย่างชัดเจนสำหรับ /ข้อผิดพลาดดังนั้นคุณจะเห็นว่าสิ่งนี้เป็นทางเลือกเมื่อวันที่ 22 มีนาคม 14:32:21 CST 2017 มีข้อผิดพลาดที่ไม่คาดคิด (ข้อผิดพลาดของเซิร์ฟเวอร์ภายในสถานะ = 500)
ที่อยู่รหัส: https://github.com/zhp8341/springclouddemo
ฉันยังได้อ่านหลักการที่เกี่ยวข้องกับ Hystrix เนื่องจากฉันยังไม่ได้อ่านพวกเขาทั้งหมดฉันยังไม่ได้เขียนพวกเขา บทความนี้ขึ้นอยู่กับการใช้และการเรียนรู้ของ Feign
หากคุณสนใจคุณสามารถตรวจสอบรายละเอียด Hystrix อย่างเป็นทางการ แต่มันดูยากเล็กน้อย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น