Domanda

C'è in qualsiasi parte del runtime di servizio che mi avrebbe detto se Sono attualmente in esecuzione su 'Staging' o 'Produzione'? modificare manualmente la configurazione da e produzione sembra un po ingombrante.

È stato utile?

Soluzione

Non si dovrebbe davvero cambiare le configurazioni quando si basa su se siete in Prod o Staging. area di sosta non è progettato per essere un ambiente "QA", ma solo una holding-area prima di produzione viene distribuito.

Quando si carica una nuova distribuzione, slot per la distribuzione di corrente in cui si carica il pacchetto per è distrutta ed è verso il basso per 10-15 minuti, mentre upload e inizio del VM sta accadendo. Se si carica direttamente in produzione, che è a 15 minuti di inattività della produzione. Così, area di sosta è stato inventato: si carica alla messa in scena, di testare la roba, e fare clic sul pulsante "Swap" e l'ambiente di staging diventa magicamente di produzione (swap IP virtuale). Così, il vostro messa in scena in realtà dovrebbe essere al 100% la stessa di vostra produzione.

Quello che penso che stai cercando è QA / ambiente di test? Si dovrebbe aprire un nuovo servizio per ambiente di test con il proprio Prod / Messa in scena. In questo caso, si vuole mantenere più set di file di configurazione, un set per ambiente di distribuzione (produzione, collaudo, ecc.)

Ci sono molti modi per gestire la configurazione, l'inferno che si verifica, in particolare con Azure che ha sulla parte superiore del file config file, proprio * .cscfg. Il modo in cui preferisco farlo con il progetto Azure è la seguente: Imposta un piccolo progetto di configurazione, creare cartelle là che corrispondono a tipi di distribuzione. All'interno ogni set di impostazione della cartella di file * .cscfg * config e quella partita a particolari ambiente di distribuzione: Debug, Test, uscita ... questi sono installati in Visual Studio, nonché, come tipi di destinazione build. Ho un piccolo comando xcopy che si verifica durante ogni fase di compilazione del progetto di configurazione che consente di copiare tutti i file dalla cartella di destinazione Corporatura di progetto config nella cartella principale del progetto Config.

Poi ogni altro progetto nella soluzione, i link ai config o il file .cscfg dalla cartella principale del progetto Config.

Voila, i miei file di configurazione magicamente adattarsi ad ogni configurazione di generazione automatica. Io uso anche .config trasformazioni per gestire le informazioni di debug per gli obiettivi di uscita vs non-Stampa di build.

Se avete letto tutto questo e ancora voglia di arrivare alla Produzione vs. stato Messa in scena in fase di esecuzione , quindi: Ottenere deploymentId da RoleEnvironment.DeploymentId Quindi utilizzare API di gestione con un adeguato X509 certificate per arrivare al Azure structure of your Service e chiamare il metodo GetDeployments (è API REST, ma c'è una libreria di astrazione).

Spero che questo aiuti

Modifica: post del blog come richiesto per la configurazione delle stringhe di configurazione e il passaggio tra gli ambienti @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other- cloud-based-NET-soluzione

Altri suggerimenti

A volte vorrei che la gente sarebbe solo rispondere alla domanda .. non spiega etica o best practice ...

Microsoft ha pubblicato un esempio di codice facendo esattamente questo qui: https: //code.msdn .microsoft.com / windowsazure / CSAzureDeploymentSlot-1ce0e3b5

immagine che mostra esempio Staging

immagine che mostra esempio di produzione

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

staging è una slot spiegamento temporaneo utilizzato principalmente per aggiornamenti non-tempi morti e possibilità di ripristinare un aggiornamento.

Si consiglia di non accoppiare il sistema (sia in codice o in config) con tali specifiche Azure.

Windows Azure Biblioteche Gestione e grazie a @ GuaravMantri risposta ad un'altra domanda si può fare in questo modo:

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

Un modo semplice per risolvere questo problema è la creazione a istanze di una chiave per identificare quale ambiente è in esecuzione.

1) Impostare in slot di produzione: Set It Impostazioni >> Impostazioni applicazione >> Impostazioni app E creare una chiave denominata SLOT_NAME e il valore di "produzione". IMPORTANTE: controllo impostazione Slot.

2) Impostare a slot messa in scena: Set It Impostazioni >> Impostazioni applicazione >> Impostazioni app E creare una chiave denominata SLOT_NAME e il valore di "messa in scena". IMPORTANTE: controllo impostazione Slot.

Accesso dalla vostra applicazione variabile e identificare quale ambiente l'applicazione è in esecuzione. In Java è possibile accedere a:

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

Qui ci sono 4 punti da considerare

  1. di swap VIP ha senso solo se il servizio deve affrontare il mondo esterno. AKA, quando espone un'API e reagisce alle richieste.
  2. Se tutto il vostro servizio non fa altro che tirare i messaggi da una coda ed elaborarli, quindi i vostri servizi è proattivo e di swap VIP non è una buona soluzione per voi.
  3. Se il servizio è sia reattivo e proattivo, si potrebbe voler riconsiderare il vostro disegno. Forse dividere il servizio in 2 diversi servizi.
  4. Il suggerimento di Eric di modificare i file cscfg pre e post-scambio VIP è buono se la parte attiva del vostro servizio può richiedere un tempo breve verso il basso (Poiché si configurano prima sia Staging e produzione di non tirare i messaggi, quindi eseguire Swap VIP e quindi aggiornare la configurazione di produzione per iniziare a scaricare i messaggi).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top