الحديث عن كسر دائرة SpringCloud يذكرني بكسر الدائرة في سوق الأوراق المالية العام الماضي. لقد أدركت العديد من الأوقات المؤلمة. تأثير كسر الدائرة العشوائية على النظام بأكمله كارثية. حسنًا ، دعنا نتحدث عن الأمور الخطيرة بعد ذلك.
فتيل
تأثير الانهيار
في بنية الخدمات الصغيرة ، عادة ما تكون هناك طبقات خدمة متعددة للاتصال بها. قد يؤدي فشل الخدمة الأساسية إلى فشل تتالي ، مما يؤدي بدوره إلى عدم توفر النظام بأكمله. وتسمى هذه الظاهرة تأثير Avalanche الخدمة. إن تأثير Avalanche Service هو عملية يؤدي فيها عدم توفر "مزود الخدمة" إلى عدم توفر "مستهلكي الخدمة" ويضخّة تدريجياً عدم توفر.
إذا أظهر الشكل أدناه: A هو مزود الخدمة ، فإن B هو مستهلك الخدمة لـ A و C و D هما مستهلكي الخدمة من B. عدم توفر أسباب عدم توفر B وعندما يتم توسيع عدم توفر C و D مثل كرة الثلج ، يتم تشكيل تأثير الانهيار.
الدائرة
مبدأ الصمامات بسيط للغاية ، مثل حامي التحميل الزائد للطاقة. يمكن أن تحقق فشل سريع. إذا اكتشف العديد من الأخطاء المماثلة على مدار فترة زمنية ، فسوف يجبر مكالماتها اللاحقة على الفشل بسرعة ولم تعد تصل إلى الخادم البعيد ، وبالتالي منع التطبيق من محاولة باستمرار إجراء عمليات الفشل المحتملة ، مما يتسبب في استمرار التطبيق دون انتظار تصحيح الخطأ ، أو إضاعة وقت وحدة المعالجة المركزية حتى يحدث وقت طويل. يمكن لـ FUSE أيضًا تمكين التطبيق من تشخيص ما إذا كان الخطأ قد تم إصلاحه ، وإذا تم إصلاحه ، فسيحاول التطبيق استدعاء العملية مرة أخرى.
يشبه وضع الصمامات الوكيل الذي يمكن أن يؤدي بسهولة إلى عمليات خاطئة. يمكن لهذا الوكيل تسجيل عدد الأخطاء التي حدثت في أحدث مكالمة ، ثم تقرر استخدام عملية السماح للمتابعة ، أو إرجاع الخطأ على الفور.
منطق التحويل المتبادل لمفاتيح الصمامات هو كما يلي:
الصمامات هي خط الدفاع الأخير لحماية توفر الخدمات العالية.
ميزات Hystrix
1. آلية قاطع الدائرة
من السهل فهم قاطع الدائرة. عندما تطلب الأمر من إخفاقات الخدمة الخلفية ، يتجاوز نسبة معينة (افتراضي 50 ٪) ، فإن قاطع الدائرة سوف يتحول إلى الحالة المفتوحة (مفتوحة). في هذا الوقت ، ستفشل جميع الطلبات مباشرة دون الإرسال إلى الخدمة الخلفية. بعد بقاء قاطع الدائرة في الحالة المفتوحة لفترة من الزمن (الافتراضي 5 ثوان) ، سيتم التبديل تلقائيًا إلى حالة نصف مفتوحة (نصف مفتوح). في هذا الوقت ، سيتم الحكم على حالة عودة الطلب التالي. إذا نجح الطلب ، فسيتم تبديل قاطع الدائرة إلى حالة الدائرة المغلقة (مغلقة) ، وإلا فإنه سيتم تحويله إلى الحالة المفتوحة (مفتوحة). قاطع دائرة Hystrix يشبه فتيل في دائرة المنزل. بمجرد أن تكون الخدمة الخلفية غير متوفرة ، سيتم قطع قاطع الدائرة مباشرة من رابط الطلب لتجنب إرسال عدد كبير من الطلبات غير الصالحة للتأثير على إنتاجية النظام. قاطع الدائرة لديه القدرة على الكشف عن الذات والتعافي.
2. التراجع
الاحتياطية تعادل عملية خفض. لعمليات الاستعلام ، يمكننا تنفيذ طريقة احتياطي. عندما يحدث استثناء في خدمة العودة المطلوبة ، يمكن استخدام القيمة التي يتم إرجاعها بواسطة طريقة العودة. يتم تعيين قيمة الإرجاع لطريقة التراجع عمومًا بواسطة القيمة الافتراضية أو تأتي من ذاكرة التخزين المؤقت.
3. عزل الموارد
في Hystrix ، يتم تحقيق عزل الموارد بشكل أساسي من خلال تجمعات الخيوط. عادة عند استخدامه ، نقوم بتقسيم تجمعات الخيوط المتعددة وفقًا للخدمة البعيدة التي نسميها. على سبيل المثال ، يتم وضع الأمر الذي يستدعي خدمات المنتج في مجموعة مؤشرات الترابط ، ويتم وضع الأمر الذي يستدعي خدمات الحساب في مجموعة مؤشرات الترابط B. الميزة الرئيسية لذلك هي أن البيئة الجارية معزولة. وبهذه الطريقة ، حتى إذا تم التنصت على الرمز الذي يستدعي الخدمة أو تجمع مؤشرات الترابط الذي يتم استهلاكه لأسباب أخرى ، فلن يؤثر ذلك على الخدمات الأخرى للنظام. ومع ذلك ، فإن التكلفة هي أن الحفاظ على تجمعات الخيوط المتعددة ستجلب الأداء الإضافي للنظام. إذا كان لديك متطلبات أداء صارمة وكنت متأكدًا من عدم وجود مشاكل في رمز العميل الذي يستدعي الخدمة ، فيمكنك استخدام وضع إشارة Hystrix (Semaphores) لعزل الموارد.
Feign Hystrix
نظرًا لأن Circuit Breaker لا يعمل إلا على نهاية استدعاء الخدمة ، نحتاج فقط إلى تغيير الكود ذي الصلة لمشروع المستهلك الساخن النابض بناءً على رمز المثال في المقالة السابقة. لأن Feign يعتمد بالفعل على Hystrix ، ليست هناك حاجة لإجراء أي تغييرات على تكوين Maven.
1. ملف التكوين
أضف هذا إلى application.properties:
feign.hystrix.endabled = true
2. إنشاء فئة رد الاتصال
إنشاء HelloremoteHystrix الفئة وراثي و Helloremote لتنفيذ عمليات الاسترجاعات
ComponentPublic Class HellorEmoteHyStrix تنفذ HellorEmote {Override public string hello (requestparam (value = "name") اسم السلسلة) {return "hello" +name +"، هذه الرسالة فشلت" ؛ }}3. إضافة سمة الاحتياطية
أضف فئة الاحتياط المحددة إلى فئة Helloremote ، وإرجاع المحتويات في فئة الاحتياط عندما تكون الخدمة دائرة.
feignclient (name = "spring-cloud-producer" ، FackBack = HelloremoteHyStrix.Class) الواجهة العامة Helloremote {REquestMapping (value = "/hellهذه هي نقطة التغيير ، إنها بسيطة للغاية.
4. اختبار
ثم دعونا نختبره لرؤية التأثير.
ابدأ المشاريع الثلاثة في Spring-Cloud-Eureka ، منتج زنبركية ، ومستهلك من الربيع.
أدخل المتصفح: http: // localhost: 9001/hello/neo
العودة: مرحبًا نيو ، هذه هي الرسالة الأولى
وهذا يعني أنه بعد إضافة المعلومات المتعلقة بكسرات الدائرة ، لن تؤثر على الوصول الطبيعي. بعد ذلك ، نتوقف يدويًا عن مشروع منتج الربيع النابض واختباره مرة أخرى:
أدخل المتصفح: http: // localhost: 9001/hello/neo
العودة: مرحبا نيو ، فشلت هذه الرسالة إرسال
وفقًا لنتيجة العودة ، تمت الإشارة إلى قاطع الدائرة بنجاح.
نموذج الرمز
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.