[Event] NetConfUy 2018 | Integrá fácilmente login social con Azure B2C y .NET

Viajamos con amigos  compañeros de trabajo para participar en la NetConfUy. Estuve tocando el tema de Azure B2C junto a .Net Core.

Hoy en día, muchas de las aplicaciones que construimos requieren inicio de sesión facilitada con redes sociales o proveedores de identidad pre-existentes. ¿Cómo puedo lograr limitar la construcción de código para llevarlo adelante? En esta charla te vamos a presentar Azure B2C y sus características, que te permiten integrar muy fácilmente inicios de sesión con redes sociales y proveedores de terceros, y la posibilidad de alojar en una base de datos escalable y redundante tus propios usuarios. Además, te vamos a mostrar cómo fácilmente podemos sumar funcionalidades de doble factor de autenticación, reseteo de password y muchas cosas más. La charla va a estar acompañada de demos donde veremos cómo integrar código personalizado de nuestras aplicaciones, móviles o web, login desde twitter, google, facebook, etc.

Les dejo los links de la presentación y videos.

Presentación

Video (Próximamente)

Entrevista (Próximamente)

[Event] NetConfCo 2018 | Integrá fácilmente login social con Azure B2C y .NET

Como les comente en el post anterior viajamos con amigos y compañeros de trabajo para participar en la NetConfCO Medellín, Colombia.

Estuve dando un workshop sobre ayure B2C, muchas de las aplicaciones que construimos requieren inicio de sesión facilitada con redes sociales o proveedores de identidad pre-existentes. ¿Cómo puedo lograr limitar la construcción de código para llevarlo adelante? En esta charla te vamos a presentar Azure B2C y sus características, que te permiten integrar muy fácilmente inicios de sesión con redes sociales y proveedores de terceros, y la posibilidad de alojar en una base de datos escalable y redundante tus propios usuarios. Además, te vamos a mostrar cómo fácilmente podemos sumar funcionalidades de doble factor de autenticación, reseteo de password y muchas cosas más. La charla va a estar acompañada de demos donde veremos cómo integrar código personalizado de nuestras aplicaciones, móviles o web, login desde twitter, google, facebook, etc.

Les dejo links de la presentación y los links a los demos:

Presentación

Demo1

Demo2

[Event] NetConfAR 2018 | Crear tu Startup en Azure con menos de 10 dólares por mes!

Estuvimos con amigos  compañeros de trabajo participando como spaekaer en la gran .NetConfar 2018. Estuve tocando el tema de como crear una StartUp de la mano de Azure con un bajo costo.

¿Cuánta inversión es necesaria para que una empresa pueda tener su infraestructura tecnológica básica para operar? ¿Compro servidores o voy a la nube? ¿Qué servicios de la nube me conviene consumir? En esta charla te vamos a contar cómo se pueden utilizar diversos servicios de Microsoft Azure que son gratuitos o tienen muy bajo costo para lograrlo. Además de contártelo, veremos ejemplos de cómo utilizar estos servicios para poder construir una aplicación completa de punta a punta.

Les dejo los links de la presentación y los videos:

Presentación

Video Entrevista

Video Charla

[Article] Azure | ¿Que es Docker?

Continuando el tema de micro-servicios y cómo podemos implementarlo vamos tocar el tema de Docker. Seguramente hemos escuchado de Docker en alguna conferencia o de algún compañero de trabajo pero no nunca llegamos a comprender del todo que es y en que podría ayudarnos esta tecnología.

Objetivo

El objetivo de esta publicación es tocar las posibles utilizaciones y el alcance de dockers. Ver cómo podemos utilizarlo en una arquitectura de microservicios. Sus beneficios como también que puntos debemos tener en cuenta para poder llevarla adelante.  El objetivo principal es entender de una forma clara y sencilla que es Docker.

Audiencia

Este documento está dirigido a personas que conocen muy poco o nada sobre el tema. No nos meteremos en aspectos técnicos, tampoco como ejecutarlo o como se debe usar.

Desarrollo

Básicamente Docker nos da la posibilidad de crear contenedores muy livianos y fácilmente portables para nuestras aplicaciones. Independiente del sistema operativo que utilicemos podremos ejecutar un contenedor Docker en cualquier máquina. Esta característica nos facilita mucho el despliegue de nuestras aplicaciones.

Seguramente se preguntaran, ¿Pero… que es un contenedor? el concepto viene originalmente de la plataforma linux, no es realmente un concepto nuevo, pero hoy muy de moda. La idea viene de los contenedores que llevan los barcos para transportar productos que pueden ser o no del mismo tipo.

Docker nos permite meter todo lo que necesitamos para ejecutar nuestra aplicación en un contenedor e inclusive la propia aplicación. Supongamos que queremos implementar un micro-servicio que está desarrollado con .Net Framework. Dentro del contenedor podremos poner todos los componentes necesarios para la ejecución del servicio, el servidor web, componentes de terceros sin preocuparnos de las versiones de software que tiene instalada, si las tiene instalada, si están lo componentes necesarios en nuestra máquina donde se alojara el contenedor.

