دليل لتحويل أدوار الويب والعمال إلى خدمات عديمة الجنسية لنسيج الخدمة

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

مشروع الخدمة السحابية لمشروع تطبيق نسيج الخدمة

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

الفرق هو أن مشروع Cloud Service يقرن نشر التطبيق بنشر جهاز ظاهري وبالتالي يحتوي على إعدادات تكوين جهاز ظاهري فيه، في حين أن مشروع تطبيق Service Fabric يحدد فقط تطبيقًا سيتم نشره على مجموعة من الأجهزة الظاهرية الموجودة في مجموعة Service Fabric. يتم نشر مجموعة Service Fabric نفسها مرة واحدة فقط، إما من خلال قالب Resource Manager أو من خلال مدخل Microsoft Azure، ويمكن نشر تطبيقات Service Fabric متعددة عليها.

مقارنة مشروع Service Fabric والخدمات السحابية

دور العامل في خدمة عديمي الجنسية

من الناحية المفاهيمية، يمثل دور العامل حمل عمل عديم الجنسية، مما يعني أن كل مثيل من حمل العمل متطابق ويمكن توجيه الطلبات إلى أي مثيل في أي وقت. لا يتوقع من كل مثيل أن يتذكر الطلب السابق. اذكر أن حمل العمل الذي يعمل عليه تتم إدارته بواسطة مخزن حالة خارجي، مثل Azure Table Storage أو Azure Cosmos DB. في نسيج الخدمة، يتم تمثيل هذا النوع من حمل العمل بواسطة خدمة عديمة الجنسية. يمكن القيام بأبسط طريقة لترحيل دور العامل إلى نسيج الخدمة عن طريق تحويل رمز دور العامل إلى خدمة عديمة الجنسية.

دور العامل في الخدمة عديمة الحالة

دور الويب في خدمة عديمي الجنسية

على غرار دور العامل، يمثل دور الويب أيضًا حمل عمل عديم الجنسية، وبالتالي من الناحية المفاهيمية، يمكن تعيينه أيضًا إلى خدمة عديمة الجنسية في Service Fabric. ومع ذلك، على عكس أدوار ويب، لا يدعم Service Fabric IIS. يتطلب ترحيل تطبيق ويب من دور ويب إلى خدمة عديمة الجنسية الانتقال أولًا إلى إطار عمل ويب يمكن استضافته ذاتيًا ولا يعتمد على IIS أو System.Web، مثل ASP.NET Core 1.

التطبيق مدعوم مسار الترحيل
نماذج ويب ASP.NET لا قم بالتحويل إلى ASP.NET كور 1 MVC
ASPNET. MVC مع الهجرة الترقية إلى ASP.NET Core 1 MVC
واجهة برمجة التطبيقات ASP.NET Web مع الهجرة استخدام الخادم المستضاف ذاتيًا أو ASP.NET Core 1
ASP.NET Core 1 نعم غير متوفر

واجهة برمجة تطبيقات نقطة الدخول ودورة الحياة

توفر واجهات برمجة تطبيقات خدمة دور العامل وService Fabric نقاط دخول مماثلة:

نقطة الإدخال دور العامل خدمة Service Fabric
المعالجة Run() RunAsync()
بدء تشغيل جهاز ظاهري OnStart() غير متوفر
توقف جهاز ظاهري OnStop() غير متوفر
فتح المستمع لطلبات العملاء غير متوفر
  • CreateServiceInstanceListener() لعديم الحالة
  • CreateServiceReplicaListener() لحالة

دور العامل


using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
        }

        public override bool OnStart()
        {
        }

        public override void OnStop()
        {
        }
    }
}

Service Fabric لعديم الحالة


using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.ServiceFabric.Services.Communication.Runtime;
using Microsoft.ServiceFabric.Services.Runtime;

namespace Stateless1
{
    public class Stateless1 : StatelessService
    {
        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
        }

        protected override Task RunAsync(CancellationToken cancelServiceInstance)
        {
        }
    }
}

كلاهما لديه تجاوز "تشغيل" أساسي لبدء المعالجة. خدمات Service Fabric تجمع بين Run وStart وStop في نقطة دخول واحدة RunAsync. يجب أن تبدأ خدمتك في العمل عند بدء تشغيل RunAsync، ويجب أن تتوقف عن العمل عند الإشارة إلى CancellationToken الخاص بالطريقة RunAsync.

هناك العديد من الاختلافات الرئيسية بين دورة حياة أدوار العمال وخدمات Service Fabric وعمرها:

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

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

واجهة برمجة تطبيقات التطبيق والبيئة

توفر واجهة برمجة تطبيقات بيئة الخدمات السحابية معلومات ووظائف لمثيل الجهاز الظاهري الحالي بالإضافة إلى معلومات حول مثيلات دور الأجهزة الظاهرية الأخرى. يوفر Service Fabric معلومات تتعلق بوقت تشغيله وبعض المعلومات حول العقدة التي تعمل عليها الخدمة حاليًا.

مهمة البيئة خدمات السحابة Service Fabric
الإعدادات التكوين وإشعار التغيير RoleEnvironment CodePackageActivationContext
التخزين المحلي RoleEnvironment CodePackageActivationContext
معلومات نقطة النهاية RoleInstance
  • الحالة الحالية: RoleEnvironment.CurrentRoleInstance
  • أدوار وأمثلة أخرى: RoleEnvironment.Roles
  • NodeContext لعنوان العقدة الحالي
  • FabricClient وServicePartitionResolver لاكتشاف نقطة نهاية الخدمة
محاكاة البيئة RoleEnvironment.IsEmulated غير متوفر
حدث تغيير متزامن RoleEnvironment غير متوفر

إعدادات التكوين

يتم تعيين إعدادات التكوين في الخدمات السحابية لدور جهاز ظاهري وتنطبق على جميع مثيلات دور الجهاز الظاهري هذا. هذه الإعدادات هي أزواج من القيم الرئيسية التي تم تعيينها في ملفات ServiceConfiguration.*.cscfg ويمكن الوصول إليها مباشرة من خلال RoleEnvironment. في Service Fabric، تنطبق الإعدادات بشكل فردي على كل خدمة وعلى كل تطبيق، بدلًا من الجهاز الظاهري، لأن الجهاز الظاهري يمكنه استضافة خدمات وتطبيقات متعددة. تتكون الخدمة من ثلاث حزم:

  • التعليمات البرمجية: يحتوي على الملفات التنفيذية للخدمة والثنائيات وDLLs وأي ملفات أخرى تحتاج الخدمة إلى تشغيلها.
  • التكوين: جميع ملفات التكوين والإعدادات الخاصة بالخدمة.
  • البيانات: ملفات البيانات الثابتة المرتبطة بالخدمة.

يمكن إصدار كل حزمة من هذه الحزم و ترقيتها بشكل مستقل. على غرار الخدمات السحابية، يمكن الوصول إلى حزمة التكوين برمجيًا من خلال واجهة برمجة التطبيقات وتتوفر الأحداث لإخطار الخدمة بتغيير حزمة التكوين. يمكن استخدام ملف Settings.xml لتكوين القيمة الرئيسية والوصول البرمجي على غرار قسم إعدادات التطبيق في ملف App.config. ومع ذلك، على عكس الخدمات السحابية، يمكن أن تحتوي حزمة تكوين Service Fabric على أي ملفات تكوين بأي تنسيق، سواء كان XML أو JSON أو YAML أو تنسيقًا ثنائيًا مخصصًا.

الوصول إلى التكوين

خدمات السحابة

يمكن الوصول إلى إعدادات التكوين من ServiceConfiguration.*.cscfg من خلال RoleEnvironment. تتوفر هذه الإعدادات عالميًا لجميع مثيلات الأدوار في نفس نشر الخدمة السحابية.


string value = RoleEnvironment.GetConfigurationSettingValue("Key");

Service Fabric

كل خدمة لديها حزمة التكوين الفردية الخاصة بها. لا توجد آلية مضمنة لإعدادات التكوين العمومية التي يمكن الوصول إليها بواسطة جميع التطبيقات في مجموعة. عند استخدام ملف تكوين Settings.xml الخاص بـService Fabric ضمن حزمة تكوين، يمكن الكتابة فوق القيم الموجودة في Settings.xml على مستوى التطبيق، مما يجعل إعدادات التكوين على مستوى التطبيق ممكنة.

إعدادات التكوين هي عمليات الوصول داخل كل مثيل خدمة من خلال الخدمة CodePackageActivationContext.


ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

// Access Settings.xml
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;

string value = parameters["Key"]?.Value;

// Access custom configuration file:
using (StreamReader reader = new StreamReader(Path.Combine(configPackage.Path, "CustomConfig.json")))
{
    MySettings settings = JsonConvert.DeserializeObject<MySettings>(reader.ReadToEnd());
}

أحداث تحديث التكوين

خدمات السحابة

يتم استخدام الحدث RoleEnvironment.Changed لإعلام كافة مثيلات الدور عند حدوث تغيير في البيئة، مثل تغيير التكوين. يستخدم هذا لاستهلاك تحديثات التكوين دون إعادة تدوير مثيلات الدور أو إعادة تشغيل عملية عامل.


RoleEnvironment.Changed += RoleEnvironmentChanged;

private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
{
   // Get the list of configuration changes
   var settingChanges = e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>();
foreach (var settingChange in settingChanges) 
   {
      Trace.WriteLine("Setting: " + settingChange.ConfigurationSettingName, "Information");
   }
}

Service Fabric

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

تتوفر هذه الأحداث لاستهلاك التغييرات في حزم الخدمات دون إعادة تشغيل مثيل الخدمة.


this.Context.CodePackageActivationContext.ConfigurationPackageModifiedEvent +=
                    this.CodePackageActivationContext_ConfigurationPackageModifiedEvent;

private void CodePackageActivationContext_ConfigurationPackageModifiedEvent(object sender, PackageModifiedEventArgs<ConfigurationPackage> e)
{
    this.UpdateCustomConfig(e.NewPackage.Path);
    this.UpdateSettings(e.NewPackage.Settings);
}

مهام بدء التشغيل

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

Service Fabric خدمات السحابة
موقع التكوين ServiceDefinition.csdef
الامتيازات "محدودة" أو "مرتفعة"
التسلسل "بسيطة"، "خلفية"، "مقدمة"

خدمات السحابة

في الخدمات السحابية، يتم تكوين نقطة إدخال بدء تشغيل لكل دور في ServiceDefinition.csdef.


<ServiceDefinition>
    <Startup>
        <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
            <Environment>
                <Variable name="MyVersionNumber" value="1.0.0.0" />
            </Environment>
        </Task>
    </Startup>
    ...
</ServiceDefinition>

Service Fabric

في Service Fabric يتم تكوين نقطة إدخال بدء تشغيل لكل خدمة في ServiceManifest.xml:


<ServiceManifest>
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>Startup.bat</Program>
      </ExeHost>
    </SetupEntryPoint>
    ...
</ServiceManifest>

ملاحظة حول بيئة التنمية

يتم دمج كل من الخدمات السحابية وService Fabric مع Visual Studio مع قوالب المشروع ودعم تصحيح الأخطاء وتكوينها ونشرها محليًا وإلى Azure. توفر كل من الخدمات السحابية وService Fabric أيضًا بيئة وقت تشغيل التطوير المحلي. الفرق هو أنه في حين أن وقت تشغيل تطوير Cloud Service يحاكي بيئة Azure التي يعمل عليها، فإن Service Fabric لا يستخدم محاكي - فهو يستخدم وقت تشغيل Service Fabric الكامل. بيئة نسيج الخدمة التي تقوم بتشغيلها على جهاز التطوير المحلي الخاص بك هي نفس البيئة التي تعمل في الإنتاج.

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

اقرأ المزيد حول خدمات Service Fabric الموثوقة والاختلافات الأساسية بين الخدمات السحابية وبنية تطبيق Service Fabric لفهم كيفية الاستفادة من المجموعة الكاملة من ميزات Service Fabric.