مقدمة
يوفر Spring Cloud مكتبة Hystrix التي تتحمل الأخطاء لتنفيذ استراتيجية تخفيض للأساليب التي تم تكوينها باستخدام قواطع الدوائر عندما تكون الخدمة غير متوفرة وتتصل مؤقتًا من الطرق البديلة. ستنشئ هذه المقالة Microservice منتجًا ، وتسجيلها في مركز تسجيل خدمة Eureka ، ثم نستخدم واجهة برمجة تطبيقات وصول عميل ويب للوصول/المنتجات للحصول على قائمة المنتجات ، وعندما تفشل خدمة المنتج ، يتم استدعاء طريقة الاستعداد المحلي للجراحة ولكن تقديم الخدمة بشكل طبيعي.
البيئة الأساسية
GIT: رمز مصدر المشروع
إضافة خدمات المنتج
قم بإنشاء مشروع Maven جديد في Intellij ، باستخدام التكوين التالي
ثم أضف الكود التالي في pom.xml:
<؟ XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 <soph> 1.0-snapshot </version> <parent> <roupiD> org.springframework.boot </groupId> <StifactId> spring-boot-starter-parent </artifactId> <soph> 2.0.1.release </version> </interparties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </java.version> </properties> <ependencies> <reperence> <roupend> org.springframework.cloud </rougeid> </reperency> <reperency> <rougiD> org.springframework.cloud </rougeid> <StifactId> زنبرك النجوم السحرية </inchifactid> </dependency> <redenced> <roupiD> org.springframework.boot </groupid> <roupl> org.springframework.boot </groupId> <StifactId> Spring-boot-starter-test </artifactid> <scope> اختبار </scope> </respency> </respendency <StifactId> تعاني من السحابة الزنبركية </artifactid> <erse> finchley.m9 </version> <type> pom </type> <scope> استيراد </scope> </sependency> </repreadency <StifactId> Spring-boot-maven-plugin </shintifactid> </spliexin> </plugins> </buys> <spositories> <ropository> <id> spring-milestones </id> <name> milestones </name> <uceded> false </texuped> </sflishots> </ropository> </ropository> </spositories> </project>
واصلنا استخدام النجمة الهادئة النجمية-نيتفيكا-كاينتا-العميل لتمكين المنتج والخدمة لتسجيلها تلقائيا مع خدمات Eureka. ثم يتم استخدام CONFIG النجمة الربيعية أيضًا لقراءة ملف التكوين لمركز خدمة التكوين. هذا المشروع هو مجرد مشروع ويب ربيع بسيط.
قم بإنشاء ملف bootstrap.yml ضمن SRC/Main/Resources وأضف المحتوى التالي:
الربيع: التطبيق: الاسم: سحابة خدمة المنتج: التكوين: URI: http: // localhost: 8888
قم بإنشاء ملف خدمة المنتج.
الخادم: المنفذ: 8081
يحدد هذا التكوين أن منفذ خدمة المنتج هو 8081. ثم قم بإنشاء فئة التطبيق وإضافة الرمز التالي:
Package Cn.zxuqian ؛ استيراد org.springframework.boot.SpringApplication ؛ استيراد org.springframework.boot.autoconfigure.springbootapplication ؛ static void main (string [] args) {springapplication.run (application.class ، args) ؛ }}سيقوم enablediscoveryclient enountation بتوجيه Spring Cloud إلى تسجيل هذه الخدمة تلقائيًا مع Eureka. أخيرًا ، قم بإنشاء وحدة تحكم Cn.zxuqian.controllers.ProductController ، وتوفير /منتجات API ، وإرجاع بيانات العينة:
package cn.zxuqian.controllers ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.restController ؛ restControllerpublic class classcontroller تي شيرت "؛ }}
تكوين عميل الويب
افتح مشروع الويب الذي أنشأناه مسبقًا وأضف تبعية Hystrix جديدة إلى pom.xml:
<Rependency> <roupiD> org.springframework.cloud </groupId> <Chotifactid> Spring-Cloud-Cloud-Netflix-Hystrix </shintifactid> </sependency>
ثم قم بتحديث رمز فئة التطبيق:
حزمة cn.zxuqian ؛ استيراد org.springframework.boot.springapplication ؛ استيراد org.springframework.boot.autoconfigure.springbootapplication org.springframework.cloud.circuitbreaker.enableCircuitBreaker ؛ استيراد org.springframework.cloud.client.disvory.enablediscoveryclient ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.web.client.restTemplate ؛@enableCircuitBreaker@enableScoveryClient@SpringBootApplicationPublicPublicpublic {public static void main (string [] args) {springapplication.run (application.class ، args) ؛ } bean public resttemplate rest (restTemplateBuilder Builder) {return builder.build () ؛ }}هنا ، يتم استخدام enableCircuitBreaker لتمكين وظيفة قاطع الدائرة ، ثم يتم إضافة طريقة REST ويتم استخدام التعليق التوضيحي bean. هذا الجزء ينتمي إلى وظيفة حقن التبعية في الربيع. ستخبرك الطريقة باستخدام علامة bean كيفية تهيئة هذه الكائنات. على سبيل المثال ، في هذا المثال ، باستخدام RestTemplateBuilder لإنشاء كائن RestTemplate ، والذي سيتم استخدامه لاحقًا في الخدمة باستخدام قاطع الدائرة.
إنشاء فئة cn.zxuqian.service.productservice وأضف الكود التالي:
package cn.zxuqian.services ؛ استيراد com.netflix.hystrix.contrib.javanica.annotation.hystrixCommand ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.cloud.client.discovery.discoveryClient ؛ استيراد org.springframework.stereotype.service ؛ استيراد org.springframewework.web.client.resttemplate ؛ استيراد java.util.list ؛ servicepublic productervice @autowired discoveryclient discoveryclient ؛ Public ProductService (restTemplate RestTemplate) {this.restTemplate = restTemplate ؛ } hystrixCommand (stropbackMethod = "backupproductlist") proform productlist () {list <ServicinStance> مثيلات = this.dissoveryclient.getInstances ("Service-Service") ؛ if (مثيلات! = null && desances.size ()> 0) {return this.restTemplate.getForObject (instances.get (0) .geturi () + "/products" ، string.class) ؛ } يعود ""؛ } السلسلة العامة backupproductlist () {return "Jack ، Sweater" ؛ }} سبب إنشاء فئة خدمة هو أنه لا يمكن استخدام Hystrix إلا في الفصول التي تم وضع علامة عليها أو component ، بحيث يمكن استخدام واجهة برمجة التطبيقات التي توفرها سياق الربيع بشكل طبيعي. سيتم شرح هذا لاحقًا عندما تعمق في الربيع.
بعد استخدام التعليق التوضيحي لـ HystrixCommand ، ستقوم Hystrix بمراقبة الطريقة المشروحة ، وهي قائمة المنتج (الطبقة الأساسية تلتف هذه الطريقة لتحقيق المراقبة). بمجرد أن تتراكم أخطاء هذه الطريقة إلى حد معين ، سيتم بدء قاطع الدائرة. ستفشل جميع الطلبات اللاحقة للاتصال بطريقة قائمة المنتج ، وسيتم تسمية الطريقة المحددة حسب FrackBackMethod مؤقتًا ، ثم عندما تعود الخدمة إلى طبيعتها ، سيتم إغلاق قاطع الدائرة.
في هذه الفئة ، نستخدم أيضًا DiscoveryClient للعثور على عنوان URI لخدمة المنتج ، واستخدام قيمة spring.Application.NAME CONFIGURION ITEM لخدمة المنتج ، أي أن خدمة المنتج يتم تمريرها إلى طريقة discoveryclient.getInstances () كخدمة serviceid ، ثم سيتم إرجاع القائمة. نظرًا لأن لدينا خدمة منتج واحدة فقط ، نحتاج فقط إلى أخذ عنوان URI في المقام الأول.
ثم نستخدم RestTemplate للوصول إلى واجهة برمجة التطبيقات لخدمة المنتج. لاحظ أن حقن مُنشئ Spring يتم استخدامه هنا ، أي أن الطريقة التي قمنا بتوضيحها باستخدام bean سيتم استخدامها لتهيئة متغير RestTemplate دون تهيئته يدويًا. توفر فئة RestTemplate طريقة getForObject () للوصول إلى واجهات برمجة تطبيقات REST الأخرى ولف النتائج في نموذج كائن. المعلمة الأولى هي عنوان URI الخاص بـ API المراد الوصول إليه ، والمعلمة الثانية هي نوع النتيجة التي تم الحصول عليها. هنا نعيد السلسلة ، لذلك نمررها إلى String.Class.
تقوم طريقة backupproductlist () بإرجاع معلومات قائمة المنتج التي تم تخفيضها.
أخيرًا ، قم بإنشاء وحدة تحكم cn.zxuqian.controllers.productController وأضف الكود التالي:
package cn.zxuqian.controllers ؛ استيراد cn.zxuqian.services.productService ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.web.bind.annotation.requestmapp org.springframework.web.bind.annotation.restController ؛ @RestControllerPublic Class ProductController {autowired private productervice productervice ؛ requestmapping ("/products) protectlist string string () {return productervice.productlist () ؛ }} هنا ، استخدم ProductService لتوفير بيانات لمسار /المنتجات.
امتحان
أولاً ، نستخدم Spring-Boot: Run Plug-in لبدء خدمة مركز التكوين ، خادم التكوين ، ثم ابدأ Eureka-Server ، ثم ابدأ خدمة المنتج ، وأخيراً بدء عميل الويب. انتظر لفترة من الوقت قبل تسجيل خدمة Eureka بنجاح وزيارة http: // localhost: 8080/products. في ظل الظروف العادية ، سنحصل على نتيجة سترة ، سترة ، سترة ، وقميص. ثم نغلق خدمة المنتج ، ثم نصل إلى نفس المسار ، وسنحصل على نتيجة لخفض التصنيف: سترة ، سترة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.