sábado, 12 de abril de 2014

"Ese serivcio, que es REST, lo vamos a hacer con WebApi"...... ¿Con qué????

Faltan pocos días para la presentación final de nuestro proyecto para el curso de sistemas distribuidos. Un aire de entusiasmo se respira en el grupo, pues todos han aportado para llegar hasta este punto. Cada uno a su manera. Los que no programamos, modelando el negocio, los que la "rompen" en programación, dándole duro al código y asesorándonos al límite para no alterar todo el proyecto con algún commit medio desubicado de nuestra parte. Tenemos claro como funciona un sistema distribuido y como debería funcionar nuestro proyecto. Por eso, cuando todo esta listo para implementar el ultimo servicio en REST, Diego, el programador "senior" del grupo hace un comentario que nos deja helados (literalmente): "Vamos a hacer esta historia con WebApi". Bien, si no fuera porque veo en su expresión una seguridad mas fuerte que la del pentágono en Washington, diría que se ha vuelto loco. Sin más vueltas que dar, hay que ponerse a investigar. 

La definición principal de WebApi dice que es un conjunto de herramientas que ayudan a crear servicios basados en REST. es decir es un framework. Esto sin duda acelera el proceso de implementación del servicio. Dentro de sus características, encontré las siguientes:

  • Modelo de programación HTTP moderno: Su principal funcionalidad es que el modelo de programación usado en el servidor también es soportado por el cliente con la nueva API HttpCliente.
  • Negociación de contenidos: Ofrece soporte para XML y JSON ademas de Form URL-encoded. Con posibilidades de extender los formatos.
  • Composición de consultas: Soporte consultas a través de convenciones OData URL.
  • Rutas: Usa todas la capacidades de enrutamiento de .NET MVC que incluyen parametros y restricciones. De esta forma, la configuración se hace solo por código dejando los archivos de configuración limpios
Además de otras características, creí que estas eran las más resaltantes pensando siempre en los principios REST. Al final, el proyecto tuvo un servicio REST implementado bajo WebApi y nosotros, los mortales que no programamos, pudimos aprender algo más de este Framework muy útil.  


Desnudando a REST

Representational State Transfer - REST. Es una técnica de arquitectura software basado en SOA y se fundamenta básicamente en recursos. Un recurso es cualquier cosa que tiene una URI (Uniform Resource Indentifier), pudiendo tener cero o más representaciones. El termino REST se introdujo en el 2000  en una tesis doctoral sobre la web escrita por Roy Fielding, uno de los principales autores de la especificación del protocolo HTTP. Desde entonces, REST a pasado a ser muy usado por la comunidad de desarrollo. En clase, muchos compañeros no tenían claro que era RESTful, pues no estaban seguros a qué exactamente se refiere este termino (y me incluyo). Pues bien, RESTful es el nombre que se le da a un sistema que ha seguido los principios de REST para su desarrollo. Es preciso mencionar que Roy, para crear REST, tuvo su mayor inspiración en Internet, pues concluyó que la Web era la aplicación distribuida más exitosa de la historia y la aprovecho al máximo.

Una de las principales características, o principio como prefiero llamarlo, es que REST divide el estado y la funcionalidad en recursos. De esta forma, se puede var claramente que REST esta orientada a recursos y no a métodos. Los recursos bien representados no pueden ser accesados directamente, sino, a través de representaciones de los mismos. De esta forma los otros principios de REST se manifiestan como consecuencia del mencionado. Así tenemos los siguientes principios:
  • REST usa directamente la sintaxis universal de HTTP para poder identificar el tipo de operacion sobre los recursos 
  • Un protocolo sin estado y basado en capas. Cada mensaje tiene la información necesaria para comprender la petición 


  • Uso de hipermedios (URIs) y son usados tanto para las transiciones del estado de la aplicación como para la información de la misma.   

  • Promueve mecanismos de cache y sistemas intermedios



Es imposible no comparar REST con SOAP para implementar un diseño SOA con WS. De esta forma, podremos resaltar tres grandes diferencias

 A pesar de todas estas  buenaas caracteristicas mencionadas, es preciso detallar algunas cosas no tan positivas de REST que se detallan a continuación.
  •  REST es poco flexible
  • REST no está preparado para albergar Servicios Web de gran complejidad como las aplicaciones B2B
  • REST tiene grandes problemas de seguridad al no soportar el concepto de sesión
    A manera de conclusión se puede decir que:
  1.      REST es adecuado para manejar grandes cantidades de información publica (escalabale) para grupos desconocidos de usuarios
  2.      REST no es muy adecuado para sistemas  complejos cerrados desnu

Descubriendo MSMQ

Una de las técnicas o patrones para integración empresarial es la de mensajería. En ese esquema, ademas de otras herramientas, tenemos a MSMQ de Microsoft, que es una herramienta que permite realizar el manejo de colas de mensajes. La finalidad de MSMQ es lograr una comunicacion asicnrona (off line) entre procesos. A veces, muchas arquitecturas usan este patrón para implementar contingencias en la interacción de servicios. 

Características

MSMQ es útil cuando tenemos algún proceso que requiere invocar una rutina que lleva mucho tiempo. Antes, El proceso que invocaba algún servicio quedaba esperando a que el proceso invocado termine para poder continuar. Con MSMQ actuando de forma asíncrona ofrece continuidad al proceso invocador y al proceso invocado.    

Esta herramienta ofrece un alto grado de encriptación para los mensajes, así como la autenticación de los mismos. Asi mismo, permite el uso de transacciones externas, lo que facilita la implementación de contingencias o aplicaciones que requieran "regularizaciones off line"

MSMQ proporciona enrutamiento dinámico, lo que hace que los mensajes se muevan por diferentes rutas de red y puedan encontrar el nodo que solicito su funcionalidad.

Biztalk Server es el adapatadro para MSMQ que le permite funcionar con colas remotas y locales, publicas y privadas, transaccionales y no transaccionales. 

Ofrece compatbilidad para mensajes mayores a 4MB y proporciona acceso a características de Message Queuing 4.0 como, por ejemplo, lecturas transaccionales remotas y lectura desde subcolas.
  

Orquestación de Servicios, piedra angular de SOA.

La orquestación de servicios es un modelo centralizado que permite realizar interacciones entre los servicios web a través de una entidad que define la lógica de dicha interacción. Es necesario precisar que SOA se caracteriza por implementar un esquema basado en servicios  interoperables, que se acoplan débilmente desde sistemas ubicados en diferentes dominios del negocio para lograr así un sistema empresarial único. En ese contexto, es precioso señalar que implementar un sistema que cumpla con los principios SOA depende mucho de una exitosa orquestación de servicios. En tal sentido, encontrar una plataforma que soporte la orquestación de los servicios es una tarea crítica dentro de un proyecto de integración.

Como bien sabemos, los servicios individualmente no se programan para comunicarse con otros (al menos no explícitamente), entonces es necesario que los mensajes entre los mismos, deban intercambiarse de acuerdo a la lógica de negocio predeterminada. Para lograr este cometido, existen patrones de integración empresarial (EIP: Enterprise Integration Patterns), los cuales cuentan con un motor central de mensajería para la integración de datos. Este motor se implementa a través de un Bus de Servicios Empresariales (ESB: Enterprise Services Bus) el cual nos permite enrutar, transformar y enriquecer mensajes. Cuando logramos una arquitectura verdaderamente orientada a servicios, las nuevas aplicaciones no deben ser reescritas, sino, se crean a partir de nuevas orquestaciones en los servicios.

En un alto nivel, la orquestación de servicios y SOA son conceptos relativamente simples. Sin embargo, si no se cuenta con la herramienta adecuada, se hacen muy difíciles de implementarlas. En este contexto, ESB surge como una alternativa altamente demandada para la orquestación de servicios dentro de un patrón de integración. Es así, como surgen diversos estándares representados en productos que siguen el patrón ESB para lograr una “integración orquestada”. En este escenario, hablamos de estándares como BPEL o productos open source como Mule.

A continuación un resumen que describe de manera acotada, cada uno de los productos mencionados.

BPEL
“Business Process Execution Language”. Es un lenguaje utilizado en la composición de servicios web. Está diseñado bajo XML y ejecuta un control centralizado de todos los servicios web diseñados. BPEL contempla lógica de negocio y es uno de sus hitos, pues depende bastante de este factor para que la composición y orquestación sean más eficaces. La razón de ser de BPEL es definir procesos de negocio que interactúen con entidades externas. Entre sus principales características tenemos:
-          Define una serie de conceptos de orquestación de servicios web que pretenden ser usados por vistas internas y externas de un proceso de negocio.
-          Provee de sistemas de control jerárquicos y estilo grafico que permitan que su uso sea lo más fusionado posible.
-           Provee funcionalidades de  manipulación de datos simples para definir datos de proceso y flujos de control
-          Usa servicios Web  como la técnica para descomponer y ensamblar modelos

Mule
Mule se presenta más como un “gestor de eventos” y ofrece escalabilidad. Es decir que además de SOA su paradigma también es EDA (Event Driven Arquitecture). Es un framework liviano que trabaja nativamente con aplicaciones JAVA. Cumple con muchos patrones de integracion definidos Gregor Hohpe y Bobby Woolf . El Proyecto Mule también tiene un Contenedor Java Business Integration (JBI/JSR-208) llamado MuleJBI y se distribuye con un IDE basado en Eclipse llamado MuleIDE, el cual es un set de Plug-Ins para Eclipse que sirven para desarrollar, desplegar y gestionar los proyectos. Entre sus principales características tenemos:
-          Manejea canales de comunicación llamados “end points”
-          Incentiva la reutilización de aplicaciones existentes
-          Acelera la integración de sistemas heterogéneos
-          Admite múltitud de formatos de mensajes: SOAP, REST..
-          Mediación y enrutamiento de servicios: Protección en el formato de los mensajes separándolos de la lógica de negocio. Enrutamiento de los mensajes basados en reglas
-          Soporta diferentes lenguajes de programación: Java, Groovy, Javascript, JRuby, etc.
-          Es opensource.

Conclusión
No es preciso definir cuál es la mejor opción para orquestar arquitecturas SOA. En ese proceso intervienen muchos factores como requerimientos funcionales y no funcionales, presupuesto, experiencia de desarrollo, etc. Lo importante es saber identificar cuando usar cual y como usarlos para poder crear una arquitectura escalable, de alta disponibilidad y que conserve siempre la estructura SOA. Ello garantizará el éxito de una integración empresarial.