Laboratorios del curso Windows Azure Technical Training Santiago #windowsazure

Durante el curso Windows Azure Technical Training Santiago Chile, entrenamiento fuertemente orientado a la práctica, se realizaron 10 ejercicios para los desarrolladores y 12 ejercicios para los IT pro.
Los recursos utilizados para estos ejercicios son de libre acceso, por lo cual cualquier persona puede realizarlos si tiene una cuenta de Windows Azure. Si no la tiene, puede abrir una trial por 30 días de manera gratuita.

Para los desarrolladores de software, la batería de ejercicios es la siguiente:

1. Azure Web Sites
https://rgodinhodemo.blob.core.windows.net/hol/ASPNETAzureWebSites.zip

2. SQL Server on Azure Virtual Machines
https://rgodinhodemo.blob.core.windows.net/hol/ConnectingApplicationsVNet.zip

3. Windows Azure Mobile Services
http://www.windowsazure.com/en-us/documentation/articles/mobile-services-html-get-started/Windows

4. Windows Azure Media Services
https://jpgarcia.cl/2013/04/02/windows-azure-media-services-publicar-videos-para-ios-y-windows-phone-azure/

5. Windows Azure Active Directory
http://www.asp.net/identity/overview/getting-started/developing-aspnet-apps-with-windows-azure-active-directory
http://blogs.technet.com/b/ad/archive/2013/06/26/improved-windows-azure-active-directory-integration-with-asp-net-amp-visual-studio.aspx

6. Windows Azure SQL Database
https://rgodinhodemo.blob.core.windows.net/hol/IntroSQLDatabase.zip

7. Windows Azure Diagnostic & Patterns
http://www.windowsazure.com/en-us/manage/services/web-sites/choose-web-app-service/Troubleshooting
http://msdn.microsoft.com/en-us/library/windowsazure/hh771389

8. Windows Azure Service Bus
http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-queues/
http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-relay/

9. Windows Azure Cloud Services
http://msdn.microsoft.com/en-us/library/ff687127.aspx

10. Windows Azure Storage
http://www.windowsazure.com/en-us/develop/net/tutorials/multi-tier-web-site/1-overview/

Para los profesionales de infraestructura , la batería de ejercicios es la siguiente:

1. Windows Azure Virtual Machines
https://rgodinhodemo.blob.core.windows.net/hol/IntroToWindowsAzureVirtualMachines.zip

2. SQL Server on Azure Virtual Machines
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-provision-sql-server/

3. Azure SQL Database
http://www.windowsazure.com/en-us/documentation/articles/sql-database-create-configure/
http://www.windowsazure.com/en-us/documentation/articles/sql-database-deploy/
http://www.windowsazure.com/en-us/documentation/articles/sql-database-manage-windows-azure-SSMS/

4. Windows Azure Virtual Network
http://msdn.microsoft.com/en-us/library/windowsazure/dn133792.aspx
https://jpgarcia.cl/2013/06/07/como-usar-custom-load-balance-y-affinity-en-windows-azure-windowsazure/

5. Sharepoint on Azure Virtual Machines
http://msdn.microsoft.com/en-us/library/windowsazure/dn275959.aspx
http://blogs.technet.com/b/keithmayer/archive/2013/01/07/step-by-step-build-a-free-sharepoint-2013-lab-in-the-cloud-with-windows-azure-31-days-of-servers-in-the-cloud-part-7-of-31.aspx

6. Windows Azure Stoarge
http://michaelwasham.com/windows-azure-powershell-reference-guide/copying-vhds-blobs-between-storage-accounts/
http://msdn.microsoft.com/en-us/library/jj720558%28v=sql.120%29.aspx
https://blogs.technet.com/b/heyscriptingguy/archive/2014/01/24/create-backups-of-virtual-machines-in-windows-azure-by-using-powershell.aspx

7. Windows Azure Managment Services
http://www.windowsazure.com/en-us/manage/services/cloud-services/how-to-scale-a-cloud-service/
http://msdn.microsoft.com/en-us/library/windowsazure/dn306638.aspx
http://www.windowsazure.com/en-us/manage/services/storage/how-to-monitor-a-storage-account/

Windows Azure Technical Community Training CHILE #windowsazure

header

Invitación Windows Azure Technical Community Training

Windows Azure Technical Community Training es un entrenamiento técnico enfocado en entregar a nuestros socios de negocio los conocimientos necesarios para poder enfrentar proyectos Cloud utilizando Windows Azure. El curso está compuesto de dos tracks en paralelo, uno orientado a los desarrolladores de aplicaciones y el otro a los profesionales de infraestructura.  Para ambas audiencias el entrenamiento incluye sesiones teóricas y prácticas en donde se realizarán los ejercicios directamente en Windows Azure.

Este entrenamiento tiene una duración de 3 días para poder darle la profundidad técnica que los socios necesitan para ejecutar proyectos Cloud.

Objetivos del Entrenamiento

 Entregado por arquitectos regionales de Azure del equipo de  Microsoft corporación, los asistentes aprenderán de manera práctica temas como los siguientes:

  • Cómo se puede aprovechar Windows Azure para desarrollar aplicaciones altamente escalables
  • Cómo se pueden desplegar en Windows Azure cargas de trabajo como por ejemplo SQL Server y Sharepoint, aprovechando las ventajas de la nube.
  • Cómo enfrentar los temas de diagnóstico y administración de las aplicaciones en la nube
  • Aprender los patrones y mejores prácticas que se aplican en los proyectos de Nube en Windows Azure

Contenidos del Curso

 Contenidos para Desarrolladores de Aplicaciones

 El track de desarrollo cuenta con los siguientes módulos:

  1. Introducción a Cloud y Windows Azure
  2. Desarrollo de aplicaciones sobre Cloud Services
  3. Desarrollo de Sitos Web modernos y altamente escalables
  4. Uso de Azure SQL Database
  5. Uso de Windows Azure Storage
  6. Diagnóstico y administración de las aplicaciones
  7. Introducción a los otros servicios de Azure
  8. Cloud Computing Patterns & Practices

Agenda para profesionales de infraestructura

