الوكيل العكسي في Azure Service Fabric

يساعد الوكيل العكسي المضمن في Service Fabric الخدمات المصغرة التي تعمل في نظام مجموعة Service Fabric على اكتشاف الخدمات الأخرى التي تحتوي على نقاط نهاية http والاتصال بها.

نموذج اتصال الخدمات المصغرة

يتم تشغيل الخدمات المصغرة في Service Fabric على مجموعة فرعية من العقد في نظام المجموعة، ويمكن ترحيلها بين العقد لأسباب مختلفة. ونتيجة لذلك، يمكن أن تتغير نقاط النهاية للخدمات المصغرة بشكل ديناميكي. لاكتشاف الخدمات الأخرى في نظام المجموعة والاتصال بها، يجب أن تمر الخدمة المصغرة بالخطوات التالية:

  1. حل موقع الخدمة من خلال خدمة التسمية.
  2. الاتصال بالخدمة.
  3. تضمين الخطوات السابقة في تكرار حلقي من شأنه تنفيذ حل الخدمة وإعادة محاولة النهج لتطبيقها على حالات فشل الاتصال

لمزيد من المعلومات، راجع الاتصال بالخدمات والتواصل معها.

التواصل باستخدام الوكيل العكسي

الوكيل العكسي هو خدمة تعمل على كل عقدة، وتعالج دقة نقطة النهاية وإعادة المحاولة التلقائية وحالات فشل الاتصال الأخرى نيابة عن خدمات العميل. يمكن تكوين الوكيل العكسي لتطبيق نهج مختلفة أثناء معالجته للطلبات الواردة من خدمات العملاء. يسمح استخدام وكيل عكسي لخدمة العميل باستخدام أي مكتبات اتصالات HTTP من جانب العميل، ولا يتطلب دقة خاصة ومنطق إعادة المحاولة في الخدمة.

يعرض الوكيل العكسي نقطة نهاية واحدة أو أكثر على العقدة المحلية لخدمات العميل لاستخدامها في إرسال الطلبات إلى خدمات أخرى.

الاتصال الداخلي

إشعار

الأنظمة الأساسية المدعومة

يدعم الوكيل العكسي في Service Fabric حالياً الأنظمة الأساسية التالية

  • نظام مجموعة Windows: Windows 8 والإصدارات الأحدث، أو Windows Server 2012 والإصدارات الأحدث
  • نظام مجموعة Linux: الوكيل العكسي غير متوفر حاليًا لأنظمة مجموعات Linux

الوصول إلى الخدمات المصغرة من خارج نظام المجموعة

يشير نموذج الاتصال الخارجي الافتراضي للخدمات المصغرة إلى نموذج الاشتراك حيث لا يمكن الوصول إلى كل خدمة مباشرة من عملاء خارجيين. موازن تحميل Azure، وهو عبارة عن حدود شبكة بين الخدمات المصغرة والعملاء الخارجيين، يقوم بإجراء ترجمة عنوان الشبكة وإعادة توجيه الطلبات الخارجية إلى نقاط نهاية عنوان IP:المنفذ الداخلية. لجعل نقطة نهاية الخدمة المصغرة قابلة للوصول مباشرة إلى عملاء خارجيين، يجب أولاً تكوين موازن التحميل لإعادة توجيه نسبة استخدام الشبكة إلى كل منفذ تستخدمه الخدمة في نظام المجموعة. ومع ذلك، فإن معظم الخدمات المصغرة، وخاصة الخدمات المصغرة ذات الحالة، لا تتواجد على جميع عقد نظام المجموعة. ويمكن أن تنتقل الخدمات المصغرة بين العقد عند تجاوز الفشل. في مثل هذه الحالات، لا يمكن لموازن التحميل تحديد موقع العقدة الهدف من النسخ المتماثلة التي يجب أن تعيد توجيه نسبة استخدام الشبكة إليها بشكل فعال.