¿Y en qué nos beneficia?

Docker puede ser utilizado en cualquier entorno de IT. Puede dar soporte a equipos de desarrollo o equipos de infraestructura ayudando a que las aplicaciones y ejecuten fácilmente y aumentando nuestra capacidad de despliegue de estas.

Desde mi punto de vista, como desarrollador, me permite olvidarme si el la aplicación que estoy construyendo funcionara correctamente en la máquina que va a ser ejecutada permitiendo enfocarme completamente en dicha construcción.

Vamos a dar un ejemplo bastante usado en internet:

  • Matías tiene en su computadora instalado la versión de .Net Framework 4.5 y se encuentra programando una micro-servicio con funcionalidades específicas de esta versión.
  • Florencia en su máquina tiene instalado las versión de .Net Framework 3.5 debido a que está trabajando en un proyecto distinto. Matías quiere que Florencia pruebe su micro-servicio en su máquina pero si ella no instala .Net Framework 4.5 la aplicación no funcionará.

Si estamos usando Docker no tendremos este inconveniente.  Matias creará un contenedor con todo lo necesario para que el micro-servicio funcione y se lo pasará a Florencia. Como Florencia tiene instalado en su máquina Docker podrá ejecutar la aplicación sin necesidad de instalar nada.

Algo para lo cual usamos mucho Docker es para hacer testing. Es muy fácil crear o eliminar un contenedor. Al ser muy livianos podemos usar varios contenedores en la misma máquina y el contenedor funcionara en cualquier maquina que tenga instalado docker sea Windows, Linux, MacOs o Inclusive en la Nube como Azure. También al contenedor es ser más liviano que una máquina virtual puede reducir mucho el hardware que utilizaremos

Docker Vs Máquina Virtual

Podemos tener varios contenedores en la misma máquina, pero… ¿en qué se diferencia de una máquina virtual si también podemos tener varias? Es muy similar en algunas cosas pero la gran diferencia es que en una máquina virtual necesitamos instalar un sistema operativo y en un contenedor no.

Algunas características específicas de los sistemas operativos pueden causar problemas cuando queremos portar nuestras aplicaciones en diferentes entornos. Un contenedor de Docker toma los aspectos básicos de funcionamiento de un sistema operativo donde se encuentra ejecutándose este.

Cosas que tenemos en Docker

Tenemos varios elementos que tenemos disponibles en docker. Cada elemento nos brinda un serie de beneficios dependiendo de cómo los usemos. Los más fuertes son Imágenes y Contenedores.

Imágenes

Las imágenes son muy parecido a un snapshot de una máquina virtual pero no olvidemos que es mucho más liviano. Los usaremos como una plantilla para nuestros contenedores. Estas imágenes las utilizaremos para crear nuestros contenedores.

Hay mucho repositorios públicos donde podemos obtener imágenes para crear contenedores siendo un buen punto de partida para crear los nuestros e ir agregando las cosas que necesitemos. Podemos empezar buscado aqui https://hub.docker.com

Contenedores

Podemos decir que son instancias de nuestras imágenes y son finalmente lo que ejecutan nuestras aplicaciones y de una imagen podemos ejecutar varios contenedores. Supongamos que necesitamos escalar nuestra aplicación porque aumentó su consumo. A partir de la imagen podríamos ir creando contenedores para atender las solicitudes.

Con Docker podemos ir administrado las versiones como si fuera una herramienta de control de versiones. Hacemos unos cambios, damos commit y se nos guardarán los cambios. Esto nos permitirá volver a versiones anterior por algún inconveniente que tengamos.

Conclusión

Docker puede darnos una gran ayuda en una arquitectura de micro-servicios. Nos facilitará no solo el desarrollo y el testing si no que nos garantizara una gran capacidad de despliegue con tiempo muy cortos. También, puede reducirse mucho los costos de infraestructura ya que son mucho más livianos que una máquina virtual. En el futuro vamos a ver una implementación de docker en Azure.

[Article] Arquitectura | Que es MicroServicios

Seguramente habrán escuchado sobre micro-servicios, o  de alguna software que sigue el patrón de una arquitectura de micros-servicios.  Micro-Servicios es un tema que actualmente se encuentra en boca de todos y probablemente escuchemos cada vez más hablar de ello.

Objetivo

El objetivo de esta publicación es tocar las posibles utilizaciones y alcance una arquitectura de microservicios. Sus beneficios como también que puntos debemos tener en cuenta para poder llevarla adelante.

Audiencia