El track de infraestructura cuenta con los siguientes módulos

  1. Introducción a Cloud y Windows Azure
  2. Infraestructura como Servicio (IaaS) Máquinas virtuales
  3. Virtual Networking
  4. Cargas de trabajo en Máquinas virtuales ( SQL Server y SharePoint)
  5. Solución de hospedaje para sitios Web
  6. Administración de la nube y ambientes híbridos
  7. Plataforma como servicio (PaaS)

En ambos tracks algunos de  los módulos serán dictados en inglés.

Agenda

Day Begin End Topic CSV Topic SI

4 de Marzo

9:00

10:00

Introduction Introduction

10:00

10:15

Coffee Break Coffee Break

10:15

11:15

Cloud Services Virtual Machines

11:15

12:45

Hand on Lab: Cloud Services Hands On Lab: Virtual Machines

12:45

13:45

Lunch Lunch

13:45

14:45

Websites Virtual Networks

14:45

16:15

Hand on Lab: Websites Hands On Lab: Virtual Network

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

PowerShell

5 de Marzo

9:00

10:00

Storage SQL Server on VMs

10:00

10:15

Coffee Break Coffee Break

10:15

11:45

HOL – Storage Hands on Lab: SQL Server on WMs

11:45

12:45

Virtual Machines SharePoint on VMs

12:45

13:45

Lunch Lunch

13:45

15:15

Hand on Lab – VMs with SQL Hands on Lab: SharePoint on VMs

15:15

16:15

SQL Database Storage

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

HOL – SQL Database Hands on Lab: Storage

6 de Marzo

9:00

10:00

Diagnostics & Patterns System Center

10:00

10:15

Coffee Break Coffee Break

10:15

11:15

Windows Azure Active Directory Azure Management Services

11:15

12:45

HOL – Active Directory Hands on Lab: Azure Managment

12:45

13:45

Lunch

13:45

14:45

Windows Azure Other Services Windows Azure Web Sites

14:45

16:15

HOL – Other Services HOL-Web Sites

16:15

16:30

Coffee Break Coffee Break

16:30

17:30

Close Close

¿A quién está dirigido el entrenamiento?

Este es un entrenamiento técnico que cubre dos audiencias, desarrolladores de aplicaciones y profesionales de infraestructura que estén interesados en aprender de manera práctica los principales conceptos de Windows Azure.

Pre-requisito

Los asistentes al entrenamiento realizarán ejercicios prácticos durante los 3 días del entrenamiento. Para ello, se requiere que cada participante lleve su propio Notebook en el cual realizará los laboratorios.

 Los asistentes al track de desarrollo de software deben traer pre  instalados el siguiente software:

1. Visual Studio 2013 Express para Web o superior

http://www.visualstudio.com/downloads/download-visual-studio-vs

2. Windows Azure SDK Octubre 2013

http://www.windowsazure.com/en-us/downloads/?fb=en-us

Los asistentes al track de infraestructura deben traer pre instalados el siguiente software:

1.  Windows Azure PowerShell

http://www.windowsazure.com/en-us/manage/install-and-configure-windows-powershell/

Cada asistente recibirá una cuenta de Windows Azure gratuita para que pueda desarrollar sus ejercicios y pruebas durante el entrenamiento y posteriormente seguir con ejercicios y pruebas durante 30 días.

¡Regístrate aquí!

Business Rule Engine en Windows Azure #windowsazure

Introducción

Trabajando con un partner mexicano de Guadalajara me encontré con el siguiente requerimiento:

Necesito crear flujos de trabajo que evalúen reglas de negocio que estén fuera del código. Además necesito que estos flujos de trabajo se expongan como servicios para que diferentes sistemas los llamen.

Para los que desarrollan en .NET desde la version 3.5 del framework tienen disponible Workflow Fundation(WF). En este artículo, vamos a desarrollar una solución muy simple para ambos requerimientos utilizando WF4.  La idea es utilizar las capacidades que tiene WF para trabajar con reglas, una de las partes más interesantes de WF. El escenario a desarrollar se muestra en el diagrama 1.

00

La solución final se basa en construir un proyecto Workflow Services, que es la publicación de manera nativa de los WF como servicios usando WCF, los que se publicarán en un Web Role de Windows Azure. Estos workflows pueden evaluar un conjunto de regalas de negocio que están definidas en un archivo XML externos al código. La idea es almacenar el set de regalas de negocio en Windows Azure Blob Storage, de manera que estén disponibles para los Workflow Services. Complementario a lo anterior, vamos a construir un editor y probador de reglas de negocio en una aplicación Windows de consola. Está aplicación nos permite cambiar las reglas en tiempo de ejecución sin necesidad de volver a hacer deploy porque están absolutamente desacopladas del código.

Este articulo está dividido en dos partes, primero vamos a construir una biblioteca que nos facilite el trabajo con reglas y una aplicación de consola para probarla. En la segunda parte vamos a usar la biblioteca desde los Workflows para evaluar reglas en tiempo de ejecución.

Primera parte: Biblioteca y pruebas

Biblioteca de ayuda para usar Reglas de Negocio

Comenzamos por crear una biblioteca de ayuda para utilizar las reglas de negocio de WF desde la aplicación de consola para administración   y  evaluación desde los Wrokflow services en tiempo de ejecución.  Esta biblioteca nos simplifica todo el manejo de las reglas de negocio y está compuesta por la clase BREClient  la que se muestra en el siguiente diagrama.

01

Clase BREClient: Edición de reglas

Lo primero que necesitamos hacer es poder cargar o crear RuleSet. Para ello necesitamos utilizar desde nuestra biblioteca el Blob Storage de Windows Azure. Para ello debemos agregar las librerías clientes de Windows Azure Storage, como se muestra en la siguiente imagen.

3

Como segundo paso agregamos los Assemblies de Windows Worflow Fundation, como se muestra en la siguiente imagen.

4

El método LoadRuleSet de la clase BREClient nos permite cargar o crear un RuleSet desde un archivo XML que se almacena en un contenedor específico del Blob Storage.

