Question

est-il partout dans le moteur d'exécution de service qui me dire si je suis actuellement en cours d'exécution sur « Mise en scène » ou « Production »? modifier manuellement la configuration et à la production semble une lourde bits.

Était-ce utile?

La solution

Vous devriez vraiment pas changer vos configurations lorsque vous êtes basé sur si vous êtes dans une option ou Staging. staging n'a pas été conçu pour être un environnement « QA », mais seulement une exploitation zone avant que la production est déployée.

Lorsque vous téléchargez un nouveau déploiement, emplacement de déploiement actuel où vous transférez votre colis est détruit et est en baisse pour 10-15minutes tout en téléchargement et le début de VM se passe. Si vous téléchargez directement dans la production, qui est de 15 minutes d'arrêt de production. Ainsi, la zone Mise en scène a été inventé: vous téléchargez à la mise en scène, tester les choses, et cliquez sur le bouton « Swap » et votre environnement Mise en scène devient magique production (échange IP virtuelle). Ainsi, votre mise en scène devrait vraiment être à 100% le même que votre production.

Ce que je pense que vous êtes à la recherche est QA / environnement de test? Vous devriez ouvrir un nouveau service pour l'environnement de test avec sa propre Prod / Mise en scène. Dans ce cas, vous voulez maintenir les ensembles de fichiers de configuration multiples, un ensemble par un environnement de déploiement (production, tests, etc.)

Il y a plusieurs façons de gérer la configuration-enfer qui se produit, en particulier avec Azure qui a au-dessus des fichiers .config, les fichiers de son propre *. La façon dont je préfère le faire avec le projet Azure se présente comme suit: Installation d'un petit projet Config, créer des dossiers là-bas qui correspondent à des types de déploiement. A l'intérieur de chaque ensembles de configuration du dossier de * .config & * fichiers .cscfg qui correspondent à l'environnement de déploiement particulier: débogage, test, sortie ... ce sont configurés dans Visual Studio ainsi, que la construction des types de cibles. J'ai une petite commande xcopy qui se produit lors de chaque compilation du projet de configuration qui copie tous les fichiers de Build dossier cible du projet Config dans le dossier racine du projet Config.

Alors tous les autres projets dans la solution, des liens vers le fichier .config ou .cscfg à partir du dossier racine du projet Config.

Voila, mes configs adapter comme par magie à chaque configuration de construction automatiquement. Je l'utilise aussi .config transformations pour gérer les informations de débogage pour la version par rapport à des objectifs de construction non mise à jour.

Si vous avez lu tout cela et que vous voulez toujours obtenir au Production par rapport à l'état de mise en attente à l'exécution , puis: Obtenez deploymentId de RoleEnvironment.DeploymentId Ensuite, utilisez l'API de gestion avec une X509 certificate appropriée pour obtenir au Azure structure of your Service et appeler la méthode GetDeployments (il est reste api, mais il y a une bibliothèque d'abstraction).

Hope this helps

Edit: blog tel que demandé sur la configuration des chaînes de configuration et la commutation entre les environnements @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other- nuage basée sur-NET solution

Autres conseils

Parfois, je souhaite que les gens simplement répondre à la question .. ne pas expliquer l'éthique ou les meilleures pratiques ...

Microsoft a posté un exemple de code fait exactement ce ici: https: //code.msdn .microsoft.com / windowsazure / CSAzureDeploymentSlot-1ce0e3b5

image montrant instance Mise en scène

image montrant instance de production

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

Mise en scène est une fente de déploiement temporaire utilisé principalement pour des mises à niveau sans interruption de service et la capacité à faire reculer une mise à niveau.

Il est conseillé de ne pas coupler votre système (en code ou dans la configuration) avec de tels détails Azure.

Depuis Windows Azure Gestion des bibliothèques et grâce à @ GuaravMantri réponse à une autre question, vous pouvez le faire comme ceci:

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 moyen facile de résoudre ce problème est DURCISSEMENT à vos instances une clé pour identifier quel environnement il est en cours d'exécution.

1) Réglez votre emplacement de production: Réglez-le Paramètres >> Paramètres d'application >> paramètres App Et créer une clé nommée SLOT_NAME et la valeur « production ». IMPORTANT: Vérifiez le réglage d'emplacement.

2) Réglez votre emplacement de mise en scène: Réglez-le Paramètres >> Paramètres d'application >> paramètres App Et créer une clé nommée SLOT_NAME et la valeur « mise en scène ». IMPORTANT: Vérifiez le réglage d'emplacement.

L'accès de l'application de la variable et déterminer quel environnement l'application fonctionne. En Java, vous pouvez accéder à:

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

Voici les 4 points à considérer

  1. échange VIP n'a de sens que lorsque votre service fait face au monde extérieur. Alias, quand il expose une API et réagit aux demandes.
  2. Si tout votre service est fait des messages d'attraction d'une file d'attente et de les traiter, alors vos services est proactive et d'échange VIP n'est pas une bonne solution pour vous.
  3. Si votre service est à la fois réactif et proactif, vous voudrez peut-être reconsidérer votre conception. Peut-être diviser le service en 2 différents services.
  4. la suggestion de Eric de modifier les fichiers cscfg avant et après échange de VIP est bon si la partie proactive de votre service peut prendre un temps court vers le bas (Parce que vous devez d'abord configurer à la fois Mise en scène et la production pour ne pas les messages tirer, puis effectuer Swap VIP , puis mettre à jour la configuration de production pour commencer à tirer des messages).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top