Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Creando una AOS con PHP: Patrones de Diseño de Servicios Web Jesús M. Castagnetto, Ph.D. Linux Week 2010 15 – 19 de Marzo, 2010 Linux IDES - Pontificia Universidad Católica del Perú Lima, Perú
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Advertencia Hablaré de arquitecturas, protocolos, patrones y diseños, la implementación queda como tarea ;-)
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Agenda ¿Qué es una Arquitectura Orientada a Servicios (AOS)? ¿Qué es un Patrón de Diseño? Servicios Web Ejemplos de patrones para AOS Recomendaciones
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Arquitectura Orientada a Servicios (AOS) • Un diseño arquitectural para el desarrollo e integración de sistemas. • La funcionalidad del sistema se organiza en función a los procesos de negocios. • Los procesos se implementan como servicios/recursos interoperables, usando interfaces y protocolos homogéneos.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Características • Acoplamiento débil/laxo entre componentes. • “Contratos de servicio” para definir interfaces.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Características (cont.) • Intermediarios para el reuso de sistemas existentes. • Composición de servicios mediante la coordinación de acciones.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Características (cont.) • Los servicios tienen lógica autónoma. • La descripción de cada servicio se puede descubrir, simplificando su uso.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Características (cont.) • Se pueden usar entornos y componentes heterogéneos, siempre que se cumplan los estándares para la comunicación entre servicios.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia ... Y algo muy importante El usar una AOS no implica el uso de Servicios Web ... pero usar WS simplifica su implementación
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Agenda ¿Qué es una Arquitectura Orientada a Servicios (AOS)? ¿Qué es un Patrón de Diseño? Servicios Web Ejemplos de patrones para AOS Recomendaciones
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Patrones de Diseño “... Cada patrón describe un problema que ocurre una y otra vez en nuesto entorno, y luego describe el meollo de la solución al problema, de tal manera que puedas usar esta solución millones de veces, sin tener que hacerlo de forma exactamente igual dos veces ...” Christopher Alexander
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Patrones de Diseño • Son soluciones generales y reusables a problemas comunes. • Se hacen evidente en la arquitectura, al construir edificios basados en principios clave. • En software, la idea se traduce en soluciones pragmáticas, que nos ayudan a hacer frente a problemas recurrentes.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Patrones de Diseño • Escribir programas, es una mezcla de teoría, técnica y arte, y los patrones de diseño surgen de la experiencia. • Las comunidades de programadores, han descrito decenas de patrones básicos y derivados. • Aprender a usar patrones de diseño efectivamente, toma tiempo.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Patrones y Anti-patrones • Los patrones de diseño, nos orientan hacia que debemos hacer para resolver un problema. • Los anti-patrones nos alertan acerca de qué evitar hacer, y nos enseñan que en ocasiones, una aparente solución es un problema más grave disfrazado.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Anatomía de un patrón de diseño Generalmente se describen usando: • Un nombre simple y descriptivo. • Una definición corta que incluye la intención (el objetivo del mismo y la razón de su uso) y su aplicabilidad (el contexto de uso). • Las consecuencias de su uso. • Ejemplo(s) de cómo implementarlo.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Agenda ¿Qué es una Arquitectura Orientada a Servicios (AOS)? ¿Qué es un Patrón de Diseño? Servicios Web Ejemplos de patrones para AOS Recomendaciones
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Servicios Web “... (U)n sistema de software diseñado para permitir la interacción interoperable de máquina-a-máquina en una red. Tiene una interfaz descrita en formato procesable-por-máquina ... Otros sistemas interaccionan con el Servicio Web de la manera prescrita en su descripción ... usando HTTP con serialización XML ...” Definición del W3C
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Protocolos de Servicios Web SOAP: • Puede usar múltiples medios de transporte: SMTP, HTTP/HTTPS, etc. • Usa XML como formato del mensaje. • Puede combinar múltiples estándares que abarcan otras facetas: seguridad, confiabilidad, transacciones, etc. • Es flexible, extensible, y complejo.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Protocolos de Servicios Web XML-RPC: • Usa HTTP como transporte (no es común que use HTTPS) • Usa XML como formato del mensaje, y describe formas de codificar datos. • Es una implementación en XML de una llamada remota a procedimiento. • Es simple, pero inflexible.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Protocolos de Servicios Web REST: • Un estilo de arquitectura de sistemas • Es la forma como funciona la Web: • Recursos abstraídos en URIs, • Operaciones definidas en HTTP (GET, POST, PUT, DELETE, etc.) • Es escalable, simple, y robusto; y es algo que ya sabemos cómo hacer.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Agenda ¿Qué es una Arquitectura Orientada a Servicios (AOS)? ¿Qué es un Patrón de Diseño? Servicios Web Ejemplos de patrones para AOS Recomendaciones
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Patrones a discutir • Búsqueda asincrónica (en detalle) (Asynchronous query) • Servicios de fachada (Façade pattern/service) • Envoltura para lo anticuado (Legacy wrapper)
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica Intención: • Permitir que se puedan realizar búsquedas o procesos de larga duración, sin impactar en forma negativa en el funcionamiento de quienes usen el servicio. • Tratar de reducir el problema de agotamiento de tiempo y bloqueo de recursos.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica Consecuencias: • No hay un tiempo precisamente determinado para obtener la respuesta. • El cliente del servicio tiene que implementar la lógica de reintentar obtener la respuesta, hasta que ésta se encuentre disponible.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica Implementación: • El cliente envía un pedido de búsqueda al proveedor del servicio, el cual lo pone en una cola de proceso, y retorna un ID del pedido. • Un proceso secundario ejecuta el pedido en cola, y al terminar, pone la respuesta en otra cola de mensajes.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica Implementación: (cont.) • El cliente le pide la respuesta al servicio. Si el servicio no la encuentra en la cola, le dice al cliente que regrese luego, de otro modo la saca de la cola de mensajes, y la entrega al cliente.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) • Vamos a generar un reporte de notas para alumnos y cursos. • Usaremos REST para definir las URLs de búsqueda (usando HTTP GET): • http://[dominio]/notas/curso/[CURSOID] • http://[dominio]/notas/cursos/[CURSOSLISTA] • http://[dominio]/notas/alumno/[ALUMID] • http://[dominio]/notas/alumnos/[ALUMLISTA]
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) • Y definiremos: • CURSOID: Identificador del curso, ej. Q0415 • CURSOSLISTA: Lista de cursos, ej. M0101,B0203 • ALUMNID: Identificador del alumno, ej. 65782 • ALUMNOLISTA: Lista de alumnos, ej. 34291,78239,12033
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) • La estructura del URL nos da el tipo general de acción, los límites de la búsqueda y sus parámetros: /notas/alumno/05644 • De esta manera el URL es único y explícito. • Para nuestro ejemplo asumimos que usaremos sólo HTTP GET.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) • Al llamar una URL, el cliente recibe un identificador de búsqueda en XML: ➔ http://.../notas/alumno/30462 <notas> <id>12345678901234567890<id> <query>/alumno/30462</query> <resultados/> </notas>
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) • El servicio lo envía a ser procesado en una cola, y de ahí en adelante, el cliente se encargará de pedir el resultado usando el URL apropiado. • Hay dos opciones de diseño: • Un servicio de resultados general, que sólo use el ID para obtener la información. • Uno específico al servicio inicial, usando una variante del URL original.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) Usando un procesador genérico: ➔ http://.../resultados/[RESULTID] • Nos permite unificar resultados de varios servicios, y no multiplicar innecesariamente los recursos. • Pero, perdemos el contexto del servicio original, lo cual puede ser confuso para los usuarios.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) Usando una variante del URL original: ➔ http://.../notas/resultado/[RESULTID] • Nos permite conservar el contexto de la interacción, añadiendo sólo una nueva acción dentro del servicio. • Podemos evitar duplicación de código delegando responsabilidades a un servicio interno.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Búsqueda asincrónica (Ejemplo) El código que implemente el patrón no es complicado, se necesita: • Código que implemente la recepción de búsquedas, y puesta en cola. • Código para obtener la búsqueda de la cola, ejecutarla, y luego poner los resultados en cola. • Código para obtener los resultados.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Servicios de fachada Intención • Permitir un acceso simplificado a un sistema con una interfaz compleja. • Combinar en una, varias operaciones relacionadas en la API existente. • Reducir el número de parámetros. • Aislar cambios del sistema interno, y desacoplar el uso externo.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Servicios de fachada Consecuencias • Si bien simplifica el uso de una interfaz, puede llevar a complejidad en la lógica de implementación. • Puede haber más de una forma de combinar interfaces, y no todas pueden ser óptimas. • Impacta el rendimiento del servicio.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Servicios de fachada Implementación • Una capa que implementa el API del servicio que será visto por los clientes externos. • Código específico que use las librerías o sistemas internos (con todas sus condiciones) para que se pueda cumplir la API simplificada del servicio.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Envoltura para lo anticuado Intención • Permitir el acceso a un sistema anticuado (legacy), a través de una tecnología o protocolo nuevo. • Integrar sistemas heterogéneos existentes, dentro de una nueva arquitectura, sin necesidad de rehacer la funcionalidad.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Envoltura para lo anticuado Consecuencias • La “envoltura” tiene que encargarse de posibles trasformaciones de datos, para que el sistema anticuado pueda funcionar correctamente. • Aumenta la vida útil del sistema anticuado, pero eso puede convertirse en un defecto grave en la evolución futura de la arquitectura.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Envoltura para lo anticuado Implementación • Una capa que exponga la API del sistema anticuado usando REST. • Rutinas de transformación de datos de entrada y salida, para que funcionen con el sistema anticuado. • Código para manejar los errores originados en el sistema anticuado.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Agenda ¿Qué es una Arquitectura Orientada a Servicios (AOS)? ¿Qué es un Patrón de Diseño? Servicios Web Ejemplos de patrones para AOS Recomendaciones
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia ¿Cómo escribimos el código? Podemos hacerlo “a mano”, creando los mapeos apropiados, y la lógica de redirección correspondiente. ó Podemos usar librerías que hagan el más sencillo el trabajo rutinario.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia dbscript (http://dbscript.net/) Implementa CRUD (Create, Read, Update, Delete) para bases de datos, usando un diseño RESTful
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Ideas finales • Se puede implementar AOS usando un diseño basado en REST. • Los patrones comunes de diseño no son tan complicados, pero la implementación puede ser compleja. • Si entendemos el uso de REST y de patrones de diseño, podemos escribirlo en PHP o cualquier otro lenguaje de programación.
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Más información: Patrones • Portland Pattern Repository: http://c2.com/cgi/wiki?PortlandPatternRepository ➔ Lean también el resto del sitio de Ward Cunninhgam (http://c2.com/) • “Design Patterns: Elements of Reusable Object- Oriented Software” por Erich Gamma, Richard Helm, Ralph Johnson, y John Vlissides (ISBN: 0- 201-63361-2) • “The Timeless Way of Building” por Christopher Alexander (ISBN: 0195024028)
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Más información: PHP, Servicios Web y AOS • Do REST in PHP - PHP RESTful Data Services (http://l.castagnetto.com/fniys) • Why PHP Users should be Serious about SOA? (http://l.castagnetto.com/fljbx) • Open Service Oriented Architecture (http://l.castagnetto.com/nclhe) • Using PHP's SDO and SCA extensions (http://l.castagnetto.com/syily)
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Más información: SOA, REST • “RESTful Web Services” por Leonard Richardson y Sam Ruby (ISBN: 0-596-52926-0) • “Basic SOA using REST” (http://l.castagnetto.com/rdlkz) • “RESTful Web Services: The basics” (http://l.castagnetto.com/voylz) • SOA Design Patterns (http://www.soapatterns.org/)
Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia ¡Gracias! A los organizadores del evento por la invitación, y su entusiasmo y perseverancia. A todos ustedes por soportar mi “bla, bla, bla...”, sin dormirse. Jesús M. Castagnetto [email protected][email protected] // [email protected]