خدمة DNS في Azure Service Fabric

خدمة DNS هي خدمة نظام اختيارية يمكنك تمكينها في نظام مجموعتك لاكتشاف خدمات أخرى باستخدام بروتوكول DNS.

يمكن معالجة العديد من الخدمات، وخاصة الخدمات المعبأة في حاويات من خلال عنوان URL موجود مسبقا. من الأفضل حل هذه الخدمات باستخدام بروتوكول DNS القياسي، بدلا من بروتوكول خدمة Service Fabric Naming. تمكنك خدمة DNS من تعيين أسماء DNS إلى اسم خدمة وبالتالي حل عناوين IP لنقطة النهاية. تحافظ هذه الوظيفة على قابلية نقل الخدمات المعبأة في حاويات عبر منصات مختلفة ويمكن أن تجعل سيناريوهات "الرفع والتحول" أسهل، من خلال السماح لك باستخدام عناوين URL الحالية للخدمة بدلا من الاضطرار إلى إعادة كتابة التعليمات البرمجية للاستفادة من خدمة التسمية.

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

Diagram showing how DNS names are mapped to service names by the DNS service for stateless services.

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

  • التقسيم المسمى
  • التقسيم النطاقي
  • تقسيم قاعدة بيانات أحادية

يوضح الرسم التخطيطي التالي كيفية عمل خدمة DNS للخدمات ذات الحالة المقسمة.

Diagram showing how DNS names are mapped to service names by the DNS service for partitioned stateless services.

المنافذ الديناميكية غير مدعومة من خدمة DNS. لحل الخدمات التي يتم عرضها على المنافذ الديناميكية، استخدم خدمة الوكيل العكسي.

تمكين خدمة DNS

ملاحظة

خدمة DNS لخدمات Service Fabric غير مدعومة على Linux الآن.

عند إنشاء نظام مجموعة باستخدام المدخل، يتم تمكين خدمة DNS بشكل افتراضي في خانة الاختيار تضمين خدمة DNS في قائمة تكوين نظام المجموعة:

Enabling DNS service through the portal

إذا كنت لا تستخدم المدخل لإنشاء مجموعتك أو إذا كنت تقوم بتحديث نظام المجموعة الحالي، لن تحتاج إلى تمكين خدمة DNS في قالب:

  • لتوزيع نظام مجموعة جديدة، يمكنك إما استخدام نماذج القوالب أو إنشاء قالب Resource Manager الخاص بك.
  • لتحديث مجموعة موجودة، يمكنك الانتقال إلى مجموعة موارد المجموعة على المدخل والنقر فوق برنامج نصي تلقائي للعمل مع قالب يعكس الحالة الحالية لنظام المجموعة والموارد الأخرى في المجموعة. لمعرفة المزيد، راجع تصدير القالب من مجموعة الموارد.

بعد أن يكون لديك قالب، يمكنك تمكين خدمة DNS باتباع الخطوات التالية:

  1. تحقق من تعيين المورد apiversion إلى 2017-07-01-preview أو لاحقًا إلى المورد Microsoft.ServiceFabric/clusters، وإذا لم يكن الأمر كذلك، فقم بتحديثه كما هو موضح في المثال التالي:

    {
        "apiVersion": "2017-07-01-preview",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        ...
    }
    
  2. الآن قم بتمكين خدمة DNS بإحدى الطرق التالية:

    • لتمكين خدمة DNS باستخدام الإعدادات الافتراضية، أضفها إلى القسم addonFeatures الموجود داخل القسم properties كما هو موضح في المثال التالي:

        "properties": {
          ...
          "addonFeatures": [
            "DnsService"
            ],
          ...
        }
      
    • لتمكين الخدمة باستخدام إعدادات أخرى غير الإعدادات الافتراضية، أضف قسم DnsService إلى القسم fabricSettings الموجود داخل القسم properties. في هذه الحالة، لا تحتاج إلى إضافة DnsService إلى addonFeatures. لمعرفة المزيد حول الخصائص التي يمكن تعيينها لخدمة DNS، راجع إعدادات خدمة DNS.

          "properties": {
            ...
            "fabricSettings": [
              ...
              {
                "name": "DnsService",
                "parameters": [
                  {
                    "name": "IsEnabled",
                    "value": "true"
                  },
                  {
                    "name": "PartitionSuffix",
                    "value": "--"
                  },
                  {
                    "name": "PartitionPrefix",
                    "value": "--"
                  }
                ]
              },
              ...
             ]
           }
      
  3. بمجرد تحديث قالب نظام المجموعة مع تغييراتك الحديثة، قم بتطبيقها والسماح للترقية بالانتهاء. عند اكتمال الترقية، تبدأ خدمة نظام DNS في العمل في نظام المجموعة الخاص بك. اسم الخدمة هو fabric:/System/DnsService، ويمكنك العثور عليه ضمن قسم خدمة النظام في مستكشف Service Fabric.

