مقدمة
نستمر في البناء على الرمز من المدونات السابقة وإضافة مكونات الشريط لتوفير موازنة تحميل العميل. يعد موازنة التحميل جزءًا مهمًا من تحقيق التزامن العالي والأداء العالي والقابل للتطوير. يمكنه توزيع الطلبات على خوادم مختلفة في مجموعة لتخفيف العبء على كل خادم. يتم تشغيل موازنة تحميل العميل في برامج العميل ، مثل مشروع الويب الخاص بنا ، ثم حدد خادمًا بشكل عشوائي لإرسال الطلبات عن طريق الحصول على قائمة عنوان IP للمجموعة. بالمقارنة مع موازنة تحميل الخادم ، فإنه لا يتطلب استهلاك موارد الخادم.
البيئة الأساسية
GIT: رمز مصدر المشروع
تحديث التكوين
هذه المرة نحتاج إلى بدء برنامجين لخدمة المنتج محليًا للتحقق من موازنة التحميل ، لذلك نحتاج إلى توفير منافذ مختلفة للبرنامج الثاني. سيؤدي تكوين مركز خدمة تكوين سحابة الربيع إلى تجاوز متغيرات بيئة النظام المحلي افتراضيًا. نحتاج إلى تعيين منفذ خدمة المنتج من خلال متغيرات بيئة النظام ، لذلك نحتاج إلى تعديل ملف التكوين لخدمة المنتج في مستودع GIT Center Center.
الخادم: المنفذ: 8081Spring: Cloud: Config: السماح بالمواد الإضافية: عمليات التجاوز الحقيقية-
القيمة الافتراضية للسماح الصحيح صحيحة. كتبت ذلك لشرح ذلك. وهذا يعني أنه يُسمح لعناصر التكوين في مركز التكوين عن بُعد بالكتابة فوق التكوين المحلي ، وليس أنه يُسمح للتكوين المحلي بالكتابة فوق التكوين عن بُعد. بالطبع يمكننا تعيينه على خطأ ، ولكن لتوفير قواعد تغطية أكثر دقة ، يتم الحفاظ على القيمة الافتراضية هنا.
لقد أضفنا أن نظام التجاوز-system-properties = false ، أي ، على الرغم من أن ملف التكوين لمركز التكوين عن بُعد يمكنه كتابة التكوين المحلي ، إلا أنه لا يكتب متغيرات النظام المحلي. بعد اكتمال التعديل ، أرسله إلى مستودع GIT.
بالإضافة إلى ذلك ، أضف بعض السجلات إلى ProductController لمشروع ProductService للتحقق مما إذا كان موازنة التحميل فعالة:
package cn.zxuqian.controllers ؛ استيراد org.slf4j.logger ؛ استيراد org.slf4j.loggerfactory ؛ استيراد org.springframework.web.bind.annotation.requestmapp {private static logger log = loggerfactory.getLogger (productController.class) ؛ requestMapping (" /products) profiglist string string () {log.info (" Access to /Products Endpoint ") ؛ العودة "معطف ، سترة ، سترة ، تي شيرت" ؛ }}تكوين الشريط للويب
أضف أولا تبعيات الشريط في pom.xml:
<Rependency> <roupiD> org.springframework.cloud </groupId> <Chotifactid> Spring-Cloud-Cloud-Cloud-Netflix-Ribbon </shintifactid> </sependency>
ثم قم بتعديل فئة التطبيق وأضف الكود التالي:
enableCircuitBreaker@enableScoveryClient@RibbonClient (name = "product-service")@SpringBootApplicationPublicpublic application {public static void main (string [] args) {springapplication.run (application.class ، args) ؛ } bean@loadbalanced public resttemplate rest (restTemplateBuilder Builder) {return builder.build () ؛ }} هنا نستخدم التعليق التوضيحي @RibbonClient (name = "خدمة المنتج") لتمييز هذا المشروع كعميل موازنة تحميل الشريط. يحتاج إلى اختيار إحدى مجموعات خدمة المنتج للوصول إلى الخدمات المطلوبة. تتوافق سمة الاسم هنا مع سمة spring.application.name التي تم تكوينها في مشروع Productervice.
يشير التعليق التوضيحي applalanced إلى أنه سيتم تكوين RestTemplate لاستخدام LoadBalancerClient من Ribbon لتحديد URI للخدمة وإرسال الطلب.
نضيف الرمز التالي إلى فئة ProducterVice:
servicepublic class productervice {private final resttemplate resttemplate ؛ @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" ؛ } السلسلة العامة ProductListListalBalanced () {return this.restTemplate.getForObject ("http: // product-service/products" ، string.class) ؛ }}تمت إضافة طريقة جديدة لـ ProductListloadBalLanced هنا ، والتي يتم الوصول إليها بنفس الخدمة مثل طريقة قائمة المنتجات السابقة ، ولكنها توازن بين عميل الشريط. هنا ، أصبح مضيف URI اسم الخدمة التي سيتم الوصول إليها ، والتي تتوافق مع سمة الاسم التي تم تكوينها في RibbonClient. أخيرًا ، أضف الكود التالي في منتجنا Controller:
RestControllerPublic Class ProductController {Autowired Private Productervice ProductService ؛ requestmapping ("/products) protectlist string string () {return productervice.productlist () ؛ } @requestmapping ("/productslb") السلسلة العامة productlistlistlalanced () {return productervice.productListLoadBalanced () ؛ }}لإنشاء طريقة تعالج طلبات /productslb على وجه التحديد ، واستدعاء ProductServie لتوفير موازنة التحميل.
في هذه المرحلة اكتمل رمزنا. يبدو الرمز بسيطًا ، ولكن في الواقع تستخدم جميع التكوينات القيم الافتراضية. يوفر الشريط طرق البرمجة والتكوين لتكوين عميل الشريط. اسمحوا لي أن أعطيك مقدمة موجزة. عندما تتعمق في الشريط ، دعنا نلقي نظرة على كيفية تعديل تكوينه. يوفر الشريط التكوين التالي (الواجهة موجودة على اليسار والتنفيذ الافتراضي على اليمين):
نظرًا لأن مشروعنا يستخدم Eureka ، فإن بعض عناصر التكوين تختلف عن التنفيذ الافتراضي. على سبيل المثال ، تستخدم Eureka DiscoveryEnabledNiwsServerList بدلاً من RibbonserverList للحصول على قائمة بالخدمات المسجلة على Eureka. هناك فئة تكوين بسيطة أدناه ، من موقع الربيع الرسمي:
الطبقة العامة sayhelloconFiguration {Autowired iClientConfig RibbonClientConfig ؛ bean public iping ribbonping (iclientConfig config) {return new pingurl () ؛ } bean public irule ribbonrule (iclientConfig config) {return new AvailabilityFilteringRule () ؛ }}لن يرسل RIBBON PING للتحقق من حالة صحة الخادم افتراضيًا ، والافتراضي طبيعي. ثم يتم تنفيذ Irune باعتباره Zoneavoidancerule افتراضيًا لتجنب المنطقة مع العديد من المشكلات مع AWS EC2. هذا غير متوفر في بيئة الاختبار المحلية. ثم يتم استبداله مع التوفر filteringrule. يمكن أن يمكّن هذا وظيفة قاطع الدائرة التي تأتي مع الشريط لتصفية الخوادم التي لا تعمل بشكل صحيح.
امتحان
أولاً ، ابدأ خدمة مركز تكوين التكوينات الخاصة بنا ، ثم ابدأ تسجيل التسجيل وخدمة الاكتشاف ، ثم بدء تشغيل اثنين من المنتجات. الأول هو استخدام Spring-Boot: Run Plug-in للبدء ، والثاني هو تزويده بمنفذ جديد ، والذي يمكن أن يبدأ بالأمر التالي:
$ server_port = 8082 mvn spring-boot: Run
أخيرًا ، ابدأ مشروع عميل الويب الخاص بنا ، تفضل بزيارة http: // localhost: 8080/productslb ، ثم تحديثها عدة مرات. سترى أن Windows Lines اثنين من ProductService سيظهران بشكل عشوائي:
الوصول إلى /المنتجات نهاية المنتجات
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.