سؤال

هل هناك أي مكان في وقت تشغيل الخدمة من شأنه أن يخبرني إذا كنت أقوم حاليًا بتشغيل "التدريج" أو "الإنتاج"؟ يبدو تعديل التكوين يدويًا من وإنتاج الإنتاج مرهقًا بعض الشيء.

هل كانت مفيدة؟

المحلول

يجب ألا تغير تكويناتك حقًا عندما تكون مستندًا إلى ما إذا كنت في حالة من الحث أو التدريج. لم يتم تصميم منطقة التدريج لتكون بيئة "QA" ولكن فقط في منطقة الاحتفاظ قبل نشر الإنتاج.

عند تحميل عملية نشر جديدة ، يتم تدمير فتحة النشر الحالية حيث يتم تحميل الحزمة الخاصة بك إلى حدوث 10-15 دقيقة أثناء تحميل وبدء VM's. إذا قمت بالتحميل مباشرة إلى الإنتاج ، فهذا 15 دقيقة من التوقف عن الإنتاج. وهكذا ، تم اختراع منطقة التدريج: يتم تحميلها إلى تنظيم واختبار الأشياء ، والنقر فوق الزر "Swap" وتصبح بيئة التدريج الخاصة بك بشكل سحري الإنتاج (مبادلة IP الظاهرية). وبالتالي ، يجب أن يكون التدريج الخاص بك حقًا 100 ٪ مثل إنتاجك.

ما أعتقد أنك تبحث عنه هو بيئة QA/اختبار؟ يجب عليك فتح خدمة جديدة لاختبار بيئة مع Prod/التدريج الخاص بها. في هذه الحالة ، سترغب في الحفاظ على مجموعات ملفات التكوين المتعددة ، مجموعة واحدة لكل بيئة نشر (الإنتاج ، الاختبار ، إلخ)

هناك العديد من الطرق لإدارة جهد التكوين الذي يحدث ، خاصة مع Azure الذي يحتوي على ملفات .config ، ملفات *.cscfg الخاصة بها. الطريقة التي أفضل القيام بها مع مشروع Azure هي كما يلي: قم بإعداد مشروع تكوين صغير ، قم بإنشاء مجلدات هناك تتطابق مع أنواع النشر. داخل كل مجموعات إعدادات مجلد من *.config & *.cscfg ملفات تتطابق مع بيئة نشر معينة: التصحيح ، الاختبار ، الإصدار ... هذه هي الإعداد في Visual Studio أيضًا ، كنوع مستهدف للبناء. لديّ أمر XCOPY صغير يحدث أثناء كل مجموعة من مشروع التكوين الذي يقوم بنسخ جميع الملفات من مجلد Build Target of Config إلى مجلد ROOT لمشروع التكوين.

ثم كل مشروع آخر في الحل ، يرتبط بملف .config أو .cscfg من المجلد الجذر لمشروع التكوين.

VOILA ، تكويناتي سحرية مع كل تكوين بناء تلقائيا. أستخدم أيضًا.

إذا كنت قد قرأت كل هذا وما زلت تريد الوصول إلى الإنتاج مقابل حالة التدريج في وقت التشغيل, ، و من ثم حصل deploymentId من RoleEnvironment.DeploymentIdثم استخدم واجهة برمجة تطبيقات الإدارة باستخدام مناسب X509 certificate للوصول إلى Azure structure of your Service ودعا GetDeployments الطريقة (إنها API REST ولكن هناك مكتبة تجريد).

أتمنى أن يساعدك هذا

تحرير: منشور المدونة كما هو مطلوب حول إعداد سلاسل التكوين والتبديل بين البيئات @ http://blog.paraleap.com/blog/post/managing-environments-in-a-distributed-azure-or--soloud-cloud-net-solution

نصائح أخرى

في بعض الأحيان أتمنى أن يجيب الناس على السؤال .. لا يشرح الأخلاق أو أفضل الممارسات ...

نشرت Microsoft نموذج رمز القيام بذلك بالضبط هنا: https://code.msdn.microsoft.com/windowsazure/csazureploymentslot-1ce0e3b5

image showing Staging instance

image showing Production instance

protected void Page_Load(object sender, EventArgs e) 
{ 
    // You basic information of the Deployment of Azure application. 
    string deploymentId = RoleEnvironment.DeploymentId; 
    string subscriptionID = "<Your subscription ID>"; 
    string thrumbnail = "<Your certificate thumbnail print>"; 
    string hostedServiceName = "<Your hosted service name>"; 
    string productionString = string.Format(
        "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
        subscriptionID, hostedServiceName, "Production"); 
    Uri requestUri = new Uri(productionString); 

    // Add client certificate. 
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.OpenExistingOnly); 
    X509Certificate2Collection collection = store.Certificates.Find(
        X509FindType.FindByThumbprint, thrumbnail, false); 
    store.Close(); 

    if (collection.Count != 0) 
    { 
        X509Certificate2 certificate = collection[0]; 
        HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
        httpRequest.ClientCertificates.Add(certificate); 
        httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
        httpRequest.KeepAlive = false; 
        HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse;

        // Get response stream from Management API. 
        Stream stream = httpResponse.GetResponseStream(); 
        string result = string.Empty; 
        using (StreamReader reader = new StreamReader(stream)) 
        { 
            result = reader.ReadToEnd();
        } 
        if (result == null || result.Trim() == string.Empty) 
        {
            return;
        }
        XDocument document = XDocument.Parse(result); 
        string serverID = string.Empty; 
        var list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.microsoft.com/windowsazure")) 
                   select item; 

        serverID = list.First().Value; 
        Response.Write("Check Production: "); 
        Response.Write("DeploymentID : " + deploymentId
            + " ServerID :" + serverID); 
        if (deploymentId.Equals(serverID)) 
            lbStatus.Text = "Production"; 
        else 
        { 
            // If the application not in Production slot, try to check Staging slot. 
            string stagingString = string.Format(
                "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
                subscriptionID, hostedServiceName, "Staging"); 
            Uri stagingUri = new Uri(stagingString); 
            httpRequest = (HttpWebRequest)HttpWebRequest.Create(stagingUri); 
            httpRequest.ClientCertificates.Add(certificate); 
            httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
            httpRequest.KeepAlive = false; 
            httpResponse = httpRequest.GetResponse() as HttpWebResponse; 
            stream = httpResponse.GetResponseStream(); 
            result = string.Empty; 
            using (StreamReader reader = new StreamReader(stream)) 
            { 
                result = reader.ReadToEnd();
            } 
            if (result == null || result.Trim() == string.Empty) 
            {
                return;
            }
            document = XDocument.Parse(result); 
            serverID = string.Empty; 
            list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.microsoft.com/windowsazure")) 
                   select item; 

            serverID = list.First().Value; 
            Response.Write(" Check Staging:"); 
            Response.Write(" DeploymentID : " + deploymentId
                + " ServerID :" + serverID); 
            if (deploymentId.Equals(serverID)) 
            {
                lbStatus.Text = "Staging";
            }
            else 
            {
                lbStatus.Text = "Do not find this id";
            }
        } 
        httpResponse.Close(); 
        stream.Close(); 
    } 
}

التدريج عبارة عن فتحة نشر مؤقتة تستخدم بشكل أساسي لترقيات عدم الترقيات والقدرة على الترقية.

يُنصح بعدم إقران نظامك (إما في التعليمات البرمجية أو في التكوين) مع تفاصيل Azure هذه.

حيث مكتبات إدارة Windows Azure وبفضل guaravmantri إجابه لسؤال آخر يمكنك القيام بذلك على هذا النحو:

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Management.Compute;
using Microsoft.WindowsAzure.Management.Compute.Models;

namespace Configuration
{
    public class DeploymentSlotTypeHelper
    {
        static string subscriptionId = "<subscription-id>";
        static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";// copy-paste it
        static string cloudServiceName = "<your cloud service name>"; // lowercase
        static string ns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";

        public DeploymentSlot GetSlotType()
        {
            var managementCertificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
            var credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);

            var computeManagementClient = new ComputeManagementClient(credentials);
            var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
            return response.Deployments.FirstOrDefault(d => d.DeploymentSlot == DeploymentSlot.Production) == null ? DeploymentSlot.Staging : DeploymentSlot.Production;
        }
    }
}

تتمثل إحدى الطرق السهلة لحل هذه المشكلة في تحديد مثيلاتك مفتاحًا لتحديد البيئة التي يتم تشغيلها.

1) اضبط في فتحة الإنتاج الخاصة بك: قم بتعيين إعداداتها >> إعدادات التطبيق >> إعدادات التطبيق وإنشاء مفتاح يسمى Slot_Name و Value "Production". هام: تحقق من إعداد الفتحة.

2) اضبط في فتحة التدريج الخاصة بك: قم بتعيين إعداداتها >> إعدادات التطبيق >> إعدادات التطبيق وإنشاء مفتاح يسمى Slot_Name و Value "التدريج". هام: تحقق من إعداد الفتحة.

الوصول من التطبيق الخاص بك المتغير وتحديد البيئة التي يتم تشغيل التطبيق. في Java يمكنك الوصول:

String slotName = System.getenv("APPSETTING_SLOT_NAME");

هنا 4 نقاط للنظر فيها

  1. تبادل VIP منطقي فقط عندما تواجه خدمتك العالم الخارجي. AKA ، عندما تكشف واجهة برمجة التطبيقات وتتفاعل مع الطلبات.
  2. إذا كانت كل خدمتك هي سحب الرسائل من قائمة انتظار ومعالجتها ، فإن خدماتك تكون استباقية ومبادلة VIP ليست حلاً جيدًا لك.
  3. إذا كانت خدمتك تفاعلية واستباقية على حد سواء ، فقد ترغب في إعادة النظر في التصميم الخاص بك. ربما تقسيم الخدمة إلى خدمتين مختلفتين.
  4. إن اقتراح إريك لتعديل ملفات CSCFG قبل وبعد مبادلة VIP أمر جيد إذا كان الجزء الاستباقي من خدمتك يمكن أن يستغرق وقتًا قصيرًا (لأنك تقوم أولاً بتكوين كل من الإنتاج والإنتاج لسحب الرسائل ، ثم إجراء مبادلة VIP ، ثم تبادل VIP ، ثم إجراء مبادلة VIP ، ثم تحديث تكوين الإنتاج لبدء سحب الرسائل).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top