///
/// Load or create RulseSet from XMl file RuleSetXmlFile stoarge in RuleSetContainer
        ///
        ///Container´s name
        ///Xml File´s name
        ///
        private RuleSet LoadRuleSet(string RuleSetContainer,string RuleSetXmlFile)
        {
            RuleSet ruleset;
            XmlTextReader reader;
            try
            {
                CloudBlobContainer container = blobClient.GetContainerReference(RuleSetContainer);
                CloudBlockBlob blockBlob = container.GetBlockBlobReference(RuleSetXmlFile);

                if (BlobExist(blockBlob))
                {
                    //Load RuleSet From XML
                    using (var memoryStream = new MemoryStream())
                    {
                        blockBlob.DownloadToStream(memoryStream);
                        memoryStream.Position = 0;
                        reader = new XmlTextReader(memoryStream);
                        WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
                        object results = serializer.Deserialize(reader);
                        ruleset = (RuleSet)results;
                    }
                }
                else
                {
                    //Create New RuleSet
                    ruleset = new RuleSet();
                }
            }
            catch (Exception X)
            {
                //TODO: manage exception
                throw X;
            }
            return ruleset;
        }

El segundo método que necesitamos en la clase BREClient es  SaveRuleSet, que nos permite persistir el RuleSet en un archivo XML en el Blob Storage.

private void SaveRuleSet(string RuleSetContainer,string RuleSetXmlFile, RuleSet ruleset)
        {
            MemoryStream memoryStream = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(memoryStream, null);
            WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
            serializer.Serialize(writer, ruleset);
            try
            {
                CloudBlobContainer container = blobClient.GetContainerReference(RuleSetContainer);
                CloudBlockBlob blockBlob = container.GetBlockBlobReference(RuleSetXmlFile);
                memoryStream.Position = 0;
                blockBlob.UploadFromStream(memoryStream);
            }
            catch (Exception)
            {
                //TODO: manage exception
                throw;
            }
            memoryStream = null;
        }

Con estos dos métodos podemos editar las reglas de negocio utilizando la interfaz Rule Set Editor, como se muestra en la siguiente imagen.

02

Este editor es parte del Windows Workflow Fundation, por lo que solo tenemos que invocarla para editar las reglas y luego al presionar OK podemos guardarlas para ser usadas desde diferentes Workflows. El método EditRuleDialog carga las reglas desde el archivo XML, lo edita y luego actualiza con los cambios realizados.

///
/// Load or create Ruleset, Edit with Rule Set Editor and save the changes in XML file.
///
///Type Class used in Rules
///Xml File Blob Container
///XML File´s name
public void EditRuleDialog(Type TargetType, string RuleSetContainer, string RuleSetXmlFile)
{
   RuleSet ruleset = null;
   //load or creat if not exits
   ruleset = this.LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
            RuleSetDialog dialog = new RuleSetDialog(TargetType, null, ruleset);
   DialogResult result = dialog.ShowDialog();
   if (result == DialogResult.OK)
     {
        SaveRuleSet(RuleSetContainer, RuleSetXmlFile, dialog.RuleSet);
      }
}

Con esta implementación se puede editar reglas de negocio absolutamente desacopladas del código de los Workflows. El siguiente código permite editar reglas utilizando la clase BREClient.

static void EDitar()
{
  //conn is Azure Storage´s connection string
   BREClient RuleClient = new BREClient(conn);
  //Target Class to use in Rules
  Person mySubjectEval = new Person();
  string RuleContainer = "demo";
  string RuleXmlFile = "PersonCredit.xml";
  RuleClient.EditRuleDialog(typeof(Person), RuleContainer, RuleXmlFile);
}

Clase BREClient: Evaluación de reglas

Una vez creadas las reglas de negocio y almacenadas en el storage de azure podemos utilizarlas desde diferentes clientes, sin importar si son Workflows o aplicaciones .NET de otra naturaleza, ya que la clase BREClient nos dará acceso al Framework de reglas.

La evaluación de las reglas se hace utilizando  la clase BREClient con el método público RuleExecute donde se carga el Rulset y se evalúan las reglas. El método privado hace la evaluación realmente, mientras que el público le provee el contexto para la ejecución.

///
/// Execute Rule evaluation
///
///Object used in rules
///RuleSet
private void RuleExecute( Object Target, RuleSet ruleset)
{
 try
    {
      RuleValidation validation = new RuleValidation(Target.GetType(), null);
      RuleExecution engine = new RuleExecution(validation, Target);
      ruleset.Execute(engine);
     }
catch (Exception X)
      {
        System.Diagnostics.Trace.WriteLine(X.Message, "Error");
        throw X;
       }
}
///
/// Execute rule evaluation with or without rulset´s cache
///
///Rulset´s blob container
///Rulset´s Xml file
///Object used in rules
///Use Rulset Cache
public void RuleExecute(string RuleSetContainer, string RuleSetXmlFile, Object Target, bool UseRuleCache)
{
   RuleSet ruleset = null;
   if (UseRuleCache)
   {
     string key = string.Format("{0}/{1}", RuleSetContainer, RuleSetXmlFile);
     if (!RuleSetCache.ContainsKey(key))
     {
        ruleset = LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
        RuleSetCache.Add(key, ruleset);
      }
      ruleset = (RuleSet)RuleSetCache[key];
      this.RuleExecute(Target, ruleset);
    }
    else
    {
      ruleset = LoadRuleSet(RuleSetContainer, RuleSetXmlFile);
      this.RuleExecute(Target, ruleset);
   }
}

Para probar la evaluación de las reglamos podemos usar el siguiente método donde se crea el objeto subjectX que es de la clase Person que se utiliza en la regla.

static void Test()
{
  Person subjectX= new Person();
  BREClient RuleClient = new BREClient(conn);
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
  {
    subjectX.Age = i;
    RuleClient.RuleExecute(RuleContainer, RuleXmlFile, subjectX,false);
    Console.WriteLine(string.Format("Age= {0} rule response {1}", i, subjectX.RuleEval));
   }
   DateTime timeOne = DateTime.Now;
   Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
   Console.WriteLine("");
}