Este documento está dirigido a personas que conocen pero no saben que realmente es, como también a personas que no conozcan el tema, o bien profesionales que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Cuando hablamos de una arquitectura de microservicios tenemos que pensar en una aplicación construida sobre una serie de pequeños servicios. Estos tienen la característica de ejecutarse de forma autónoma y también pueden comunicarse entre sí. Uno de los mecanismos comunes de comunicación es por medio de peticiones http hacia sus APIs.

Al referirnos a pequeños servicios podemos decir que cada uno corresponde a un área de negocio de la aplicación como por ejemplo: Clientes, Ventas, Stock, etc. Básicamente el objetivo es tener una cantidad mínima de servicio que manejan cosas comunes para todos como acceso a base de datos o bien servicios de terceros.

Cada servicio es independiente y debe poder ser desplegado sin tener ningún impacto sobre los otros. Otra característica muy interesante es que pueden escribirse en cualquier tecnología y cómo estos se comunican por medio de las APIs pueden hablar sin inconvenientes.

No hay especificaciones de qué tamaño deben tener los micro-servicios, tampoco, cómo debemos dividirlo para una aplicación. Jon Evans publicó que la mejor característica de un microservicio es que puede ser re-escrito nuevamente en 2 semanas.

Arquitectura sin MicroServicios

Para poder entender mejor el objetivo de la arquitectura de microservicios vamos a usar el siguiente ejemplo: Pensemos en una aplicación de gestión para una empresa que se dedica a la venta de productos en línea. Los usuarios interesados en los productos podrán ver, comprar los productos y seguir sus pedidos.

Nuestra primera aproximación de nuestra arquitectura seria algo asi sin la utilización de microservicios:

 

 

Nuestros usuarios entraran a la aplicación, una aplicación web, y podrán visualizar los productos, seleccionarlos,  agregarlos a un carrito y finalmente cerrar su compra junto a su forma de pago y datos de envío. Todo nuestro codigo se ejecutara en el servidor el cual puede conectarse a una base de datos u otro servicio de terceros. En nuestro caso podría ser un servicio de pago especial.

Nuestra aplicación pueda estar separado por módulos con diferentes lógicas de aplicación, pero, esta tiene como resultado siempre el mismo compilado ejecutable. Supongamos que debemos hacer un cambio en el módulo de envíos y debemos implementarlo en producción. Ante esta situación no tenemos opción de tener que implementar todos los módulos aunque la gran mayoría no hayan cambiado.

Otra situación es, que pasa si nuestro sitio tiene comienza a tener mucha demanda. Necesitaremos escalar para poder brindar servicio a todos los usuarios nuevos. En esta arquitectura debería crear nuevas instancias de mi aplicación y usar algún tipo de balanceador de carga para que los usuarios vayan dirigiéndose a cada instancia dependiendo de la carga. Pero, si en realidad es solo el modulo de ventas está sobrecargado, igualmente, deberemos crear instancias totales de nuestra aplicación.

No debemos olvidar que en el punto anterior la aplicación es fácil de gestionar porque posee un solo ejecutable para actualizar todas las instancias de nuestra aplicación de una forma manual o automática.

Arquitectura MicroServicios

 

 

En lugar de tener todo en un solo servicio o ejecutable, cada componente puede auto-ejecutarse y los servicios que lo componente pueden comunicarse entre si sin ningún problema.

Los usuarios pueden interactuar con ellos por medio de la aplicación, que tranquilamente también puede ser un micro-servicio, comunicándose con los servicios de clientes por ejemplo.

Al usar este tipo de arquitectura tenemos los siguientes beneficios:

  • Como la lógica de negocio está bien separada o sectorizada es muy simple de comprender.
  • Cada microservicio es autónomo y puede desplegarse sin afectar a otro. Si el módulo de clientes necesita actualizarse no afectará por ejemplo al módulo de proveedores o no será necesario implementarlo nuevamente.
  • Mejor escalamiento debido a que no es necesario replicar toda la aplicación, si no, balancear o replicar los módulos que están teniendo más carga.
  • Podemos tener varios equipos de desarrollo autónomos encargándose cada uno de un módulo o micro-servicio tanto en el desarrollo como en la gestión del mismo.

Si bien este tipo de arquitectura tiene muchos beneficios… no todo es color de rosa. Como toda arquitectura tiene sus pros y sus contras.

Una falsa creencia es que sin microservicios no podemos tener despliegue continuo o entrega continua, esto no es cierto. Grandes empresas como Facebook, Twitter u otras poseen este tipo de capacidad sin la utilización de una arquitectura de microservicios en su totalidad.

Los micro-servicios agregan complejidad en nuestra gestión. Si tenemos mucha cantidad de servicios debemos tomarnos el tiempo de crear una buena estrategia gestión. Deben estar bien monitoreados, debemos saber exactamente cual esta fallando, gestionar sus fallos, velar por la consistencia de datos y tener una buenas estrategias de pruebas.

Martin Fowler dice : “hay muchas formas de gestionar todo esto, pero necesitamos esfuerzo extra, y nadie que conozco en desarrollo software parece tener muchísimo tiempo libre.”

