Pregunta

¿Hay algún lugar en el tiempo de ejecución del servicio que me diga si estoy actualmente en ejecución en la puesta en escena "o 'producción'? modificar manualmente la configuración desde y hacia la producción parece un poco engorroso.

¿Fue útil?

Solución

En realidad, no debe cambiar sus configuraciones cuando estás basa en si estás en Prod o puesta en escena. área de ensayo no está diseñado para ser un entorno de "control de calidad", sino sólo una zona de espera antes de que se despliegue la producción.

Cuando se carga un nuevo despliegue, ranura para el despliegue actual en la que se carga el paquete a se destruye y está desactivado por 10-15 minutos mientras se carga e inicio de la VM está sucediendo. Si carga directamente en la producción, que es de 15 minutos de tiempo de inactividad de la producción. De este modo, área de ensayo fue inventado: se carga en transferencia, prueba la materia, y hace clic en el botón "Cambio" y el entorno de ensayo se convierte mágicamente Producción (IP virtual de intercambio). Por lo tanto, su puesta en escena en realidad debería ser el 100% igual que su producción.

Lo que creo que estás buscando es QA / pruebas de medio ambiente? Usted debe abrir un nuevo servicio para el entorno de pruebas con su propio Prod / puesta en escena. En este caso, tendrá que mantener varios conjuntos de archivos de configuración, un juego por entorno de despliegue (producción, pruebas, etc.)

Hay muchas maneras de administrar configuración de demonios que se produce, especialmente con azul que tiene en la parte superior de los archivos .config, archivos de su propio * .cscfg. La manera en que yo prefiero hacerlo con el proyecto Azure es el siguiente: Configuración de un pequeño proyecto de configuración, crear carpetas ahí que los partidos tipos de implementación. Dentro de cada uno de los conjuntos de configuración de carpeta * .config y archivos * .cscfg ese partido en particular a entorno de despliegue: depuración, prueba, lanzamiento ... son de configuración en Visual Studio, así como los tipos de blancos de construcción. Tengo un pequeño comando xcopy que ocurre durante cada compilación del proyecto de configuración que copia todos los archivos de la carpeta de destino de construcción del proyecto de configuración en la carpeta raíz del proyecto de configuración.

A continuación, cada dos proyecto de la solución, los enlaces a las .config o archivo .cscfg desde la carpeta raíz del proyecto de configuración.

Voila, mis configuraciones mágicamente adaptarse a cada configuración de generación automática. También uso .config transformaciones para administrar la información de depuración para los objetivos de liberación frente a no-construcción de la release.

Si usted ha leído todo esto y todavía desea conseguir en el Estado de la estadificación de Producción vs en tiempo de ejecución y, a continuación: Obtener deploymentId de RoleEnvironment.DeploymentId A continuación, utilice la API de administración con un X509 certificate adecuado para llegar a la Azure structure of your Service y llame al método GetDeployments (que es la API REST pero hay una biblioteca de abstracción).

Espero que esto ayude

Edit: entrada de blog como solicitada acerca de la configuración de cadenas de configuración y el cambio entre los entornos @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other- -NET-solución basada en la nube

Otros consejos

A veces me gustaría que la gente simplemente responder a la pregunta .. no explica la ética o las mejores prácticas ...

Microsoft ha publicado un ejemplo de código haciendo exactamente esto aquí: https: //code.msdn .microsoft.com / windowsazure / CSAzureDeploymentSlot-1ce0e3b5

imagen que muestra instancia Staging

imagen que muestra instancia de producción

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

La estadificación es una ranura despliegue temporal utilizado principalmente para las actualizaciones no hay tiempo de inactividad y capacidad de revertir una actualización.

Se aconseja no para acoplar el sistema (ya sea en clave o en config) con tales características específicas Azure.

Windows Azure Gestión de Bibliotecas gracias a @ GuaravMantri respuesta a otra pregunta que puede hacerlo de esta manera:

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

Una manera fácil de resolver este problema es la creación de instancias de una clave para identificar qué entorno se está ejecutando.

1) ajustadas en la ranura de la producción: Configurarlo Configuración >> >> configuración de la aplicación de configuración de aplicaciones Y crear una clave denominada SLOT_NAME y el valor de la "producción". IMPORTANTE: especificación de ranura de retención.

2) ajustadas en la ranura de estadificación: Configurarlo Configuración >> >> configuración de la aplicación de configuración de aplicaciones Y crear una clave denominada SLOT_NAME y el valor de "puesta en escena". IMPORTANTE: especificación de ranura de retención.

El acceso desde la aplicación de la variable e identificar qué entorno se ejecuta la aplicación. En Java se puede acceder a:

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

Aquí hay 4 puntos a considerar

  1. intercambio VIP sólo tiene sentido cuando el servicio se enfrenta al mundo exterior. También conocido como, cuando se expone una API y reacciona a las solicitudes.
  2. Si todo su servicio hace es tirar mensajes de una cola y transformarlos, a continuación, sus servicios es proactivo y de intercambio VIP no es una buena solución para usted.
  3. Si su servicio es tanto reactivo como proactivo, es posible que desee reconsiderar su diseño. Tal vez dividir el servicio en 2 servicios diferentes.
  4. sugerencia de modificar los archivos cscfg de Eric pre y post-canje VIP es bueno si la parte activa de su servicio puede tomar un tiempo más corto hacia abajo (Debido a que configure por primera vez, tanto de ensayo y producción de no tirar mensajes, a continuación, realizar Intercambiar VIP , y luego actualizar la configuración de la producción comience tirando de mensajes).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top