ملاحظة

عند ترقية DNS من وضع تعطيل إلى وضع تمكين، قد لا يعكس مستكشف Service Fabric الحالة الجديدة. لحل هذه المشكلة، أعد تشغيل العقد عن طريق تعديل UpgradePolicy في قالب Azure Resource Manager. راجع مرجع Service Fabric Template لمزيد من المعلومات.

ملاحظة

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

تعيين اسم DNS لخدمتك

يمكنك تعيين اسم DNS لخدماتك إما بشكل معلن للخدمات الافتراضية في ملف ApplicationManifest.xml أو من خلال أوامر PowerShell.

اسم DNS لخدمتك قابل للحل في جميع أماكن نظام المجموعة لذلك من المهم التأكد من عدم تشابه اسم DNS عبر المجموعة.

يوصى بشدة استخدام نظام تسمية لـ <ServiceDnsName>.<AppInstanceName>؛ على سبيل المثال، service1.application1. في حالة توزيع التطبيق باستخدام إنشاء Docker، يتم تعيين أسماء DNS تلقائيا للخدمات باستخدام نظام التسمية هذا.

تعيين اسم DNS لخدمة افتراضية في ApplicationManifest.xml

افتح مشروعك في Visual Studio، أو المحرر المفضل لديك، وافتح ملف ApplicationManifest.xml. انتقل إلى قسم الخدمات الافتراضية، وأضف السمة ServiceDnsName لكل خدمة. يوضح المثال التالي كيفية تعيين اسم DNS للخدمة إلى service1.application1

    <Service Name="Stateless1" ServiceDnsName="service1.application1">
      <StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>

بمجرد توزيع التطبيق، يعرض مثيل الخدمة في مستكشف Service Fabric اسم DNS لهذا المثيل، كما هو موضح في الشكل التالي:

service endpoints

يقوم المثال التالي بتعيين اسم DNS لخدمة ذات حالة إلى statefulsvc.app. تستخدم الخدمة نظام تقسيم مسمى. لاحظ أن أسماء الأقسام بأحرف صغيرة. يعد هذا شرط للأقسام التي سيتم استهدافها في استعلامات DNS. لمزيد من المعلومات، راجع إنشاء استعلامات DNS على قسم خدمة ذي حالة.

    <Service Name="Stateful1" ServiceDnsName="statefulsvc.app" />
      <StatefulService ServiceTypeName="ProcessingType" TargetReplicaSetSize="2" MinReplicaSetSize="2">
        <NamedPartition>
         <Partition Name="partition1" />
         <Partition Name="partition2" />
        </NamedPartition>
      </StatefulService>
    </Service>

تعيين اسم DNS لخدمة باستخدام PowerShell

يمكنك تعيين اسم DNS لخدمة عند إنشائها باستخدام الأمر New-ServiceFabricService PowerShell. ينشئ المثال التالي خدمة جديدة بدون حالة باسم DNS service1.application1

    New-ServiceFabricService `
    -Stateless `
    -PartitionSchemeSingleton `
    -ApplicationName `fabric:/application1 `
    -ServiceName fabric:/application1/service1 `
    -ServiceTypeName Service1Type `
    -InstanceCount 1 `
    -ServiceDnsName service1.application1

[معاينة] إجراء استعلامات DNS على قسم خدمة ذي حالة

بدءا من الإصدار 6.3 من Service Fabric، تدعم خدمة Service Fabric DNS الاستعلامات الخاصة بأقسام الخدمة.