Si nuestra aplicación es muy simple tal vez no sea necesario usar micro-servicios. Pero si nuestra aplicación crece y comienza a volverse compleja vale la pena invertir esfuerzo en llevarla a este tipo de arquitectura. Grandes empresas, clientes nuestros, se han encontrado con que gestionar la aplicación en un solo componente con el tiempo es cada vez mas complejo y han empezado a separar sus aplicaciones en microservicios o bien, los proyectos nuevos, desarrollarlos con una arquitectura de micro-servicios.

Conclusión

La arquitectura de micro-servicios no es simplemente una moda. Para una empresa que hoy no posee esta arquitectura es aconsejable que vayan hacia ella poco a poco, manteniendo las aplicaciones actuales e ir separando las partes críticas en micro-servicios mediante algunas estrategias como Branch By Abstration. Esta estrategia hablaremos en algún post junto a Visual Studio On-Line. En azure podemos usar docker para llevarla adelante. En próximo post estaremos viendo como usar docket en azure.

[Article] Azure | Content Delivery Network (CDN)

Hoy quiero tocar el tema de CDN específicamente Azure Content Delivery Network. Esta herramienta nos ofrece una solución global para tener contenido disponible usando un ancho de banda de gran velocidad. En esta red podemos almacenar objetos en cache publicos tales como archivos, aplicaciones, maquinas virtuales o cualquier objeto que pueda almacenarse en vía http o https.

Objetivo

El objetivo de esta publicación es tocar las posibles utilizaciones y alcance del manejo CDN para mejorar la performance y la escalabilidad en nuestras aplicaciones Asp.Net Core.

Audiencia

Este documento está dirigido a desarrolloradores que quieren conocer Asp.Net core y el uso de Azure CDN o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Usualmente CDN lo utilizamos para entregar contenido estático, como imágenes, archivos javascript, archivos de estilos css, etc. Aunque en su gran mayoría se usa para esto, también, podemos utilizar para brindar contenido dinámico almacenando su parametrización y devolviendo el mismo resultado.

Una de las principales ventajas del uso es que posee una latencia muy pequeña lo cual hace que se pueda entregar contenido extremadamente rápido sin estar atado a una ubicación geográfica o bien brindando lo más cerca posible del usuario que la solicita.

 

Usar CDN no ayuda a reducir la carga de la aplicación ya que liberamos a los servidores de procesamiento innecesario al entregar el contenido. Esto aumenta el rendimiento y reduce el costo del consumo de red como también aumentando la disponibilidad.

Veamos algunos casos típicos donde podemos usar CDN:

  • Recursos Estáticos: Nuestros sitios web contienen una gran cantidad de contenidos estáticos como imágenes, hojas de estilo, documentos, archivos, páginas web completas o parciales o cualquier contenido que no necesita ser procesado por el servidor.
  • Contenido Estático para dispositivos móviles: Por medio de servicio web se puede proporcionar datos estáticos a este tipo de clientes.
  • Media y Video: Podemos transferir videos pequeños. El gran beneficio es que baja mucha la latencia y aumenta la disponibilidad de este tipo de contenido. Algo para tener en cuenta es que Azure Media Services puede ser integrado con Azure CDN para entregar contenido.
  • Aumento de Demanda: podemos evitar que el aumentar la demanda no aumente nuestros costos de consumo. Por ejemplo, si nuestra aplicación lanza una nueva versión, aumentará la demanda de nuestros archivos y contenido para las nuevas características.

Ahora bien, qué debemos tener en cuenta para el uso o implementación:

  • Debemos tenerlo en cuenta durante nuestro proceso de desarrollo e implementación de contenido estático y recursos de nuestras aplicaciones.
  • Debemos considerar que nuestro contenido será actualizado, por esto, debe estar versionado.
  • Es difícil realizar pruebas locales o probar aplicaciones locales.
  • El contenido público es enviado desde dominios diferentes lo cual puede afectar a los resultado SEO.
  • Podemos encontrarnos con entornos donde no podamos consumir recursos directamente desde el CDN. Para esto es necesario hacer una implementación especial.
  • Si la red es privada, como una empresa, tal vez no sea una buena opción por restricciones de seguridad de la misma red.}

Usar CDN es una buena práctica para minimizar la carga, maximizar la disponibilidad y rendimiento de nuestras aplicaciones. Es altamente recomendable para implementar en nuestras aplicaciones web. Veamos algunas estrategias:

Entrega

  • CDN solamente necesita un endpoint HTTP o HTTPS la cual será utilizada para acceder y para almacenar el contenido.
  • Debemos recordar que el Blob al cual esté direccionado debe ser público.
  • Si nuestro lo seteamos como root en una WebApp todo el sitio quedará disponible por CDN.
  • Cuando las fuentes son dinámicas, podemos utilizar parametros via QueryString como llaves para almacenar en caché el contenido de este tipo.
  • Debemos recordar que los recursos del tipo blobs son sensibles a mayusculas y minusculas.