La regla que estamos usando es la siguiente: si la propiedad Age es menor que 5, la propiedad RuleEval de la clase Person es verdadero sino falso. Esto se muestra en la siguiente imagen.

02

Al ejecutar la prueba obtenemos la siguiente respuesta, que obedece a la regla definida.

03

El tiempo de ejecución es alrededor de 0.95 segundos por llamada. Esto ocurre porque en cada evaluación accede al archivo XML que está en el Blob Storage. En el caso en que las reglas no cambian en tiempo real podemos optimizar los tiempos utilizando un cache local para los RulSet. El siguiente método optimiza las llamada a las mismas reglas pero usando cache.

static void TestCache()
{
  Person subjectX = new Person();
  BREClient RuleClient = new BREClient(conn);
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
    {
      subjectX.Age = i;
      RuleClient.RuleExecute(RuleContainer, RuleXmlFile, subjectX,true);
      Console.WriteLine(string.Format("Age= {0} rule response {1}", i, subjectX.RuleEval));
     }
     DateTime timeOne = DateTime.Now;
     Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
     Console.WriteLine("");
}

Las respuestas a esta segunda llamada toman sólo 0,1,83 segundos por regla porque sólo hace una lectura al blob storage y alamacena en un Hashtable el objeto RuleSet por lo que todas las otras evaluaciones la realiza con el objeto ya guardado en memoria.

04

Segunda parte: Workflows como Servicios

En esta segunda parte vamos a desarrollar el proyecto de Workflow Services, donde implementaremos los Workflows que utilizaran la clase BREClient para evaluar las reglas de negocio alacenadas en el archivo XML en Azure Blob Storage.

Workflow EvalPerson

El primer workflow a desarrollar es la evaluación de un sujeto basado en la clase Person. El servicio recibe como parámetro una instancia de Person y lo regresa al cliente después de hacer la evaluación como se muestra en la siguiente imagen.

05

El mensaje de entrada se llama data y el del tipo HelperBRE.SampleSubject.Person para poder aplicarle las mismas reglas que utilizamos en la primera parte del artículo, con la aplicación de consola que crea, edita y graba reglas de negocio. El WSDL que expone el servicio se muestra en la siguiente imagen.

06

Ahora, si miramos el contenido de la actividad Flow: Rule Evaluation podemos ver que está compuesta por una actividad del tipo InvokeMethod llamada “Rule Eval”, Decision y Assign llamada “SalaryPlus”. Estas actividades y sus conectores se muestran en la siguiente imagen. Además de las actividades, se deben declarar las variables que se utilizaran en el workflow, las que aparecen en la tabla de variables.

07

La actividad “Rule Eval” requiere que se declare el método que se llamará y también que parámetros se utilizarán. Aquí es donde utilizamos el objeto BREClientWF4 de la clase BRClient para invocar la evaluación de las reglas de la misma forma que utilizamos en la primera parte del artículo. Como parámetros de la llamada usamos las variables ya definidas RuleContainer, RuleXmlFile, data y el valor true. La configuración de “Rule Eval” se muestra en la siguiente imagen.

08

Una vez realizada la evaluación de las reglas podemos tomar una decisión basados en la propiedad data.RuleEval, valor que fue fijado en la evaluación de la regla de negocio. Si el valor es verdadero, vamos a modificar el valor de la propiedad data.Salary aumentándolo en 10%.

Por último, después de ejecutar el Flowchart respondemos al cliente que nos ha llamado, regresándole el mismo objeto data pero con los valores modificados en base a la evaluación de las reglas y la asignación de valor en el workflow.

Para probar este workflow ejecutamos el proyecto, que es un Web Role, y podemos utilizar el programa de pruebas WCF Test Cient. Como primera prueba llamamos al Workflows con los valores 0, False y 100 y nos responde 0, True y 100. Esto es porque la evaluacion de la regla de negocio dio True entonces el workflow le aumentó 10% el salario al sujeto evaluado como se muestra en la siguiente imagen.

09

Como segunda prueba ejecutamos el workflow con los valores 10, False y 100 y nos regresa 10, False y  100. Esto es porque la regla de negocio respondió False y no tuvo entonces aumento en el workflow como se muestra en la siguiente imagen.

010

Con estas dos pruebas comprobamos que nuestro Workflow con invocación a las reglas de negocio funciona perfectamente por lo que podemos crear un cliente que nos permite utilizarlo. El siguiente código, muestra como iniciar el Workflow utilizando código.  La idea de este método de prueba es que hace 10 evaluaciones y nos muestra su resultado por pantalla, cada evaluación es una llamada al servicio que expone el Workflow.

static void TestWF4WFC()
{
  Person subjectX = new Person();
  srvEvalPersona.ServiceClient proxy = new srvEvalPersona.ServiceClient();
  DateTime timezero = DateTime.Now;
  for (int i = 0; i < 10; i++)
    {
     subjectX.Age = i;
     subjectX.Salary = 100;
     proxy.EvalPersona(ref subjectX);
     Console.WriteLine(string.Format("Age= {0} rule response {1} and Salary={2}", i,subjectX.RuleEval,subjectX.Salary));
     }
     DateTime timeOne = DateTime.Now;
     Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
     Console.WriteLine("");
}

La respuesta a cada llamada se muestra en la siguiente imagen, los resultados son coherente con la regla definida. Ahora, el tiempo de ejecución de las 10 evaluaciones toma 10.49 segundo porque estamos haciendo 10 llamadas al servicio y cada llamada a su vez carga el RulSet desde el storage.

011

Podemos optimizar esto, construyendo un Workflow que haga la evaluación de varias personas en una sola llamada y usar RuleSet Cache para que sea lo más rápido posible la evaluación. Este nuevo workflow tiene la siguiente estructura: recepción de la petición, ciclo ForEach donde se evalúa cada persona y respuesta al cliente como se muestra en la siguiente imagen.

A diferencia del primer workflow, este recibe como mensaje un objeto del tipo Persons[], es decir un arreglo de personas a evaluar.

012

El archivo WSDL que describe a este nuevo Workflow se muestra en la siguiente imagen.

