Service Registry con capacidad de búsqueda avanzada: Parte 2: Implementación

Aprenda a implementar cuatro componentes principales

En la primera entrega, la Parte 1 de esta serie conoció los motivos por los cuales se requiere la capacidad de búsqueda avanzada en un registro de servicios. En la Parte 1, también identificamos cuatro componentes principales que se necesitan para suministrar la capacidad de búsqueda avanzada. En esta entrega, la Parte 2 de esta serie, aprenderá a implementar estos cuatro componentes principales. En la próxima entrega aprenderá a configurar estos cuatro componentes mediante una aplicación individual o aplicaciones múltiples.

Dr. Waseem Roshen, Master IT Architect, IBM  

Waseem RoshenEl Dr. Waseem Roshen obtuvo su doctorado en la Universidad del Estado de Ohio, Columbus, Ohio (Estados Unidos) y cuenta con más de 18 años de experiencia práctica en el campo de la Tecnología Informática (TI). Actualmente trabaja como IT Architect en el Centro de Excelencia Enterprise Architecture and Technology de IBM. Tiene amplia experiencia en el ámbito de la computación distribuida, incluyendo arquitectura orientada a servicios (SOA). Además, su experiencia abarca el desarrollo personalizado, la arquitectura de integración y J2EE (ahora conocida como JEE). En la actualidad, el Dr. Roshen se dedica a SOA y servicios web, computadoras Quantum y cloud computing. Publicó más de 60 artículos, registró 37 patentes y es miembro de IEEE y de la Sociedad de Computación IEEE. Es autor único del libro “SOA-Based Enterprise Integration: A step-by-step guide to services-based application integration” [Integración empresarial basada en SOA: Guía paso a paso para la integración de aplicaciones basadas en servicios].



05-08-2011

Introducción

En la Arquitectura orientada a servicios (SOA), se usa un registro de servicio para publicar y detectar servicios. En el registro clásico, el nombre del servicio debe coincidir exactamente con el nombre que existe en el registro para detectar el servicio. En la Parte 1, aprendió muchos motivos por los cuales esta restricción de contar con nombres exactamente iguales se puede eliminar y por lo tanto se requiere un registro con capacidad de búsqueda avanzada de manera que no se necesite saber el nombre exacto del servicio para encontrarlo en el registro. Además, aprendimos el proceso y los componentes necesarios para suministrar dicha capacidad de búsqueda avanzada. Los cuatro componentes que identificamos en la Parte 1 fueron Registro clásico, Analizador de nombre, Compositor de nombre y Diccionario.

En esta segunda entrega aprenderá cómo implantar los cuatro componentes identificados en la Parte 1. Estas implementaciones se describen a continuación.


Registro clásico

Las dos funciones más importantes que provee el registro clásico son la publicación de servicios y la búsqueda o detección de los servicios publicados. En esta serie sólo nos abocaremos a la función de búsqueda o detección del registro. Casi todos los registro comercialmente disponibles, incluyendo WebSphere Registry and Repository (WSRR), brindan alguna especie de funcionalidad de búsqueda o detección que le permite a los usuarios del registro encontrar la descripción del servicio que incluye la interfaz e implementación del servicio si el usuario suministra la ID o el nombre exacto del servicio. Al registro con esta función limitada de búsqueda o detección lo llamamos registro clásico. Esta funcionalidad del registro clásico se resume gráficamente en la Figura 1. Como todos los registros disponibles comercialmente ofrecen esta funcionalidad, no describiremos su implementación en este artículo. En cambio, nos focalizaremos en cómo construir sobre esta funcionalidad para brindar un registro con capacidad de búsqueda avanzada.

Figura 1. Funcionalidad de búsqueda de un registro clásico
Funcionalidad de búsqueda de un registro clásico

Analizador de nombre

