building microservices soap and rest example

Building Micro Services II

Una vez hemos introducido el concepto de microservicio, sus ventajas y sus características, vamos a realizar nuestro primer desarrollo, haciendo hincapié en los aspectos más destacados y los pasos necesarios. Si no sabes de lo que hablo, lee el post anterior.

buo-libreria

Fuente: Freepng

Problema a resolver

Supongamos el siguiente problema:

Una librería desea realizar un servicio, que gestione los libros que contiene su sistema informático. Para ello se deben de tener en cuenta las propiedades que se desean almacenar:

  • Isbn
  • Título
  • Ejemplares

Este servicio permitirá realizar un CRUD, sobre los elementos que contenga, y mostrar un listado de todos sus elementos.

Definición de la API

En primer lugar, hemos de definir la API:

Conjunto de definiciones y protocolos que se utiliza para desarrollar e integrar el software de las aplicaciones. API significa interfaz de programación de aplicaciones

Fuente:Redhat

Nuestra API será sencilla, al igual que el ejemplo planteado. En primer lugar, debemos agrupar las propiedades en una clase, denominada Libro, tal y como se muestra :

/**
 * Entidad basica de la api
 */
public class Libro implements Serializable {

   private static final long serialVersionUID =1L;
   String titulo;
   String isbn;
   int ejemplares;

En segundo lugar, definiremos nuestro servicio, el cual llamaremos LibroServicio, con las operaciones básicas de un CRUD, junto con el método listar. Podemos ver el resultado:

public interface LibroServicio {
    Collection list();
    Libro get(String isbn);
    void add(Libro libro);
    void update(Libro libro);
    void remove(String isbn);
}

Implementación del Servicio

El siguiente paso, radica en la implementación en sí del servicio. Como resulta evidente, el ejemplo planteado, es sumamente sencillo, y una posible solución es la siguiente:


/** * Implementacion del servicio Libro */ public class LibroServiceImpl implements LibroServicio { private Map libros = new HashMap<>(); /** * Constructor por defecto */ public LibroServiceImpl() { libros = new HashMap<>(); Libro libro1 = new Libro("titulo1", "isbn1", 1); Libro libro2 = new Libro("titulo2", "isbn2", 2); libros.put("isbn1", libro1); libros.put("isbn2", libro2); } @Override public void add(Libro libro) { libros.put(libro.getIsbn(), libro); }

Como se puede observar, se han añadido dos elementos, para simplificar las pruebas de correcto funcionamiento de nuestro servicio.

Protocolo de Comunicación

Llegados a este punto, hemos de diseñar las interfaces de programación (API), que permiten la comunicación de datos entre aplicaciones web.
REST y SOAP son dos enfoques distintos para la transmisión de datos en línea.
La transferencia de estado representacional (REST) es un conjunto de principios arquitectónicos; mientras que el protocolo simple de acceso a objetos (SOAP) es un protocolo oficial de cuyo mantenimiento se encarga el Consorcio World Wide Web (W3C). La principal diferencia es que SOAP es un protocolo, y REST no lo es. Por lo general, alguno de ellos regirá a las API, según el caso práctico y las preferencias del desarrollador.

Fuente:Redhat

Implementación SOAP <-> REST

Para demostrar una de las ventajas de desarrollar servicios basados en una API, se realizará el desarrollo de un servicio basado en la arquitectura SOAP, y REST. De esta forma, expondremos la misma solución a través de dos puntos de acceso diferentes.
Como podrás entender, si me he explicado bien, y si conoces los conceptos que se están explicando, en realidad sólo vamos a exponer de distintas maneras LibroServicioImp.



Veamos ambas soluciones:

REST

Como podemos ver, tan sólo hemos de crear un servicio Rest (LibroRestService), extendiendo este la clase que contiene la implementación.

/**
 * Implementacion del servicio Libro en Rest
 */
@Path("/")
public class LibroRestService extends LibroServiceImpl {

    @Override
    @Path("/")
    @Produces("application/json")
    @GET
    public Collection list() {
        return super.list();
    }

    @Override
    @Path("/{isbn}")
    @Produces("application/json")
    @GET
    public Libro get(@PathParam("isbn") String isbn) {
        return super.get(isbn);
    }

SOAP

Al igual que en el caso anterior, hacemos uso de la clase implementación simplificando el desarrollo. Tan sólo hemos de añadir las anotaciones necesarias, y especificas del protocolo SOAP.

/**
 * Implementacion del servico Libro en Soap
 */
@WebService(endpointInterface="es.ejemplos.jpexposito.LibroSoapService", serviceName="Libro")
public class LibroSoapServiceImp extends LibroServiceImpl implements LibroSoapService {
   public Collection list() {
      return super.list();
  }

  @Override
  public Libro get(String isbn) {
      return super.get(isbn);
  }
  
  @Override
  public void add(Libro libro) {
      super.add(libro);
  }

ARQUITECTURA

Finalmente la arquitectura de nuestro servicio estará de momento compuesta por 4 módulos, independientes y que tienen como punto común la api del servicio.
En un futuro cercano hablaremos de esas cajas, su construcción, etc.




En un futuro próximo realizaremos el despliegue de los servicios, y la demostración de funcionamiento de cada uno de estos.

Aquí tienes el código fuente al completo.

¡¡¡ Sed buenos, disfrutad programando y recuerda que el siguiente post está a medio cocer. 😉 !!!!.