في مكدس Spring Cloud Netflix ، تعرض كل الخدمات الصغيرة خدماتها الخاصة في شكل واجهة HTTP ، لذلك يجب استخدام عميل HTTP عند الاتصال بخدمة بعيدة. يمكننا استخدام JDK Native UrlConnection ، عميل HTTP من Apache ، عميل HTTP غير المتزامن من Netty ، و RestTemplate من Spring. ومع ذلك ، فإن الشيء الأكثر ملاءمة وأنيقة لاستخدامه هو التظاهر.
مقدمة للتظاهر
Feign هو عميل HTTP التصريحي. باستخدام Feign في Spring Cloud ، يمكننا تحقيق نفس تجربة الترميز مثل استدعاء الأساليب المحلية عند طلب الخدمات عن بُعد باستخدام HTTP. لا يمكن للمطور أن يدرك تمامًا أن هذه طريقة بعيدة ، ولا يمكن ملاحظة أن هذا طلب HTTP. على سبيل المثال:
AUTOWIREDPRIVER SERVERGROPREMOTESERVICE ؛ . // استدعاء الخدمة عن بُعد عبر http}
يمكن للمطورين إكمال عملية إرسال طلبات HTTP ، وفك تشفير HTTP وإرجاعها وتغليفها في كائنات من خلال service.findByGroupId() .
تعريف التظاهر
لكي تعرف على العنوان الذي يجب إرسال طلب إليه عند الاتصال بأسلوب وأي المعلمات التي يجب اتخاذها للطلب ، نحتاج إلى تحديد واجهة:
feignclient (name = "ea") // [a] الواجهة العامة AdverGroUpreMotEservice { @requestmapping (value = "/group/{groupid}" ، method = requestMethod.get) // [b] addrgroupvo findbygroupid (pathvariable ("group") integer) // [c] "/group/{groupId}" ، method = requestMethod.put) تحديث باطل (pathvariable ("groupId") integer groupid ، requestparam ("groupname") سلسلة groupname)A: يتم استخدام @VIGNCLIENT لإخطار مكونات التظاهر لوكالة الواجهة (لا حاجة لكتابة تطبيق واجهة) ، ويمكن للمستخدم حقنها مباشرة من خلال @autowired.
ب: @requestmapping يعني أنه عند الاتصال بهذه الطريقة ، تحتاج إلى إرسال طلب الحصول على /group/{groupId} .
C: @pathvariable له نفس المعنى مثل التعليق التوضيحي المقابل في springMVC.
عند بدء تشغيل تطبيق Spring Cloud ، سيقوم Feign بمسح الواجهة المميزة بشرح @VIGNCLIENT ، وإنشاء وكيل ، وتسجيله في حاوية الربيع. عند إنشاء وكيل ، سيقوم Feign بإنشاء كائن requettemplate لكل طريقة واجهة. يقوم هذا الكائن بتغليف جميع المعلومات المطلوبة لطلبات HTTP. يتم تحديد اسم معلمة الطلب وطريقة الطلب والمعلومات الأخرى في هذه العملية. ينعكس قالب التظاهر هنا.
في هذا المثال ، نستخدم Feign مع Eureka و Ribbon ,@FeignClient(name = "ea") تعني ,@FeignClient(name = "ea") إخطار Feign بالاستعلام عن Eureka لخدمة تدعى EA عند استدعاء طريقة الواجهة هذه ، وذلك للحصول على عنوان URL للخدمة.
تشفير Feign و Decoder و Errordecoder
تم إكمال عملية التسلسل لتسلسل كائن المعلمة الطريقة في توقيع الأسلوب إلى معلمات الطلب ووضعها في طلب HTTP بواسطة المشفر (التشفير). وبالمثل ، يتم إلغاء تسهيل بيانات استجابة HTTP في كائنات JAVA بواسطة وحدة فك ترميز (وحدة فك ترميز).
بشكل افتراضي ، ستقوم Feign بتحويل المعلمات المميزة بتوضيح REQUESTPARAM إلى سلاسل وإضافتها إلى عنوان URL ، وتحويل المعلمات دون تعليقات إلى JSON عبر جاكسون لوضعها في هيئة الطلب. لاحظ أنه إذا تحدد الطريقة الموجودة في requetMapping طريقة الطلب على أنها منشور ، فسيتم تجاهل جميع المعلمات غير المخصصة ، على سبيل المثال:
requestmapping (value = "/group/{groupId}" ، method = requestMethod.get) تحديث باطل (pathvariable ("groupid") integer groupid ، requestparam ("groupName") سلسلة groupName ، dataObject OBJ) ؛في هذا الوقت ، نظرًا لأن طلب الحصول على طلب لا يطلب ، سيتم تجاهل معلمة OBJ.
في بيئة Spring Cloud ، سيتم استخدام Feign's Encoder* فقط لتشفير المعلمات التي لم تتم إضافتها إلى التعليقات التوضيحية. إذا قمت بتخصيص المشفر ، فلن يتم استدعاء التشفير الخاص بك إلا عند ترميز معلمة OBJ. بالنسبة إلى وحدة فك التشفير ، فإن المندوبين الافتراضيين لفئة MapPingJackson2HttpMessageConverter في SpringMVC لفك تشفيره. لن يتم استدعاء ErrorDecoder إلا عندما لا يتراوح رمز الحالة بين 200 و 300. تتمثل وظيفة ErrorDecoder في إرجاع استثناء بناءً على معلومات استجابة HTTP ، والتي يمكن اكتشافها حيث يتم استدعاء واجهة Feign. نحن نستخدم حاليًا ErrorDecoder للتسبب في إلقاء واجهة Feign على استثناء العمل حتى يتم التعامل مع المتصل.
Feign's HTTP عميل
بشكل افتراضي ، يستخدم Feign urlconnection urlConnection JDK لإرسال طلبات HTTP. لا يوجد تجمع اتصال ، ولكن سيتم الحفاظ على اتصال طويل لكل عنوان ، أي يتم استخدام اتصال الثبات لـ HTTP. يمكننا استبدال عميل HTTP الأصلي الخاص بـ Feign بعميل HTTP الخاص بـ Apache ، وبالتالي الحصول على إمكانات التحكم المتعلقة ارتباطًا وثيقًا بالأداء مثل تجمعات الاتصال ، والمهام ، وما إلى ذلك. يدعم Spring Cloud هذا الاستبدال منذ إصدار Brixtion.sr5 ، ويعلن أولاً عميل Apache HTTP و feign-httpclient تبعات في المشروع:
<!-استبدل feign httpclient httpclient مع apache httpclient-> <redence> <roupiD> org.apache.httpcomponents </groupId> <StifactId> httpclient </thifactid> </sempendency> <splex> $ {feign-httpclient} </version> </sependency>ثم أضف in application.properties:
feign.httpclient.enabled = true
لخص
من خلال Feign ، يمكننا إجراء مكالمات HTTP عن بُعد شفافة تمامًا للمطورين والحصول على تجربة ترميز تتفق مع استدعاء الأساليب المحلية. هذا مشابه للطريقة التي تتعرض بها الخدمات عن بُعد في Alibaba Dubbo. الفرق هو أن Dubbo يعتمد على بروتوكول ثنائي خاص ، في حين أن Feign هو في الأساس عميل HTTP. إذا كنت تستخدم Spring Cloud Netflix لبناء الخدمات الدقيقة ، فإن Feign هو بلا شك الخيار الأفضل.
ما سبق هو الطريقة (الموصى بها) لاستخدام Spring Cloud Feign كعميل HTTP للاتصال بخدمات HTTP عن بُعد (موصى بها). آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!