Analizando WSO2 Business Rules Server

0
9460

Analizando WSO2 Business Rules Server

0. Índice de contenidos.


1. Introducción

Mucho se ha hablado de la arquitectura SOA, de las ventajas y bondades de esta arquitectura. No solo se trata de exponer servicios y ya. Es también su gestión, el ciclo de vida de los mismos, su mantenimiento, evolución, documentación, o lo que se denomina «gobierno SOA».

También podríamos incluir en esta arquitectura la medición de quien, cuando y cómo se consumen los servicios que exponemos en nuestra organización. La metainformación que saquemos de estos datos puede resultar en nuevos planes de negocio o la modificación de las estrategias actuales de nuestra empresa. Bajo mi punto personal de vista, la medición de estos datos es importantísima porque proporciona una información de como interactua el mercado/mundo con nosotros. Y no son datos imaginarios, o cómo creemos que se da esta relación, sino datos empíricos.

Hoy en día tenemos varias suites de herramientas que nos permiten construir y gestionar este tipo de arquitecturas, y encajar todas las piezas de forma que tengamos los servicios expuestos, documentados, con los procesos estandarizados y comunicados entre ellos.

Una de estas suites es WSO2, de la que ya hemos hablado en algún otro tutorial. A continuación vamos a ver que es WSO2 Business Rules Server y cómo se instala. Vamos a exponer un servicio con lógica de negocio en base a reglas y vamos a ver como podemos probarlo y consumirlo desde un cliente real.


2. Entorno

  • Hardware: Portátil MacBook Pro 15′ (2.3 GHz Intel i7, 16GB DDR3 SDRAM, 500GB HDD).
  • Sistema Operativo: Mac OS Mavericks 10.9.5.
  • Software relacionado con el tutorial: Eclipse Kepler, java 1.6.0_65, maven 3.1.1.


3. Instalando WSO2 Business Rules Server

Me gustaría empezar comentando que el producto es código libre, y que cualquiera puede usarlo y modificarlo, lo cual es un punto muy importante a tener en cuenta. Con esta pieza de la suite de productos de WSO2 lo que pretendemos es exponer los servicios, monitorizar los que están arrancados, los que no, ver el estado de la máquina, acceso a logs…

Antes que nada podemos entrar en el site oficial, leernos todo lo que ofrece y determinar si nos encaja o no. En caso afirmativo pinchamos en Download Binary.

El único prerequisito obligatorio es tener instalada la máquina virtual de java (1.6.24 +). De todas formas aquí hay una lista más detallada.

Esto nos baja un archivo .zip. Lo podemos descomprimir en la ruta que queramos. Para ejecutarlo simplemente desde el directorio raíz de la instalación ejecutamos ./bin/wso2server.sh. Esto es para sistemas operativos basados en linux. Los usuarios de windows podéis usar el .bat equivalente.

La consola nos muestra si la aplicación arranca de forma correcta, y la url donde está la herramienta desplegada. Accedemos y nos logamos con el usuario: admin y password: admin.

El hecho de bajarse un .zip, descomprimirlo, ejecutar un .sh y que funcione dice mucho. Después de pegarme con muchas herramientas, y pasar horas y horas por google y stackoverflow, bajar algo, ejecutarlo, y que funcione !! es un soplo de aire fresco.


4. Exponiendo reglas como servicios

Vamos a usar uno de los ejemplos de la web y nos vamos a crear una regla con las siguientes restricciones:

  • Un pedido de la compañia A se acepta solo si el número de stock es mayor que 10.
  • Un pedido de la compañía B se acepta cuando el precio es mayor que 100.
  • Un pedido de la compañía C se acepta cuando el precio es mayor que 50, y el número de stock es menor que 200.

La regla sería la siguiente:

package OrderApproval;

import samples.userguide.OrderAccept;
import samples.userguide.OrderReject;
import samples.userguide.PlaceOrder;

rule "Order Approval Rule" dialect "mvel" no-loop true salience 4

