خدمة DNS في Azure Service Fabric

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

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

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

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

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

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

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

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

لمزيد من المعلومات حول الاستعلامات المقسمة، راجع القسم أدناه.

دعم نظام التشغيل

يتم دعم خدمة DNS على كل من أنظمة مجموعات Windows وLinux، على الرغم من أن دعم Linux يقتصر حاليا على الخدمات المعبأة في حاويات ولا يمكن تمكينه من خلال مدخل Microsoft Azure. ومع ذلك، يدعم Windows جميع أنواع الخدمات ونماذج التوزيع.

تمكين خدمة DNS

ملاحظة

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

مجموعات جديدة

أنظمة المجموعات التي تستخدم قوالب ARM

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

أنظمة المجموعات التي تستخدم مدخل Microsoft Azure

إذا كنت تقوم بإنشاء مجموعة قياسية في المدخل، يتم تمكين خدمة DNS بشكل افتراضي في خيار تضمين خدمة DNS ضمن قسم Add on features .

لقطة شاشة لتمكين خدمة DNS لمجموعة قياسية من خلال المدخل.

إذا كنت تقوم بإنشاء مجموعة مدارة في المدخل، يتم تمكين خدمة DNS بشكل افتراضي في خيار خدمة DNS ضمن قسم Add on features .

لقطة شاشة لتمكين خدمة DNS لمجموعة مدارة من خلال المدخل.

المجموعات الموجودة

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

  • استخدم قالب ARM الذي تم استخدامه لتوزيع نظام المجموعة، إن أمكن.
  • انتقل إلى نظام المجموعة على Azure Resource Explorer وقم بتحديث مورد نظام المجموعة، كما هو موضح في الخطوات أدناه (من الخطوة 2 وما بعده).
  • انتقل إلى نظام المجموعة على المدخل وانقر فوق تصدير قالب. لمعرفة المزيد، راجع تصدير القالب من مجموعة الموارد.

بعد أن يكون لديك قالب، يمكنك تمكين خدمة 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')]",
        ...
    }
    

    بالنسبة للمجموعات المدارة، تحقق من تعيين apiVersion إلى 2020-01-01-preview أو أحدث للمورد Microsoft.ServiceFabric/managedClusters ، وإذا لم يكن الأمر كذلك، فقم بتحديثه كما هو موضح في المثال التالي:

    {
        "apiVersion": "2020-01-01-preview",
        "type": "Microsoft.ServiceFabric/managedClusters",
        "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": "<key>",
               "value": "<value>"
             }
           ]
         },
         ...
       ]
      }
      
  3. بمجرد تحديث قالب نظام المجموعة مع تغييراتك الحديثة، قم بتطبيقها والسماح للترقية بالانتهاء. عند اكتمال الترقية، تبدأ خدمة نظام DNS في العمل في نظام المجموعة الخاص بك. اسم الخدمة هو fabric:/System/DnsService، ويمكنك العثور عليه ضمن قسم خدمة النظام في مستكشف Service Fabric.

ملاحظة

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

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

يمكنك تعيين أسماء DNS لخدماتك باستخدام قوالب ARM، مع الخدمات الافتراضية في ملف ApplicationManifest.xml، أو باستخدام أوامر PowerShell.

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

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

تعيين اسم DNS باستخدام قالب ARM

إذا كنت تستخدم قوالب ARM لنشر خدماتك، يمكنك إضافة الخاصية serviceDnsName إلى القسم المناسب وتعيين قيمة لها. يمكن رؤية الأمثلة أدناه:

أنظمة المجموعات القياسية

بالنسبة للمجموعات القياسية، تحقق من تعيين apiVersion إلى 2019-11-01-preview أو أحدث للمورد Microsoft.ServiceFabric/clusters/applications/services ، وإذا لم يكن الأمر كذلك، فقم بتحديثه كما هو موضح في المثال التالي:

{
  "apiVersion": "2019-11-01-preview",
  "type": "Microsoft.ServiceFabric/clusters/applications/services",
  "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]",
  "location": "[variables('clusterLocation')]",
  "dependsOn": [
    "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]"
  ],
  "properties": {
    "provisioningState": "Default",
    "serviceKind": "Stateless",
    "serviceTypeName": "[parameters('serviceTypeName')]",
    "instanceCount": "-1",
    "partitionDescription": {
      "partitionScheme": "Singleton"
    },
    "correlationScheme": [],
    "serviceLoadMetrics": [],
    "servicePlacementPolicies": [],
    "serviceDnsName": "[parameters('serviceDnsName')]"
  }
}

المجموعات المُدارة

بالنسبة للمجموعات المدارة، تحقق من تعيين apiVersion إلى 2022-10-01-preview أو أحدث للمورد Microsoft.ServiceFabric/managedclusters/applications/services ، وإذا لم يكن الأمر كذلك، فقم بتحديثه كما هو موضح في المثال التالي:

{
  "apiVersion": "2022-10-01-preview",
  "type": "Microsoft.ServiceFabric/managedclusters/applications/services",
  "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]",
  "location": "[variables('clusterLocation')]",
  "dependsOn": [
    "[concat('Microsoft.ServiceFabric/managedclusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]"
  ],
  "properties": {
    "serviceKind": "Stateless",
    "serviceTypeName": "[parameters('serviceTypeName')]",
    "instanceCount": "-1",
    "partitionDescription": {
      "partitionScheme": "Singleton"
    },
    "correlationScheme": [],
    "serviceLoadMetrics": [],
    "servicePlacementPolicies": [],
    "serviceDnsName": "[parameters('serviceDnsName')]"
  }
}

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

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

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

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

