2010-12-01 3 views
45

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

ответ

75

Вы действительно не должны изменять свои конфигурации, когда находитесь на основе, если вы находитесь в 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.

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

Надеется, что это помогает

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

+2

Hi Igorek, можете ли вы предоставить нам несколько примеров кода или пошаговое руководство с ним? У меня также проблемы с web.config в Azure за среду .... – 2011-01-19 11:43:47

+1

+1 для Игорека, чтобы написать блог-постер об этом :) – Slav 2011-02-20 12:58:23

+6

Восемь месяцев спустя, но вот он: http://www.paraleap.com/ блог/сообщение/Управление-среда-в-распределенном-Azure-or-other-cloud-based-NET-solution.aspx – Igorek 2011-09-13 02:17:37

8

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

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

1

Вот 4 балла рассмотреть

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

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

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(); 
    } 
} 
5

С Windows Azure Management Libraries и благодаря @GuaravMantri answer на другой вопрос, вы можете сделать это следующим образом:

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; 
     } 
    } 
} 
2

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

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

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

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

String slotName = System.getenv("APPSETTING_SLOT_NAME"); 
Смежные вопросы