U3 Arquitecturas y Patrones Aplicaciones Distribuidas
U3 Arquitecturas y Patrones Aplicaciones Distribuidas
U3 Arquitecturas y Patrones Aplicaciones Distribuidas
aplicaciones distribuidas
Índice
1 Charla 1: Introducción a los patrones de diseño. Algunos patrones básicos................3
1.1 Por qué patrones.......................................................................................................3
1.2 Patrones JavaEE.......................................................................................................4
1.3 Singleton (GoF)....................................................................................................... 6
1.4 Facade (GoF)........................................................................................................... 8
1.5 Data Access Object - DAO (JavaEE).................................................................... 10
1.6 Transfer Object...................................................................................................... 12
1.7 Factory (GoF).........................................................................................................13
2 Charla 2: Arquitecturas Java EE................................................................................ 18
2.1 Bloques Arquitectónicos........................................................................................18
2.2 Arquitectura y Java EE.......................................................................................... 23
2.3 Propuestas de Arquitecturas Java EE.....................................................................27
2.4 Para Saber Más...................................................................................................... 38
3 Integración de aplicaciones........................................................................................ 40
3.1 ¿Qué es la EAI?..................................................................................................... 40
3.2 Sistemas de Información de Empresas (EIS).........................................................43
3.3 Arquitectura de aplicaciones existentes................................................................. 44
3.4 Arquitectura de aplicaciones modernas................................................................. 48
3.5 Retos que plantea la EAI........................................................................................51
3.6 Capas en la integración de aplicaciones.................................................................52
3.7 Uso de middleware para EAI.................................................................................54
3.8 Servicios de infraestructura necesarios para la integración................................... 59
3.9 Técnicas de integración..........................................................................................63
3.10 Opciones alternativas a la integración..................................................................65
3.11 Arquitectura de integración..................................................................................67
2
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Aunque cada aplicación JavaEE tiene peculiaridades que la hacen única, en el proceso de
desarrollo de casi todas las aplicaciones es necesario solucionar una y otra vez los mismos
problemas: autentificación del cliente, persistencia de datos, separación entre
presentación, lógica y control,... En lugar de reinventar continuamente la rueda, es mucho
más productivo aplicar estrategias que ya hayan funcionado con anterioridad. Esta idea es
la que lleva a la definición de los patrones software.
3
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
utilizarlos.
Los patrones JavaEE están orientados específicamente a los problemas comunes a todas
las aplicaciones JavaEE. Algunos están basados en los patrones originales mientras que
otros son más específicos del tipo de problemas que surgen específicamente en JavaEE,
bien sea por los tipos de aplicaciones que se suelen desarrollar con la plataforma o por las
características (o deficiencias, incluso) de la tecnología. Los primeros fueron publicados
en el libro Core J2EE Patterns, convertido también en un clásico dentro del "mundillo"
JavaEE. En la actualidad son muchos los libros y los sitios web dedicados íntegramente a
patrones para aplicaciones JavaEE o con algún apartado sobre ellos.
Una versión resumida del catálogo de Core J2EE Patterns está disponible en su sitio web.
Siguiendo la idea de dividir la arquitectura de una aplicación en varias capas, los patrones
se clasifican atendiendo a la capa a la que pertenecen. En la figura 5 aparece el esquema
general en la que se muestra la situación de cada uno de los 21 patrones en el modelo de
capas y las relaciones que existen entre ellos. Iremos viendo con detalle algunos de estos
patrones y sus interrelaciones en las distintas charlas del módulo.
4
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
5
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Hay muchos casos en los que solo necesitamos una instancia de una determinada clase.
Ejemplos típicos son clases que representan las preferencias del usuario o la
configuración del sistema, o clases que sirven de interfaz con dispositivos físicos.
En estos casos hay que asegurarse de poder obtener una referencia a dicha instancia desde
cualquier punto del código, y que solo haya una instancia creada, para evitar posibles
problemas o inconsistencias. Una posible solución es definir variables globales (o sea,
static), pero esto tiene dos problemas:
• Por descuido, se podría instanciar una misma variable en dos sitios distintos, lo que
"machacaría" el valor anterior.
• El orden y momento de inicialización de las variables depende del compilador, lo cual
puede ser delicado si unas dependen de otras y están en lugares distintos.
El patrón singleton nos permite asegurar que de una clase habrá solo una instancia, y
proporciona un punto de acceso a ella global a todo el código. El diagrama de clases es
muy sencillo, ya que se compone de una única clase:
Patrón singleton
El método getInstance() nos sirve para obtener la referencia a la única instancia de la
clase. Además dicha instancia está almacenada dentro de la propia clase como una
variable de tipo static (esto último puede resultar curioso, pero no deja de ser un "truco
ingenioso" perfectamente legal para el compilador). Por supuesto el singleton tendrá otros
métodos, los servicios que proporcione la clase.
La implementación de un singleton podría hacerse de varias formas, pero casi siempre se
utiliza el mismo tipo de código. Vamos a resumir las ideas que nos llevarán a la
implementación final:
• Si el constructor de una clase es público, podrá llamarse desde cualquier otra. Por
tanto, si queremos asegurar un control de la creación de instancias, no podemos tener
un constructor público, debemos hacerlo privado:
6
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Como puede verse, este código es una especie de "idea feliz" que consigue de forma
elegante el objetivo que nos proponíamos. Aunque quizá esto podría conseguirse de otras
formas, esta es ampliamente utilizada y conocida, por lo que merece la pena usarla en
lugar de intentar formas propias de hacerlo (después de todo, esta "reutilización de ideas"
es consustancial a la idea misma de patrones software).
7
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
¡Cuidado!
El código visto no asegura que solo exista una instancia si se permiten varios threads (piénsese
que pasaría si los dos threads comprueban "a la vez" que no existe una instancia del objeto y la
crean ¡por dos veces!). Consultad la bibliografía adicional para ver formas de solucionar este
problema (basadas en general en el uso de synchronized).
En aplicaciones JavaEE, son múltiples los casos en los que solo se necesita una
instancia de un objeto para toda la aplicación (aunque a este objeto lo puedan llamar
varios threads simultáneamente). Piénsese por ejemplo en un objeto encargado de
calcular costes de envío de pedidos. Los costes según métodos de envío, plazos de
recepción, peso del paquete, etc. son información global para toda la aplicación, de modo
que se puede implementar como un singleton.
Un uso típico de este patrón en aplicaciones enterprise es para implementar un encargado
global de localizar recursos JNDI como por ejemplo conexiones JDBC, EJBs, etc. Esto es
lo que se conoce como Service Locator.
Supongamos que tenemos un sistema complejo, que agrupa multitud de clases, y para
realizar una tarea tenemos que llamar a varios métodos de estas clases en una secuencia
precisa. Por ejemplo, supongamos un sistema domótico en el que tenemos el siguiente
diagrama de clases
8
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
...
//de alguna forma, ya hemos obtenido una referencia a la alarma,
configuración, aire y luces
//y tenemos también el nombre de usuario y el password
...
//desactivar la alarma
alarma.desactivar(password);
//obtener preferencias de usuario
Preferencias prefs = configuracion.getPreferencias(usuario);
//poner el aire acondicionado a la temperatura deseada
Float temp = (Float) prefs.getPreferencia("temperatura");
aire.setTemp(temp.floatValue());
//poner las luces en "auto" si es la preferencia del usuario
String luces = (String) prefs.getPreferencia("luces");
if (luces.equals("auto"))
luces.setAuto(true);
...
Como se ve, una operación tan sencilla en apariencia implica manejar un número elevado
de objetos y métodos. salirDeCasa() sería igual de tedioso: apagar las luces, el aire,
activar la alarma.... Un cliente que quiera invocar una de estas operaciones no debería
necesitar tanto código.
Parece inmediata la idea de crear una clase a la que trasladaremos todo este código y a la
cual puedan acceder los clientes que lo necesiten. Esto es ni más ni menos que un facade.
Patrón facade
Un Facade (fachada) consiste en implementar un interfaz simplificado para un
sistema complejo. La idea es implementar una clase con un interfaz sencillo y que
encapsule los detalles de la interacción entre todas las clases del sistema. Es importante
9
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
notar que se sigue permitiendo el acceso directo a las clases del sistema a los clientes que
necesiten "acceso a bajo nivel" pero se simplifica la interacción para los que no necesiten
más que operaciones comunes.
En aplicaciones JavaEE, las fachadas se suelen utilizar para proporcionar un "frontal de
servicios" de la capa de negocio. De este modo, la interacción de los clientes (web, swing,
etc...) con esta capa se simplifica considerablemente. Como veremos en charlas
posteriores, en aplicaciones distribuidas las fachadas también mejoran la eficiencia del
sistema, ya que las operaciones "de fachada para adentro" serán todas locales y la única
llamada remota será la del cliente a la fachada.
Supongamos que el código de acceso a los recursos de datos (normalmente bases de datos
relacionales) está incluído dentro de clases que tienen además otras responsabilidades
diferentes. Por ejemplo supongamos que en una biblioteca (el ejemplo que usaremos en
las sesiones de integración) tuviéramos una clase GestorPrestamos que se ocupara de
realizar y gestionar los préstamos de libros. En una primera aproximación podríamos
hacer que esta clase se encargara tanto de la lógica de negocio (por ejemplo comprobar si
un usuario es "moroso" antes de prestarle un libro) como del acceso a datos (introducir el
préstamo en una hipotética tabla de préstamos).
Este tipo de enfoque lleva a sistemas poco modulares y difícilmente mantenibles. En
nuestro caso, el cambio de las reglas de negocio implicaría cambios en GestorPrestamos.
El problema es que además, un cambio en la base de datos también implica cambios en
GestorPrestamos.
10
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
funcionalidades del sistema. El siguiente esquema UML muestra una estructura de clases
típica para el DAO de préstamos de la biblioteca.
DAO
Como se observa en la figura, el DAO es el punto de entrada al almacén de datos (aquí
representado por un DataSource JDBC) y proporciona operaciones de tipo CRUD
(Create-Read-Update-Delete).
Destacamos algunos puntos importantes:
• Como se ve, el DAO no tiene por qué implementar todas las operaciones CRUD
(quizá en nuestro sistema no se puedan borrar los préstamos, solo devolver el libro
quedando el registro del préstamo en la base de datos).
• En general (aunque esto es una decisión de diseño), por cada objeto de negocio en
nuestro sistema, crearemos un DAO distinto. En nuestro caso además del
PrestamosDAO podríamos tener también un UsuarioDAO y un LibroDAO.
• Aunque aquí el almacén de datos se representa como una base de datos compatible
JDBC no tiene por qué ser siempre así, como discutiremos a continuación.
• La información que devuelve o se le pasa al DAO se encapsula en objetos de tipo
transfer object (en nuestro caso la clase Prestamo), que, simplificando, no son más
que "contenedores de información" y que trataremos en la discusión del patrón
correspondiente.
Hay que tener en cuenta que si el DAO se considera un patrón J2EE (o hablando más en
general un patrón de aplicaciones de tipo enterprise) es porque prácticamente todas las
aplicaciones J2EE de cierta dimensión hacen uso intensivo de almacenes persistentes de
datos (normalmente bases de datos relacionales) aunque muchas aplicaciones J2SE no lo
hagan.
Otro importante beneficio del DAO es la independencia del almacén de datos: el cambio
de motor de base de datos o el paso de usar un pequeño archivo XML a usar una base de
datos relacional para almacenar datos solo afectará al DAO y no a las clases encargadas
de la lógica de negocio o de presentación. Se suele usar el patrón Factory para poder
instanciar los DAOs reduciendo al máximo la dependencia del DAO concreto a crear (por
ejemplo de MySQL, Oracle, XML, fichero .properties, ...).
11
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Identificar los aspectos de la aplicación que cambian o pueden cambiar y separarlos de los
que van a permanecer fijos. Muchos patrones de diseño se basan en encapsular de alguna forma
la parte que cambia para hacer más fácil la extensión del sistema. En este caso, el DAO
encapsula la parte que puede variar (la interacción con la fuente de datos).
Cuando se trabaja con arquitecturas de varias capas, un problema típico es cómo pasar los
datos de una capa a otra. En el caso de la biblioteca que veíamos anteriormente, cuando
por ejemplo queremos ver los datos de un libro, éstos tienen que sacarse de la base de
datos, pasando por las capas de datos y negocio hasta la capa de presentación. Solicitar
los datos uno a uno (título, autores, ISBN,...) no es una opción adecuada ya que en
aplicaciones distribuidas incrementa innecesariamente el número de llamadas remotas.
Necesitamos una forma compacta y organizada de pasar estos datos de una capa a otra.
Si la aplicación no es distribuida, no va a existir este problema. No obstante, en todas las
aplicaciones se suele plantear el caso de que la capa de presentación puede necesitar
menos datos de los almacenados en un objeto del modelo del dominio o bien puede
necesitarlos organizados de otra manera. Por ejemplo, quizá en un listado de libros nos
baste con el título y el autor y no sea necesario obtener de la base de datos todos los
demás campos.
Un transfer object no es más que un objeto que "empaqueta" datos para que puedan viajar
entre las capas. Dicho objeto contendrá todos los datos que nos interesen accesibles
mediante getters y setters. Por ejemplo, como ya se vio en el patrón DAO la
comunicación entre la capa de negocio (clase GestorPrestamos) y la de datos (el propio
DAO) se hace en base a transfer objects.
12
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Nótese que aunque los transfer objects están directamente relacionados con los objetos
del modelo de objetos del dominio, no se trata de los mismos objetos. Los objetos del
dominio pueden contener lógica de negocio mientras que como ya se ha dicho los transfer
objects son meros almacenes de datos. Además no tiene por qué haber una relación
uno-a-uno entre objetos del dominio y transfer objects, como se discutirá a continuación.
Destacamos algunos puntos importantes:
• Por cada objeto de negocio puede haber más de un transfer object. De hecho, una
estragegia muy común es usar un transfer object distinto para cada caso de uso. Por
ejemplo, al ver los datos de un solo libro vamos a mostrar probablemente mucha más
información que la que aparece en un listado de varios libros, por lo que podemos
tener un LibroTO y un LibroListaTO.
• Un problema importante es el de la sincronización entre los valores del transfer object
y los del objeto del dominio que representa. Hay que asegurarse de que dichos valores
están actualizados o que una falta de actualización de los mismos no conlleve
consecuencias graves (caso típico de las operaciones de solo lectura). En caso de usar
los TO tanto para mostrar datos como para almacenarlos (TOs actualizables) habrá
que llevar sumo cuidado para sincronizar la información de los TOs que hayan
cambiado.
El patrón factory pretende proporcionar una buena manera de instanciar objetos cuando la
clase a la que pertenece el objeto instanciado puede cambiar, bien por modificaciones en
el diseño o bien porque en tiempo de compilación no se conoce la clase exacta.
Por poner un ejemplo concreto, supongamos que tenemos un sistema de mensajería
instantánea. Los mensajes se pueden enviar a través de varios canales (TCP/IP, SMS,
buzón de mensajes,...) y hemos implementado una serie de clases que nos permiten hacer
el envío por ellos: EnvioTCP, EnvioSMS, EnvioBuzon,... todas estas clases implementan la
misma interfaz ICanal, y el usuario elige el medio a través del GUI del programa. El
código que envía el mensaje podría ser similar al siguiente:
Mensaje mensaje;
ICanal canal;
...
mensaje = GUI.getMensaje();
nombreCanal = GUI.getOpcionEnvio();
if (nombreCanal.equals("TCP"))
canal = new EnvioTCP();
else if (nombreCanal.equals("SMS"))
canal = new EnvioSMS();
else if (nombreCanal.equals("buzon"))
canal = new EnvioBuzon();
canal.enviar(mensaje)
13
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Nota:
Un principio básico de un buen diseño es que el código debería estar abierto a la extensión
pero cerrado a la modificación. Es decir, que el diseño debería ser tal que nos permitiera
extender la funcionalidad donde fuera necesario, pero al mismo tiempo consiguiera que esta
extensión no suponga cambios en el código ya existente. Cualquier modificación de código en
funcionamiento podría suponer la introducción de bugs en el sistema.
Es evidente que el código anterior no cumple esta condición, ya que es necesario insertar
líneas de código y recompilar la clase para extender la funcionalidad.
Recordemos de nuevo ese principio básico del diseño que dice que hay que separar lo que
varía de lo que permanece igual. En nuestro caso hemos visto que al tomar la precaución
de usar una interfaz común para todas las clases lo que puede cambiar es la instanciación
de la clase concreta que necesitamos. Por tanto, vamos a encapsularla y separarla del
resto.
Si tuviéramos una clase auxiliar que nos proporcionara instancias concretas de la clase o
interfaz deseados (en nuestro caso ICanal) podríamos hacer algo como:
Mensaje mensaje;
ICanal canal;
...
mensaje = GUI.getMensaje();
nombreCanal = GUI.getOpcionEnvio();
canal = FactoriaCanales.crearCanal(nombreCanal);
canal.enviar(mensaje)
Que es un código mucho más limpio que la versión anterior. Ahora trasladamos los
detalles de la instanciación a FactoriaCanales, que se ha convertido en una especie de
factoría o fábrica de objetos:
14
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Simple factory
En el diagrama anterior, Cliente es cualquier clase que requiera los "servicios" del
Simple Factory para crear objetos.
Aviso:
En algunas fuentes de referencia se da como patrón factory esto que no es sino una versión
simplificada. Esto no supone un problema siempre que se tenga clarpo de qué se está hablando y
la diferencia entre ambas "versiones".
Supongamos que el problema anterior se complica: ahora tenemos que distinguir entre
usuarios lite, que no pagan una cuota y por tanto tienen algunas restricciones (número
máximo de SMS, tiempo máximo de conexión, tamaño más limitado del buzón,..) y
usuarios pro, que tienen menos restricciones en la mensajería. Necesitamos por tanto
crear un canal lite y pro de cada tipo (SMS, TCP,...). Para organizar el código de manera
flexible podemos usar el patrón factory method, a veces llamado simplemente factory.
Este patrón es ligeramente más complicado que la versión anterior. Tenemos una factoría
"genérica" que es una clase abstracta y sirve para "fabricar" un producto, también
genérico (un interfaz o bien una clase abstracta). Siguiendo con nuestro ejemplo,
15
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
16
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Nótese que no siempre es necesario que un factory concreto cree más de un producto
distinto. En nuestro ejemplo, cada subclase de FactoriaCanales creaba distintos tipos de
canal, pero no siempre es así. En ese caso el método que actúa de factoría de objetos no
tendrá parámetros.
17
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Esta charla se enfoca partiendo de un repaso de las diferentes capas lógicas (layers) de
una aplicación, para luego centrarnos en diferentes planteamientos de arquitectura
dependiendo del uso o no de un servidor de aplicaciones.
La clave de una arquitectura sólida es una capa de servicios bien definida. Esta capa
expone la lógica de negocio a los clientes, como interfaces web o capas remotas. Esta
capa consistirá en múltiples interfaces, cada uno con un contrato bien definido.
Una capa de servicios bien definida debería:
• Ser completa. Debería exponer todas las operaciones que necesiten los clientes.
Puede que sea necesario exponer diferentes interfaces que den soporte a los diferentes
clientes.
• Ser simple. No debe ser más compleja que los requisitos de negocio que ofrece.
• Estar definida mediante interfaces en vez de clases, persiguiendo las buenas
prácticas de OO.
• Ser orientada a objetos. Se debe minimizar el número de restricciones de los objetos
de negocio. Por ejemplo, no se debe forzar a que implementen interfaces especiales o
que hereden de alguna superclase particular.
• Ser independiente de la lógica de presentación
• Ser fácil de escribir, maximizando la productividad y reduciendo los costes.
• Forzar la ocultación de la tecnología de acceso a datos. El acceso a datos es un
tema de bajo nivel, y por tanto, los objetos de negocio no deben tratar con tecnologías
como JDBC ni capturar excepciones específica de este tipo de tecnologías.
• Tratar la gestión de transacciones. Los clientes de la capa de servicios de negocio
no se deberían preocupar sobre las transacciones.
• Ser compatible con el escalado horizontal (si fuese necesario). Nada de la capa de
negocio debe impedir la realización de un cluster. Sin embargo, esto no significa que
la capa de negocio ofrezca escalado horizontal. No tiene por que ser un mecanismo
distribuido.
• Ser fácil de probar y estar probada a conciencia. Esto es crucial, ya que la robustez
18
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
¿Qué sucede si no existe capa de negocio y toda la lógica de negocio residen en la capa
web dentro de un Action de Struts o un Controlador Spring, u otras clases de la capa web?
Esto suele ocurrir por la falta de una gestión de los objetos de negocio en aplicaciones
JavaEE que no utilizan EJB. Las desventajas son numerosas, incluyendo:
• Atar los objetos de negocio al API de los Servlets.
• Reutilización limitada de los objetos de negocio. Un framework como XWork, el cual
desacopla los Actions del API de los Servlets puede paliar este problema.
• Dependiendo del framework MVC utilizado, podemos perder capacidades de OO, ya
que, por ejemplo, mediante el uso de Struts los Actions deben heredar de las clases de
Struts, lo que nos priva de poder realizar herencia sobre otras clases.
• Responsabilidades difusas en la capa web. Cada clase debería tener una sola y clara
responsabilidad. Con este enfoque, las clases de la capa web al menos tienen 2
responsabilidades bien diferentes.
• Ausencia de soporte para la gestión declarativa de transacciones (Spring AOP se
puede utilizar para los controladores web, o los filtros de Servlets se puede utiliza
para gestionar las transacciones en una aplicación web, pero estas son soluciones tipo
tirita para problemas mejor resueltos de forma separada al API de los Servlets).
• La lógica de negocio es difícil de probar, causado por los elementos implícitos del
contenedor web.
La tendencia actual es utilizar una capa de servicio de negocio mediante POJOs corriendo
sobre un contenedor ligero, tipo Spring o PicoContainer, el cual reemplaza la estructura
de los EJB con mucha menos complejidad.
En pocas palabras, un contenedor ligero:
• Gestiona el ciclo de vida de los objetos de negocio. La principal diferencia con los
EJBs es que un contenedor ligero puede gestionar POJOs: no hay necesidad de
implementar contratos especiales.
• Ofrece facilidades de lookup, resolviendo la dependencia entre objetos gestionados
por el contenedor. El paradigma de Inversion Of Control (IoC) es el elemento central
de este tipo de contenedores ligeros.
• Ofrece servicios empresariales (mediante AOP) como gestión declarativa de
transacciones sobre objetos corriendo dentro del contenedor, devaluando una de los
principales defensas de EJB.
Los contenedores ligeros promueven el uso de buenas prácticas OO, como que los
clientes realicen la llamadas a interfaces y no a clases. Estos interfaces definen contratos
19
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Hay algunas cosas que una capa de servicio no debería exponer al resto del mundo. Por
ejemplo:
• Si la capa de servicios es remota, es obligatorio trabajar con parámetros y tipos de
retorno Serializable. También hay que considerar la eficiencia ¿Cuanto costará que
estos objetos se codifiquen (marshall) y descodifiquen (unmarshall) para viajar a
través de la red?
• Con algunas tecnologías de persistencia, puede ser necesario desconectar los objetos
del almacén persistente de un modo explicito.
Importante
La desconexión de un almacén persistente es un problema común e importante.
20
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
El requisito más común es exponer los servicios de negocio vía un interfaz web. En esta
arquitectura, existe un línea divisoria que fuerza la distribución, la que existe entre el
cliente y su navegador, y el servidor web. Sin embargo, no son necesarias más barreras
distribuidas, ya que normalmente todo funciona mejor sin los costes asociados a los
objetos distribuidos.
Navegador-Contenedor Web
Lo que comúnmente se conoce como arquitectura JavaEE (J2EE) tradicional u ortodoxa
promueve la separación física entre el nivel web (vía un Contenedor Web) y los objetos
de negocio (vía un Servidor de Aplicaciones). La tendencia señala en otra dirección,
donde toda la aplicación reside un único nivel y, como hemos comentado, la escalabilidad
se consiga mediante el clustering de servidores.
Consejo
Coloca los objetos de negocio en el contenedor web (mononivel).
Este es el enfoque más sencillo, con mejor rendimiento, y con un enfoque más OO.
La separación de los BOs del nivel web es una de las falacias del mundo JavaEE.
Puede haber un línea divisoria entre el servidor web y el contenedor web. Por ejemplo, se
puede utilizar Apache como servidor HTTP, con un conector proxy el cual envíe
peticiones al contenedor JavaEE. Esta distribución no afecta al código de la aplicación.
Lo que varía es el efecto en el rendimiento. Normalmente este enfoque es más lento que
si el contenedor web sirve todo el contenido web, a no ser que exista un gran proporción
de contenido estático respecto al dinámico. Otra razón puede ser por cuestiones de
seguridad, colocando todas las partes de la aplicación JavaEE detrás de un firewall.
21
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Parece ser que por lo general, no queremos una separación física de los objetos de
negocio del nivel web. Sin embargo, si queremos una separación lógica, y el hecho de
rechazar la separación física no implica que olvidemos esto.
El primer paso para tener una separación lógica es tener una capa de servicios de negocio
bien definida. Sin embargo, también debemos asegurar que el acceso a estos servicios sea
fácil y que no produzca una dependencia en la capa de UI o en la tecnología detrás del
interfaz de los servicios de negocio
La mayoría de las aplicaciones JavaEE contienen demasiado código dentro de la capa
web, ya sea porque pocos libros enfatizan la importancia de esta separación (se centran
más en separar la lógica de control de la vista), que los frameworks MVC tipo Struts no
obligan a realizar esta separación, y al no obligar, los desarrolladores tienden a colocar la
lógica de negocio en los Action, o bien porque parece que la solución más fácil sea
colocar todo en el Action y evitar la creación de las diferentes capas mediante el uso de
interfaces/implementaciones desacopladas mediante factorías.
En resumen, el interfaz web debería ser ligero. Se debería construir sobre la capa de
servicio y únicamente contener el código necesario para capturar los eventos del usuarios
y visualizar las respuestas.
El uso de los clientes remotos debe tratarse con cuidado. Aunque no se trata de un acceso
complejo, los servicio de negocio solo deben exponer interfaces remotos cuando sea
necesario.
Aunque nuestros servicios de negocio no incluyan soporte nativo para el acceso remoto,
el proceso de añadir una fachada sobre la capa de servicios es tan fácil como añadir una
fachada web.
Las elecciones para acceder a servicios remotos se centran en RMI (Remote Method
Invocation), la cual es la tecnología que utilizan los EJBs para la comunicación remota de
los componentes; también se pueden utilizar diferentes protocolos Hessian o Burlap vía
Commons Proxy (commons.apache.org/proxy) o el uso de servicio SOAP con Web
Services vía herramientas como Apache Axis/Axis2 (ws.apache.org/axis y
ws.apache.org/axis2)
22
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.1.3.1. Tecnologías
Las tecnologías de acceso a datos incluidas en JavaEE son JDBC, JDO y JPA. Sin
embargo, es muy común utilizar productos de terceros, y en la mayoría de las ocasiones,
vale la pena.
Antes de JPA, el uso de EJBs de Entidad producía , el uso de EJBs de Entidad produce
resultados no muy buenos. Esta apreciación está ampliamente aceptada dentro de la
comunidad JavaEE. ¿Qué nos queda?
• JDBC es una buena tecnología para acceso a bases de datos relacionales vía SQL. Si
utilizas JDBC, hazlo indirectamente mediante una buena capa de abstracción.
Frameworks como Commons DbUtils (jakarta.apache.org/commons/dbutils) y Apache
iBatis (ibatis.apache.org) facilitan y mejoran la calidad de este tipo de código.
• Hibernate es un excelente tecnología ORM
• A pesar de la lenta adopción desde su lanzamiento en 2001, JDO esta emergiendo
como estándar Java de persistencia.
• Alternativas comerciales como TopLink, aunque no tengan nada que los hagan muy
superiores (normalmente, asistentes gráficos y soporte por parte de las empresas
propietarias) a Hibernate o JDO.
Como ya sabemos, podemos mezclar y encajar código basado en SQL con persistencia
ORM. El patrón DAO es la elección correcta, ya que oculta los detalles de las
operaciones de persistencia tras un interfaz DAO, el cual libera a los objetos de negocio
de conocer que tecnología de persistencia se está utilizando.
23
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
La complejidad va a:
• dificultar la comprensión del diseño y el código
• alargar los tiempos de desarrollo debido a la curva de aprendizaje
• encarecer el mantenimiento del software
• dificultar la evaluación y aplicación de los cambios
• provocar la realización de errores
A continuación vamos a evaluar las ventajas e inconvenientes de los sistemas distribuidos
y considerar posibles arquitecturas que no se basen en componentes distribuidos
Antes de la entrada de las tecnologías distribuidas como JavaEE o CORBA, los sistemas
de empresa normalmente utilizaban una arquitectura de 2 capas conocida como
cliente/servidor, la cual se desplegaba a su vez en 2 niveles.
Bajo el modelo de cliente/servidor, la lógica de negocio se implementaba como parte
integrada de un cliente rico y pesado que accedía al servidor para obtener los datos de una
base de datos centralizada.
El modelo cliente/servidor disfrutó de un éxito considerable, ya que era fácil de
comprender, fácil de probar y soportado por numerosas herramientas de desarrollo visual
a alto nivel.
El problema es que la arquitectura de 2 capas/niveles tiene las siguientes limitaciones:
• Despliegue: en las grandes empresas donde existen miles de clientes, el hecho de
realizar un despliegue supone un reto logístico
• Compartición de servicios: si la aplicación debe compartir servicios dentro de la
empresa, y la lógica esta integrada con los clientes, tenemos una gran redundancia de
código entre las diferentes aplicaciones.
• Pobre separación de la presentación y la lógica de negocio: este tipo de
arquitectura provoca un alto acoplamiento, ya que es muy fácil mezclar ambas capas.
Debido a estas limitaciones, la comunidad de desarrollo concluyó que era necesaria una
tercera capa de negocio que se colocara entre las 2 anteriores, apareciendo la necesidad de
un tercer nivel.
El uso de una capa intermedia de negocio ofrece ciertos beneficios respecto al modelo
cliente/servidor:
• Inteligencia de negocio centralizada: al estar centralizado y accesible por un sistema
remoto, resuelve el problema de juntar presentación y negocio
• Fácil despliegue: ya no es necesario actualizar miles de cliente. Al tener el negocio
centralizado, los cambios se pueden desplegar de forma rápida y fácil con un mínimo
impacto sobre el sistema base del usuario
• Redundancia: al poder desplegar la capa de negocio en un cluster, ofrecemos un
24
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Los clientes de un bean de sesión pueden acceder a éste mediante su interfaz remoto o
25
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
El uso de EJBs con interfaces remotos permite el desarrollo de sistemas con arquitecturas
distribuidas. La plataforma JavaEE ofrece una gran ayuda para construir arquitecturas
complejas de éste tipo. Sin embargo, añadir interfaces remotos a los objetos de negocio
implica ciertos aspectos que el arquitecto debe tener en cuenta antes de decidirse por este
tipo de planteamiento.
2.2.4.1. Rendimiento
Consejo
El paso de objetos pesados en las llamadas remotas reduce el rendimiento gravemente. Si un
objeto contiene referencias a otros objetos, entonces estos objetos miembros también son
serializados como parte de la llamada.
Para reducir el tamaño de algunos objetos, se pueden excluir objetos innecesarios marcándolos
con la palabra clave transient
2.2.4.2. Complejidad
Aunque RMI puede hacer parecer que simplifica las llamadas a un bean remoto, la
computación distribuida introduce cierta complejidad extra al desarrollador.
26
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Se debe tener en cuenta la diferencia entre el paso de variables por valor en las llamadas
remotas, y el paso por referencia en las locales. Además, los clientes remotos pueden
gestionar las posibles excepciones lanzadas por problemas en la red.
El uso de las capacidades distribuidas de los EJBs requiere un cambio en el modo que
aplicamos las prácticas de diseño orientado a objetos.
En una arquitectura no-distribuida, los desarrolladores trabajan directamente con los
objetos del modelo del dominio. Aquí, los objetos del dominio representa entidades de
negocio y exponen interfaces con métodos de granularidad fina, como pueden ser los
métodos get y set de un javabean.
La penalización de rendimiento de una aplicación distribuida descarta el uso de éste tipo
de objetos, ya que incrementa el número de llamadas a través de la red.
Para mantener el número de viajes de ida y vuelta al mínimo, los interfaces remotos se
deben diseñar con granularidad gruesa, donde los métodos combinan la funcionalidad de
varios métodos finos en una sola llamada.
Una ayuda a la hora de diseñar los métodos es el uso de los patrones de diseño, en
especial, aquellos que tratan con componentes distribuidos, como pueden ser Session
Façade y Transfer/Value Object. Más información en Patrones para Aplicaciones
Distribuidas
A pesar de la existencia de los patrones, el arquitecto debe tener en cuenta las
restricciones que ofrecen las tecnologías, y reflejarlo en las arquitecturas diseñadas. Si las
tecnologías marcan el modo de diseñar el interfaz de un componente, estamos
contradiciendo las pautas de un buen diseño orientado a objetos.
Importante
La decisión arquitectural de utilizar componentes distribuidos va a condicionar la complejidad de
la aplicación, y por ello, los costes (económicos y temporales) del proyecto.
27
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
En los últimos tiempos, predominan los clientes web ligeros respecto a los interfaces de
usuario pesados (Swing), aunque no hemos de descartarlos. Por lo tanto, las aplicaciones
web son el estándar de facto de las aplicaciones empresariales.
Estas arquitecturas, fácilmente escalables a nivel de hardware (clustering), pueden
acceder al mismo tipo de APIs que los EJBS, además, se benefician de las capacidades
que ofrece el servidor J2EE, como pueden ser la gestión de transacciones y el pool de
conexiones. Finalmente, también pueden utilizar todos los servicios de empresas, tales
como JMS, JDBC, JavaMail y JCA. La única tecnología a la que no puede acceder es a
los Entity Beans. Por lo tanto, cubre las necesidades de la mayoría de las aplicaciones.
En este tipo de arquitectura, tanto la capa web como la de negocio se ejecutan en la
misma JVM, normalmente desplegadas sobre un contenedor web (tipo Tomcat, Resin,
etc...). Sin embargo, es muy importante, que a nivel lógico si que las separemos. Uno de
los mayores riesgos a la hora de diseñar una aplicación web es mezclar responsabilidades
entre componentes de presentación y de lógica de negocio.
2.3.1.1. Ventajas
2.3.1.2. Limitaciones
28
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Como toda solución, este tipo de arquitectura también tiene sus limitaciones, entre las que
se encuentran:
• Sólo soporta interfaces web. Si fuera necesaria que un cliente pesado acceder a la
capa de negocio de forma remota, entonces necesitaríamos una capa de servicios web
(por ejemplo, mediante Apache Axis) o una arquitectura EJB.
• Falta de un entorno estándar para gestionar los objetos de negocio.
• Puede no existir una capa de servicios de negocio bien definida. Se puede evitar
mediante el uso de frameworks web, tipo Struts, Spring, etc...
• Puede que necesitemos implementar "a mano" algún tipo de solución que los EJBs ya
ofrecen, como puedan ser la gestión de transacciones declarativas o el modelo
declarativo de seguridad, que nos toca implementarlo mediante el código de la
aplicación.
• No existe un estándar de configuración de los objetos de negocio (aunque los EJBs
tampoco lo hacen muy bien).
• Falta de consistencia entre aplicaciones, o incluso en una misma aplicación. Cada
aplicación tiende a manejar a su modo el acceso a los objetos de negocio, su
configuración, la gestión de transacciones, etc... Por lo tanto, cada aplicación requiere
de su propia curva de aprendizaje.
El mayor inconveniente que puede ser la falta de una capa de servicios claramente
definida, se puede resolver mediante el uso consistente de interfaces de negocio y el
acceso consistente a los objetos de negocio.
2.3.1.3. Implementación
Pregunta
¿Sabrías identificar los elementos del siguiente gráfico con la implementación que hemos
realizado en el proyecto de integración?
29
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Arquitectura Web
Por supuesto que las arquitecturas JavaEE pueden ser exitosas sin EJBs. Sin embargo, se
puede utilizar algunas de las buenas ideas de los EJBs y llevarlas a una arquitectura sin
EJBs. Para ello, se utiliza una arquitectura de Contenedor Ligero.
Del mismo modo que los EJBs, se plantea una arquitectura centrada a partir de una capa
de servicios de negocio gestionados por el contenedor. Pero aquí se acaba la similitud. En
vez de ejecutarse dentro de un contenedor EJB, los objetos de negocio corren dentro de
un contenedor ligero.
Un contenedor ligero no está atado a JavaEE, por lo que puede correr en un contenedor
web, una aplicación "standalone", o incluso en un contenedor EJB (si fuese necesario).
Además, tampoco esta atado al API de los Servlets, como los frameworks MVC, lo cual
seria una pobre elección para gestionar los objetos de negocio.
Los contenedores ligeros tienen un coste de arranque insignificante y elimina el proceso
de despliegue necesario en los EJBs. Los contenedores ligeros ofrecen un modo de
gestionar y localizar los objetos de negocio; ya no necesitan búsquedas JNDI,
localizadores de servicio o singletons, ya que ofrece un registro de los objetos de
aplicación. Este enfoque es menos invasivo y más poderoso que los EJBs, siempre y
cuando todo resida en la misma JVM.
30
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.3.2.1. Ventajas
2.3.2.2. Limitaciones
31
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.3.2.3. Implementación
Dentro de una aplicación, todas las clases se ejecutan dentro de la misma JVM. Desde el
punto de vista del usuario, la capa web la ofrece un framework MVC, ya sea mediante
Struts, o en el caso de Spring, mediante una capa web que puede ser gestionada por el
contenedor y ofrecer un integración cercana con los objetos de negocio.
Los objetos de negocio serán POJOs, ejecutándose dentro del contenedor ligero. Estos
pueden ser avisados vía intercepcion AOP para que ofrezcan servicios empresariales. El
acceso a los BOs ser realizará exclusivamente a través de sus interfaces, lo cual permite el
intercambio de implementaciones de negocio, sin necesidad de modificar el código
llamador. En cuanto al acceso a datos, ya sea mediante un framework ORM tipo
Hibernate, o JDBC si la abstracción de ORM no aporta casi valor.
A parte de la ya comentada posibilidad de gestionar servicios empresariales de forma
declarativa mediante AOP, el uso de un contenedor ligero como Spring permite que si
controlamos las transacciones mediante conexiones JDBC, sin utilizar JTA, si en un
futuro necesitamos sacar ventaja de JTA, entonces sólo habremos de cambiar la
configuración de Spring.
32
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.3.3.1. Ventajas
2.3.3.2. Limitaciones
Hemos visto que esta arquitectura representa un buen uso (y valido) de la tecnología EJB,
donde los requisitos del sistema pueden utilizar la seguridad declarativa y la gestión de las
transacciones. Algunas de las debilidades son:
• Es más compleja que una aplicación web pura.
• Todavía no soporta otro tipo de clientes que no sean el interfaz web, a no ser que
añadamos una capa de servicios web.
• Toda la aplicación corre sobre la misma JVM, lo que significa que todos los
componentes debe ejecutarse en el mismo servidor físico y no se pueden separar para
desplegarlos en servidores diferentes.
• Este tipo de EJBs son difícil de probar. Necesitamos hacerlo desde casos de prueba
33
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.3.3.3. Implementación
34
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
35
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
2.3.4.1. Ventajas
2.3.4.2. Limitaciones
2.3.4.3. Implementación
Aunque el diagrama muestre una aplicación web, esta arquitectura soporta cualquier tipo
de cliente JavaEE. Por lo tanto, se trata de una arquitectura preparada para las necesidades
de las aplicaciones cliente.
Esta arquitectura utiliza RMI entre las capas de presentación (o con otros cliente remotos)
y los objetos de negocio, los cuales están expuestos como EJBs (los detalles de la
comunicación RMI los abstrae el contenedor de EJBs, pero hemos de tratar con las
implicaciones de su uso). Esto hace las invocaciones remotas un factor determinante de
rendimiento y una consideración central a la hora de realizar el diseño. Como vimos
36
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
37
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Tras ver las diferentes alternativas arquitecturales, podemos hacer una elección de si una
nueva aplicación necesita un servidor de aplicación completo (con soporte de JTA, JCA,
EJBs) o un contenedor web como Tomcat.
Existen diferentes beneficios para evitar el uso de un servidor de aplicaciones, tales como:
• Menor coste de licencia, en el caso de productos comerciales. Muchas empresas están
pagando la licencia de un producto que no necesitan.
• Arranque más rápido, lo que nos ahorra tiempo de desarrollo.
• Administración más sencilla, y por lo tanto, curva de aprendizaje menor.
Las aplicaciones web que sólo utilizan una base de datos rara vez requieren un servidor
de aplicaciones. Los contenedores ligeros (tipo Spring) ofrecen mejores alternativas que
un contenedor EJB para gestionar los objetos de negocio en la mayoría de las aplicaciones
web. Las transacciones distribuidas, y por tanto JTA, no son necesarias cuando
trabajamos con una única base de datos.
Necesitamos un servidor de aplicaciones si:
• necesitamos transacciones distribuidas
• queremos que nuestra aplicación sea remota, para lo cual los EJBs son una buena
solución. Sin embargo, los servicios web remotos ofrecen casi las mismas
prestaciones (recuperación frente a caída del servidor, clustering, ...) sin necesidad de
un servidor de aplicaciones para ofrecer escalabilidad y tolerancia.
Resumiendo, en las arquitectura que no son EJB, el factor crítico que se hecha en falta es
la gestión de las transacciones. Por ello, debemos asegurarnos que nuestros requisitos se
cumplen con transacciones locales o distribuidas.
2.4.1. Bibliografía
• Expert one-on-one J2EE Design and Development , de Rod Johnson. Libro que
sirvió como base del desarrollo de Spring y que destaca todos los puntos fuertes y
débiles de los EJBs, destacando cuando hacer qué y cómo hacerlo.
• Expert one-on-one J2EE Development without EJB, de Rod Johnson. Secuela de
libro anterior donde se defiende la Arquitectura de Contenedor Ligero.
2.4.2. Enlaces
• Apartado del tutorial de Sun sobre JavaEE que habla de las Aplicaciones distribuidas
38
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
39
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
3. Integración de aplicaciones
Las empresas necesitan, cada vez más, un fácil acceso a la información por parte de sus
aplicaciones. Esta necesidad presenta nuevos retos para el desarrollo de aplicaciones. La
facilidad de acceso a los datos es poco probable que se consiga mediante aplicaciones
separadas (stand-alone) usadas por la mayoría de las empresas, debido a la dificultad que
representa el compartir datos entre ellas. Sin embargo, muchas empresas no pueden
permitirse el lujo de retirar o reemplazar sus aplicaciones stand-alone de un día para otro
debido a que juegan un papel crítico en el funcionamiento de la empresa, y a menudo no
es rentable desarrollar de nuevo la aplicación en su totalidad. Recordemos que una
aplicación stand-alone es aquella que se puede ejecutar sin necesidad de ningún elemento
soporte (por ejemplo un navegador).
Por otro lado, a medida que pasa el tiempo, las empresas necesitan introducir nuevas
aplicaciones y sistemas. Estas nuevas soluciones se basan normalmente en arquitecturas
modernas, que difieren de forma significativa de las arquitecturas usadas por aplicaciones
que ya tienen años de uso. A menudo las aplicaciones modernas se adquieren en forma de
componentes, que se integran en una aplicación más grande. Estas nuevas aplicaciones
necesitan integrarse en el sistema existente para que la información que contienen esté
disponible y sea accesible.
En estas situaciones, la integración de aplicaciones corporativas (EAI) adquiere una gran
importancia, permitiendo que una empresa integre sus aplicaciones y sistemas existentes
y sea capaz de añadir nuevas tecnologías y aplicaciones al nuevo conjunto.
La integración de aplicaciones no es una tarea fácil; de hecho se ha convertido en uno de
los problemas más difíciles con los que se enfrenta el desarrollo de aplicaciones para la
empresa desde hace pocos años. Los mayores retos se presentan en la integración de
diferentes dominios, arquitecturas y tecnologías. Además, los requerimientos de los
sistemas de información van creciendo significativamente y cambiando continuamente,
por ello los proyectos de integración deben realizarse en el menor tiempo posible,
entregar sus resultados rápidamente, y adaptarse a estos requerimientos siempre
cambiantes.
Actualmente hay dos formas principales de integración: primero es necesario permitir la
integración de aplicaciones dentro de una compañía (intra-EAI), y en segundo lugar,
podemos querer promover una integración inter-EAI (business-to-business, B2B).
En esta charla presentamos los conceptos básicos de la integración de aplicaciones
corporativas. Comenzaremos definiendo el concepto de integración, considerando los
retos que representa, así como los tipos, técnicas y tecnologías utilizadas para la
integración de aplicaciones corporativas.
40
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
41
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
42
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
43
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
negocio).
En la Figura 2 se puede apreciar gráficamente esta situación. En el entorno mostrado, las
aplicaciones residen en un servidor de aplicaciones. Dicho servidor tiene una
infraestructura particular dependiente del vendedor, contemplando en particular los
servicios de procesamiento de transacciones, seguridad y balanceo de carga. Las
aplicaciones incluidas en el servidor pueden ser suministradas por diferentes vendedores,
o pueden desarrollarse en el departamento IT de la empresa. Las aplicaciones están
escritas en varios lenguajes, como COBOL, C, y C++. Los clientes acceden a las
diferentes aplicaciones mediante interfaces (APIs: Application Programming Interfaces).
Un API es alguna rutina que permite a un cliente realizar operaciones tales como crear
una orden de compra o actualizar un registro de usuario. La interfaz de acceso a los datos
permite acceder al almacenamiento de los datos (ficheros o base de datos relacional). Los
interfaces de objetos del negocio son abstracciones que representan la lógica específica
del negocio para acceder a las funciones y los datos.
Los proyectos EAI tienen que tratar con aplicaciones (sistemas de información)
44
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
45
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
46
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
acceso a los mismos datos no resuelve todos los problemas. Dicho acceso a los datos y su
posible transferencia entre bases de datos no es suficiente debido a la dificultad que
entraña el análisis de dichos datos para obtener información del negocio valiosa para el
soporte de decisiones. Tampoco es posible reusar todas las funcionalidades de otras
aplicaciones. Sin la reusabilidad de las funciones la única posibilidad consiste en
implementar las funcionalidades en diferentes aplicaciones, incrementando la
complejidad de nuevo (especialmente a la hora de mantener las aplicaciones). Duplicar la
funcionalidad es necesario debido a que si accedemos a los datos en la base de datos
directamente, evitamos implementar reglas del negocio en la aplicación original; pero
esto significa que tenemos que ser extremadamente cautos debido a que un acceso directo
a la base de datos puede amenazar la integridad del sistema.
Para resolver el problema del análisis de grandes cantidades de datos almacenados en
aplicaciones diferentes, y permitir el compartir funcionalidades de las aplicaciones, se
utilizan los datawarehouse y los sistemas ERP.
A principios de los 90, la integración es una cuestión relevante desde dos puntos de vista
distintos. Por un lado tenemos el uso de data warehouses. Un data warehouse es un
repositorio central para todos los datos significativos que las aplicaciones de una
compañía obtienen. Debido a la variedad de datos bien estructurados contenidos en ellos,
los data warehouses fueron (y todavía siguen siendo) efectivos como sistemas de soporte
de decisiones off-line, y útiles siempre que puedan obtenerse datos "en bruto" y
analizarlos para derivar conclusiones a partir de ellos.
Los datos de las bases de datos de las aplicaciones se envían al data warehouse a
intervalos de tiempo predeterminados, normalmente una vez por día. Esto hace que los
data warehouses no sean la elección perfecta para la integración, especialmente cuando
no podemos permitirnos el trabajar con datos que pueden estar anticuados. Los
procedimientos asociados con un sistema data warehouse se asemejan a los de la Figura
5, en donde los datos desde diferentes bases de datos son extraídos, transformados y
cargados en un data warehouse central. Las reglas para estas tres fases se definen como
meta-datos.
47
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
aplicaciones integradas que cubren todas las facetas del negocio, incluyendo
planificación, fabricación, ventas y marketing. La idea es usar los sistemas ERP para
cubrir todas las necesidades de información de la empresa. Por desgracia, la experiencia
ha demostrado que los sistemas ERP no pueden satisfacer las necesidades de información
de una compañía totalmente. Si bien el código fuente está disponible para algunos de
ellos, los vendedores no quieren realizar cambios específicos sobre ellos. Sin embargo,
cada empresa tiene muchas particularidades que necesitan ser cubiertas sobre una base
individual, además de tener que reaccionar de forma rápida para adaptarse a los cambios
del mercado. Todo ello hace que se requieran modificaciones o añadidos sobre el sistema
de información, y esperar las soluciones de los suministradores de los ERP no es práctico.
Algunos resultados de estudios de mercado sugieren que los sistemas ERP típicamente
cubren únicamente un 25-40% de las necesidades de información de una empresa (el
resto se cubre con otras aplicaciones software).
La situación actual es que las empresas se encuentran con una mezcla disparatada de
sistemas existentes heterogéneos de los cuales dependen sus negocios. Desgraciadamente
esta mezcla de sistemas diferentes no ha sido diseñada de una manera unificada
(solamente ha crecido, y continuará creciendo). La heterogeneidad consume recursos de
desarrollo. En vez de crear soluciones a problemas nuevos, muchos desarrolladores
emplean una considerable cantidad de tiempo y recursos trabajando sobre soluciones
viejas. Y tenemos que tener en cuenta, que el número de computadores en una empresa
suele ser finito.
Las aplicaciones más críticas para la mayor parte de las empresas son las aplicaciones de
procesamiento de transacciones. Suelen ser aplicaciones desarrolladas a lo largo de
muchos años, los desarrolladores han ido cambiando varias veces, y es difícil encontrar a
alguien que las entienda en su totalidad. Algunas de ellas todavía se ejecutan sobre
sistemas mainframe. Las empresas son renuentes, comprensiblemente, a modificar o
reemplazar dichas aplicaciones. El dilema entonces se convierte en cómo modernizarlas
sin comprometer las operaciones.
48
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
49
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
50
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
51
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
usan las aplicaciones cliente para gestionar las transacciones y realizar un acceso
transaccional a dicho EIS. La librería puede contemplar mecanismos de comunicación
distribuidos entre las aplicaciones cliente y los EIS. El desarrollador de aplicaciones
tiene por lo tanto, la tarea añadida de comprender esta librería C (y los mecanismos de
bajo nivel que contempla esta API), para usar el API del cliente. Esta complejidad
adicional incrementa el esfuerzo de la integración de aplicaciones.
Dada la complejidad del desarrollo de aplicaciones y la integración de los EIS, es
importante que los desarrolladores utilicen herramientas de desarrollo estándares y
entornos de integración.
El acceso transaccional y la seguridad son cuestiones importantes en términos de
integración EIS. Las empresas llevan a cabo sus negocios utilizando la información
almacenada en sus EIS, el éxito de una empresa depende de forma crítica de su
información, así como de un acceso seguro a la misma.
Otro requerimiento importante es la escalabilidad, con el fin de permitir que la empresa
pueda ampliar sus relaciones con suministradores, compradores, y socios. Para lograr
esto, el uso de un pooling de conexiones se convierte en un requerimiento importante para
la integración de sistemas.
Adicionalmente, las empresas deben considerar su inversión actual en las aplicaciones
existentes y un plan de integración que resulte efectivo en cuanto a coste. La mayoría de
las empresas y EIS han invertido cantidades considerables en el código de sus
aplicaciones e infraestructura asociada. Si bien reconocen la necesidad de migrar a una
plataforma J2EE, deben lograr esta integración de forma incremental en lugar de en un
solo paso. Una migración incremental les permite mantener un uso máximo de sus
sistemas existentes, pero añadiendo de forma gradual nuevas funcionalidades como
componentes J2EE, haciendo así accesibles sus aplicaciones mediante J2EE. Durante este
proceso de migración, pueden descargar sobre los vendedores del servidor de aplicaciones
la gestión de la complejidad de las transacciones y la seguridad, y así dejar que los
desarrolladores del software se centren en la resolución de problemas del dominio del
negocio.
52
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
53
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
implementación de varias capas como base para integrar las aplicaciones en un nivel alto
de abstracción.
Integración de la presentación. Una vez que las aplicaciones existentes se remodelan y
encapsulan en la capa intermedia, en la que exponen su funcionalidad a través de
interfaces de alto nivel, resulta crucial que el usuario también observe una vista unificada
del sistema de información. Mediante el desarrollo de una capa de presentación unificada,
estaremos ocultando el hecho de que las aplicaciones que se están ejecutando son
aplicaciones diferentes, algunas de ellas legacy, y otras desarrolladas recientemente. De
esta manera se mejora la eficiencia de los usuarios finales, ya que no tienen que cambiar
entre diferentes aplicaciones existentes y usar diferentes interfaces de usuario. Además, se
proporciona una forma de reemplazar parte de los sistemas legacy en el futuro sin
influenciar al resto de partes del sistema.
Integración inter-EAI o integración B2B. Actualmente la integración de las
aplicaciones de una compañía puede no resultar suficiente. Hay una necesidad creciente
de permitir una integración entre empresas, a menudo referida como integración B2B
(business-to-business), o también e-business. Por supuesto, el requerimiento para una
integración eficiente B2B requiere una integración de cada una de las empresas a nivel de
negocio en ambos sentidos.
Se denomina middleware al software de los servicios del sistema que se ejecuta entre la
capa del sistema operativo y la capa de aplicación. Conecta dos o más aplicaciones,
proporcionando interoperabilidad entre ellas. El concepto de middleware cobra
protagonismo hoy en día, ya que todos los proyectos de integración tienen que usar una o
varias soluciones diferentes middleware.
Usaremos el término middleware para denotar a aquellos productos software que actúan
como "pegamento" entre aplicaciones, que sean distintos de simples funciones de
importación y exportación de datos que pudieran formar parte de las propias aplicaciones.
Todas las formas de middleware son útiles para facilitar la comunicación entre diferentes
aplicaciones software. El middleware introduce un nivel de abstracción en la arquitectura
del sistema, reduciendo así su complejidad considerablemente. Por otro lado, cada
producto middleware introduce una cierta sobrecarga en el sistema con respecto a la
comunicación, lo cual puede afectar al rendimiento, la escalabilidad, y otros factores de
eficiencia. Esto es importante tenerlo en cuenta, particularmente si nuestros sistemas son
críticos y son usados por un gran número de clientes concurrentemente.
Los productos middleware comprenden una amplia variedad de tecnologías, incluyendo
las siguientes:
Tecnologías de acceso a bases de datos. Proporcionan acceso a una base de datos a
través de una capa de abstracción que permite cambiar el sistema de gestión de base de
54
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
datos (DBMS) sin tener que modificar el código fuente de la aplicación. En otras
palabras, permiten usar el mismo o similar código para acceder a diferentes fuentes de
bases de datos. Las tecnologías de acceso a bases de datos difieren en la forma de los
interfaces que proporcionan. Pueden ofrecer acceso a las bases de datos orientado a la
función o a objetos. Los representantes más conocidos son JDBC y Java Data Objects
(JDO) en la plataforma Java, y Open Database Connectivity (ODBC) y Active Data
Objects (ADO) en la plataforma Microsoft.
Middleware orientado a mensajes. También denominado MOM: Message Oriented
Middleware. Es una estructura cliente/servidor que incrementa la interoperabilidad,
flexibilidad y portabilidad de las aplicaciones. Permite la comunicación entre aplicaciones
entre plataformas distribuidas y heterogéneas, y reduce su complejidad debido a la
ocultación de los detalles de la comunicación y de las plataformas y protocolos
implicados; la funcionalidad del MOM es accedida mediante APIs. Las aplicaciones
pueden por lo tanto intercambiar datos sin necesidad de comprender los detalles del resto
de aplicaciones, arquitecturas y plataformas implicadas.
Geralmente MOM reside tanto en la parte del cliente como en la del servidor.
Proporciona comunicación asíncrona mediante el uso de colas de mensajes para
almacenar los mensajes temporalmente. La comunicación puede darse incluso aunque el
receptor esté temporalmente no disponible, y los mensajes pueden contener casi cualquier
tipo de dato. Cada mensaje espera en la cola y es entregado tan pronto como el receptor es
capaz de aceptarlo. La comunicación asíncrona tiene el inconveniente de que, ya que el
servidor no bloquea a los clientes, puede continuar aceptando peticiones con el riesgo de
producir una situación de sobrecarga.
La Figura 9 muestra dos aplicaciones que usan MOM. Las aplicaciones acceden a MOM
a través de un API, y son responsables de construir y analizar los mensajes, pero MOM
oculta todos los detalles de red y transporte.
55
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
MOM es adecuado para comunicación entre aplicaciones dirigida por eventos. También
es adecuado para sistemas orientados a objetos. Los productos MOM son propietarios y
están disponibles desde mediados de los 80, de forma que son incompatibles entre ellos.
El uso de un único producto tiene como consecuencia la dependencia de un vendedor
específico, lo que puede influenciar negativamente la flexibilidad, portabilidad,
mantenibilidad e interoperabilidad de las aplicaciones. El mismo producto MOM debe
poder ejecutarse sobre cada una de las plataformas que están siendo integradas. Sin
embargo, no todos los productos MOM soportan todas las plataformas, sistemas
operativos y protocolos. La plataforma Java proporciona formas de conseguir una
relativamente alta independencia de un vendedor específico mediante una interfaz común,
usada para acceder a todos los productos middleware: el servicio de mensajes java (JMS).
Llamadas a procedimientos remotos (RPC). Las RPC: Remote Procedure Call
constituyen una infraestructura cliente/servidor orientada a mejorar la interoperabilidad
entre las aplicaciones desde plataformas heterogéneas. Al igual que MOM, oculta los
detalles de la comunicación. La principal diferencia con MOM es la forma de
comunicación, mientras que MOM soporta comunicación asíncrona, RPC promueve la
comunicación síncrona en forma de petición-espera, que bloquea al cliente hasta que el
servidor completa la respuesta. RPC previene la sobrecarga de la red (a diferencia de
MOM). Hay alguna implementación asíncrona de RPC disponible, pero son la excepción
y no la regla. En la Figura 10 se muestra un esquema de dos aplicaciones que utilizan
RPC.
56
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
57
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
58
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
59
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
60
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Lógica del negocio. Esta capa es la responsable de presentar un interfaz de alto nivel que
permita acceder a la información del negocio para otras aplicaciones y para los usuarios,
presentando los datos a los usuarios en una forma comprensible.
Actualmente, esta capa es soportada por la capa de presentación, normalmente en forma
de portales personalizados.
Adicionalmente a la entrega de datos y contenidos, esta capa está conectada a menudo
con tecnologías de procesamiento de datos como OLAP (Online Analytical Processing),
data mining y sistemas de soporte de decisiones, entre otros. Estas fuentes analizan los
datos de la empresa y proporcionan informaciones tales como estimaciones y pronósticos.
Transacciones. La infraestructura de integración debe proporcionar los medios para
llevar a cabo las operaciones de la empresa de forma transaccional. Por lo tanto debe ser
capaz de invocar varias operaciones sobre diferentes sistemas existentes y de nueva
generación como una operación atómica que cumpla con las propiedades denominadas
ACID (Atomicity, Consistency, Isolation and Durability).
Seguridad. Se debe proporcionar la forma de restringir el acceso al sistema. La seguridad
debería incluir a las tres capas horizontales. El sistema de seguridad no debería basarse en
diferentes passwords para diferentes aplicaciones o incluso entre partes de la misma
aplicación.
Ciclo de vida. Se trata de proporcionar formas de controlar el ciclo de vida de las
aplicaciones implicadas. Se debería permitir que las aplicaciones existentes fuesen
reemplazadas de una en una, sin influenciar al resto de aplicaciones del sistema integrado.
Hay que hacer hincapié en que este reemplazamiento debería ser posible paso a paso,
cuando lo dicten las necesidades de la empresa y cuando estén disponibles los recursos
suficientes. También se debe permitir que el reemplazo tenga lugar mientras el sistema
permanece on-line. Esta última funcionalidad se consigue a menudo minimizado las
dependencias entre las aplicaciones y formas específicas en las que interoperan las
aplicaciones.
Nombrado. Un servicio unificado de nombres permitirá a la implementación
transparencia en la localización y el reemplazo de un recurso por otro si éste es requerido.
Normalmente se implementa con un producto de nombrado y directorios que permite el
almacenamiento y la búsqueda de información relacionada mediante nombres.
Idealmente, el servicio de nombres se debe unificar.
Escalabilidad. Es una característica que debe tenerse en mente a la hora de diseñar la
infraestructura de integración. Se debe permitir el acceso a información sobre los clientes
y proporcionar acceso concurrente a las aplicaciones. Se deben incorporar soluciones que
permitan extender las demandas de carga del sistema. Puede ser un problema difícil el
proporcionar escalabilidad en un sistema integrado debido a que se deben tener en cuenta
aplicaciones existentes que probablemente no hayan sido diseñadas para el grado de
escalabilidad que deseamos conseguir. Por ello, se deben implementar algunos prototipos
para probar qué niveles de rendimiento se pueden esperar. También deberían usarse
61
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
herramientas de pruebas de carga que permitan simular cargas elevadas y evaluar criterios
de rendimiento.
Gestión. Se deben proporcionar los mecanismos para gestionar la infraestructura de
integración. El no hacerlo puede ocasionar dificultades en la fase de mantenimiento. Se
debe proporcionar una gestión de versiones y configuración sencilla. Una gestión
declarativa permite el acceso a cambios y actualización de parámetros sin necesidad de
modificar los fuentes y volver a desplegar las soluciones. Una gestión remota permite
llevar a cabo la gestión de la infraestructura de forma remota, minimizando la necesidad
de entrenamiento del personal en los lugares de trabajo.
Reglas. Los servicios horizontales requieren reglas específicas para realizar la
comunicación, brokering, routing, y tareas de lógica del negocio. Estas reglas con
deberían estar codificadas en el "interior" de las aplicaciones, sino que deberían
especificarse de una forma declarativa formando parte de la infraestructura de
integración. Esto incluye definiciones, formatos de datos, transformaciones de datos y
flujos, eventos, procesamiento de información y representación de la información. A
menudo estas reglas se almacenan en un repositorio, lo cual proporciona un
almacenamiento centralizado evitando así duplicaciones e inconsistencias.
Como hemos visto, los servicios de infraestructura pueden ser realizados por diferentes
tecnologías middeware. Al seleccionar y reunir tecnologías diferentes hay que tener en
cuenta su interoperabilidad. Alcanzar dicha interoperabilidad entre tecnologías puede ser
difícil, incluso para aquellas basadas en estándares abiertos; para soluciones propietarias
es todavía más difícil.
No solamente es una cuestión de si podemos alcanzar interoperabilidad, sino cuánto
esfuerzo tenemos que invertir para conseguirlo. Por ello, las empresas se inclinan cada
vez más hacia plataformas software que reúnen tecnologías compatibles. El uso de una
plataforma software normalmente ahorra mucho trabajo adicional. Actualmente hay tres
plataformas importantes:
• La plataforma Java 2, Enterprise Edition (J2EE)
• CORBA
• Microsoft.NET
J2EE y CORBA tienen asociadas unas especificaciones y diferentes vendedores ofrecen
productos que cumplen dichas especificaciones. En este sentido son plataformas abiertas,
J2EE está controlado por Sun y JCP (Java Community Process), y CORBA por OMG.
Por otro lado Microsoft.NET es una plataforma propietaria y dirigida específicamente a
plataformas Windows. Las tres plataformas proporcionan un conjunto de tecnologías, más
o menos apropiadas para integración.
Todos los productos EAI incluyen un componente denominado integration broker o
intermediario de integración. Un intermediario de integración es una abstracción utilizada
para las tecnologías que componen la infraestructura de integración. El intermediario
proporciona los servicios horizontales y verticales que hemos identificado, y centraliza la
62
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
63
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
64
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
atrás varios pasos. Por lo tanto esta aproximación es altamente desaconsejable, siendo
mucho mejor la aproximación top-down.
La aproximación top-down es esencialmente una estrategia de integración definida. El
comenzar la integración simplemente conectando las aplicaciones sin un buen plan y
arquitectura, podría conducir casi con toda seguridad a un gran número de conexiones
punto a punto que resultarían difíciles de gestionar y mantener. En su lugar, se define en
primer lugar una arquitectura del sistema integrado, y solamente entonces se empezará a
revisar las aplicaciones existentes y decidir como pueden encajarse en la arquitectura de
integración. Esta aproximación presenta varias ventajas y nos permitirá construir la
arquitectura en la que se ubicarán de igual forma tanto las aplicaciones existentes como
sistemas de nueva generación. Además nos permitirá reemplazar y realizar reingeniería
sobre sistemas existentes con nuevos desarrollos. Esta forma de pensar es lo que se
conoce como aproximación top-down.
La aproximación top-down centra su atención en la integración como actividad global.
Identifica una estrategia de integración conjunta que define todos los aspectos previsibles
de los problemas del negocio relacionados con la integración, analiza las dependencias
existentes, fija guías de actuación, y define prioridades. Gestiona la integración como un
gran proyecto coordinado y comparte esfuerzos con todas las partes implicadas.
Debería quedar claro que la integración no es solamente un problema técnico. En lugar de
eso, requiere también un buen nivel de organización y gestión para que la integración
tenga éxito. Además resulta crucial que la compañia inicie el proyecto de integración con
los suficientes recursos, prioridades y autorización para ser capaz de conseguir una buena
coordinación de las partes implicadas.
Para conseguir una buena coordinación existen varias posibilidades, una de las cuales
consiste en introducir y organizar un nuevo servicio denominado servicio de integración,
responsable de la integración. Dicho servicio debería tener tres responsabilidades
principales:
• Definición de la arquitectura de integración
• Selección de la infraestructura y tecnologías de la integración
• Desarrollo y mantenimiento de la documentación de la integración
65
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
reemplazamiento requiere un claro "corte" y parada del uso de las aplicaciones existentes
y un cambio al nuevo sistema.
Para reemplazar las aplicaciones se puede optar por comprarlas o desarrollarlas, bien por
nosotros o por terceros. Los factores determinantes para elegir entre comprar o desarrollar
son esencialmente el tipo de aplicación a reemplazar y el grado en el que una aplicación
comercial podría satisfacer nuestras necesidades. Si bien en teoría, la compra es la
solución preferida sobre el desarrollo al ser mucho más rápida, tiene inconvenientes
importantes. Primero es poco probable que una aplicación comercial cubra las
necesidades del negocio de forma tan eficiente o global como una solución desarrollada a
medida. Y además no podremos influenciar en el desarrollo de la aplicación o su
modificación de la misma forma que si se trata de una solución a medida.
Por otro lado, la flexibilidad de las aplicaciones a medida se consigue en un tiempo mayor
que el del desarrollo. Y además las compañías actualmente rara vez cuentan con los
recursos para realizar por sí mismas largos desarrollos, y encargar el desarrollo a una
empresa externa no necesariamente acelera dicho desarrollo.
Otra cuestión importante (quizá más importante que la decisión desarrollar-comprar) es la
de qué aplicaciones se van a reemplazar, si solamente parte de ellas (por ejemplo las
aplicaciones legacy), o todas.
Si reemplazamos parte de ellas, realmente no hemos solucionado el problema original: la
integración. Por lo tanto, en términos de integración, la única decisón razonable es
reemplazar el sistema de información en su totalidad con una nueva solución integrada.
Sin embargo, el total reemplazamiento del sistema no es aplicable en muchos casos
debido a:
• la necesidad de tiempo, recursos y conocimiento para crear el sistema desde cero
simplemente no es posible,
• no existen herramientas comerciales (por ejemplo ERPs) que se adapten al 100% a
nuestras necesidades (un estudio sugiere que suelen cubrir alrededor de un 30% ó
40% de las necesidades de la empresa, por lo que se están introduciendo interfaces
interoperables en este tipo de productos),
• se necesitan tiempos y recursos adicionales para desplegar, transferir los datos y
entrenar a los usuarios que van a usar el nuevo sistema.
Extensión de los sistemas. Debido a las ajustadas agendas que imponen los órganos de
gestión de la empresa, muchas veces los desarrolladores optan por extender la
funcionalidad de las aplicaciones existentes en vez de integrarlas en su totalidad. Dichas
extensiones no están centradas en la arquitectura global de la aplicación, sino que intentan
modificar aplicaciones existentes para que puedan acomodarse a los cambios. Las
modificaciones se llevan a cabo sin determinar en qué modo se adecúan y contribuyen a
los requerimientos globales de la empresa y la arquitectura de información, tratando cada
aplicación como un dominio separado.
66
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
67
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
68
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
componentes virtuales, con ello se consigue, además obtener información con baja
latencia y garantizar que solamente necesitamos introducir la misma información en el
sistema una vez.
Los componentes virtuales son bloques de construcción sobre los que basaremos la
integración. Encapsulan los detalles y métodos que las aplicaciones existentes usan para
satisfacer las peticiones realizadas sobre ellas. Por un lado, muestran la aplicación
existente a través de unos interfaces, y por otro lado, se comunican con la aplicación
existente utilizando las facilidades que ya tiene implementadas.
La interoperabilidad entre componentes virtuales se consigue mediante el uso de un
intermediario de integración. Los componentes virtuales deberán definir los contratos, o
los interfaces de interoperabilidad, a través de los cuales se proporcionará la
funcionalidad al resto de componentes.
Los interfaces de los componentes introducirán una aproximación basada en servicios
para reusar la funcionalidad, y expondrán todos ellos un conjunto de servicios
normalizados que diferirán en complejidad y abstracción. En cada nivel de integración se
construirán componentes virtuales más abstractos y complejos:
• A nivel de integración de datos los componentes virtuales proporcionarán únicamente
acceso a los datos
• A nivel de interfaz de aplicaciones permitirán reusar además la funcionalidad de las
aplicaciones existentes
• A nivel de lógica del negocio se proporcionará acceso a funcionalidades de alto nivel
• A nivel de presentación se añadirá una capa por encima haciendo que el sistema de
información integrado tenga una apariencia de un sistema desarrollado nuevamente
Los componentes virtuales implementarán las funciones reusando las aplicaciones
existentes. Si una función no puede implementarse únicamente con los sistemas
existentes se puede añadir código nuevo. De hecho, desde el punto de vista de los
clientes, los componentes virtuales no difieren de los componentes nuevos. El concepto
de componentes virtuales, por tanto nos permitirán mezclar aplicaciones existentes con
aplicaciones nuevas de muchas formas distintas.
Los componentes virtuales, junto con los interfaces abstractos de interoperabilidad
presentan una vista de la aplicación que es independiente de la implementación: si
mantenemos constante la interfaz abstracta, el resto de aplicaciones no tendrán
conocimiento de los cambios realizados sobre la aplicación original.
El sistema de información integrado estará basado en una arquitectura multi-capa, que
separa los roles del sistema y define las siguientes capas:
• Interfaz de usuario
• Lógica del negocio
• Persistencia de datos
Las aplicaciones existentes se situarán en la capa de persistencia de datos. En los tres
69
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
70
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
71
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
72
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
73
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
74
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
debe aparecer ante los usuarios finales como una aplicación desarrollada completamente
nueva, de forma que los usuarios no deben ser capaces de reconocer que las aplicaciones
existentes están siendo usadas "por debajo", y no deben tener contacto directo con dichas
aplicaciones, que ahora sirven como componentes virtuales en la capa media.
A continuación debemos establecer la correspondencia entre las operaciones de interfaz
de usuario con los métodos del negocio de la capa de lógica del negocio.
Finalmente tenemos que implementar la nueva capa de presentación. Podemos utilizar
diferentes aproximaciones, entre ellas: clientes con interfaces gráficas, clientes web o
clientes "thin", o clientes universales para diferentes tipos de tecnologías cliente (basados
en web, o móviles entre otras).
Una implementación exitosa de la capa de integración de presentación resulta en una
arquitectura multi-capa tal y como se muestra en la Figura 26.
75
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Muchas empresas han dedicado grandes inversiones en los recursos de sus sistemas
software a lo largo de los años. Dichas empresas tienen una enorme cantidad de datos
almacenados en sistemas de información (EIS) legacy, de forma que no resulta práctico
descartar dichos sistemas existentes. Es mucho más efectivo evolucionar y mejorar los
EIS. ¿Pero cómo hacer ésto? La arquitectura orientada a servicios (Service Oriented
Architecture) proporciona una solución con unos costes aceptables. Si bien la arquitectura
a servicios no es nueva, se está convirtiendo en el principal framework para la integración
de entornos heterogéneos y complejos. En esta charla, explicaremos con detalle qué es la
arquitectura orientada a servicios.
76
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
77
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
78
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
79
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
80
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
81
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
82
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
83
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
84
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
85
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Los servicios son el corazón de una arquitectura SOA y deben ser: débilmente acoplados,
de grano grueso (coarse-grained: implementan funcionalidades de alto nivel), centrados
en el negocio y reutilizables.
Un servicio "bien escrito" es de grano grueso, lo que significa que hace referencia a que
tiene un alto nivel de abstracción, y por lo tanto, su ámbito es lo suficientemente amplio
como para que la gente implicada en el negocio pueda comprender el propósito del
servicio incluso si tienen pocos conocimientos sobre software. Según la cantidad de
colecciones de procedimientos de negocio que maneje una compañía, en la misma
proporción los analistas del negocio y los profesionales del software de dicha compañia
podrán compartir el conocimiento de la información de forma provechosa para ambos.
Además, pueden incluir al cliente en sus las deliberaciones tempranas sobre el alcance de
cada servicio, así como pueden comprender todas las implicaciones de la realización de
cambios sobre un procedimiento de negocio. La facilidad de comunicaciones entre las
personas es un beneficio importante de SOA y sugiere que la arquitectura se conviertirá
en el principio de organización primaria para los procesos de negocio.
Por otro lado, los servicios bien diseñados son reutilizables. Las organizaciones se
benefician de la reusabilidad de dos formas al menos: primero, evitando el gasto asociado
al desarrollo de un nuevo software, y segundo, incrementando la fiabilidad del software
existente a lo largo del tiempo. Las compañías pueden realizar unas pruebas menos
extensivas si utiliza un servicio existente en una nueva aplicación, en comparación con las
pruebas necesarias requeridas para desplegar software que ha sido escrito desde cero.
A continuación discutiremos con más detalle la característica de bajo acoplamiento. El
término acoplamiento hace referencia al grado en el que los componentes software
dependen unos de otros. El acoplamiento puede tener lugar a diferentes niveles. Los
procesos de negocio requieren un alto nivel de flexibilidad, y por lo tanto una arquitectura
con un bajo acoplamiento para así poder reducir la complejidad total y las dependencias,
y en consecuencia facilitar cambios más rápidos y con menores riesgos. En la siguiente
tabla mostramos las diferencias fundamentales entre acoplamiento débil (loose coupling)
y fuerte (tight coupling), considerando diferentes niveles.
Nivel Tight coupling Loose coupling
86
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
87
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
88
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
89
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Actualmente, las IT son el elemento más omnipresente dentro de una empresa. Una
organización que posee algo tan importante para el crecimiento y éxito del negocio debe
considerarlo como uno de los elementos clave de la empresa. Un bien tan valioso debe ser
entendido completamente, no sólo para maximizar los beneficios que pueden derivarse de
él, sino para poderlo gestionar de forma adecuada y, consecuentemente, mitigar los
riesgos asociados con él. Todo ello plantea la necesidad de establecer una forma de
gobierno para formular, controlar y vigilar el mantenimiento y crecimiento adecuados de
dicha posesión valiosa para la empresa, es decir es necesario establecer un gobierno para
las IT.
SOA es como un vino viejo en una botella nueva. Los conceptos de SOA ya existen desde
hace bastante tiempo en la industria de las IT. Pero es sólo recientemente que ha captado
la atención como forma de alinear la estrategia del negocio y los imperativos de una
empresa con sus iniciativas de IT. Lo que hace que una empresa que utilice de SOA
necesite tomarse en serio el gobierno es la naturaleza distribuida de los servicios entre
varias LOBs ( Lines of Business). La proliferación de más partes "movibles" (es decir, los
bloques de construcción en forma de servicios) que necesitan ser mantenidos por las
diferentes organizaciones hace que la actividad que hemos denominado como gobierno se
plantee como un reto. La naturaleza inter-organizacional de los servicios de negocio y la
potencial composición de servicios a través de las "fronteras" de las organizaciones puede
funcionar correctamente si y sólo si los servicios son gobernados eficientemente para que
así estén conforme a los requerimientos dictados por un determinado nivel de satisfacción
requerido de características tales como la seguridad, fiabilidad, rendimiento, etc. El
proceso de identificar, especificar, crear, y finalmente desplegar los servicios de la
empresa, por lo tanto, requiere de un gobierno SOA a través de un grupo "fuerte" y
eficiente que vigile el ciclo de vida en su totalidad de una cartera de servicios de una
empresa.
90
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
91
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Cualquier implementación del gobierno debería centrarse en los cuatro pilares de una
arquitectura de empresa: la gente, los procesos, la tecnología, y los servicios. Una
implementación de gobierno SOA necesita ser soportada por una organización jerárquica,
como por ejemplo la mostrada en la Figura 7.
92
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
despliegue).
JBI (Java Business Integration) es un estándar basado en Java que aborda las cuestiones
principales sobre EAI y B2B, y que está basado en los paradigmas y principios que
defiende SOA. La versión actual (1.0) lleva el nombre de JSR (Java Specification
Request) 208. Tanto los vendedores comerciales como los open source han comenzado ya
a utilizar JBI como un estándar de integración en sus productos ESB (Enterprise Service
Bus).
JBI define una arquitectura basada en plug-ins en la que los servicios pueden ser plugged
en el entorno de ejecución de JBI. JBI proporciona interfaces bien definidas para los
servicios que interactúan con el entorno de ejecución JBI. Los servicios necesitan exponer
sus interfaces al entorno JBI para que éste pueda enrutar los mensajes hacia los servicios.
El entorno de ejecución JBI actúa como un mediador entre los servicios que están
desplegados en dicho entorno (ver Figura 8)
93
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
94
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
95
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Muchos desarrolladores piensan a menudo que los servicios Web y SOA son sinónimos.
Muchos también piensan que no es posible construir aplicaciones orientadas a servicios
sin utilizar servicios Web. Para clarificar las diferencias diremos que SOA es un principio
de diseño, mientras que los servicios Web son una tecnología de implementación. Por lo
tanto, podemos construir una SOA utilizando otras tecnologías tradicionales, como por
ejemplo RMI.
Tenemos que destacar que el precursor de SOA es Jini: un entorno de computación
distribuida basado en Java y desarrollado por Sun a finales de los 90, en la que los
dispositivos (como por ejemplo impresoras, portátiles y PDAs) pueden ser plugged en
una red y automáticamente ofrecer sus servicios y hacer uso de otros servicios en dicha
red. Posteriormente los servicios Web utilizan estándares independientes de la plataforma
tales como HTTP, XML, SOAP, y UDDI, permitiendo la interoperabilidad entre
tecnologías heterogéneas tales como J2EE y .NET.
En 2003, SOA entra al fin por completo en el mundo de las tecnologías de la información
empresariales, a través de los servicios Web, y gracias a:
• Al contrario que CORBA y DCE, los estándares de servicios web no tienen
detractores entre los fabricantes.
• Los servicios Web tienen flexibilidad para soportar aplicaciones multicanal.
• La capacidad de SOAP de atravesar los firewalls, aprovechando la ubicuidad del
HTTP.
• El soporte de servicios Web en servidores de aplicaciones que albergan lógica
empresarial.
• Los ESBs, que combinan servicios Web con middleware orientado a mensajes
(MOM), más algunas capacidades de transformación y enrutado.
SOA está emergiendo como el principal marco de integración en entornos de
computación complejos y heterogéneos. Los intentos anteriores no permiten soluciones
interoperables abiertas, ya que recaen sobre APIs propietarios y requieren un alto nivel de
coordinación entre grupos de trabajo. SOA puede ayudar a las organizaciones a
modernizar sus procesos para que sus negocios sean más eficientes, así como adaptarlos a
las necesidades de cambio y ser más competitivos, gracias al concepto de servicio. eBay,
por ejemplo, ha "abierto" los APIs de sus servicios Web de sus subastas online. El
objetivo es permitir a los desarrolladores ganar dinero a través de la plataforma eBay.
96
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
Utilizando los nuevos APIs, los desarrolladores pueden construir aplicaciones cliente que
enlacen con el sitio online y permitir que las aplicaciones acepten ítems que se pondrán a
la venta. Tales aplicaciones suelen interesar a vendedores, ya que los compradores
todavía utilizan ebay.com para pujar sobre los items. Este tipo de estrategia, por lo tanto,
incrementará la base de clientes de eBay.
Aunque una SOA se podría implementar sin servicios Web, siendo realistas, cualquier
proyecto SOA realizado en los últimos años está plagado de ellos. Es más, la mayoría de
los clientes empiezan a practicar con SOA creando un servicio Web, muchas veces sobre
lógica de negocio ya existente.
Una de las principales ventajas de implementar una SOA con servicios Web es que los
servicios Web están muy extendidos y constituyen una plataforma sencilla y sobre todo
neutral.
La arquitectura básica de los servicios Web (mostrada en la Figura 11), consiste en
especificaciones (SOAP, WSDL, y UDDI) que soportan la interacción de un servicio
Web que realiza una solicitud (servicio Web cliente) con un servicio Web que suministra
el servicio requerido y con un registro de servicios (directorio de servicios Web). El
suministrador publica una descripción WSDL de su servicio Web, y el solicitante accede
a dicha descripción utilizando UDDI u otro tipo de registro, y solicia la ejecución del
servicio del suministrador enviandole un mensaje SOAP.
97
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
98
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
los sistemas IT permitiendo que los usuarios del negocio modelen los procesos de
negocio, y dejando que el departamento de IT proporcione la infraestructura para
ejecutar y controlar estos procesos de negocio.
• Incrementan la productividad de los empleados y reducen los costes operacionales
automatizando y modernizando los procesos de negocio.
• Incrementan la agilidad y flexibilidad de la empresa separando explícitamente la
lógica del proceso de otras reglas de negocio y representan los procesos de negocio de
forma que es fácil cambiarlos a medida que los requerimientos del negocio cambian.
Esto permite que las organizaciones sean más ágiles, ya que permiten responder
rápidamente a los cambios del mercado y conseguir rápidamente un mayor poder
competitivo.
• Reduce los costes de desarrollo y el esfuerzo usando un lenguaje de programación
gráfico, de alto nivel, que permite a los analistas del negocio y a los desarrolladores
construir de forma rápida y actualizar los sistemas IT dentro de un dominio particular
del problema.
Obviamente, todos los sistemas IT soportan e implementan procesos de negocio de una
forma u otra. Sin embargo, lo que hace único a la gestión de los procesos de negocio es
que explícitamente separa la lógica de dichos procesos de negocio de otras reglas de
negocio. De esta forma, la lógica del proceso se mantiene separada de las aplicaciones
subyacentes y no está incluida en dichas aplicaciones, por lo tanto, resulta sencillo y
rápido modificar los procesos de negocio a medida que los requermientos y las
necesidades del negocio cambien.
Los primeros sistemas BPM definieron formatos propietarios para representar los
procesos de negocio. Actualmente WS-BPEL proporciona una forma estándar para la
composición de servicios, así como para la orquestación y coreografía de servicios. Un
proceso de negocio puede estar formado por una composición de servicios, y la
composición de servicios es una tarea importante en SOA para proporcionar
funcionalidades de negocio de grano grueso (coarse-grained).
La Figura 13 muestra la relación entre BMP y SOA:
99
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.
Arquitecturas y patrones de aplicaciones distribuidas
100
Copyright © 2011-2012 Dept. Ciencia de la Computación e IA All rights reserved.