الوصول إلى الخدمات المصغرة عبر الوكيل العكسي من خارج نظام المجموعة

بدلاً من تكوين منفذ خدمة فردية في موازن التحميل، يمكنك تكوين منفذ الوكيل العكسي فقط في موازن التحميل. يتيح هذا التكوين للعملاء خارج نظام المجموعة الوصول إلى الخدمات داخل نظام المجموعة باستخدام الوكيل العكسي بدون تكوين إضافي.

الاتصال الخارجي

تحذير

عند تكوين منفذ الوكيل العكسي في موازن التحميل، فإن جميع الخدمات المصغرة في نظام المجموعة التي تعرض نقطة نهاية HTTP قابلة للتوجيه من خارج نظام المجموعة. هذا يعني أن الخدمات المصغرة التي من المفترض أن تكون داخلية قد تكون قابلة للاكتشاف من قبل مستخدم متطفل محدد. من المحتمل أن يمثل هذا نقاط ضعف خطيرة يمكن استغلالها؛ على سبيل المثال:

  • قد يقوم مستخدم متطفل بشن هجوم لقطع الخدمة عن طريق الاتصال المتكرر بخدمة داخلية لا تحتوي على سطح هجوم محكم بدرجة كافية.
  • قد يقوم مستخدم متطفل بتوصيل حزم بيانات ضارة إلى خدمة داخلية، مما يؤدي إلى سلوك غير مقصود.
  • قد تعرض الخدمة التي يُقصد بها أن تكون داخلية معلومات خاصة أو حساسة لا يُقصد بها التعرض لخدمات خارج نظام مجموعة، وبالتالي يتم تعريض هذه المعلومات الحساسة لمستخدم متطفل.

تأكد من أنك تفهم تماماً العواقب الأمنية المحتملة نظام المجموعة الخاص بك والتطبيقات التي تشغل عليها وتعمل على تخفيفها، قبل أن تجعل منفذ الوكيل العكسي عاماً.

تنسيق URI لمعالجة الخدمات باستخدام الوكيل العكسي

يستخدم الوكيل العكسي تنسيق معرف مورد موحد محدد (URI) لتحديد قسم الخدمة الذي يجب إعادة توجيه الطلب الوارد إليه:

http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>
  • http(s): يمكن تكوين الوكيل العكسي لقبول نسبة استخدام شبكة HTTP أو HTTPS. لإعادة توجيه HTTPS، ارجع إلى الاتصال بخدمة آمنة باستخدام الوكيل العكسي بمجرد الانتهاء من إعداد الوكيل العكسي للاستماع إلى HTTPS.

  • اسم المجال المؤهل بالكامل (FQDN) | عنوان IP الداخلي: بالنسبة للعملاء الخارجيين، يمكنك تكوين الوكيل العكسي بحيث يمكن الوصول إليه من خلال مجال نظام المجموعة، مثل mycluster.eastus.cloudapp.azure.com. بشكل افتراضي، يتم تشغيل الوكيل العكسي على كل عقدة. بالنسبة لنسبة استخدام الشبكة الداخلية، يمكن الوصول إلى الوكيل العكسي على المضيف المحلي أو على أي عنوان IP داخلي للعقدة، مثل 10.0.0.1.

  • المنفذ: يعبر عن المنفذ، مثل 19081، الذي تم تحديده للوكيل العكسي.

  • ServiceInstanceName: يشير إلى الاسم المؤهل بالكامل لمثيل الخدمة الموزعة الذي تحاول الوصول إليه بدون المخطط "fabric:/". على سبيل المثال، للوصول إلى خدمة fabric:/myapp/myservice/، ستستخدم myapp/myservice.

    اسم مثيل الخدمة حساس لحالة الأحرف. يؤدي استخدام غلاف مختلف لاسم مثيل الخدمة في عنوان URL إلى فشل الطلبات مع 404 (غير موجود).

  • مسار اللاحقة: هذا هو مسار عنوان URL الفعلي، مثل myapi/values/add/3، للخدمة التي تريد الاتصال بها.

  • PartitionKey: بالنسبة لخدمة مقسمة، هذا هو مفتاح القسم المحسوب للقسم الذي تريد الوصول إليه. لاحظ أن هذا ليس المعرف الفريد العمومي للقسم. هذه المعلمة غير مطلوبة للخدمات التي تستخدم نظام التقسيم لقاعدة البيانات الأحادية.

  • PartitionKind: هذا هو نظام تقسيم الخدمة. يمكن أن يكون هذا "Int64Range" أو "Named". هذه المعلمة غير مطلوبة للخدمات التي تستخدم نظام التقسيم لقاعدة البيانات الأحادية.

  • ListenerName نقاط النهاية من الخدمة تكون بالنموذج التالي {"Endpoints":{"Listener1":"Endpoint1","Listener2":"Endpoint2" ...}}. عندما تعرض الخدمة نقاط نهاية متعددة، يحدد ذلك نقطة النهاية التي يجب إعادة توجيه طلب العميل إليها. يمكن حذف هذا إذا كانت الخدمة تحتوي على وحدة استماع واحدة فقط.

  • TargetReplicaSelector يحدد هذا كيفية تحديد النسخة المتماثلة أو المثيل الهدف.

    • عندما تكون الخدمة الهدف ذات حالة، يمكن أن يكون TargetReplicaSelector واحداً مما يلي: "PrimaryReplica" أو "RandomSecondaryReplica" أو "RandomReplica". عندما لا يتم تحديد هذه المعلمة، يكون الإعداد الافتراضي هو "PrimaryReplica".
    • عندما تكون الخدمة الهدف عديمة الحالة، يختار الوكيل العكسي مثيلاً عشوائياً لقسم الخدمة لإعادة توجيه الطلب إليه.
  • المهلة: يحدد هذا الإعداد المهلة لطلب HTTP الذي تم إنشاؤه بواسطة الوكيل العكسي للخدمة نيابة عن طلب العميل. القيمة الافتراضية هي 120 ثانية. فهذه معلمة اختيارية.

استخدام المثال

على سبيل المثال، لنأخذ خدمة fabric:/MyApp/MyService التي تفتح وحدة استماع HTTP على عنوان URL التالي:

http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/

فيما يلي موارد الخدمة:

  • /index.html
  • /api/users/<userId>

إذا كانت الخدمة تستخدم نظام التقسيم لقاعدة بيانات أحادية، فإن معلمات سلسلة استعلام PartitionKey وPartitionKind غير مطلوبة، ويمكن الوصول إلى الخدمة باستخدام البوابة على النحو التالي:

  • خارجياً: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService
  • داخلياً: http://localhost:19081/MyApp/MyService

إذا كانت الخدمة تستخدم نظام تقسيم Int64 موحد، يجب استخدام معلمات سلسلة استعلام PartitionKey وPartitionKind للوصول إلى قسم من الخدمة:

  • خارجياً: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range
  • داخلياً: http://localhost:19081/MyApp/MyService?PartitionKey=3&PartitionKind=Int64Range

للوصول إلى الموارد التي تعرضها الخدمة، ما عليك سوى وضع مسار المورد بعد اسم الخدمة في عنوان URL:

  • خارجياً: http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService/index.html?PartitionKey=3&PartitionKind=Int64Range
  • داخلياً: http://localhost:19081/MyApp/MyService/api/users/6?PartitionKey=3&PartitionKind=Int64Range

ستقوم البوابة بعد ذلك بإعادة توجيه هذه الطلبات إلى عنوان URL للخدمة:

  • http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/index.html
  • http://10.0.0.5:10592/3f0d39ad-924b-4233-b4a7-02617c6308a6-130834621071472715/api/users/6

معالجة خاصة لخدمات مشاركة المنافذ