بالنسبة للأقسام التي سيتم استخدامها في استعلامات DNS، تطبق قيود التسمية التالية:

  • يجب أن تكون أسماء الأقسام متوافقة مع DNS.
  • يجب ألا تكون أسماء الأقسام متعددة التسميات (التي تتضمن نقطة، '.'، في الاسم).
  • يجب أن تكون أسماء الأقسام بأحرف صغيرة.

يتم تنسيق استعلامات DNS التي تستهدف قسما كما يلي:

    <First-Label-Of-Partitioned-Service-DNSName><PartitionPrefix><Target-Partition-Name>< PartitionSuffix>.<Remaining- Partitioned-Service-DNSName>

المكان:

  • First-Label-Of-Partitioned-Service-DNSName الجزء الأول من اسم DNS الخاص بخدمتك.
  • PartitionPrefixهي قيمة يمكن تعيينها في قسم DnsService من بيان نظام المجموعة أو من خلال قالب Resource Manager الخاص بنظام المجموعة. القيمة الافتراضية هي "--". لمعرفة المزيد، راجع إعدادات خدمة DNS.
  • Target-Partition-Name هو اسم القسم.
  • PartitionPrefixهي قيمة يمكن تعيينها في قسم DnsService من بيان نظام المجموعة أو من خلال قالب Resource Manager الخاص بنظام المجموعة. القيمة الافتراضية هي سلسلة فارغة. لمعرفة المزيد، راجع إعدادات خدمة DNS.
  • Staying-Partitioned-Service-DNSName هو الجزء المتبقي من اسم DNS للخدمة.

تعرض الأمثلة التالية استعلامات DNS للخدمات المقسمة التي تعمل على نظام مجموعة يحتوي على إعدادات افتراضية لـ PartitionPrefix و PartitionSuffix:

  • لحل القسم "0" من خدمة باسم DNS backendrangedschemesvc.application يستخدم نظام تقسيم نطاق، استخدم backendrangedschemesvc-0.application.
  • لحل القسم "0" من خدمة باسم DNS backendnamedschemesvc.application يستخدم نظام تقسيم نطاق، استخدم backendnamedschemesvc-first.application.

تقوم خدمة DNS بإرجاع عنوان IP الخاص بالنسخة المتماثلة الأساسية للقسم. إذا لم يتم تحديد قسم، تقوم الخدمة بإرجاع عنوان IP الخاص بالنسخة المتماثلة الأساسية لقسم تم تحديده عشوائيا.

استخدام DNS في خدماتك

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

المنافذ الديناميكية غير مدعومة من خدمة DNS. يمكنك استخدام خدمة الوكيل العكسي لحل الخدمات التي تستخدم المنافذ الديناميكية.

توضح التعليمة البرمجية التالية كيفية استدعاء خدمة بدون حالة من خلال DNS. إنها ببساطة مكالمة http عادية تقدم فيها اسم DNS والمنفذ وأي مسار اختياري كجزء من عنوان URL.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://service1.application1:8080/api/values");
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            result = await response.Content.ReadAsStringAsync();

        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        return result;
    }
}

تعرض التعليمة البرمجية التالية مكالمة على قسم معين من الخدمة ذات الحالة. في هذه الحالة، يحتوي اسم DNS على اسم القسم (partition1). تفترض المكالمة مجموعة ذات قيم افتراضية لـ PartitionPrefix و PartitionSuffix.

public class ValuesController : Controller
{
    // GET api
    [HttpGet]
    public async Task<string> Get()
    {
        string result = "";
        try
        {
            Uri uri = new Uri("http://service2-partition1.application1:8080/api/values");
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            result = await response.Content.ReadAsStringAsync();

        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        return result;
    }
}

المشكلات المعروفة

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

  • خدمة DNS لخدمات Service Fabric غير مدعومة على Linux الآن. يتم دعم خدمة DNS للحاويات على Linux. الدقة اليدوية باستخدام Fabric Client / ServicePartitionResolver هو البديل المتاح.

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

تعرف على المزيد حول اتصال الخدمة داخل المجموعة باستخدام الاتصال والتواصل مع الخدمات