في الخدمات الصغيرة ، نقوم بتقسيم النظام إلى العديد من وحدات الخدمة ، وكل وحدة مترابطة من خلال تسجيل الخدمة واستهلاك الاشتراك. ولكن ماذا يحدث إذا كانت بعض الخدمات تعاني من مشاكل؟
على سبيل المثال ، هناك ثلاث خدمات (ABC) ، مكالمات B و B C. بسبب تأخير الشبكة أو مشاكل رمز C ، لن تحصل B على استجابة لفترة طويلة ، وبالتالي سيتم تعليق المكالمات B وانتظر.
في حالة الوصول المتزامن العالي ، لا يمكن إصدار هذه الخيوط الموقوفة ، مما تسبب في حظر الطلبات اللاحقة ، وفي النهاية ستنطلق B. عن طريق القياس ، قد يتم شنق أيضًا ، مما تسبب في تعطل النظام بأكمله.
من أجل حل المشكلة بأكملها ، تستخدم Spring Cloud Hystrix لحماية تحمل أخطاء الخدمة ، بما في ذلك سلسلة من وظائف الحماية مثل قواطع الدوائر وعزل الخيط. اليوم سوف نلقي نظرة على كيفية تنفيذ قواطع الدوائر من خلال Hystrix.
1. ما هو Spring Cloud Hystrix؟ ما هو قاطع الدائرة؟
يتم تنفيذ Spring Cloud Hystrix استنادًا إلى إطار عمل المصدر المفتوح لـ Netflix ، Hystrix ، والغرض منه هو توفير التسامح القوي للأخطاء للتقدم والفشل من خلال التحكم في تلك العقد التي تصل إلى الأنظمة والخدمات عن بُعد والأطراف الثالثة.
يشبه قاطع الدائرة قاطع دائرة التسرب المستخدم في الصندوق الكهربائي القوي في منزلنا. عندما تفشل وحدة الخدمة (على غرار الدائرة القصيرة للجهاز الكهربائي) ، يتم إرجاع استجابة الخطأ إلى المتصل من خلال وظيفة مراقبة الصدع في قاطع الدائرة (على غرار الصمام) ، وتجنب الانتظار طويل الأجل ، وبالتالي منع الخطأ من الانتشار إلى النظام بأكمله.
2. إذا لم يكن هناك قاطع دائرة ، فإن عرض الصفحة
هل ما زلت تتذكر الخدمات الثلاث في سلسلة SPRING Cloud Introduction Series 2: استخدام Eureka لإدارة الخدمة (Eureka/Hello-Service/Hello-Consumer) كتبنا سابقًا؟ نجري تجارب بناء على هذا.
1. ابدأ مركز تسجيل خدمة Eureka برقم المنفذ 1111
2. ابدأ مزود خدمة Hello-Service. هنا نبدأ خدمتين ، مع أرقام الموانئ 9090 ، 9091 على التوالي.
3. ابدأ Hello-Consumer لخدمة المستهلكين ، مع رقم المنفذ 9999 ؛ في هذا الوقت ، ليس لدينا مشكلة في زيارة http: // localhost: 9999/hello-consumer عدة مرات.
4. قم بإيقاف تشغيل الخدمة برقم المنفذ 9091 ، ثم قم بزيارة http: // localhost: 9999/hello-consumer عدة مرات ، وتم الإبلاغ عن خطأ.
ملاحظة: هنا نوضح لماذا نحتاج إلى الوصول عدة مرات ، لأننا حققنا موازنة الحمل من خلال الشريط. عندما نصل إلى http: // localhost: 9999/hello-consumer ، سنقوم بالاستطلاع لخدمتين تصل إلى خدمة Hello-Service. سيتم الإبلاغ عن خطأ عند الوصول إلى خدمة مع رقم المنفذ 9091. لن تكون هناك مشكلة في الوصول إلى خدمة مع 9090.
3. تنفيذ رمز قاطع الدائرة
بعد ذلك ، دعونا نلقي نظرة على كيفية تنفيذ الرمز. لا نقوم بتعديل مركز تسجيل الخدمة ومزود الخدمة ، نحتاج فقط إلى تعديل مستهلك الخدمة Hello-Consumer.
1. تعديل ملفات POM وتقديم تبعيات Hystrix
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/xsd/maven-4.0.0.xsd "> <Dodeversion> 4.0.0 </modelversion> <roupiD> com.sam </rougiD> <ContifactId> hello-consumer </stifactid <roughid> org.springframework.boot </rougiD> <StifactId> Spring-boot-starter-parent </shintifactid> <الإصدار> 1.5.1.Release </version> </parent> <PereTies> <javaversion> 1.8 </javaversion> <roupl> org.springframework.cloud </groupId> <StifactId> تعتمد على السحابة الزبدية </insifactid> <sople> camden.sr6 </version> <type> pom </type> <scope> الاستيراد </scope> <roupl> org.springframework.cloud </groupId> <Stifactid> spring-cloud-starter-eureka </artifactid> </premined> <!-يتم استخدام تبعية الشريط لتنفيذ موازنة التحميل. نحن فقط نستخدمه هنا ولن نقدمه في مكان آخر-> <redency> <roupend> org.springframework.cloud </groupId> <StifactId> <StifactId> spring-cloud-starter-hystrix </shintifactid> </reperence> </perendencies> </project>
2. قم بتعديل فئة بدء التشغيل ، وأضف EnoBleCircuitBreaker ، وتمكين قاطع الدائرة
enableScoveryClient@springbootapplication@enableCircuitBreakerPublic class consumerapp {//@bean يتم تطبيقه على الطريقة ويستخدم لتعيين قيمة إرجاع الطريقة لتكون bean@loadbalanced //@loadbalanced لتحقيق موازنة التحميل resttemplate () {resttemprate () } public static void main (string [] args) {springapplication.run (consumerapp.class ، args) ؛ }}في هذا الوقت ، ستجد أن فئة بدء التشغيل هذه لديها ثلاثة تعليقات توضيحية. أليس هذا مزعجًا جدًا؟ لا يهم ، يمكننا استخدام التعليق التوضيحي @springcloudapplication
springCloudapplicationPublicpublic Class ConsumerApp {// @bean يتم تطبيقه على الطريقة ويستخدم لتعيين قيمة إرجاع الطريقة لتكون bean @loadbalanced // @loadbalanced لتحقيق موازنة التحميل public RestTemplate () {return resttemplate () ؛ } public static void main (string [] args) {springapplication.run (consumerapp.class ، args) ؛ }}springCloudapPlication = enabledCoveryClient +@SpringBootApplication +@enableCircuitBreaker ، يمكنك أن ترى من رمز المصدر:
target (elementType.type) reception (attreencepolicy.runtime)@موثقة@ويرث@springbootapplication@enableScoveryClient@enableCircuitBreakerPublic interface springCloudapplication {}3. خدمة
ServicePublic Class Classervice {autowired restTemplate restTemplate ؛ @HystrixCommand (frobrbackMethod = "errormsg") السلسلة العامة المستهلك () {// استدعاء خدمة Hello-Service ، لاحظ أن اسم الخدمة يستخدم هنا ، وليس IP+Port RestTemplate.getForObject ("http: // hell-service/hello" ، string.class) ؛ العودة "مرحبا المستهلك الانتهاء !!!" ؛ } سلسلة errormsg () {return "خطأ !!!" ؛ }}نضع تنفيذ وحدة التحكم الأصلية لاتصال RestTemplate في الخدمة ، وحدد طريقة رد الاتصال من خلال HystrixCommand ، واتصل بهذه الطريقة عند حدوث خطأ.
4. تعديل وحدة التحكم
/** *لم يعد يتم استدعاء RestTemplate مباشرة هنا ، ولكن يتم تنفيذه عن طريق الاتصال بالخدمة * */ @restControllerPublic Class ClasseRoller { @AutoWired // RestTemplate RestTemplate ؛ خدمة الخدمات المستهلك ؛ requestmapping ("/hello-consumer") السلسلة العامة Helloconsumer () {// // اتصل بخدمة Hello-Service ، لاحظ أن اسم الخدمة يستخدم هنا ، وليس IP+Port // RestTemplate.getForObject ("http: // hell-service/hello" ، string.class) ؛ return service.consumer () ؛ }}5. اختبار ، زيارات متعددة ، وعندما يتم الإبلاغ عن خطأ ، سيتم عرض المحتوى التالي.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.