Una de las particularidades de las orientaciones SOA
es que servicios consumen servicios, y desde hace un tiempo ya estos
servicios no se orientan a SOAP con webservices si no que se orientan
más a servicios más ligeros basados en REST.
En la siguiente firgura podemos ver un ejemplo de lo comentado
Donde podemos ver, serialización y des-serialización basada en JAXB,
exposición de servicios usando JAX-RS y
sobre todo vemos que el objeto intercambiado entre los servicios
(Book) se transporta en formato JSON entre el consumidor y el
publicador del servicio.
Esto está bien como primera aproximación pero lo mismo que hace 10
años se intercambiaban XMLs y pasamos a JSON ahora parece que sería
interesante pasar de JSON
a alugno de los protocolos binarios que aportaán más velocidad y
por ende más rendimiento. Los candidatos principales son (Avro y Protobuf).
Una vez que tenemos claro el objetivo, ¿cómo podríamos hacerlo?, en
realidad revisando el diagrama anterior parece que debería ser
sencillo hacer el cambio. Para ello solo hay que registrar un
nuevo protcolo para que JAXRS lo identifique y sea capaz de
gestionarlo. Tenemos que implementar las siguientes dos
clases (javax.ws.rs.ext.MessageBodyReader
y javax.ws.rs.ext.MessageBodyWriter) que le indican al servicio
como tiene que leer la información de la petición REST y como tiene
que escribir la respuesta. Siguiendo este
artículo podemos ver como se hace esto para Protobuf. Además para
poder completar el ejemplo hay que seguir un manual de Protobuf de
los muchos existentes en internet.
Para hacer lo mismo con Avro habría que implemntar estas dos clases
y definir un nuevo tipo de contenido por ejemplo application/avro. Con
esto podríamos tener servicios que consuman y devuelvan peticiones con
objetos serializados en Avro o en Protobuf igual que hacemos con los
servicios que exponen JSON