013

A diferencia del primer workfow, aquí tenemos que evaluar a todas las personas que vienen en la llamada por lo que utilizamos la actividad ForEach, donde cada persona a evaluar es asignada al objeto subject. Luego en cada iteración se hace el llamado a RuleExecute usando el objeto BREClientWF4 del tipo BREClient y aplicando o no el cambio de salario dependiendo de resultado de la evaluación de la regla de negocio, como se muestra en la siguiente imagen.

014

Para poder probar este nuevo workflow, utilizamos el código que se muestra a continuación. En este procedimiento creamos un arreglo de 10 personas y les asígnanos el mismo salario pero diferente edad a casa uno.

static void TestWF4WFC_Bacth()
{
  Person[] subjectXs = new Person[10];
  for (int i = 0; i < 10; i++)
  {
     subjectXs[i] = new Person();
     subjectXs[i].Age = i;
     subjectXs[i].Salary = 100;
  }
  srvEvalPersonaBatch.ServiceClient proxy = new srvEvalPersonaBatch.ServiceClient();
  DateTime timezero = DateTime.Now;
  //execute
  proxy.EvalPersonaBatch(ref subjectXs);
  foreach (var subject in subjectXs)
  {
    Console.WriteLine(string.Format("Age= {0} rule response {1} and Salary={2}", subject.Age, subject.RuleEval, subject.Salary));
  }
  DateTime timeOne = DateTime.Now;
  Console.WriteLine("Total time: " + (timeOne - timezero).TotalSeconds.ToString());
  Console.WriteLine("");
}

Luego hacemos solo una llamada al servicio y obtenemos la respuesta. Con la respuesta recorremos el arreglo e imprimimos el resultado de la evaluación de cada cliente. En la siguiente imagen podemos ver el resultado de ejecutar la prueba obteniendo resultados coherentes con las regla de negocio y en un tiempo de 0.069 segundos por regla.

015

Conclusiones

En este artículo hemos visto cómo podemos utilizar el motor de reglas de Windows Workflow Fundation desde una aplicación de consola. Esto lo hemos hecho utilizando una clase de apoyo llamada BREClient. Un punto importante a tener en cuenta es el uso de cache local para el RuleSet ya que leer en cada evaluación las reglas desde el archivo XML almacenado en Blob Storage hace muy lento las evaluaciones.

En la segunda parte del artículo, utilizando BREClient desde dos workflow diferentes. El primero es una llamada para evaluar a una persona y el segundo para evaluar a grupos de personas, viendo claramente la optimización de la evaluación al hacer solo una llamada por grupo.

Esta es una solución muy simple para el problema propuesto por el partner, pero muy efectiva. Ademas es una solución estándar por lo cual los costos de desarrollo y mantención son más bajos que en un BRE custom.

El código fuente de este artículo está en GIT, en el siguiente link.

016

Presentación Windows Azure VPN Workshop #windowsazure

Aquí esta la presentación que hicimos hoy junto a Alejandro Pachecho en Microsoft Chile sobre Windows Azure VPN.

Links relacionados

Presentación: Using windows azure to develop secure and deploy cloud applications Santiago Chile

vs2013_a

En el contexto del lanzamiento de Visual Studio 2013 presenté las siguientes laminas. En la exposición se muestran los conceptos básicos de Windows Azure y las herramientas que VS2013 trae para facilitar el desarrollo de aplicaciones en la Nube.

En las siguientes ligas se pueden hacer tutoriales parecidos a las demostraciones  que vimos en la presentación.

  1. Escenario de DEV/TES de Sharepoint en Azure VM
  2. Creación de Web Sites en Azure
  3. Debugging remoto con Visual Studio 2013
  4. Crear una aplicación Windows Phone 8 con BackEnd en Azure Mobile Services
  5. Publicar servicios internos en Azure Service Bus Relay

Lanzamiento Visua Studio 2013 & Team Foundation Server 2013 en Chile

vs2013_a
Te invitamos el próximo 27 de Noviembre a conocer de la mano de expertos consultores y especialistas de Microsoft Chile las mejores novedades de nuestras herramientas para Desarrollo, Testing y Gestión de Proyectos de Desarrollo.

Te esperamos en el Hotel Neruda, ubicado en Avenida Pedro de Valdivia 164 (Metro Pedro
de Valdivia), Providencia – Santiago.

Agenda

• 9:30 a las 13:00 – Revisaremos de forma teórica y práctica las novedades de la IDE de Visual Studio 2013 y de .NET Framework 4.5
• 13:00 a las 14:00 – Almuerzo
• 14:00 a las 15:00 – Metodologías Agiles para TI – Elsa Mangione, Delivery  Project Manager, Agile Certified Practitioner & Certified ScrumMaster
• 15:00 a las 16:00 – Colaboración con Team Foundation Server 2013 / Team
Foundation Service– Cristian Muñoz – Consultant en Microsoft Chile
• 16:00 a las 17:00 – Gestión de despliegues y Deployment en Producción –
Andrés Iturralde – Premier Field Engineering en Microsoft Chile

Dependiendo el rol en tu empresa puedes asistir en la mañana, tarde o todo el día.

Inscríbete en el siguiente link si quieres asistir en a mañana:

Regístrate aquí – Sesión AM

Inscríbete en el siguiente link si quieres asistir en a tarde

Regístrate aquí – Sesiones PM

Inscríbete en el siguiente link si quieres asistirv todo el día

Regístrate aquí – Todo el día

vs2013_b.jpg

Presentación BizTalk Server, BizTalk Services and Windows Workflow Foundation (WF) #windowsazure

Pequeña presentación que muestra como Windows Workflow fundation no compite con BizTalk Server o WA BizTalk Service, sino que tienen focos diferentes.

Links relacionados

Windows Azure Queues and Windows Azure Service Bus Queues

Aquí publico una pequeña comparación de las opciones de mensajería de Windows Azure, con foco en Services bus Queues y ejemplos transaccionales que compilé la semana pasada para un proyecto en México.

