Постановка или производственный экземпляр?

StackOverflow https://stackoverflow.com/questions/4328462

  •  29-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: сообщение в блоге, как запрошено о настройке строк конфигурации и переключении между средами @ http://blog.paraleap.com/blog/post/managing-environments-in-a-distributed-azure-or-other-cloud на основе сетевой сети

Другие советы

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

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

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

Рекомендуется не объединить вашу систему (ни в коде, ни в конфигурации) с такими спецификами 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 и значение «Производство». ВАЖНО: Проверьте настройку слота.

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

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

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

Вот 4 балла, которые нужно рассмотреть

  1. VIP Swap имеет смысл только тогда, когда ваш сервис сталкивается с внешним миром. Ака, когда он разоблачает API и реагирует на запросы.
  2. Если все ваши сервисы делают сообщения из очереди и обрабатывают их, то ваши услуги являются упреждающими, а VIP -обмен не является хорошим решением для вас.
  3. Если ваш сервис является как реактивным, так и упреждающим, вы можете пересмотреть свой дизайн. Возможно, разделите сервис на 2 разных службы.
  4. Предложение Эрика об изменении файлов CSCFG Pre- и Post-VIP хорош, если упреждающая часть вашей службы может занять короткое время (потому что вы сначала настраиваете как постановку, так и производство, чтобы не вытащить сообщения, а затем выполняете VIP-совоку, а затем Обновите конфигурацию производства для начала вытягивания сообщений).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top