في المقالة السابقة ، يمكننا أن نجد أنه عندما ندعو واجهة برمجة التطبيقات للخدمات الأخرى من خلال RestTemplate ، يجب تقطيع المعلمات المطلوبة في عنوان URL المطلوب. إذا كان هناك عدد أقل من المعلمات ، فقد نتمكن من تحملها. بمجرد وجود معلمات متعددة ، سيكون الربط سلسلة الطلب غير فعال ويبدو غبيًا.
فهل هناك حل أفضل؟ الجواب مؤكد ، وقد زودنا Netflix بإطار عمل: Feign.
Feign هو عميل خدمة ويب تصريحي ، والغرض منه هو جعل مكالمات خدمة الويب أكثر بساطة. يوفر Feign قالبًا لطلبات HTTP. من خلال كتابة واجهات بسيطة وشروح إدخال ، يمكنك تحديد المعلمات والتنسيقات والعناوين وغيرها من المعلومات الخاصة بطلبات HTTP.
ستقوم Feign بتكييف طلبات HTTP تمامًا ، ونحتاج فقط إلى تسميتها مثل استدعاء طريقة لإكمال طلب الخدمة والمعالجة ذات الصلة. يدمج Feign Ribbon و Hystrix (سنتحدث عن Hystrix لاحقًا) ، لذلك لم يعد بإمكاننا استخدام هذين المكونين بشكل صريح.
باختصار ، تتمتع Feign بالخصائص التالية:
هذا يشبه إلى حد ما رسم الخرائط لطلب طبقة وحدة التحكم في نمط springMVC الخاص بنا. هذا النمط شيء نحبه حقًا. Feign يستخدم @dignclient لتعيين الخدمات.
أولاً ، الخطوة الأولى هي إنشاء وحدة Feign جديدة على الأساس الأصلي ، ثم تقديم التبعيات ذات الصلة والتبعيات المظلمة ، والتي ستقدم تلقائيًا تبعيات Hystrix ، على النحو التالي:
<Rependency> <roupeD> org.springframework.cloud </groupId> <intifactid> spring-cloud-starter-eureka </frensifactid> <sophy> 1.3.5 <splect> 1.4.0.release </version> </sependency>
التكوين application.yml كما يلي:
الخادم: المنفذ: 8083spring: التطبيق: الاسم: Feign-consumereureka: العميل: Service-url: DefaultZone: http: // localhost: 8888/eureka/، http: // localhost: 8889/eureka/
بعد ذلك ، في المقالة السابقة ، تتم إضافة عدة طرق جديدة إلى خدمة وحدات Provider1 و Provider2 ، كما هو موضح في الكود التالي:
/*** تم إنشاؤه بواسطة Cong في 2018/5/8. */ @restControllerPublic Class HelloconTroller {REquestMapping ("/hello") السلسلة العامة Hello () {system.out.println ("Access يأتي 1 ...") ؛ العودة "Hello1" ؛ } @requestmapping ("/hjcs") قائمة عامة <string> laowangs (string ids) {list <string> list = new ArrayList <> () ؛ list.add ("laowang1") ؛ list.add ("laowang2") ؛ list.add ("laowang3") ؛ قائمة العودة } // تمت إضافة method @requestmapping (value = "/hellol" ، method = requestMethod.get) السلسلة العامة Hello ( @requestparam name) {return "hello" + name ؛ } requestmapping (value = "/hello2" ، method = requestMethod.get) المستخدم العام Hello (requestheader اسم سلسلة ، requestheader integer age) {إرجاع مستخدم جديد (الاسم ، العمر) ؛ } requestmapping (value = "/hello3" ، method = requestMethod.post) السلسلة العامة Hello ( @requestbody user user) {return "hello"+ user. getName () + "،" + مستخدم. getage () ؛ }}التالي هو فئة المستخدم المطلوبة للرمز أعلاه ، الرمز كما يلي:
/*** تم إنشاؤه بواسطة Cong 2017/12/2. */مستخدم الفئة العامة {اسم السلسلة الخاصة ؛ عصر عدد صحيح خاص ؛ // يجب أن يكون هناك مُنشئ فارغ عند تسلسل الإرسال ، وإلا فإن الخطأ سيحدث. المستخدم العام () {} المستخدم العام (اسم السلسلة ، عصر الصدفة) {this.name = name ؛ this.age = العمر ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } integer getAge () {return Age ؛ } public void setage (integer age) {this.age = age ؛ }}بعد ذلك ، استخدم Feign'sFignClient ("اسم الخدمة") لتعيين مكالمة الخدمة. الرمز كما يلي:
حزمة hjc ؛ استيراد org.springframework.cloud.netflix.feign.feignclient ؛ استيراد org.springframework.web.bind.annotation.* ؛/*** تم إنشاؤه بواسطة Cong في 2018/5/17. */// configuration = xxx.class تقوم هذه الفئة بتكوين بعض الخصائص الدقيقة لـ Hystrix // value = "اسم الخدمة الذي استخدمته" @VEIGNCLIENT (value = "hello-service" ، FrackBack = FeignFallback.class) الواجهة العامة FeignService {// mapping path of the service requestmapping ("/hello") requestmapping (value = "/hellol" ، method = requestMethod.get) String hello (@requestparam ("name") اسم السلسلة) ؛ requestmapping (value = "/hello2" ، method = requestMethod.get) المستخدم Hello ( @requestheader ("name") اسم السلسلة ، requestHeader ("Age") integer age) ؛ requestmapping (value = "/hello3" ، method = requestMethod.post) String Hello (@requestbody user) ؛}ثم حقن واجهة Feiservice في طبقة وحدة التحكم لإجراء مكالمات الخدمة عن بُعد. الرمز كما يلي:
/*** تم إنشاؤه بواسطة Cong في 2018/5/17. */ @restControllerPublic Class electionTroller {autowired FeignService FeignService ؛ requestmapping ("/consumer") السلسلة العامة helloconsumer () {return feignservice.hello () ؛ } @requestmapping ("/consumer2") السلسلة العامة helloconsumer2 () {string r1 = feignservice.hello ("hjc") ؛ String R2 = FeignService.hello ("HJC" ، 23) .ToString () ؛ String R3 = FeignService.hello (مستخدم جديد ("HJC" ، 23)) ؛ إرجاع R1 + "-----" + R2 + "----" + R3 ؛ }}ثم ، حيث يمكنك التعليق على عميل Eureka في فئة بدء التشغيل في وحدة Feign
enablefeignclients ، الرمز هو كما يلي:@springbootapplication@enableScoveryClient@enablefeignclientsspublic class feignapplication {public static void main (String [] args) {springapplication.run (feignapplication.class ، args) ؛ }}ثم ابدأ فئة بدء التشغيل ، أدخل مضيفًا محليًا: 8083/المستهلك في المتصفح ، والنتيجة الجارية هي كما يلي:
يمكنك أن ترى أن استطلاع موازنة التحميل يظهر Hello1 و Hello2.
ثم استمر في الدخول إلى المضيف المحلي: 8083/consumer2 في المتصفح ، والنتيجة الجارية هي كما يلي:
بعد ذلك ، نستخدم ترجمة الخدمة تحت خدمة المكالمات التعريفية. ثم يجب أن ننشئ فئة جديدة من FeignFallback لروث Feiservice. الرمز كما يلي:
حزمة HJC ؛ استيراد org.springframework.stereotype.component ؛/*** تم إنشاؤه بواسطة Cong في 2018/5/17. */ @componentpublic class feignfallback تنفذ FeignService {// طريقة التنفيذ هي طريقة تخفيض لاستدعاء الخدمة Override Public Hello () {return "error" ؛ } Override Public String Hello (اسم السلسلة) {return "error" ؛ } Override Public User Hello (اسم السلسلة ، عصر integer) {إرجاع مستخدم جديد () ؛ } Override public string hello (user user) {return "error" ؛ }}ثم نوقف وحدات موفر خدمة مزود الخدمة 1 ووحدات Provider2 ، ونتائج التشغيل هي كما يلي:
يمكنك أن ترى أن مكالماتنا قد خفضت جميع الخدمات.
ثم إذا أردنا التحكم بدقة في معلمات Hystrix ، على سبيل المثال ، المعلمات مع Hystrix ، يمكنك تكوين تكوين = سمة فئة XXX.
أو تكوينه في application.yml ، على النحو التالي:
Hystrix: الأمر: الافتراضي: التنفيذ: العزلة: الموضوع: TimeOtinMillisEconds: 5000Ribbon: ConnectTimeout: 500 #إذا كنت تريد تكوين خدمة منفصلة بالتفصيل ، على النحو التالي للخدمة Hello: Ribbon: ConnectTimeout: 500
هذا يرضي مكالمات معظم سيناريوهاتنا ، ولكن إذا كتبت سيناريوهات رائعة ، فلا تزال بحاجة إلى استخدام Hystrix الأصلي ومتابعة استخدامنا السابق لـ Hystrix. فقط لا تستخدم مكالمات العميل Feign ، على النحو التالي:
/*** تم إنشاؤه بواسطة Cong في 2018/5/17. */الفئة العامة HJCCommand يمتد HystrixCommand {HjCcommand المحمي (HystrixCommandGroupkey Group) {Super (Group) ؛ } Override محمي الكائن Run () يلقي الاستثناء {return null ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.