Lo que necesita el proyecto es poder habilitar mensajería transaccional entre servidores en sus instalaciones y servicios corriendo en la Nube. Aquí se incluye un ejemplo de cómo enviar mensajes desde una cola MSMQ a una Cola del Service Bus en Azure de manera transaccional.

Links relacionados

  1. Colección de EBooks GRATIS de tecnologías Microsoft, incluida Windows AZURE
  2. Mejores Prácticas para el Diseño de la arquitectura en CLoud
  3. Presentación: Introducción SOA

 

Windows Azure Session Affinity en Java/Tomcat con HTTPS/SSL #windowsazure

Introducción

Muchos desarrolladores de JAVA que desarrollan en eclipse están utilizando Windows Azure para hacer despliegue de sus aplicaciones en la Nube. Optan por Azure en el modelo de plataforma como servicio (PaaS) que les brinda muchas ventajas como por ejemplo elasticidad horizontal para responder a demanda variable, control automático de la plataforma basado en monitoreo de las aplicaciones, altoa disponibilidad de 99,95% asegurada,  etc.

Las aplicaciones desarrolladas para correr en PaaS siguen ciertas directivas de diseño para aprovechar al máximo las capacidades de la plataforma. Una de esas directivas es no utilizar estado en memoria, porque eso genera dependencia del cliente (Browser en una aplicación Web) con la instancia del servicio que lo está atendiendo. La razón por la cual se busca que esta dependencia no exista es para permitir escalar horizontalmente sin problema a las aplicaciones, dando la potencialidad de convertirse en aplicaciones que no tendrán problemas de desempeño si se ven enfrentados a picos de utilización.

Históricamente los desarrolladores Web han utilizado variables de sesión almacenadas en memoria para conservar estados.  Con eso se les simplificaba el trabajo ya que podía almacenar cualquier información que considerara parte de la sesión del usuario en memoria y acceder a ella. Esto generaba un problema cuando las aplicaciones web son desplegadas en una granja de servidores constituida por más de una instancia del servidor Web y un balanceador de carga.

Para Ilustrar el problema veamos el siguiente escenario. Una aplicación web con estado en memoria que es desplegada en dos instancias coordinadas por un balanceador de carga (NLB) como se muestra en el diagrama 1. La idea es que el usuario ingresa su nombre de usuario / contraseña para inicia una sesión (Mensaje 1), esa petición es enviada a la instancia cero del servicio web y esa instancia crea la sesión en memoria de ese servidor. Lugo, el cliente vuelve ha hacer un requerimiento donde le pregunta al servidor web los datos de su sesión (Mensaje 2), esa petición es enviada a la instancia uno servicio web quien la busca en memoria y por supuesto no la encuentra ya que esa sesión fue creada en la instancia cero lo que produce un error!

1

Una solución simple para este problema es configurar el balanceador para que genere afinidad entre el cliente y la instancia de servicio que lo está atendiendo, comúnmente esto se llama Sticky Session. Esta configuración lo que hace es que la primera vez que un cliente se conecta lo envía a una instancia de servicio y almacena esa información (cliente/instancia) en memoria del balanceador. Entonces cuando el balanceador recibe la siguiente llamada de un cliente ya conocido lo envía siempre a la misma instancia, como se muestra en el diagrama 2.

2

Esta solución, muy simple de configurar, tiene la desventaja de que si la instancia cero de nuestro ejemplo cae, entonces todos los clientes que tienen afinidad con esa instancia caen también con ella aunque el servicio tenga otras instancias funcionando.

La solución más correcta en aplicaciones que corren en PaaS es que esa sesión sea almacenada en memoria compartida por todas las instancias del servicio web ya que así no se produce este error ya que todas las instancias tienen acceso a los mismos datos. En Windows Azure para esto se implementa memcache. Para más detalles de esto en JAVA, pueden ver el tutorial How to Use Caching.

Ahora, muchas aplicaciones JAVA ya fueron construidas con sesiones en memoria y vienen de despliegues tradicionales en Datacenters en los cuales los balanceadores de carga fueron configurados con Sticky session. Para hacer mas simple la migración de esas aplicaciones a Windows Azure, en el Plugin de Eclipse se incorporó la opción de configurar Session Affinity para evitar tener que modificar el código de las aplicaciones para que usen memoria compartida. La figura 3 muestra la pantalla de configuración de Session Affinity en Eclipse.

3

Escenario

El escenario que vamos a utilizar es una página Web desarrollada en JSP que es hospedada en el servidor web Tomcat. Un escenario muy común en el mundo JAVA. Esta aplicación será desplegada en Windows Azure utilizando Worker Role, con la opción de Session Affinity sobre HTTPS. La figura 4 muestra el escenario de este artículo.

4

Una sorpresa común para los desarrolladores de JAVA que usan Eclipse y el plugin de Azure es que en el despliegue de su solución se utiliza Internet Information Services (IIS) con Application Request Routing (ARR). ARR es el responsable de mantener la afinidad de la sesión, sin intervención alguna de Tomcat. Este elemento es quien identifica a los clientes y crea la afinidad entre cada cliente y una de las instancias de Tomcat. Esto permite que cada vez que llega un requerimiento desde el cliente ARR lo envía siempre a la misma instancia de Tomcat permitiendo así que las variables de sesión en memoria funcionen correctamente.

La página JSP de nuestra aplicación web nos permitirá identificar que instancia de Tomcat nos está respondiendo, que instancia de ARR nos esta rutenado e ver los identificadores de sesión de Tomcat y el identificador de ruteo de ARR como se muestra en la figura 5.

5

Implementación paso a paso

  1. Crear un proyecto tipo Dynamic Web Project en Eclipse

Utilizando Eclipse creamos un nuevo proyecto web dinámico con el nombre de HolaMundov2 como se muestra en la figura 6.

6

2. Crear una página JSP en la carpeta WebContent

Ahora, debemos crear la página JSP que utilizaremos en nuestra aplicación la cual llamaremos index.jsp como se muestra en la figura 7.

7

3. Modificar la página JSP

Reemplazamos el código que viene por defecto en la página por el siguiente código.

