هذه المرة أشارككم كيفية استهلاك الخدمات. تتحدث المقالة السابقة عن استخدام Feign للاستهلاك ، وتستخدم هذه المقالة خدمات استهلاك REST+RIBBON ، وتخصيص مكون استهلاك بسيط من خلال الاقتراع. الغرض من هذه المقالة هو: فكرة تخصيص خدمات الاستهلاك ؛ إذا كانت هناك أي مزايا ، يرجى "مثل":
REST+RIBBON يدرك خدمات المستهلك
كمستهلك خدمة ، قمنا بإجراء عمليتين رئيسيتين للتمييز بين 1) الحصول على الخدمات و 2) خدمات الاتصال. إذن كيف تحصل على الخدمات وماذا يمكن استدعاء الخدمات؟ دعونا نلقي نظرة على رسم تخطيطي يدوي أدناه:
يمكن ملاحظة من المخطط اليدوي أن المستهلك يحصل أولاً على عنوان الواجهة الحقيقية لمزود الخدمة ، ثم يستدعي الواجهة من خلال العنوان ؛ ثم بالنسبة للهندسة المعمارية للخدمة المجهرية ، لا يُنصح بالتأكيد بالحصول على فئة أو منفذ فئة معينة ثم استدعاء الواجهة ، لذلك ظهر مفهوم ServiceID في الخدمات الدقيقة ؛ تم تقديم العملية البسيطة ، والما يلي مثال لتحليلها ؛ أضف أولا تبعيات مثل:
<Rependency> <roupeD> org.springframework.boot </rougiD> <intifactid> Spring-Boot-Starter-Web </shintifactid> </sependency> <rependency> <roupiD> org.springframework.cloud </rougiD>
دعنا نستخدم EUREKA_SERVER (مركز الخدمة) و EUREKA_PROVIDER (مزود الخدمة) المدمج في المقالة السابقة لإجراء حالات الاختبار. هنا أقوم بإعادة تعريف وحدة eureka_consumer_ribbon كخدمة مستهلك ؛ قم أولاً بإنشاء فئة طبقة الخدمة والرمز:
servicepublic class userService تنفذ userInterface {autowired resttemplate resttemplate ؛ Override public morp <list <mouser >> getUsers (morq rq) {return null ؛ } Override public string getMsg () {String str = restTemplate.getForObject ("http: // eureka-provider/msg" ، string.class) ؛ إرجاع شارع }}استخدم بشكل أساسي وظيفة RestTemplate.getForObject لـ RestTemplate ، ثم تحتاج إلى تحديد وحدة تحكم للرد على البيانات التي تم الحصول عليها على الصفحة. للبساطة ، ما عليك سوى استخدام واجهة خدمة GetMsG للاختبار:
RestControllerPublic Class USERCONTROLLER getMapping ("/msg") السلسلة العامة getMsg () {return orperService.getMsg () ؛ }}أخيرًا ، نضيف الكود التالي إلى فئة بدء التشغيل. لاحظ أنه يجب إضافة العلامة المتوازنة ، لأن تبعية Eureka التي قدمتها تحتوي على شريط (إصدار Dalston.Release). يتضمن الشريط خوارزمية موازنة التحميل. إذا لم تتم إضافة هذا التعليق ، يجب أن يكون عنوان URL لطريقة REST هو مسار URL المتاح. بالطبع ، إذا تمت إضافة التعليق التوضيحي هنا ، فيمكنك استخدام ServiceId المذكورة أعلاه:
@springBootApplication @enableScoveryClient // Consumer Client Class EurekaconsumerRibbonApplication {bean@loadbalanced // تحميل موازنة RestTemplate RestTemplate () {return resttemplate () ؛ } public static void main (string [] args) {springapplication.run (eurekaconsumerribbonapplication.class ، args) ؛ }}فيما يلي التأثير الذي عرضه المستهلك:
REST+استطلاع مكونات استهلاك بسيطة مخصصة
مكون الاستهلاك المخصص هو نفس الرسم اليدوي للوجه. إنه أولاً الحصول على عنوان الواجهة الحقيقي لمزود الخدمة ، ثم اتصل بعنوان URL من خلال REST للحصول على إخراج النتيجة المقابلة ؛ هنا فئة مكون Shenniubanlance:
/** * تم إنشاؤه بواسطة Shenniu في 2018/6 * <p> * REST+Eureka+Custom Client */ @ComponentPublic Class Shenniubanlance {Auutowired private resttemplate ؛ @autowired discoveryclient discoveryclient ؛ / ** * خدمة العنوان الحقيقي concurrenthashmap <"اسم تطبيق الخدمة" ، ("الواجهة الحقيقية IP" ، عدد الزيارات)> */ concurrenthashmap الثابتة العامة <string ، قائمة <moservice>> servicesmap = concurrenthashmap <> () ؛ /** * تعيين معلومات مزود الخدمة على خريطة */public void setServicesMap () {// الحصول على جميع قائمة تطبيقات موفر الخدمة <string> appnames = discoveryclient.getServices () ؛ // تخزين العنوان الحقيقي لخريطة (appname appname: appnames) {// احصل على معلومات عن قائمة مزود الخدمة <ServiceInStance> مثيل inclupoS = discoveryclient.getInstances (appname) ؛ if (مثيل infos.isempty ()) {متابعة ؛ } list <Moservice> services = new ArrayList <> () ؛ extoryinfos.foreach (b -> {moservice service = new moservice () ؛ // عدد service. // إذا كان هناك ، تحديث ServicesMap.put (appname.toLowerCase () ، الخدمات) ؛ }} / ** * الخدمة المحددة وفقًا للتطبيق * * param appname * regurn * / public moservice choiceserviceByAppName (سلسلة appname) يلقي استثناء {appname.toLowerCase () ؛ . if (servicemap == null) {// تهيئة جميع خدمات التطبيق setServicesMap () ؛ serviceMap = ServicesMap.get (appname) ؛ if (servicemap == null) {رمي استثناء جديد ("فشل في العثور على" + appname + "الخدمات ذات الصلة") ؛ }} // تصفية طريقة استطلاع الخدمة مع أصغر عدد من الزيارات moservice moservice = servicemap.stream (). min (comparator.comparing (moservice :: getWatch)) .get () ؛ // سجل تحميل +1 moservice.setWatch (moservice.getWatch () + 1) ؛ العودة moservice. } / ** * تحديث معلومات مزود الخدمة تلقائيًا إلى رسم خريطة * / scheduled (flexdelay = 1000 * 10) public void refreshervicesmap () {setServicesMap () ؛ } / ** * احصل على خدمة طلب للحصول على بيانات الإرجاع * * param appname اسم التطبيق ApplicationName * param servicename servicename * param map request parameter on url * @param tclass return type * @param <t> * regurn * / public <t> t getvispatedata (string appname ، string servicename ، map <tr strep ، map <t> tclass <tclass ؛ جرب {// filter للحصول على خدمة moservice خدمة حقيقية = choiceserviceByAppName (appname) ؛ // اطلب عنوان URL لسلسلة الخدمة APIURL = service.geturl () + "/" + servicename ؛ System.out.println (Apiurl) ؛ النتيجة = الخريطة! = فارغة؟ RestTemplate.getForObject (Apiurl ، tclass ، MAP): restTemplate.getForObject (apiurl ، tclass) ؛ } catch (استثناء ex) {ex.printStackTrace () ؛ } نتيجة الإرجاع ؛ } / *** معلومات الخدمة* / الفئة العامة moservice { / *** عدد سجلات التحميل* / private long watch ؛ /** * عنوان الواجهة الحقيقية: http://xxx.com/api/add */url url private ؛ Public Long getWatch () {return Watch ؛ } public void setwatch (watch long) {this.watch = watch ؛ } السلسلة العامة geturl () {return url ؛ } public void seturl (url url) {this.url = url ؛ }}}ما سبق هو رمز التنفيذ الرئيسي. منطق الرمز: قم بتعيين معلومات مزود الخدمة إلى خريطة للتطبيق للحصول على طريقة الاقتراع ، وتطلب الخدمة الخدمة للحصول على بيانات الإرجاع ؛ يتمثل مبدأ تطبيق الاقتراع في استخدام رقم سجل التحميل ، والذي +1 تلقائيًا بعد كل طلب. عندما ترغب في الحصول على مزود خدمة معين ، يتم تصفية مثيل القيمة الدنيا من خلال رقم السجل ، ويتم تخزين عنوان URL للعنوان الحقيقي ؛ يجب أن تكون الدعوة فقط هكذا (بالطبع ، يمكن تسميتها كشروط توضيحية):
Override public string getMsg () {String str = banlance.getServusedata ("Eureka-provider" ، "msg" ، null ، string.class) ؛ إرجاع شارع }تجدر الإشارة هنا إلى أننا أضفنا التعليق التوضيحي في repttemplate السابقة ، بحيث يجب الوصول إلى طلب RESS في غير IP (أي ServiceID) للرد بشكل طبيعي ، وإلا فإن الخطأ سيتم مطالبته مثل:
ببساطة ، لا تحتاج إلى استخدام IP بعد الآن لأن هناك آلية موازنة التحميل ؛ عندما نقوم بإزالة هذا التعليق التوضيحي ، ستتمكن مكوناتنا المخصصة من التشغيل بنجاح ، وتكون العروض هي نفسها الموجودة في المثال 1 ، ولن تتمسك الخريطة ؛
تحديث معلومات مزود الخدمة باستخدام المجدولة
في بنية الخدمات الصغيرة ، إذا تم تعليق الخدمة ، فيجب تحديث معلومات ذاكرة التخزين المؤقت لخدمة العميل في الوقت المناسب ، وإلا فقد تطلب عنوان URL لأسفل. بناءً على هذا الاعتبار ، استخدمت علامة EnlablesChed لأداء تحديث توقيت ؛ أضف أولاً enablescheduling إلى فئة بدء التشغيل ، ثم حدد خدمة تومض معلومات الخدمة مثل:
/ ** * تحديث معلومات مزود الخدمة تلقائيًا إلى MAP */ SCHEDELED (ثابتة = 1000 * 10) Refreshervicesmap () {setServicesMap () ؛ }من أجل تسهيل تأثير الاختبار ، عندما يتم بدء الخادم والمزود (2) والمستهلك ، نبدأ خدمة مزود مع Port 2005 ؛ ثم قم بتحديث واجهة المستهلك لمعرفة التأثير:
في هذا الوقت ، يمكنك أن ترى أن الواجهة التي تستدعي منفذ 2005 قد تم استدعاؤها بنجاح. بعد إضافة خدمة أحدث أو غير صالحة إلى خدمة timed scheduled ، ستلبي احتياجات ما تحتاجه ؛ إذا كنت تعتقد أن هذا المحتوى مفيد لك ، فالرجاء إعجابك ، شكرًا لك. آمل أن يكون ذلك مفيدًا لتعلم الجميع ، وآمل أن يدعم الجميع wulin.com أكثر.