Despliegue

  • El contenido puede necesitar ser desplegado inmediatamente. Debemos considerar que será necesario un mecanismo de control de versiones para poder entregar las el contenido correctamente.
  • La comprensión, unión y minificación de archivos son técnicas utilizadas para reducir el tiempo de carga de los clientes y son compatibles con CDN.
  • Al utilizar la compresión de contenido será enviado en un formato zip o gzip. Por default Azure comprimira el contenido si el procesador se encuentra menos de un 50% de consumo.

Enrutamiento y control de versiones

  • Si necesitamos mantener control de versiones podemos crear un nuevo CDN y conservar el antiguo para versiones anteriores de nuestra aplicación.
  • La implementación de nuevas versiones de contenido estático será necesario tener en cuenta si fueron almacenados en el caché del CDN.
  • Podemos restringir acceso por país. Azure CDN nos permite filtrar contenido por origen de la petición y restringir la entrega del contenido.

Control de Caché

  • Debemos considerar el almacenamiento del caché en el sistema. Podemos configurar propiedades de caché desde el CDN y para el cliente podemos configurar los encabezados HTTP.
  • Podemos purgar el caché eliminandolos manualmente, convertir el blob en privado. Debemos tener en cuenta que los archivos solo serán eliminados cuando el tiempo de vida expire realmente si no se especificado un tiempo de cache.
  • En las aplicaciones web podemos establecer el almacenamiento de cache y su caducidad mediante el elemento clientCache del namespace system.webServer / staticContent en el archivo web.config.
  • Si el contenido es dinámico no debemos olvidar setear la propiedad Cache.SetExpires en cada página.

Seguridad

  • En el CDN puede entregar contenido a través de HTTPS utilizando certificados proporcionado por el mismo. También estará disponible en HTTP ya que no es posible bloquear los elementos por este canal.
  • Podemos tener algunos inconvenientes al usar peticiones AJAX debido a que se hace uso del objeto XMLHttpRequest cuando son solicitados datos, imágenes o fuentes de un dominio diferente. La gran mayoría de los navegadores evitan el consumo de objetos cruzados (CORS) si el servidor no está configurado correctamente.

Dominios personalizados

  • Podemos usar dominios personalizados y utilizarlo para acceder a recursos a través de CDN.
  • Podemos utilizar subdominios utilizando registros CNAME en nuestros CDN. Recordemos que si usamos este método no podremos usar SSL ya que el CDN utiliza sus propios certificados.

Tips para SEO

  • Debemos incluir el encabezado REL en cada una de las paginas o los recursos.
  • Utilizar un subdominio CNAME para acceder a los recursos.}
  • Tener en cuenta que la dirección IP del CDN puede ser diferente del pais donde se encuentra su aplicación.
  • Mantener la misma estructura si estamos usando almacenamiento Blob Azure

Supervisión y registro

Debemos agregar en nuestra estrategia de construcción de aplicaciones el planeamiento para implementación de CDN para poder detectar y medir fallas o problemas de latencia. Desde el portal de Azure podemos encontrar un panel de administración.

Demos Considerar:

  • Ancho de banda
  • Datos transferidos
  • Hits
  • Estado del caché
  • Cache Hit ratio
  • Solicitudes desde IPV4 / 6

Costos

Algo para tener muy presente es que se cobra por transferencia de información saliente desde nuestro endpoint CDN. Debemos incluir el costo de almacenamiento de recursos que se alojan activamente y sus transacciones. Debemos balancear los tiempo de expiración de caché, no debe ser muy largos para mantener un caché actualizado como no deben ser muy cortos para aumentar los costos.

Agrupamiento y minificación

Una excelente práctica es la agrupación  y la minificación de recursos. Esta práctica reduce notoriamente los tiempos de descarga debido a su reducción en tamaño.

Tenemos varias formas de manejar este tipo de prácticas. Podemos hacerlo desde .Net MVC como también con algunas herramientas de NodeJS. Mi recomendación es ver WebPack, una herramienta muy popular dedica a este tipo de funciones.

Conclusión

CDN posee un gran soporte para la utilización de caché tanto en entrega de contenido estático o contenido dinámico. Podemos aprovechar esta funcionalidad para aumentar el rendimiento y la escalabilidad de nuestras aplicaciones. En futuros artículos veremos como usar Azure CDN.

[Event] Global Azure BootCamp 2018 | Azure B2C: servicio de identidad ágil para tus desarrollos.

El día de ayer estuvimos presentando Global Azure Bootcamp 2018 Buenos Aires el tema  Azure B2C. Les dejo los link de la presentación y los el video.

El día de ayer estuve presentando Global Azure Bootcamp 2017 Buenos Aires el tema  Azure B2C. Les dejo los link de la presentación y los el video.