El componente analizador de nombre toma como entrada al nombre del servicio, el cual normalmente está compuesto por varias palabras, y devuelve una lista de palabras que constituyen el nombre. Por ejemplo, si el nombre de entada es GetCarPrice, la salida será una lista que contendrá las palabras get, car, y price. Esta funcionalidad del componente analizador de nombre se muestra esquemáticamente en la Figura 2.

Figura 2. Funcionalidad del componente analizador de nombre
Funcionalidad del componente analizador de nombre

La implementación del componente analizador de nombre aprovecha las convenciones usadas para nombrar un servicio. Por ejemplo una convención comúnmente usada para nombrar a un servicio usa letras en mayúscula para separar o distinguir las palabras en el nombre del servicio. Un ejemplo de este nombre de servicio es GetCarPrice. En este nombre, las tres palabras, get, car, y price, que constituyen el nombre del servicio, están separadas por tres letras mayúsculas,G,C, yP. Esta convención de nombres sigue estrechamente varias convenciones usadas por el lenguaje de programación Java. Utilizar estas convenciones de nombres es práctico para analizar el nombre del servicio. Por ejemplo, la Lista 1 a continuación es un código de muestra que analizará el nombre del servicio que sigue la convención de nombres Java y devolverá las palabras que lo integran en forma de lista (Array).

Lista 1. Código Java para analizar el nombre del servicio
public Class NameParser {
public static ArrayList parseName ( String serviceName) { String name = serviceName;
int len = name.length(); int l = 0; ArrayList list = new ArrayList (); String
constituentWord = ""; char c = null; for ( int k = 0; k < len; k++) { c =
name.charAt (k); if ( c < 'A' || k == 0 ) { constituentWord = constituentWord
+ c; } else { list.add (l, constituentWord); l++; constituentWord = "" + c; } }
list.add (l, constituentWord); return list; } }

Otra convención común para nombres sigue la convención de nombres del lenguaje de programación C/C++. En esta convención, las palabras que integran el nombre del servicio se separan por guión bajo. Se puede usar un código muy parecido al código que se muestra en la Lista 1 para analizar los nombres que usan guión bajo para separar palabras. Efectivamente, es también muy sencillo generalizar el código anteriormente mencionado para que pueda administrar estas dos convenciones de nombre y también otras similares.


Compositor de nombre

La funcionalidad básica suministrada por el componente compositor de nombre es revertir al componente analizador de nombre, toma como entrada una lista de palabras y las combina en el orden correcto para suministrar un posible nombre de servicio. Por ejemplo, la entrada podría ser una lista que contenga las palabras get, car, y price. Entonces la salida podría ser el nombre GetCarPrice. Esta funcionalidad básica del compositor de nombre se muestra esquemáticamente en la Figura 3. En realidad la funcionalidad provista por el compositor de nombre incluye algo más que la funcionalidad básica. En lugar de tomar una única lista de palabras como entrada, el componente compositor de nombre toma como entrada varias listas de palabras y devuelve una lista de todos los nombres de servicio posibles.

Figura 3. La funcionalidad básica del componente compositor de nombre
La funcionalidad básica del componente compositor de nombre

La siguiente Lista 2 muestra un código Java como ejemplo, el cual se puede usar para componer nombres equivalentes del servicio. El código que se muestra en esta lista puede incluir hasta tres listas de palabras como entrada. Cada lista contiene sinónimos de una palabra en el nombre original del servicio. La salida de este código es una lista que agrupa nombres de servicio equivalentes. Aunque este código particular se limita a un máximo de tres palabras en el nombre de servicio, es claro que puede generalizarse para abarcar una mayor cantidad de palabras que lo integren.

Lista 2. Código Java para componer nombres de servicio equivalentes
public class
NameComposer { public ArrayList composeNames ( ArrayList list1, ArrayList list2,
ArrayList list3) { String serviceName = null; String word1 = null; String word2 =
null; String word3 = null; int size1 = 0; int size2 = 0; int size3 = 0; ArrayList
serviceNames = new ArrayList (); if ( list1 != null ) size1 = list1.size (); if (
list2 != null ) size2 = list2.size (); if ( list3 != null ) size3 = list3.size ();
for (int i = 0; i < size1; i++) { word1 = (String) list1.get(i); word1 =
upperFirstChar (word1); if ( size2 == 0) { servicesNames.add(word1); continue; } for
( int j = 0; j < size2; j++) { word2 = (String) list2.get(j); word2 =
upperFirstChar (word2); if ( size3 == 0) { serviceNames.add (word1 + word2);
continue; } for ( int k = 0; k < size3; k++) { word3 = (String) list3.get(k);
word3 = upperFirstChar (word3); serviceName = word1 + word2 + word3;
serviceNames.add (serviceName); } } } return serviceNames; } private String
upperFirstChar (String word) { char c = word.charAt (0); c = char.toUpperCase (c);
StringBuffer sbuff = new StringBuffer (word); sbuff.setCharAt (0, c); return
sbuff.toString (); } }

Diccionario

El diccionario, en este contexto, es un componente que toma una palabra como entrada. La salida del diccionario es una lista de palabras que tienen un significado igual o similar al de la palabra original. Por ejemplo, si la entrada es la palabra get (conseguir), entonces la salida será una lista que contenga las palabras get, fetch (ir a buscar), y obtain (obtener). Esta funcionalidad de componente diccionario se muestra esquemáticamente en la Figura 4.

Figura 4. Funcionalidad del componente diccionario
Funcionalidad del componente diccionario

Podemos categorizar el componente diccionario según el contenido del diccionario.

  • un diccionario restringido que es específico para una organización, como una gran empresa u organización
  • un diccionario específico más general para la industria que asista a un tipo de industria específico, e.g. concesionarias de autos
  • un diccionario muy general que pueda ser usado por cualquier organización.

Hay dos formas principales de implementar un componente diccionario. (1) Un diccionario basado en una base de datos relacional y (2) un diccionario basado en archivo. Ahora describiremos cada uno de estos dos métodos de implementación de un componente diccionario.

Diccionario basado en base de datos relacional

Una base de datos relacional almacena información en tablas. Cada fila en la tabla almacena un conjunto de datos relacionados y los datos almacenados en una fila se llaman registro. Para implantar un diccionario usando una base de datos relacional para nuestro sistema, cada palabra y sus sinónimos se almacenarán en una fila. Para perfeccionar el funcionamiento de la búsqueda, la primera columna está ordenada por índice. Por ejemplo para almacenar la palabra car (auto) y sus dos sinónimos, automobile (automóvil) y vehicle (vehículo), la base de datos tendrá tres filas como se muestra en la Tabla 1.Cada una de estas filas contendrá el mismo grupo de sinónimos, pero cada fila comenzará con un sinónimo diferente, como se muestra en la Tabla 1. Es importante observar una limitación del diccionario de base de datos. La cantidad máxima de sinónimos se debe especificar al crearse la tabla. Como veremos más adelante, el diccionario basado en archivos sortea esta limitación.

Tabla 1. Tabla de base de datos relacional que contiene palabras y sus sinónimos
PalabraSinónimo 1Sinónimo 2
CarAutomobileVehicle
AutomobileCarVehicle
VehicleAutomobileCar

El funcionamiento de este tipo de diccionario se explica mejor en el diagrama de flujo que se muestra en la Figura 5. Como primer paso, usar la herramienta sql o basada en sql para crear la tabla con la suficiente cantidad de columnas para contener la cantidad máxima de sinónimos de cada palabra. Cada columna debe tener asignado el almacenamiento suficiente para contener la mayor cantidad de sinónimos por cada palabra. Luego usar sql para ingresar los sinónimos de cada palabra en la tabla. La cantidad de filas ingresadas por cada palabra será igual a la cantidad de sinónimos para esa palabra. Cada una de estas filas comenzará con un sinónimo diferente. Al recibir una solicitud del cliente por los sinónimos de una determinada palabra, formular una consulta de base de datos usando sql para buscar los sinónimos de una determinada palabra. Después de ejecutar la consulta contra la base de datos, devuelve los resultados de la consulta en forma de lista o no devuelve nada si no se encontró sinónimo alguno.

Figura 5. Flujo de proceso para diccionario basado en base de datos
Flujo de proceso para diccionario basado en base de datos

Diccionario basado en archivo

En esta modalidad, los datos del diccionario se almacenan como archivo en el disco duro de una computadora. Cada línea del archivo contendrá una palabra y sus sinónimos separados por un espacio o algún otro token conocido. Por lo tanto, para almacenar todos los tres sinónimos de la palabra car, se usarán tres líneas, cada línea comenzará con un sinónimo diferente, como se muestra en la Lista 3.

Lista 3. Archivo de ejemplo que contiene palabras y sus sinónimos
Car Automobile
                Vehicle Automobile Car Vehicle Vehicle Automobile Car ... ...

El funcionamiento de este tipo de diccionario se explica mejor en el diagrama de flujo que se muestra en la Figura 6. Como primer paso, usar un editor de texto para crear un archivo que contenga cada palabra común y sus sinónimos en una única línea. Los sinónimos y la palabra estarán separados por un token conocido. El archivo se almacena en el disco duro de una computadora. Como segundo paso, ingresar cada línea del archivo en la memoria de la computadora como una cadena de caracteres al comienzo de la aplicación del diccionario o del subprograma. Luego analizar la cadena de caracteres desglosándola en palabras individuales y almacenar en la memoria de la computadora en forma de lista. Copiar estas listas a un mapa con cada entrada de la lista identificada por la primera palabra (la clave) de la lista. Al recibir una solicitud de sinónimos para una determinada palabra, buscar en el mapa usando esa palabra como la clave. Si se encuentra una lista que corresponda a la palabra de entrada, se devuelve la lista al cliente, de lo contrario no devuelve nada.

Figura 6. Flujo de proceso para diccionario basado en archivo
Flujo de proceso para diccionario basado en archivo

Observe que en el caso del diccionario basado en base de datos, la cantidad máxima de sinónimos es fija al momento de diseñar la estructura de la base de datos. Esta restricción no se aplica al caso del diccionario basado en archivo. En el archivo se puede almacenar cualquier cantidad de sinónimos. También observe que en el caso del diccionario basado en base de datos, la longitud de cada columna es fija al momento de diseñar la estructura de la base de datos. Esto limita el tamaño de cada sinónimo a este tamaño máximo. Esta restricción no se aplica al almacenamiento basado en archivo. Cada sinónimo puede tener la longitud que se desee. Otra diferencia es que en el caso del diseño de la base de datos se necesitará una herramienta genérica o personalizada para ingresar los sinónimos a la base de datos. El diccionario basado en archivo no necesita esta herramienta. En el caso del diccionario basado en archivo se puede usar cualquier editor de texto.


Conclusión

En esta entrega describimos las implementaciones de los cuatro componentes principales del registro SOA con capacidad de búsqueda avanzada. La capacidad de búsqueda avanzada permite detectar información sobre tiempo de desarrollo y tiempo de ejecución de un servicio en un registro aún cuando se desconozca el nombre exacto del servicio. Cabe destacar que los conceptos y las implementaciones de estos componentes principales están registrados en dos patentes solicitadas por IBM. En la última entrega, la Parte 3 de esta serie, describiremos las diferentes configuraciones posibles para implementar estos componentes como aplicación individual o aplicaciones múltiples ejecutadas en un servidor individual o en múltiples servidores. En la Parte 3, también describiremos la implementación de un quinto componente, llamado Controlador, que tal vez necesiten algunas configuraciones. El componente Controlador controlará cómo funcionan conjuntamente los cuatro componentes principales para brindar la capacidad de búsqueda avanzada que se requiera.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=SOA y servicios web
ArticleID=475719
ArticleTitle=Service Registry con capacidad de búsqueda avanzada: Parte 2: Implementación
publish-date=08052011