<%@page import="java.net.InetAddress"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hola Mundo V2 JSP</title>
</head>
<body>
	<%
	java.net.InetAddress ip = java.net.InetAddress.getLocalHost();
	ip = InetAddress.getLocalHost();
	System.out.println("Current Server IP address : " + ip.getHostAddress());
	String hostName=request.getServerName();
	String x=(String)session.getId();
	if ( x  == null ) {
			x="";
		}
    Integer count = (Integer)session.getAttribute("COUNT");
	// If COUNT is not found, create it and add it to the session
    if ( count == null ) {
      count = new Integer(1);
      session.setAttribute("COUNT", count);
    }
    else {
      count = new Integer(count.intValue() + 1);
      session.setAttribute("COUNT", count);
    }
	%>
	<br>IP TOMCAT Server: <b><%=ip.getHostAddress() %></b><br>
	Cloud Services: <b><%=hostName%></b>
	<br>
	Session ID: <B><%=x  %></B>
	<br>Session Counter: <b><%=count%></B> times.

	<script language="JavaScript">
		var req = new XMLHttpRequest();
		req.open('GET', document.location + 'lala.jps', false);
		req.send(null);
		var headers = req.getAllResponseHeaders().toLowerCase();
		document.write('<p><b>HTTP Headers</b>: '  + headers);
	</script>

	<%
	   Cookie cookie = null;
	   Cookie[] cookies = null;
	   // Get an array of Cookies associated with this domain
	   cookies = request.getCookies();
	   if( cookies != null ){
	      out.println("<h2> Found Cookies Name and Value</h2>");
	      for (int i = 0; i < cookies.length; i++){
	         cookie = cookies[i];
	         out.print("Name : " + cookie.getName( ) + ",  ");
	         out.print("Value: " + cookie.getValue( )+" <br/>");
	      }
	  }else{
	      out.println("<h2>No cookies founds</h2>");
	  }
%>
</body>
</html>

4. Ejecutar en el ambiente local
Para poder ejecutar localmente la página JSP debemos definir un nuevo servidor Tomcat 7 como se muestra en la figura 8. Como segundo paso del asistente, agregamos nuestra aplicación.

8

Una vez creado el servidor podemos ejecutar localmente el proyecto obteniendo como respuesta la página mostrada en la figura 9 en el mismo ambiente de Eclipse. En este momento estamos listos para hacer el despliegue en Windows Azure.

9

5. Crear un proyecto tipo Windows Azure Deployment Project
Ya tenemos funcionando nuestra aplicación de prueba en el ambiente local, por lo que ahora debemos hacer el proyecto de despliegue. Este proyecto lo que hace es crear un paquete de instalación y un archivo de configuración de Azure.  Dentro del paquete van utilitarios que instalaran y configuraran los diferentes componentes necesarios para que esta aplicación funcione correctamente, como por ejemplo Java Runtime Environment (JRE), el servidio de Tomcat, etc.

Al crear el proyecto, seguimos el asistente como se muestra en las siguientes imágenes.

Primero le asignamos un nombre al proyecto de despliegue.

10

Segundo, incluimos el JDK en el proyecto.

11

Tercero, incluimos el servidor Tomcat.

12

Cuarto, Incluimos nuestra aplicación (WAR)

13

Por último, debemos seleccionar la opción de Session Affinity para que se configure la afinidad entre clientes y una de las instancias de Tomcat.

14

6. Cambio de configuración de Puertos para soportar SSL

Una vez terminado el asistente Eclipse crea un proyecto de despliegue que tiene dos EndPoints  definidos como se muestra en la imagen 15. EL llamado “http” tiene el puerto publico 80 y privado 31221 mientras el llamado “http_SESSION_AFFINITY” solo el privado 8080. La idea de esta configuración es que las llamadas http:80 son recibidas por el balanceador del Cloud Services y enviados al puerto 31221 donde IIS ARR lo recibe y lo redirige a alguna de las instancias de Tomcat que está escuchando en el puerto 8080.

15

Ahora como nosotros queremos que esto funcione sobre HTTP:443 debemos modificar la configuración por defecto de los EndPoints como se muestra en la imagen 16.

16

7. Instalar el Certificado a utilizar en el Cloud Services

Para poder utilizar HTTPS necesitamos un certificado que será utilizado para cifrar la comunicación entre el navegador y el servidor Web. Para esto debemos subir el certificado a nuestro Cloud Services, como se muestra en la imagen 17.

17

En este ejemplo yo estoy utilizando un certificado autogenerado para hacer las pruebas, el cual tiene el Thumbprint 09D7DF2A1779D027CB52DE223FA30C579182109B como se muestra en la siguiente imagen.

18

8. Incluir la referencia al certificado en ServiceDefinition.csdef

LA definición de los servicios de un Cloud Services se hace en el archivo XML llamado ServiceDefinition.csdef. Este archivo describe cada Rol y sus características. Aquí vamos a agregar la referencia al certificado que usaremos, en este caso lo he llamado “web.ssl”. Para esto debemos agregar los siguientes tag como miembro del tag WorkerRole.

<Certificates>
      <Certificate name="web.ssl" storeLocation="LocalMachine" storeName="My"/>
</Certificates>

9. Incluir la referencia al certificado en ServiceConfiguration.cscfg
La configuración del servicio que brinda un Cloud Services se hace en el archivo XML llamado ServiceConfiguration.cscfg, Aquí vamos a agregar la referencia al certificado y su Thumbprint.

<Certificates>
<Certificate name="web.ssl" thumbprint="09D7DF2A1779D027CB52DE223FA30C579182109B" thumbprintAlgorithm="sha1"/>
</Certificates>

10.Definir el número de instancias del servicio
En este mismo archivo vamos a aumentar las instancias del servicio de 1 a 2, para poder generar el escenario mostrado en la figura 4. Para eso modificamos el siguiente TAG en el archivo ServiceConfiguration.cscfg

<Instances count="2"/>

11. Script de configuración Automática de IIS ARR

Dado que el Plugin de Eclipse para Windows Azure, al configurar Session Affinity lo hace sobre HTTP y no sobre HTTPS, nosotros debemos modificar la configuración para que así si funcione el servicio sobre HTTPS. Para lograr este cambio de configuración vamos a utilizar un script llamado stratup.cmd que permite ejecutar comandos destinados a configuraciones especiales antes que el servicio inicie.

Lo que necesitamos hacer en este script sobre IIS es:

  • Borrar el Binding HTTP que tiene el sitio web por defecto
  • Crear el Binding HTTPS para el sitio web por defecto en el puerto 31221
  • Agregar el certificado al puerto 31221
  • Agregar un HTTP Header para poder identificar que instancia de ARR nos esta direccionando (opcional)
  • Reiniciar el servicio IIS para que todas las configuraciones se apliquen

Todo esto debe hacerse de manera automática cada vez que una instancia de se crea, por eso lo incluimos en el script stratup.cmd.  Reemplazamos el contenido original de dicho archivo con el siguiente código.

echo Hello World!
:: Script Variables
set vcerthash=09D7DF2A1779D027CB52DE223FA30C579182109B

:: get ipv4
ipconfig | findstr IPv4 > ipadd.txt
for /F "tokens=14" %%i in (ipadd.txt) do (
	@echo %%i
	set varip=%%i
)
del ipadd.txt /Q
set varip=%varip: =%
:: Move to directory
cd d:\windows\System32\inetsrv > logArrSetup.txt
d:
: Delete HTTP Binding
appcmd set site /site.name: "Default Web Site"  /-bindings.[protocol='http',bindingInformation='%varip%:31221:'] >> logArrSetup.txt
:Create HTTPS Binding
appcmd set site /site.name: "Default Web Site"  /+bindings.[protocol='https',bindingInformation='%varip%:31221:'] >> logArrSetup.txt
:Add Certificate to HTTPS Binding port
netsh http add sslcert ipport=0.0.0.0:31221 certhash=%vcerthash% appid={4dc3e181-e14b-4a21-b022-59fc669b0914} >> logArrSetup.txt
:Add HTTP Header response to track who instance of ARR is reciving the request
appcmd set config /section:httpProtocol /+customHeaders.[name='X-JPG-ARR',value='%varip%']  >> logArrSetup.txt
:Reset IIS Services to update de configuration Changes
iisreset >> logArrSetup.txt

Para efectos de análisis, todos los comandos tienen como salida el archivo logArrSetup.txt. En este archivo vamos a poder ver el resultado de las configuraciones aplicadas en cada instancia de servicio.

12. Publicación en Azure

En este momento ya estamos listos para realizar el despliegue de nuestra aplicación de pruebas. Para eso utilizamos la opción de publicación que nos brinda el Plugin de Eclipse, que inicia el dialogo que se muestra en la siguiente imagen.

Es importante completar la información de Remote Access para que en pasos posteriores podamos conectarnos a las instancias y revisar la configuración.

Una vez terminado de hacer el deploy, obtenemos el esperado mensaje “Running” como se muestra en la siguiente imagen.

20

Prueba de Afinidad de sesión

Ahora, debemos hacer la prueba de afinidad de sesión. Para ello, vamos a ejecutar el siguiente comando

iexplore -private https://tomcatssl.cloudapp.net/HolaMundov2/

Esto lo que hace es abrir un browser en modo privado y carga mi página JSP usando HTTPS como queremos. Al ejecutarlo recibo el mensaje advertencia que el certificado no está emitido por una entidad certificadora reconocida y que la dirección del certificado no corresponde. Esto está bien ya que yo generé ese certificado.

21

Selecciono la opción Continue to this website (not recommended) y me muestra la respuesta de mi página. Recargo la página unas 3 veces y obtengo lo que se muestra en la siguiente pantalla.

22

Primero, podemos ver que la dirección de la instancia de Tomcat con la que se generó afinidad es 10.146.226.34 y la cookie de identificación de sesión es DE9EF2B35416C64B4CB0165F4A6A9C4E. Estos dos datos no deben cambiar nunca ya que todas las futuras peticiones que haga al servidor con este browser van a ser redireccionadas a esa instancia de Tomcat.

Este requerimiento, el balanceador de carga lo envío al IIS ARR  x-jpg-arr: 10.146.226.34 cómo podemos ver en el encabezado de HTTP.

Ahora, recargo la página y obtengo lo siguiente.

23

Se puede ver que la instancia de Tomcat sigue siendo la misma 10.146.226.34, el identificador de sesión también se mantiene  DE9EF2B35416C64B4CB0165F4A6A9C4E pero la instancia de IIS ARR cambío ya que ahora es la x-jpg-arr: 10.175.104.24. Esto quiere decir que el balanceador de carga envío mi nuevo requerimiento a la otra instancia del servicio que tiene la dirección 10.175.104.24 y aquella reconoció que yo ya tengo afinidad con la instancia de Tomcat  10.146.226.34 por lo que redirigió mi llamada a esa instancia.

¿Cómo supo IIS ARR que ya tengo afinidad con un Tomcat?

Bueno, muy simple. IIS ARR creó en la primera llamada una cookie llamada ARRWAP4EJ la cual contiene la información de afinidad de sesión para este navegador. EL valor de esa cookie tampoco cambia en las diferentes llamadas, en mi caso el valor es  5855a053ea34b597db38b95ce14626517935371c9408359ab695f0f1b114977f.  Con esa cookie ARR puede saber dónde enviar este y los próximos requerimientos.

EL comportamiento de las dos llamadas se muestra en el siguiente diagrama de secuencia.

24

Es importante notar que la comunicación entre el ARR y Tomcat es HTTP no HTTPS por lo que el certificado digital sólo debe ser instalado en IIS.

Código fuente

El código fuente se puede descargar desde Github

https://github.com/liarjo/TomcatSSL/tree/master/TomcatSSLSessionAffinity

Conclusiones

Es perfectamente posible configurar de manera automática Session Affinity sobre HTTPS cuando se desarrolla en Java con Eclipse. Solo se debe entender cómo funciona  IIS ARR, el balanceador de Carga y la configuración de IIS a través de comandos como lo hicimos en este ejemplo.

Links Relacionados