Presentación

Video Charla

Video Entrevista

[Article] Azure | Integrando Azure Search en un Website

En en el artículos anterior (ir al articulo anterior) estuvimos viendo qué es Azure Search y como podemos configurarlo para comenzar a utilizarlo. En este artículo veremos cómo integrarlo en una Aplicación Web por medio del SDK que nos brindan.

Objetivo

En esta entrega estaremos integrando Azure Search en una Aplicación Web. Veremos sus características y funcionalidades plasmadas en un WebSite. El código del proyecto podrán descargo desde GitHub desde esta dirección

https://github.com/withoutdebugger/DemoAzureSearchWODv1

Audiencia

Este documento está dirigido a personas que conocen muy poco o nada sobre el tema o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Antes que nada necesitaremos el SDK. El SDK posee un conjunto de librerías de cliente las cuales las utilizaremos para manejar los índices, los datasource, indexadores, subir documentos, ejecutar queries y todo lo que necesitemos.

Las librerías principales son:

  • Azure.Search
  • Search.Models

Estas librerías tienen definidas algunas clases principales como Index, Field y Document como también algunas operaciones como Indexes.Create o Documents.Search asociadas a SearchServiceClient y SerachIndeCliente. Están agrupadas de una forma lógica para una mejor compresión.

Una vez listo el SDK en nuestra aplicación necesitaremos los ApiKey que Azure. Esta llave nos dará acceso al servicio y a base de búsqueda. La guardaremos en nuestra configuración de connections strings.

Para obtenerlos debemos ingresar al portal de Azure. Seleccionamos nuestro servicio de búsqueda -> opción claves:

Estas claves la usaremos dentro de nuestro archivo appsettings.json para tenerlas disponibles y consultarlas en el momento de consumir el servicio.

{
"AzureSearch": {
"SearchServiceName": "{nombre del servicio}",
"SearchServiceAdminApiKey": "{apikey}",
"SearchServiceQueryApiKey": "{apikey} "
},

...

}

Nuestra aplicación es una aplicacion ASP.Net Core MVC junto a una Web APi que será consumida por medio de JQuery. No voy a entrar en detalle de la aplicación MVC pero si en el servicio de búsqueda.

Tendremos el Home Controller que solamente nos devolverá la página inicial donde se encontrarán nuestros métodos en JQuery que consumirán los servicios de búsqueda.

Crearemos una Web API que se llamara Search. Será un controller llamado SearchController. Este recibirá en su constructor la clase IConfiguration para tener disponible el servicio de Azure Search.

{
searchServiceName = _configuration["AzureSearch:SearchServiceName"];
queryApiKey = _configuration["AzureSearch:SearchServiceQueryApiKey"];
indexClient = new SearchIndexClient(searchServiceName, "realestate-us-sample", new SearchCredentials(queryApiKey));
}

Nuestro método principal Get será el encargado de recibir las consultas desde el cliente. En esta primera versión filtra por texto, facets, tag y manejara la paginación. También tendremos algunos métodos privados que nos ayudaran a armar la consulta final.

Modelo Hotel

Este modelo es en el cual se transformara el resultado de Azure Search en nuestra aplicación.

public partial class Hotel
{
[System.ComponentModel.DataAnnotations.Key]
public string listingId { get; set; }
public string description { get; set; }
public string description_es { get; set; }
public string number { get; set; }
public string street { get; set; }
public string city { get; set; }
public string countryCode { get; set; }
public string postCode { get; set; }
public string thumbnail { get; set; }
public string status { get; set; }
public string[] tags { get; set; }
}

Get Method

El método principal recibirá los parámetros de consulta. Dentro podemos ver que tenemos los métodos privados CreateFilterFacets, CreateFilterTags, CreateParameter.

[HttpGet]
public DocumentSearchResul<Hotel> Get(string searchtext = "", string cityFacet = "", string typeFacet = "", string tags = "", string orderby = "", string derbydirection "desc", int actualPage = 1)
{
//Filter
string filter = CreateFilter(cityFacet, typeFacet);

//Filter Tags
IList<ScoringParameter> filterTags = CreatedFilterTags(tags);

//Parameters
SearchParameters sp = CreateParameter(10, filter, orderBy, filterTags, actualPage);

//Search
var result = indexClient.Documents.Search<Hotel>(searchtext, sp);
return result;
}

CreateFilterFacets

 Este método es el encargado de crear los filtros para los facets de City y Type. Como podemos ver en el método, el resultado un string que acompañará a la consulta. Azure Index utiliza una estructura OData formar las consultas. Por ejemplo, en el string el comando podemos ver el comando eq que significa igual. Podemos ver la lista completa de comando desde este link:

https://docs.microsoft.com/en-us/rest/api/searchservice/odata-expression-syntax-for-azure-search

private string CreateFilterFacets(string cityFacet, string typeFacet) {

string filter = "";

if (cityFacet != null)
{
filter += filter != string.Empty ? " and " : "";
filter += "city eq '" + cityFacet + "'";
}

if (typeFacet != null)
{
filter += filter != string.Empty ? " and " : "";
filter += "type eq '" + typeFacet + "'";
}

return filter;
}

CreateFilterTags

Este método es el encargado de crear una lista de Tags para filtrar. A diferencia del anterior, los tags deben filtrarse por medio de ScoringParameter que hace referencia a un nivel de acierto.

private IList<ScoringParameter> CreateFilterTags(string tags) {

IList<ScoringParameter> _parameterTags = new List<ScoringParameter>();

if (tags == null) { return _parameterTags; }

string[] _listTags = tags.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);

if (_listTags.Count() > 0)
{
_parameterTags.Add(new ScoringParameter("tags", _listTags));
}

return _parameterTags;
}

CreateParameter

Antes de la ejecución final de obtención de resultados debemos armar un SearchParamters. Desde este manejaremos la configuración principal de la consulta como el modo de búsqueda, cuántos tomar por medio de top, el filtro de text, el cálculo para la página, los campos que usaremos, si incluimos el total y los facets que filtraremos. Por último también se agregara tags correspondientes al ScoringParameters.

private SearchParameters CreateParameter(int top, string filter, IList<string> orderby, IList<ScoringParameter> filterTag, int currentPage)
{

SearchParameters searchParameters =
new SearchParameters() {
SearchMode = SearchMode.Any,
Top = 10,
Filter = filter,
Skip = currentPage - 1,
Select = new Lis<String>() { "listingId", "description", "description_es", "number", "street", "city", "countryCode", "postCode", "thumbnail", "status", "tags" },
// Add count
IncludeTotalResultCount = true,
//// Add facets
Facets = new List<String>() { "city", "type", "status", "tags" },
};

searchParameters.OrderBy = orderby;
searchParameters.ScoringParameters = filterTag;

return searchParameters;
}

Ejecución de resultado

Una vez que tenemos todo los objetos armados para nuestra consulta se llamará al siguiente método perteneciente al cliente de Azure Search.

var result = indexClient.Documents.Search<Hotel>(searchtext, sp);

indexClient es del tipo SearchIndexClient el cual es el encargado de realizar finalmente la consulta en nuestro servicio de Azure Search. Podemos ver que le enviaremos nuestra clase Hotel y el se encargara de hacer la transformación.

La aplicación

Finalmente nuestra aplicación se verá visualizará de la siguiente forma luego de una búsqueda:

Podemos filtrar la búsqueda por medio de la selección en cada una de las secciones City, Type y Tags para ajustar nuestros resultados. El encargado de ajustar la búsqueda sera los métodos creados en JQuery.

 

Conclusión

Azure Search es una excelente herramienta para realizar potentes búsquedas. También nos brinda un SDK muy potente para que podamos realizar consultas muy rápidamente y poder así integrar rápidamente en nuestras aplicaciones

Les dejos la aplicación de ejemplo en GitHub para que puedan consultarla:

https://github.com/withoutdebugger/DemoAzureSearchWODv1

También les dejo el link del demo:

http://wodazuresearch.azurewebsites.net/

[Article] Azure | Azure Search

En este artículo hablaremos de Azure Search. Azure Search es una solución que Microsoft nos brinda para poder integrar una excelente experiencia de búsqueda en nuestras aplicaciones móviles, web o cualquier aplicación como empresariales.

Objetivo

En esta entrega veremos qué es Azure Search. También, como configurar nuestra cuenta de Azure Search y un pequeño demo de como utilizarlos en una aplicación web.

Audiencia

Este documento está dirigido a personas que conocen muy poco o nada sobre el tema o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Todos los días, como usuarios, al usar aplicaciones estamos acostumbrados a los métodos de búsqueda rápidos y muy eficientes. Por ejemplo, todos los dias, en algun momento, buscamos en Google o algun motor de búsqueda de nuestra preferencia. Cuando usamos otras aplicaciones buscamos la misma experiencia de búsqueda.

Azure Search nos da la posibilidad de tener la misma experiencia de búsqueda en nuestras aplicaciones. Todo esto es posible gracias que tenemos disponible una gran cantidad de APIs Rest para consumir el servicio, también, un SDK muy completo en .Net. Por último,  dentro del portal de Azure tenemos muchas herramientas para la creación de prototipos, creación y consulta de índices.

Para poder comenzar es necesario una cuenta de Azure. Les dejo el link para poder obtener una cuenta gratuita junto a 200 dolares de crédito para poder probar las capacidades que Azure Search brinda:

Suscribirse

Características de Azure Search

A continuación analizaremos las características funcionales más interesantes, desde mi punto de vista, que podemos usar con Azure Search. Son las siguientes:

Búsqueda de texto completo y analisis de texto

Corresponde a la búsqueda que se basa escribiendo en una caja de texto. Podemos usar operadores lógicos o frases de búsqueda como cualquier buscador de internet.

Integración de datos

Azure Search soporta gran variedad de orígenes de datos. La unica caracteristica que tienen que tener estos datos es que tienen que respetar la estructura de datos del tipo JSON.

No obstante tenemos disponible soporte para Azure SQL Database, Azure Cosmos DB o Azure Blob Storage. En este último podemos tener documentos del tipo Microsoft Office, PDF o Html los cuales pueden ser indexados para búsquedas dentro de documentos.

Análisis Lingüístico

Básicamente, tendremos la capacidad de analizar la busqueda relacionado con una fonética de un lenguaje o alguna expresión regular. Podemos controlar el idioma, los tiempos verbales, género, nombres plurales o singulares o inclusive el manejo de palabras compuestas.

Características de la experiencia del usuario

Entre las características más importantes que podemos brindarles a nuestros usuarios tenemos:

  • Sugerencias de búsqueda: a medida que los usuarios van escribiendo su búsqueda le podemos ir sugerencias mostrando relacionadas con lo ingresado.
  • Navegación por facetas: Es un listado de categorización que podemos usar como filtros. Este tipo de filtro es muy similar a los sitios de compras, como amazon, que en el lado izquierdo tenemos varias opciones agrupadas que al hacer un solo click filtran la búsqueda principal.
  • Resaltado de referencias: podemos aplicarle un formato al resultado, por ejemplo subrayarlo en negrita, indicando que está relacionado con la búsqueda.
  • Ordenación: podemos ofrecer varias forma de ordenar la información obtenida del resultado de búsqueda.
  • Paginación: Como todo buen listado de búsqueda, podemos paginarlo.

Supervisión e informes

Es importante analizar las búsquedas de nuestros usuarios con el objetivo de tener que ajustar nuestro índices para que las posteriores búsquedas sean más efectivo y eficiente. Azure Search registra todas la búsquedas realizadas para posterior análisis. En un post futuro tocaremos este tema con más detalle.

Otras Características

Además de las nombradas, Azure Search tiene las siguientes características:

  • Georeferencia: Filtro por ubicaciones geográficas.
  • Relevancia: Usando perfiles de puntuación podemos darle relevancia a ciertos documentos.
  • Herramientos de prototipos e Inspección: configurar indexadores, crear índices, consulta de un índice particular, etc.

Manos a la Obra

Una vez que tenemos nuestra cuenta Azure, es muy sencillo crear una cuenta de Azure Search. Debemos seguir los siguiente pasos:

1. Ingresar al portal y buscar en el MarketPlace “Búsqueda de Azure”, lo seleccionamos y presionamos crear.

2. Completamos los datos que nos solicita el formulario. En mi caso la url sera testwod pero pueden seleccionar un nombre que ustedes deseen. En el plan de tarifa, para motivos de este demo, usaremos la tarifa gratis.

3. Un vez creado, vamos a grupo de recursos, seleccionamos el nombre de recurso que utilizamos y dentro podemos ver la cuenta de Azure Search que creamos. Le hacemos clic y veremos la información necesaria de nuestra cuenta.

Volvamos a nuestro panel de Azure Search. Para conectar nuestra base de datos debemos seleccionar desde la barra de opciones “Importar Datos” y seleccionamos Muestras para nuestro demo:

Luego de vincularlo veremos la pantalla de configuración de nuestros índices que descubrirá, desde nuestro origen de datos. Vamos a dejarlos por default.

Por último, seleccionamos un nombre para nuestro índice.  El tiempo el cual queremos que se refresque nuestros índices es configurable. Cuales son retornables, cuales filtrables, por cual vamos a ordenar, etc. Para esto último debemos habilitarlo en el datasource como dice en el mensaje. Por el momento no será necesario.

Ahora, una vez que el indexador termine podremos ingresar al explorador de búsqueda para probar algunas consultar.

En la imagen podemos ver que tenemos un cuadro donde podemos ingresar nuestra consulta, como también, un cuadro donde podemos obtener la url de esa búsqueda. Por último, un cuadro con el resultado de la búsqueda.

Vamos a escribir la siguiente consulta y veremos los resultado que se corresponden a nuestros parámetros:

search=granite&country=us

Conclusión

Azure Search es una excelente herramienta para realizar potentes búsquedas desde nuestros orígenes de datos existentes. No es necesario crear una plataforma para esto. Azure Search pone a nuestra disponibilidad la misma experiencia de usuario y la misma potencia de un motor búsqueda especializado para nuestra aplicaciones.

En este post hemos hablamos sobre Azure Search, sus características, como configurar nuestra cuenta y configurar nuestros primeros índices para hacer pruebas. En el próximos post integraremos estos índices a una aplicación en .Net para poder explorar un poco más las capacidades en un sitio web.