when
$placeOrder : PlaceOrder( ( symbol == "Company A" && quantity > 10 ) || ( symbol == "Company B" && price > 100 ) || ( symbol == "Company C" && price > 50 && quantity 

A estas reglas se les van a pasar hechos (facts) como entrada, y van a producir respuestas aplicando las reglas. A continuación vamos a poner el pedido y las posibles respuestas cuando aplicamos las reglas.

package samples.userguide;

/**
* Represents the fact of a customer places an order 
*/
public class PlaceOrder {

	String symbol;
	int quantity;
	double price;

	public String getSymbol() {
		return symbol;
	}

	public void setSymbol(String symbol) {
		this.symbol = symbol;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
}
package samples.userguide;

/**
* Order accept notification
*/
public class OrderAccept {

	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}
package samples.userguide;

/**
* Order Reject Notification
*/
public class OrderReject {

	private String reason;

	public String getReason() {
		return reason;
	}

	public void setReason(String reason) {
		this.reason = reason;
	}
}

Una vez tenemos esto ya podemos exponer la regla como servicio. Le pasaremos peticiones o facts, y nos responderá con los resultados que hemos definido. Para ello entramos en la url donde se nos ha desplegado la herramienta.

Hacemos click en create, y le damos un nombre al servicio y pulsamos en next

A continuación tenemos una serie de opciones para indicar nuestra regla. Mediante texto, mediante WSO2 Governance Registry, mediante url... La opción que me parece más interesante es mediante Governance Registry, pero por ahora simplemente vamos a copiar la regla en modo texto y pinchamos en siguiente.

A continuación se nos pide que introduzcamos un jar con las clases java que va a usar la regla. No solo la entrada sino también cualquier tipo de salida. Son las clases que hemos visto antes. Para que vayamos rápido, yo me he generado un jar con maven con las tres clases. Os lo podéis bajar aquí mismo. Subimos ese fichero, nos confirman que ha ido todo bien y pinchamos en siguiente. Fijaros que abajo nos salen el número de facts que tenía nuestro jar, que son 3. Con esto podemos ver si hemos subido todo lo que queremos o no.

En el siguiente paso solo nos queda configurar que clases son facts de entrada y cuales son de salida. Lo hacemos como en la imagen. Cuando lo tengamos todo listo pulsamos en Add y Finish, y ya tenemos nuestro servicio publicado.

Para comprobar que lo hemos hecho bien, nos vamos en el panel de administración de la izquierda a Services >> List. Deberíamos ver nuestro servicio en la lista.

Si pulsamos en Try this service podemos generar un fact de entrada y comprobar que el servicio responde. Lo haríamos así.

Como el stock es mayor que 10 y la Compañia es la A, nos devuelve un orderAccepted

Vamos a ver ahora como podríamos llamar a nuestro servicio desde fuera. Podeis usar cualquier cliente para web services. Yo lo voy a hacer con un plugin de chrome(Postman)

Es tan sencillo como hacer un post al endpoint de nuestro servicio copiando la request que teníamos cuando hemos probado el servicio y añadiendo la cabecera de que vamos a enviar un xml. Como véis la respuesta es la misma que obteniamos desde wso2.


5. Repositorio de reglas integrado con WSO2 Governance Registry

Hay cierta parte de WSO2 Governance Registry (de ahora en adelante GR) que ya viene integrado por defecto en WSO2 Business Rules Server (de ahora en adelante BSR). Si nos descargamos GR vemos que en realidad tenemos muchas más opciones de las que vienen dentro de BRS. Por lo que he podido averiguar por internet, parece ser que tú te bajas un .zip con un producto de la suite de WSO2, pero si quieres integrar ciertos productos con otros lo tienes que hacer añadiendo features a la instalación que te bajas mediante el wizard de añadir features. He intentado sin éxito arrancar a la par estos dos productos y aun cambiando los puertos no he sido capaz. Lo que si que he podido comprobar es que cada uno tenía su propio repositorio, es decir, que no es compartido. Desde BRS no ves las reglas que tienes en el repositorio de GR, y esto me hace pensar que el filesystem virtual que se crea para almacenar los recursos es relativo a la instalación. No he visto forma de cambiar el fylesystem a una ruta alternativa, y no se si se puede.

Para almacenar las reglas en el repositorio de BRS, nos podemos crear una carpeta rules y metemos dos reglas. La primera es la que tenemos en el ejemplo de arriba, y la segunda es una simple modificación donde modificamos un poco la regla para que en la Company A, el quantity en vez de ser mayor que 10, ponemos mayor que 15. Así vamos a tener dos reglas y veremos como podemos borrar una, meter la otra y el servicio responde en consonancia.

Ahora para aplicar la regla a nuestro servicio solo tenemos que ir al listado de servicios y pinchar en el nuestro, como se ve en la imagen siguiente.

Pinchamos en el wizard de edición de servicio.

Pinchamos en siguiente, hasta que llegamos a la parte de definición de reglas, y pulsamos en Governance Registry. En la ventana emergente buscamos nuestra regla, pulsamos en OK, y después en Add.

Si todo va bien tendremos la regla seleccionada del repositorio, pulsamos en Next y finish. Podemos volver a probar el servicio con Try-it o con Postman y comprobar como sigue respondiendo.

La siguiente prueba que podemos hacer es cambiar la regla a la v2. Vemos como es prácticamente instantáneo el cambio y al llamar a nuestro servicio, solo nos responderá correctamente si la cantidad es mayor que 15 (recordad que cambiamos justamente esto). Esta parte me ha gustado bastante, porque no hace falta tirar el servidor, ni reiniciar nada. Simplemente cambiando la regla cambia el servicio.


6. Conclusiones

La documentación de la web está muy bien explicada, aunque es cierto que hay bastantes cosas que no se detallan. Me ha parecido una documentación un tanto escasa. Esto es debido al modelo de negocio de WSO2, en donde lo que te venden es el soporte. Por ejemplo yo desconozco donde se guarda el fichero de reglas dentro del repositorio, y muchos detalles que no se explican en la documentación. Esto me crea cierta incertidumbre. Como bien dicen ellos en su propia página o tienes tiempo para bucear en el código fuente y ver el detalle de las cosas, o tienes dinero y contratas soporte para que te lo den masticado. Con respecto a la comunidad, te referencian a stackoverflow. Una vez vas a stackoverflow ves que muchas preguntas están sin respuesta, por lo que la comunidad por ahora no está tan desarrollada como la de otros productos. Un saludo y espero que os haya resultado interesante.


7. Información sobre el autor

Alberto Barranco Ramón es Ingeniero Técnico en Informática de Gestión y Graduado en Ingeniería del Software por la Universidad Politécnica de Madrid

Mail: abarranco@autentia.com.

Twitter: @barrancoalberto

Autentia Real Business Solutions S.L. - "Soporte a Desarrollo".

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad