وضع الكسارة curcuit
في البيئات الموزعة ، وخاصة في الأنظمة الموزعة مع هياكل الخدمات الدقيقة ، من الشائع جدًا أن يستدعي نظام برمجي واحد نظامًا آخر عن بُعد. قد يكون Callee من هذه المكالمة عن بُعد عملية أخرى ، أو مضيف آخر عبر الشبكة. الفرق الأكبر بين هذه المكالمة عن بُعد والدعوة الداخلية للعملية هو أن المكالمة عن بُعد قد تفشل أو تعلق دون أي استجابة حتى المهلة. والأسوأ من ذلك ، إذا استدعى العديد من المتصلين نفس الخدمة المعلقة ، فمن المحتمل جدًا أن ينتشر انتظار المهلة للخدمة بسرعة إلى النظام الموزع بأكمله ، مما تسبب في سلسلة رد فعل ، وبالتالي يستهلك كمية كبيرة من الموارد للنظام الموزع بأكمله. قد يؤدي في النهاية إلى شلل النظام.
يتمثل وضع قاطع الدائرة في منع الكوارث الناتجة عن تفاعل السلسلة الشبيه بالشلال في الأنظمة الموزعة.
بمجرد أن يعاني جهاز كهربائي معين من مشاكل ، فإن فتيل الدائرة سوف ينفجر لمنع الكارثة. قواطع الدوائر تشبه الصمامات الدائرة. فكرة التنفيذ بسيطة للغاية. يمكنهم تغليف الخدمات عن بُعد التي تحتاج إلى حماية ومراقبة عدد الفشل داخليًا. بمجرد أن يصل عدد الإخفاقات إلى حد معين ، ستعود جميع المكالمات اللاحقة إلى الخدمة مباشرة إلى الخطأ إلى المتصل بعد اعتراض قاطع الدائرة ، ولن تستمر في الاتصال بالخدمة التي واجهت بالفعل مشاكل ، وبالتالي تحقيق الغرض من حماية المتصل. لن يختبر النظام بأكمله رد فعل سلسلة الشلال الناجم عن المهلة.
1. الوضع الأساسي
الشكل أعلاه هو بنية قاطع الدائرة (قاطع كيركويت) ، والتي لها دولتين أساسيتين (قريبة ومفتوحة) وإجراء رحلة أساسية:
في الحالة القريبة ، يطلب العميل الخدمة للمورد مباشرة من خلال قاطع الدائرة دون أي عقبات. يتم إرجاع قيمة الإرجاع للمورد مباشرة إلى العميل بواسطة قاطع الدائرة.
في الحالة المفتوحة ، بعد أن يبدأ العميل طلب خدمة إلى المورد ، لن يقوم قاطع الدائرة بنقل الطلب إلى المورد ، ولكنه سيعيد مباشرة العميل ، ويتم كسر المسار بين العميل والمورد.
الرحلة: في الحالة القريبة ، إذا استمر المورد في وقت الخروج والخطأ ، بعد الوصول إلى العتبة المحددة ، ستحدث الرحلة في قاطع الدائرة ، ثم ستدخل حالة قاطع الدائرة من الإغلاق.
2. الوضع الموسع
في وضع قاطع الدائرة الأساسي ، يضمن عدم استدعاء قاطع الدائرة عندما يكون قاطع الدائرة في الحالة المفتوحة ، لكننا نحتاج أيضًا إلى إجراءات إضافية لإعادة تعيين قاطع الدائرة بعد استعادة المورد للخدمة. تتمثل إحدى الطرق الممكنة في اكتشاف ما إذا كانت خدمة المورد تم استعادةها ، وبمجرد استعادتها ، يتم إغلاق الحالة. حالة محاكاة قاطع الدائرة نصف مفتوحة.
3. استخدم مناسبات لقواطع الدوائر:
المورد عموما مستقر جدا. في حالة حدوث فشل ما ، يستغرق وقت التفتيش والاسترداد وقتًا طويلاً ولا يمكن إصلاحه بسرعة في وقت قصير ، فإن هذه الخدمة أكثر ملاءمة لاستخدام وضع قاطع الدائرة. خلاف ذلك ، من المحتمل أن يؤدي إلى تأثير بينغ بونج.
3. قاطع الدائرة غير مناسب للمناسبات:
لمنع تطبيق ما من محاولة استدعاء خدمة عن بُعد أو الوصول إلى مورد مشترك ، قد لا يكون هذا النمط مناسبًا إذا كان من المحتمل جدًا أن تفشل العملية.
لمعالجة تطبيقات الوصول إلى الموارد المحلية المخصصة ، مثل هياكل البيانات داخل الذاكرة. في هذه البيئة ، لا يكون من المناسب عادةً ، وسيؤدي استخدام قاطع الدائرة إلى زيادة حجم النظام.
فيما يلي مقدمة مباشرة عن كيفية استخدام قاطع دائرة Spring Cloud.
ينفذ SpringCloud Netflix اسم مكتبة قاطع الدائرة تسمى Hystrix. تحت بنية الخدمات المجهرية ، عادة ما تكون هناك مستويات متعددة من مكالمات الخدمة. فيما يلي مخطط تخطيطي للمستعرض الذي يصل إلى الخدمات المجهرية الخلفية من خلال API تحت بنية الخدمات الدقيقة:
قد يؤدي فشل مهلة الخدمات المجهرية إلى تفاعل سلسلة الشلال. في الشكل أدناه ، يمنع Hystrix هذا من حدوث ذلك من خلال قاطع دائرة التغذية المرتدة.
الخدمة B في الشكل تفشل لسبب ما وتصبح غير متوفرة. جميع المكالمات للخدمة ب سوف الوقت خارج. عندما تفشل المكالمة إلى B في الوصول إلى عتبة محددة (تحدث 20 فشلًا في غضون 5 ثوان ، تكون القيمة الافتراضية المحددة بواسطة Hystrix) ، وسيكون الرابط في الحالة المفتوحة ، ومن ثم لن يتم تنفيذ جميع المكالمات إلى الخدمة B ، بدلاً من ذلك ، فإن رسالة استرجاع تشير إلى الرابط المفتوح المقدم من قاطع الدائرة. يوفر Hystrix آلية مقابلة تسمح للمطورين بتحديد رسالة Fallbak هذه.
يمنع ارتباط Open خطأ في الشلال ، مما يتيح للخدمات التي غمرتها الفيضانات أو لديها وقت لإصلاحه. يمكن أن يكون هذا الاحتياطي مكالمة هايستريكس محمية أخرى أو بيانات ثابتة أو قيمة خالية قانونية. يمكن أن تشكل الاحتياطات بنية سلسلة ، وبالتالي فإن أول احتياطي يدعو خدمات الأعمال الأخرى في الأسفل لإرجاع البيانات الثابتة.
بعد ذلك ، دعنا نصل إلى هذه النقطة ، مع إضافة قاطع الدائرة إلى مجموعات خدمة Hello World السابقة لمنع أحد Hello World من الركود ، مما تسبب في فشل النظام في سلسلة المهلة.
1. أضف مكتبة Hystrix لدعم قواطع الدوائر في مشروع POM.xml من مشروع Maven (شريط الشريط أو Feign الذي تم تقديمه في الفصل السابق)
<Rependency> <roupiD> org.springframework.cloud </groupId> <CrintifactId> spring-cloud-starter-hystrix </shintifactid> </premed>
2. استخدم قواطع الدوائر في تطبيقات الشريط
1). أضف enableCircuitBreaker تعليقًا على فئة بدء تشغيل Boot Spring
@SpringBootApplication@enableScoveryClient@enableCircuitBreakerPublic Class Serviceribbonapplication {public static void main (string [] args) {springapplication.run (serviceribbonapplication.class ، args) ؛ }2). توضيح طريقة الوصول إلى الخدمات مع @HystrixCommand التعليق التوضيحي
servicepublic class helloService {autowired restTemplate restTemplate ؛ @hystrixCommand (frackBackMethod = "serviceFailure") السلسلة العامة gethellocontent () {resttemplate.getForObject ("http: // service-helloworld/" ، string.class) ؛ } السلسلة العامة ServiceFailure () {return "Hello World Service غير متوفر!" ؛ }}يحدد شرح HystrixCommand قاطع الدائرة الذي يلف طريقة Gethellocontant (). عندما تفشل خدمة الخدمة التي تصل إلى الخدمة في الوصول إلى العتبة ، لن يتم استدعاء Service-Helloworld. بدلاً من ذلك ، فإنه يعيد Method ServiceFaileure () المحددة بواسطة FrackBackMethod. هناك نقطتان تحتاج إلى إيلاء اهتمام خاص عند تحديد طريقة FrosrbackMethod التي حددها @HystrixCommand التعليق التوضيحي:
أولاً ، يجب أن تكون قيمة الإرجاع ونوع المعلمة من FrackBackMethod هي نفسها تمامًا مثل الطريقة التي تم توضيحها بواسطة HystrixCommand. خلاف ذلك ، سيتم طرح استثناء في وقت التشغيل. على سبيل المثال ، في هذا المثال ، فإن قيمة إرجاع ServiceFailure () وقيمة إرجاع طريقة Gethellocontant () هما سلاسلان.
ثانياً ، عندما تفشل الخدمة الأساسية ، لا تحل FrobrbackMethod محل الطريقة بأكملها التي تم شرحها بواسطة HystrixCommand (Gethellocontant في هذا المثال) ، ولكن فقط الخدمة المحددة التي تم الوصول إليها من خلال RestTemplate. يمكنك أن ترى من إخراج النظام أنه حتى لو فشل ، فسيظل هناك "خدمة مكالمات صفراء" في إخراج وحدة التحكم.
ابدأ خدمة Eureka ، وابدأ فقط في خدمتين من HelloWorld ، ثم تقاطع أحدهما (محاكاة واحدة من الخدمات الدقيقة المعلقة) ، تفضل بزيارة http: // localhost: 8901/ثم تحديثها ، بسبب موازنة التحميل ، يمكنك رؤية الصفحتين التاليتين تظهر بالتناوب. يمكنك أن ترى أن الخدمة الثانية المعلقة يتم استبدالها بطريقة معالجة الأخطاء المحددة في الشريط.
4. استخدم قواطع الدوائر في تطبيقات التظاهر
1). يدعم Feign بالفعل قواطع الدوائر ، لذلك لا تحتاج إلى التفكير في طريقة RIBBON ، إضافة تعليقات توضيحية إضافية إلى فئة بدء تشغيل SPRING BOOT.
2). أضف فئة احتياطية مع @VeIgnClient enoutation ، والتي يجب أن تنفذ الواجهة المعدلة بواسطة feignclient.
feignclient (name = "service-helloworld" ، FackBack = HelloWorLdServiceFailure.Class) الواجهة العامة HelloWorLdService {REquestMapping (value = "/" ، method = requestMethod.get) public string salehello () ؛ }3). لإنشاء فئة HelloWorldServiceFailure ، يجب عليك تنفيذ واجهة HelloWorldService المعدلة بواسطة @VeignClient. لاحظ أنك تضيف @component أو التعليق التوضيحي service لإنشاء حبة في حاوية الزنبرك.
@componentpublic class helloworldservicefailure تنفذ helloWorldService {Override public string salehello () {system.out.println ("Hello World Service غير متوفرة!") ؛ العودة "Hello World Service غير متوفرة!" ؛ }}4). في إصدارات Brixton قبل Spring Cloud ، قام Feign تلقائيًا بتنشيط قاطع الدائرة افتراضيًا ، لكن إصدار Dalston الأخير قد غير التكوين الافتراضي إلى حظر.
لأسباب ، يرجى الرجوع إلى: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277. انتبه إلى هذه النقطة. لذلك ، لاستخدام قواطع الدوائر في Feign ، يجب عليك إضافة التكوين التالي في Application.yml:
Feign: Hystrix: تمكين: صحيح
5). قم بتشغيل تطبيق Feign وقم بزيارة http: // localhost: 8902/hello لرؤية نفس تأثير الشريط.
المرجع: 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 أكثر.