يحاول وكيل Service Fabric العكسي حل عنوان خدمة مرة أخرى وإعادة محاولة الطلب عند تعذر الوصول إلى خدمة ما. بشكل عام، عندما يتعذر الوصول إلى خدمة، ينتقل مثيل الخدمة أو النسخة المتماثلة إلى عقدة مختلفة كجزء من دورة حياتها الطبيعية. عند حدوث ذلك، قد يتلقى الوكيل العكسي خطأ في اتصال الشبكة يشير إلى أن نقطة النهاية لم تعد مفتوحة على العنوان الذي تم حله في الأصل.

ومع ذلك، يمكن للنسخ المتماثلة أو مثيلات الخدمة مشاركة عملية مضيف، وقد تشارك أيضاً منفذاً عند استضافته بواسطة خادم ويب يستند إلى http.sys، بما في ذلك:

في هذه الحالة، من المحتمل أن يكون خادم الويب متوفراً في عملية المضيف، ويستجيب للطلبات، ولكن لم يعد مثيل الخدمة الذي تم حله أو النسخة المتماثلة متوفرة على المضيف. في هذه الحالة، ستتلقى البوابة استجابة HTTP 404 من خادم الويب. وبالتالي، يمكن أن يكون لاستجابة HTTP 404 معنيان متميزان:

  • الحالة رقم 1: عنوان الخدمة صحيح، ولكن المورد الذي طلبه المستخدم غير موجود.
  • الحالة رقم 2: عنوان الخدمة غير صحيح، وقد يكون المورد الذي طلبه المستخدم موجوداً على عقدة مختلفة.

الحالة الأولى هي HTTP 404 عادي، والذي يعتبر خطأ من المستخدم. ومع ذلك، في الحالة الثانية، طلب المستخدم مورداً موجوداً. لم يتمكن الوكيل العكسي من تحديد موقعه لأن الخدمة نفسها قد انتقلت. يحتاج الوكيل العكسي إلى حل العنوان مرة أخرى وإعادة محاولة الطلب.

وبالتالي يحتاج الوكيل العكسي إلى طريقة للتمييز بين هاتين الحالتين. لإجراء هذا التمييز، يلزم وجود تلميح من الخادم.

  • بشكل افتراضي، يفترض الوكيل العكسي الحالة رقم 2، ويحاول حل الطلب وإصداره مرة أخرى.

  • للإشارة إلى الحالة رقم 1 إلى الوكيل العكسي، يجب أن ترجع الخدمة عنوان استجابة HTTP التالي:

    X-ServiceFabric : ResourceNotFound

يشير عنوان استجابة HTTP هذا إلى حالة HTTP 404 عادية، حيث لا يوجد المورد المطلوب، ولن يحاول الوكيل العكسي حل عنوان الخدمة مرة أخرى.

معالجة خاصة للخدمات التي تعمل في حاويات

بالنسبة للخدمات التي تعمل داخل الحاويات، يمكنك استخدام متغير البيئة Fabric_NodeIPOrFQDN لإنشاء عنوان URL للوكيل العكسي، كما في التعليمة البرمجية التالية:

    var fqdn = Environment.GetEnvironmentVariable("Fabric_NodeIPOrFQDN");
    var serviceUrl = $"http://{fqdn}:19081/DockerSFApp/UserApiContainer";

بالنسبة إلى نظام المجموعة المحلي، يتم تعيين Fabric_NodeIPOrFQDN إلى "localhost" بشكل افتراضي. بدء تشغيل نظام المجموعة المحلي باستخدام المعلمة للتأكد من أن الحاويات يمكن أن تصل إلى وكيل عكسي يعمل على العقدة -UseMachineName. لمزيد من المعلومات، راجع تكوين بيئة المطور لتتبع أخطاء الحاويات.

تتطلب خدمات Service Fabric التي يتم تشغيلها داخل حاويات «Docker Compose» تكوين http: أو https: لـ قسم منافذ special docker-compose.yml. لمزيد من المعلومات، راجع دعم توزيع Docker Compose في Azure Service Fabric.

الخطوات التالية