Routing Service: Novedades en WCF 4.0

Código del ejemplo en VS2010 Beta 1

En una entrada anterior, hicimos una introducción acerca de la creación de un sistema de Router o Forwarding en WCF 3.X, fíjese que comenzamos diciendo que podría ser algo habitual en arquitecturas orientadas a servicios, note el patrón “Intermediate Routing”.

La siguiente versión de WCF, conocida como WCF 4.0 de entre las novedades que trae consigo, algunas de las cuales ya las hemos visto aquí y aquí, puede encontrarse la implementación de un servicio de router ‘out of box’ capaz de resolvernos este patrón sin necesidad de implementar ni una sola línea de código y soportando muchos de los esquemas de mensajes habituales, Request Replay, Fire And Forget, Duplex.

A lo largo de esta entrada trataremos de implementar el mismo ejemplo que teníamos en la entrada anterior  con el nuevo sistema de routing. Empezemos por el principio, que consiste en definir el servicio que será alojado en distintos procesos HOST (presumiblemente en distintas máquinas) y que desamos balancear.

 

 

Una vez alojados estos servicios, cosa que no vamos a comentar y que damos por sabida, por ejemplo en las direcciones http://localhost:2020/GeekService/ y http://localhost:2030/GeekService/IGeekService llega la hora de hacer la implementación de nuestro router. El nuevo espacio de nombres System.ServiceModel.Routing pone a nuestra disposición un servicio por defecto denominado RoutingService el cual realizará por nosotros las tareas de enrutado sin necesidad de que tengamos tanto conocimiento de las cabeceras de los sobres SOAP To y Action como necesitábamos para la versión anterior.

Las siguientes líneas de código reflejan lo necesario para alojar nuestro servicio de Router, en nuestro ejemplo en una aplicación de consola.

 

 

A la hora de configurar este servicio de router nos tendremos que fijar en distintos aspectos. Por un lado el enlace que vamos a seleccionar, que por supuesto tendrá que ser perfectamente compatible con los de los servicios y cliente, es decir, si el cliente y los servicios se comunican con el enlace ws2007HttpBinding y con un determinado mecanismo de seguridad, el router tendrá que tener este mismo enlace con la configuración adecuada.

Con respecto al contrato que implementa este Routing Service, tendremos distintas opciones a elegir, dependiendo del tipo de esquema de mensajería que se utilice. Otra vez el espacio de nombres System.ServiceModel.Routing pone a nuestra disposición cinco posibles contratos de servicio para nuestro router para que seleccionemos el adecuado para nuestras necesidades:

· System.ServiceModel.Routing.IDuplexRouterCallback

· System.ServiceModel.Routing.IDuplexSessionRouter

· System.ServiceModel.Routing.IRequestReplyRouter

· System.ServiceModel.Routing.ISimplexDatagramRouter

· System.ServiceModel.Routing.ISimplexSessionRouter

Como en nuestro ejemplo, teníamos un sistema de envío y respuesta tradicional, seleccionaremos IRequestReplyRouter. En este punto ya tendremos la configuración de nuestro router como sigue:

 

 

Llegados a este momento solamente falta ver como especificamos los filtros que permitan indicarle al router como redirigir los mensajes entrantes hacia los distintos procesos de alojamiento de los servicios. Para ello, lo primero que haremos será agregar un nuevo comportamiento  llamado routing, mediante el cual podremos indicar la tabla de filtros de enrutado.

 

Nota: El comportamiento de routing permite indicar si solamente se realizaran filtros por las cabeceras ( filtersOnHeadersOnly ), algo muy rápido, o bien examinando el cuerpo de los mensajes.

Estamos ya en la parte más interesante del sistema, la parte con la que podemos especificar los filtros que nos permitan balancear las peticiones. En realidad, un filtro, para un router nos es nada más que una clase heradada de MessageFilter, por lo tanto la creación de filtros personalizados es relativamente sencillo. Por defecto, dentro de WCF 4.0 ya tendremos una serie de filtros OOB, los cuales nos permitirán balancear en función del Action, Address, Endpoint y/o un filtro XPath sobre el contenido del mensaje.

La sección de filtros para enrutado es un nueva subsección de <system.serviceModel> y que tendrá un aspecto similar a la siguiente, que pasaremos a desgranar seguidamente.

La primera parte de la nueva sección , namespaceTable, nos permite establecer prefijos para los distintos namespaces que pueda tener un sobre SOAP, como en nuestro caso, al igual que en la entrada para routers en WCF 3.X, establecíamos una cabecera con un determinado namespace, pasamos a establecer este nuevo prefijo. Por supuesto, algunos prefijos son por defecto ya conocidos como s12 para Soap 1.2 o s11 para Soap 1.1.

Una vez especificados los prefijos, llega la hora de establecer la lista de filtros que podrán usarse dentro de las tablas. En el caso de nuestra sección incluímos dos filtros basados en una consulta XPath sobre el mensaje. Cómo podrá observar el primer filtro se corresponderá con los mensajes que contengan una Header llamada Host y con valor HostA, el segundo filtro será equivalente pero en este caso para el valor HostB.

Nota: Por supuesto, dentro de esta colección se podrá hacer uso tanto de los filtros por defecto como de los filtros personalizados que deseemos crearnos.

Ya completadas las secciones de prefijos y filtros solamente falta la creación de las tablas, para nuestro ejemplo disponemos de una tabla con nombre ‘RoutingTableA’, previamente configurada en el comportamiento de servicio, la cual hace uso de los filtros con nombre FilterHostA y FilterHostB.

Ya está todo amigos, no ha hecho falta escribir una sola línea de código para completar el ejemplo, solamente configuración de un servicio que tenemos por defecto en WCF 4.

Ahora, solamente haría falta comunicarle al cliente la dirección del router para que la establezca como dirección de los servicios, sin preocuparnos de que el header Address no coincida, sin aplicar un ViaBehavior etc….

Espero que esta nueva entrada sobre las novedades de WCF os haya parecido interesante, si os interesa investigar o leer más sobre este tema a continuación os dejo algunos enlaces interesantes.

http://blogs.msdn.com/endpoint/archive/2009/05/07/the-road-to-4-wcf-changes-between-beta-1-and-ctp.aspx

http://blogs.thinktecture.com/cweyer/archive/2009/05/08/415335.aspx

http://www.aspnetpro.com/articles/2009/05/asp200905mb_f/asp200905mb_f.asp

 

Saludos

Unai Zorrilla

3 comentarios sobre “Routing Service: Novedades en WCF 4.0”

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *