Подтвердить что ты не робот

Этап постановки или производства?

Есть ли где-нибудь в среде выполнения службы, которые скажут мне, если я в настоящее время работаю над "Staging" или "Production"? Вручную изменять конфигурацию в и из производства представляется немного громоздкой.

4b9b3361

Ответ 1

Вы действительно не должны изменять свои конфигурации, когда будете на основе, если вы находитесь в Prod или Staging. Промежуточная область не предназначена для среды "QA", а только область хранения перед развертыванием.

Когда вы загружаете новое развертывание, текущий слот развертывания, в который вы загружаете свой пакет, уничтожается и заканчивается на 10-15 минут при загрузке и запуске виртуальной машины. Если вы загружаете прямо в производство, это 15 минут простоя производства. Таким образом, была создана область постановки: вы загружаетесь в стадию, проверяете материал и нажимаете кнопку "своп", а ваша среда постановки волшебным образом становится производством (виртуальный обмен IP). Таким образом, ваша постановка должна быть действительно на 100% такой же, как ваша постановка.

Что я думаю, что вы ищете, это QA/тестовая среда? Вы должны открыть новый сервис для среды тестирования с помощью собственного Prod/Staging. В этом случае вам нужно будет поддерживать несколько наборов конфигурационных файлов, по одному для каждой среды развертывания (Production, Testing и т.д.).

Существует множество способов управления конфигурацией-адом, особенно с Azure, которая имеет поверх файлов .config, свои собственные файлы *.cscfg. То, как я предпочитаю делать это с проектом Azure, выглядит следующим образом: Настройте небольшой проект Config, создайте там папки, соответствующие типам развертывания. Внутри каждой папки устанавливаются файлы *.config и *.cscfg, которые соответствуют конкретной среде развертывания: Debug, Test, Release... они также настраиваются в Visual Studio, а также в качестве типов целевых объектов. У меня есть небольшая команда xcopy, которая возникает во время каждой компиляции проекта Config, которая копирует все файлы из папки "Создать целевую" проекта Config в корневую папку проекта Config.

Затем каждый другой проект в решении связывается с файлом .config или .cscfg из корневой папки проекта Config.

Voila, мои конфиги волшебным образом адаптируются к каждой конфигурации сборки автоматически. Я также использую преобразования .config для управления информацией об отладке для целей выпуска Release и non-Release.

Если вы все это прочитали и все еще хотите получить статус Production vs. Staging во время выполнения, тогда: Получите deploymentId из RoleEnvironment.DeploymentId Затем используйте API управления с правильным X509 certificate, чтобы получить значение Azure structure of your Service и вызовите метод GetDeployments (он остался api, но есть библиотека абстракции).

Надеюсь, что это поможет

Изменить: запись в блоге по запросу о настройке строк конфигурации и переключении между средами @http://www.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other-cloud-based-NET-solution.aspx

Ответ 2

Иногда я хочу, чтобы люди просто ответили на вопрос.. не объяснять этику или лучшие практики...

Microsoft опубликовала пример кода, который делает именно это здесь: https://code.msdn.microsoft.com/windowsazure/CSAzureDeploymentSlot-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(); 
    } 
}

Ответ 3

Staging - это временный слот развертывания, используемый в основном для обновлений без простоя и возможности отката обновления.

Рекомендуется не связывать вашу систему (либо в коде, либо в конфиге) с такими особенностями Azure.

Ответ 4

Поскольку Библиотеки управления 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;
        }
    }
}

Ответ 5

Простым способом решения этой проблемы является установка в ваших экземплярах ключа для определения среды, в которой она запущена.

1) Установите в своем рабочем слоте: Установите его Настройки → Параметры приложения → Настройки приложения И создайте ключ с именем SLOT_NAME и оцените "production". ВАЖНО: проверьте настройку слота.

2) Установите в своем промежуточном слоте: Установите его Настройки → Параметры приложения → Настройки приложения И создайте ключ с именем SLOT_NAME и оцените "этап". ВАЖНО: проверьте настройку слота.

Доступ из вашего приложения к переменной и определение среды, в которой работает приложение. На Java вы можете получить доступ:

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

Ответ 6

Вот 4 точки для рассмотрения

  • VIP swap имеет смысл только тогда, когда ваш сервис стоит перед внешним миром. AKA, когда он предоставляет API и реагирует на запросы.
  • Если ваша служба действительно выводит сообщения из очереди и обрабатывает их, ваши сервисы активны, а VIP-обмен не является хорошим решением для вас.
  • Если ваша услуга является реактивной и активной, вы можете пересмотреть свой дизайн. Возможно, разделить службу на две разные службы.
  • Предложение Эрика о модификации файлов cscfg pre и post-VIP хорош, если проактивная часть вашей службы может занять короткое время простоя (поскольку вы сначала настраиваете как Staging, так и Production, чтобы не вытаскивать сообщения, затем выполняйте VIP Swap, а затем обновить конфигурацию производства, чтобы начать вытягивание сообщений).