<Service Name="Stateful1" ServiceDnsName="stateful1.application1" />
  <StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="2" MinReplicaSetSize="2">
    <NamedPartition>
      <Partition Name="partition1" />
      <Partition Name="partition2" />
    </NamedPartition>
  </StatefulService>
</Service>

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

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

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

يمكنك أيضا تحديث خدمة موجودة باستخدام Update-ServiceFabricService أمر PowerShell. يحدث المثال التالي خدمة عديمة الحالة موجودة لإضافة اسم stateless1.application1DNS :

Update-ServiceFabricService `
    -Stateless `
    -ServiceName fabric:/application1/stateless1 `
    -ServiceDnsName stateless1.application1

تحقق من تعيين اسم DNS في Service Fabric Explorer

بمجرد نشر الخدمة باسم DNS، سيعرض Service Fabric Explorer اسم DNS للخدمة، كما هو موضح في الشكل التالي:

لقطة شاشة لاسم DNS في Service Fabric Explorer.

ملاحظة

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

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

بدءا من الإصدار 6.3 من Service Fabric، تدعم خدمة DNS الاستعلامات لأقسام الخدمة. لتمكين دعم استعلامات الخدمة المقسمة، يجب تحديث إعدادات خدمة DNS لتعيين الخيار EnablePartitionedQuery إلى true.

بالنسبة للأقسام التي سيتم استخدامها في استعلامات 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 من بيان نظام المجموعة أو من خلال قالب ARM الخاص بالمجموعة. القيمة الافتراضية هي "--". لمعرفة المزيد، راجع إعدادات خدمة DNS.
  • Target-Partition-Name هو اسم القسم.
  • PartitionSuffix هي قيمة يمكن تعيينها في قسم DnsService من بيان نظام المجموعة أو من خلال قالب ARM الخاص بالمجموعة. القيمة الافتراضية هي سلسلة فارغة. لمعرفة المزيد، راجع إعدادات خدمة DNS.
  • Staying-Partitioned-Service-DNSName هو الجزء المتبقي من اسم DNS للخدمة.

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

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

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

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

إذا قمت بنشر خدمات بأسماء DNS، يمكنك العثور على عنوان IP لنقاط النهاية المكشوفة عن طريق الرجوع إلى اسم DNS. تعمل خدمة DNS للخدمات عديمة الحالة، وفي Service Fabric الإصدار 6.3 والإصدارات الأحدث، للخدمات ذات الحالة. بالنسبة للخدمات ذات الحالة التي تعمل على إصدارات 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://stateless1.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://stateful1--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;
    }
}

الاستعلامات المتكررة

بالنسبة لأسماء DNS التي لا يمكن لخدمة DNS حلها بمفردها (على سبيل المثال، اسم DNS عام)، ستقوم بإعادة توجيه الاستعلام إلى خوادم DNS المتزامنة الموجودة مسبقا على العقد.

رسم تخطيطي يوضح كيفية حل استعلامات DNS للأسماء العامة.

قبل Service Fabric 9.0، تم الاستعلام عن هذه الخوادم بشكل تسلسلي حتى يتم تلقي استجابة، مع فترة مهلة ثابتة من 5 ثوان بينهما. إذا لم يستجب الخادم خلال فترة المهلة، فسيتم الاستعلام عن الخادم التالي (إذا كان متوفرًا). في حالة مواجهة خوادم DNS هذه لأي مشكلات، سيستغرق إكمال استعلامات DNS أكثر من 5 ثوان، وهو أمر غير مثالي.

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

يتم أيضًا تقديم خيارات دقيقة في Service Fabric 9.0 للتحكم في سلوك الاستعلامات المتداخلة، بما في ذلك فترات المهلة ومحاولات الاستعلام. يمكن تعيين هذه الخيارات في إعدادات خدمة DNS:

  • RecursiveQuerySerialMaxAttempts - عدد الاستعلامات التسلسلية التي ستتم محاولتها، على الأكثر. إذا كان هذا الرقم أعلى من عدد خوادم DNS لإعادة التوجيه، فسيتوقف الاستعلام بمجرد محاولة جميع الخوادم مرة واحدة بالضبط.
  • RecursiveQuerySerialTimeout - قيمة المهلة بالثوان لكل محاولة استعلام تسلسلي.
  • RecursiveQueryParallelMaxAttempts - عدد المرات التي ستتم فيها محاولة الاستعلامات المتوازية. يتم تنفيذ الاستعلامات المتوازية بعد استنفاد المحاولات القصوى لطلبات البحث التسلسلية.
  • RecursiveQueryParallelTimeout - قيمة المهلة بالثوان لكل استعلام متوازي تمت محاولة القيام به.

القيود والمشكلات المعروفة

  • المنافذ الديناميكية غير مدعومة من قبل خدمة DNS. لحل الخدمات التي يتم عرضها على المنافذ الديناميكية، استخدم خدمة الوكيل العكسي.
  • يقتصر دعم Linux حاليا على الخدمات الحاوية. لا يمكن للخدمات المستندة إلى العملية على Linux حاليا استخدام خدمة DNS.
  • لا يمكن تمكين خدمة DNS لمجموعات Linux من خلال مدخل Microsoft Azure.
  • إذا تم تغيير اسم DNS لخدمة ما، فقد لا تكون تحديثات الاسم مرئية على الفور في بعض السيناريوهات. لحل المشكلة، يجب إعادة تشغيل مثيلات خدمة DNS عبر نظام المجموعة.

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

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