1: ما هو الشريط؟
الشريط هو مشروع مفتوح المصدر أصدره Netflix. تتمثل وظيفتها الرئيسية في توفير خوارزميات موازنة تحميل البرامج من جانب العميل لتوصيل خدمات Netflix المتوسطة معًا. يوفر مكون عميل الشريط سلسلة من عناصر التكوين الكاملة مثل مهلة الاتصال ، وإعادة المحاولة ، وما إلى ذلك. ببساطة ، هو سرد جميع الآلات وراء Load Balancer (LB لفترة قصيرة) في ملف التكوين. سيساعدك Ribbon تلقائيًا على توصيل هذه الآلات بناءً على قواعد معينة (مثل الاقتراع البسيط ، والاتصال الفوري ، وما إلى ذلك). لدينا أيضًا طريقة سهلة للغاية لتنفيذ خوارزميات موازنة التحميل المخصصة باستخدام الشريط.
الثاني: تصنيف مخطط LB
في الوقت الحالي ، يمكن تقسيم مخطط LB السائد إلى فئتين: واحدة هي LB مركزية ، أي استخدام مرافق LB المستقلة (يمكن أن تكون الأجهزة ، مثل F5 ، أو البرمجيات ، مثل Nginx) بين مستهلك الخدمة والمزود ، والمرفق مسؤول عن إعادة توجيه طلبات الوصول إلى مزود الخدمة من خلال سياسة معينة ؛ والآخر هو LB في العملية ، والتي تدمج منطق LB في المستهلك ، ويعرف المستهلك من مركز تسجيل الخدمة الذي يتوفر عناوين ، ثم يختار خادمًا مناسبًا من هذه العناوين بأنفسهم. الشريط ينتمي إلى الأخير. إنها مجرد مكتبة فئة مدمجة في عملية المستهلك. من خلال ذلك ، يحصل المستهلكون على عنوان مزود الخدمة.
ثلاثة: المكونات الرئيسية للشريط وسير العمل
المكونات الأساسية للشريط (جميع أنواع الواجهة) لها ما يلي:
قائمة الخادم
تستخدم للحصول على قائمة العناوين. يمكن أن يكون إما ثابتًا (توفير مجموعة ثابتة من العناوين) أو ديناميكية (استعلام متكرر لقوائم العناوين من السجل).
ServerListFilter
يستخدم فقط عند استخدام قائمة الخادم الديناميكي ، يتم استخدامه لاستخدام بعض السياسات في قائمة الخدمة الأصلية للنظر في بعض العناوين.
irule
حدد عنوان الخدمة النهائية كنتيجة LB. تشمل السياسات المحددة الاقتراع ، والترجمة بناءً على وقت الاستجابة ، وقاطع الدائرة (عندما يكون Hystrix متاحًا) ، إلخ.
عندما يعمل RIBBON ، يُفضل استخدام قائمة الخادم للحصول على جميع قوائم الخدمات المتاحة ، ثم استخدم ServerListFilter للنظر في بعض العناوين ، وأخيراً حدد خادمًا في العناوين المتبقية من خلال IRULE كنتيجة نهائية.
الرابع: مقدمة في استراتيجيات موازنة التحميل الرئيسية التي يوفرها الشريط
1: موازنة تحميل الاقتراع البسيط (Roundrobin)
يتم جدولة الطلبات بدورها بطريقة تم استطلاعها ، أي يتم تنفيذ كل جدول I = (i + 1) mod n ، ويتم تحديد الخادم i-th.
2: موازنة التحميل العشوائي (عشوائي)
حدد خادمًا بشكل عشوائي مع حالة UP
3: موازنة التحميل في وقت الوزارة (OnsidedResponsetime)
يتم تخصيص الوزن وفقًا للوقت المقابل. كلما طال الوقت المقابل ، وأصغر الوزن ، وأقل من إمكانية اختيار.
4: Zoneavoidancerule
حدد بشكل شامل أداء منطقة الخادم وخادم اختيار توافر الخادم
مقارنة استراتيجيات موازنة التحميل الخاصة بشريط
| اسم الاستراتيجية | بيان السياسة | وصف السياسة | تعليمات التنفيذ |
| Bestavailablerule | الفئة العامة Bestavailablerule يمتد ClientConfigenabledRoundRoundRule | حدد خادمًا مع أصغر طلب متزامن | تحقق من الخادم واحد تلو الآخر. إذا تم تعثر الخادم ، فتجاهله. حدد الخادم مع أصغر ActivErequestScount |
| التوفر filteringrule | توفر الطبقة العامة filteringrule | قم بتصفية خوادم الواجهة الخلفية التي تم تمييزها على أنها دائرة تعثرت بسبب فشل الاتصال ، وتصفية خوادم الواجهة الخلفية هذه ذات التزامن العالي (تتجاوز الاتصالات النشطة العتبة التي تم تكوينها) | إن استخدام Availabilability PredIcate لتضمين منطق خوادم التصفية هو في الواقع التحقق من حالة تشغيل كل خادم مسجلة في الحالة |
| OnsidedResponsetImerule | يمتد Roundrobinrule Roundrobinrule Roundrobinrule من الطبقة العامة | يتم تخصيص الوزن وفقًا للوقت المقابل. كلما طال الوقت المقابل ، وأصغر الوزن ، وأقل من إمكانية اختيار. | يقرأ مؤشر ترابط الخلفية بانتظام وقت استجابة التقييم من الحالة ويحسب الوزن لكل خادم. حساب الوزن هو أيضا بسيط نسبيا. المسؤولية ناقص متوسط وقت الاستجابة لكل خادم هو وزن الخادم. عندما يتم بدء الحالة للتو ولم يتم تشكيل أي إحصائيات ، استخدم سياسة Roubine لتحديد الخادم. |
| إعادة المحاولة | Retryrule من الطبقة العامة يمتد مجردة toplalancerrule | أعد محاولة الآلية على الجهاز لسياسة موازنة التحميل المحددة. | خلال فترة التكوين ، عندما يكون اختيار الخادم غير ناجح ، فإنك تستمر في محاولة تحديد خادم متاح باستخدام Subrule |
| Roundrobinrule | يمتد Roundrobinrule من الطبقة العامة مجردة TrostractLoadBalancerrule | استطلاع طريقة Roundrobin لتحديد الخادم | فهرس الاستطلاع وحدد الخادم المقابل للفهرس |
| عشوائي | الطبقة العامة randomrule يمتد مجردة triptloadbalancerrule | حدد خادمًا بشكل عشوائي | بشكل عشوائي على الفهرس ، حدد الخادم المقابل لموضع الفهرس |
| ZoneaeAvoidancerule | يمتد Zoneavoidancerule من الطبقة العامة | حدد بشكل شامل أداء منطقة الخادم وخادم اختيار توافر الخادم | استخدم Zoneavoidancepredicate و Availability Predipicate لتحديد ما إذا كان يتم تحديد الخادم. يحدد الأسلوب السابق ما إذا كان أداء التشغيل للمنطقة متاحًا. استبعاد المناطق غير المتوفرة (جميع الخوادم). يتم استخدام التوفر predicate لتصفية الخوادم مع العديد من الاتصالات. |
5: الشريط وحده
إنشاء اسم مشروع Maven Ribbon_Client
محتوى بوم
<ependencies> <Rependency> <rougiD> com.netflix.ribbon </rougiD> <StifactId> شريط الشريط </artifactId> <الإصدار> 2.2.0 </version> </respency> <redenced> </atsiD> com.netflix.ribbon </premency> </تبعيات>
نموذج التكوين client.properties
# الحد الأقصى لعدد إعادة العدد من sample-client.ribbon.maxautoristries = 1# الحد الأقصى لعدد الخوادم التالية لإعادة محاولة (باستثناء الخادم الأول) عينة client.ribbon.maxautoriretriesNexterver = 1# sample-client.ribbon.serverlistrefreshinterval = 2000# توصيل المهلة التي تستخدمها Apache httpclient sample-client.ribbon.connecttimeout = 3000# قراءة المهلة المستخدمة من قبل Apache httpclient sample-client.ribbon.readtimeout = 3000# القائمة الأولية للخوادم ، يمكن تغييرها عن طريق propertar sample-client.ribbon.listofservers = www.sohu.com: 80 ، www.163.com: 80 ، www.sina.com.cn: 80sample-client.ribbon.enablePrimeConnections = true
رمز الشريط
استيراد java.net.uri ؛ استيراد com.netflix.client.clientfactory ؛ استيراد com.netflix.client.http.httprequest com.netflix.loadbalancer.zoneawareloadbalancer ؛ import com.netflix.niws.client.http.restclient ؛ public class ribbonmain {public static void main (string [] args) revision {configurationManager.loadPropertiesFromesourges ("" sampl-client.propisteries "؛ System.out.println (configurationManager.getConfiginStance (). عميل RestClient = (restClient) clientFactory.getNamedClient ("عينة عميل") ؛ HttPrequest request = httprequest.newbuilder (). uri (new uri ("/")). build () ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {httpresponse response = client.executewithloadBalancer (request) ؛ System.out.println ("حالة URI:" + response.getRequesteduri () + "هو:" + reponse.getStatus ()) ؛ } zoneawareloadbalancer lb = (zoneawareloadbalancer) client.getLoadBalancer () ؛ System.out.println (lb.getloadBalancerStats ()) ؛ configurationManager.getConfiginStance (). system.out.println ("تغيير الخوادم ...") ؛ thread.sleep (3000) ؛ لـ (int i = 0 ؛ i <3 ؛ i ++) {httpresponse response = client.executewithloadBalancer (request) ؛ System.out.println ("حالة URI:" + response.getRequesteduri () + "هو:" + reponse.getStatus ()) ؛ } system.out.println (lb.getLoadBalanCerstats ()) ؛ }}تحليل رمز
استخدم Archaius configurationManager لتحميل الخصائص ؛
استخدام ClientFactory لإنشاء العملاء وتحميل الموازنات ؛
استخدم Builder لإنشاء طلبات HTTP. لاحظ أننا ندعم فقط مسار "/" جزء من URI. بمجرد تحديد الخادم بواسطة موازن التحميل ، سيقوم العميل بحساب URI الكامل ؛
استدعاء API client.executewithloadBalancer () ليس exeucte () API ؛
تصحيح ديناميكي تجمع الخادم في التكوين ؛
انتظر حتى يتم تحديث قائمة الخادم (فاصل التحديث المحدد في ملف التكوين هو 3 ثوان) ؛
اطبع إحصائيات الخادم المسجلة بواسطة موازن التحميل.
ستة: الشريط جنبا إلى جنب مع يوريكا
أولاً ، ابدأ مشروع eureka_register_service (مركز التسجيل) ومشروع Biz-Service-0 (منتج الخدمة)
إنشاء مشروع maven eureka_ribbon_client يبدأ هذا المشروع ويعتمد التكوينات ذات الصلة على eureka_register_service و biz-service-0
بوم انضم
<Arnal> <roupiD> org.springframework.boot </rougiD> <ArtifactId> Spring-Boot-Starter-Parent </stifactid> <الإصدار> 1.4.3 <StifactId> spring-cloud-starter-ribbon </stifactid> </sependency> <reperency> <roupiD> org.springframework.cloud </groupiD> <StifactId> spring-cloud-starter-eureka </stifactid> <StifactId> Spring-Boot-Starter-Web </stifactid> </sependency> <reperence> <roupiD> org.springframework.boot </rougeid> <StifactId> spring-boot-starter-test </stifactid> <Groper> org.springframework.cloud </rougiD> <StifactId> تعتمد على السحابة النابضة </intifactid> <splection> brixton.release </version> <type> pom </type> <scope> استيراد </scope> </
في الفئة الرئيسية للتطبيق ، أضف إمكانيات خدمة الاكتشاف من خلال التعليق التوضيحي enabledCoveryClient. قم بإنشاء مثيل RestTemplate وتمكين موازنة سعة التحميل من خلال التعليق التواقي المتوازن.
@SpringBootApplication @enableScoveryClientpublic class ribbonapplication {bean@loadbalanced resttemplate restTemplate () {return resttemplate () ؛ } public static void main (string [] args) {springapplication.run (ribbonapplication.class ، args) ؛ }}قم بإنشاء مستهلك للاستهلاك لاستهلاك خدمة GetUser من خدمة Biz-Service-0. استدعاء الخدمة عن طريق RestTemplate مباشرة
RestControllerPublic Class ClassErconTroller {Autowired restTemplate restTemplate ؛ requestmapping (value = "/getUserInfo" ، method = requestMethod.get) سلسلة عامة add () {resttemplate.getforentity ("http: // biz-service-0/getUser" ، string.class) .getBody () ؛ }} تكوين مركز تسجيل خدمة Eureka في التطبيق.
spring.application.name = Ribbon-consumerserver.port = 8003eureka.client.serviceurl.defaultzone = http: // localhost: 8000/eureka/
بعد الانتهاء ، يمكنك فتح http: // localhost: 8003/getUserInfo لمعرفة النتائج
ملخص: الشريط هو في الواقع مكون عميل موازنة التحميل الناعم. يمكن استخدامه مع الطلبات المطلوبة الأخرى. الجمع بينه مع Eureka هو مجرد مثال عليه.
عنوان الرمز: https://github.com/zhp8341/springclouddemo
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.