Постановка или производство экземпляра? - PullRequest
46 голосов
/ 01 декабря 2010

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

Ответы [ 6 ]

77 голосов
/ 02 декабря 2010

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

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

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

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

Затем все остальные проекты в решении, ССЫЛКИв файл .config или .cscfg из корневой папки проекта Config.

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

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

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

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

51 голосов
/ 29 октября 2014

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

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(); 
    } 
}
8 голосов
/ 02 декабря 2010

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

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

5 голосов
/ 29 июня 2015

С Windows Azure Management Libraries и благодаря @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;
        }
    }
}
4 голосов
/ 03 марта 2016

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

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

2) Установите в своем промежуточном слоте: Установите его Настройки >> Настройки приложения >> Настройки приложения И создайте ключ с именем SLOT_NAME и значением «staging».ВАЖНО: проверьте настройки слота.

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

String slotName = System.getenv("APPSETTING_SLOT_NAME");
1 голос
/ 24 октября 2014

Вот 4 пункта, которые следует учитывать

  1. VIP-своп имеет смысл только тогда, когда ваши услуги обращены к внешнему миру.АКА, когда он выставляет API и реагирует на запросы.
  2. Если все, что вам нужно сделать - это извлечь сообщения из очереди и обработать их, тогда ваши сервисы проактивны, и VIP-своп не является хорошим решением для вас.1006 *
  3. Если ваш сервис является как реактивным, так и проактивным, вы можете пересмотреть свой дизайн.Возможно, разделите службу на 2 разных службы.
  4. Предложение Эрика об изменении файлов cscfg до и после VIP-перестановки хорошо, если проактивная часть вашей службы может занять короткое время (потому что вы сначала настраиваете обаПодготовка и производство, чтобы не получать сообщения, затем выполнить VIP-своп, а затем обновить конфигурацию производства, чтобы начать получение сообщений).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...