Crear microservicios con Spring Boot

Las limitaciones de las aplicaciones monolíticas, como ser mayor tiempo de desarrollo, dificultad para ser escaladas y el hecho de que los errores individuales pueden afectar la disponibilidad de toda la aplicación llevaron a la creación de la arquitectura de microservicios.

¿Qué son los Microservicios?

Los microservicios son un enfoque arquitectónico y organizativo para el desarrollo de software en el que el software se compone de pequeños servicios independientes que se comunican a través de APIs bien definidas. Las arquitecturas de microservicios hacen que las aplicaciones sean más fáciles de escalar y más rápidas de desarrollar, lo que permite la innovación y acelera el tiempo de comercialización de nuevas funciones. Los microservicios presentan varias ventajas en comparación con las aplicaciones monolíticas:

  • Facilidad de despliegue: Mientras que el despliegue de una aplicación monolítica es simple y no requiere orquestación ni gestión con otros componentes o aplicaciones, los microservicios permiten desplegar componentes de forma independiente, lo que facilita la actualización y mantenimiento de la aplicación.
  • Escalabilidad y autonomía: Cada servicio que compone una arquitectura basada en microservicios puede desarrollarse, implementarse y escalar sin afectar el funcionamiento del resto de servicios, lo que brinda una mayor autonomía y flexibilidad en el desarrollo y mantenimiento de la aplicación.
  • Equipos multifuncionales y autónomos: Los microservicios permiten la formación de equipos multifuncionales sin demasiado esfuerzo, ya que cada servicio es un elemento independiente, lo que facilita la gestión y el desarrollo de la aplicación.
  • Mayor flexibilidad en cambios y actualizaciones: Dado que cada microservicio es independiente y puede desarrollarse, desplegarse y escalarse por separado de los demás, es más fácil realizar cambios en la aplicación sin afectar otras partes de la misma.

Crear el microservicio

En esta sección veremos los pasos necesarios para crear microservicios Spring Boot Java, desplegarlo en el servidor Apache Tomcat y acceder a los endpoints con un cliente REST. En el ejemplo desarrollaremos un servicio con una operación POST para alta de clientes y una operación GET para listar los clientes ingresados.

Paso 1: crear microservicios con Spring Boot Generando el proyecto con Spring Web starter

Para generar la estructura básica de la aplicación con las dependencias necesarias:

a) acceder a la página de Spring Initializr

crear-microservicios-con-spring-boot-starter

b) En cada sección de la página seleccionar/ingresar los valores que se indican a continuación:

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.6.7 (default)

Project Metadata

  • Group: com.jcodepoint
  • Artifact: customer-service
  • Name: customer-service
  • Package name: com.jcodepoint.customer-service
  • Packaging: Jar
  • Java: 11

Dependencias

  1. Clic en el botón ADD DEPENDENCIES…
  2. En el diálogo de dependencias buscar y agregar la dependencia Spring Web.

Esta opción incluirá automáticamente la siguiente dependencia en el archivo pom.xml:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

La dependencia spring-boot-starter-web incluye características como configuración automática para desarrollo web, integración con contenedores como Tomcat y soporte para crear API REST. Esta dependencia es parte de Spring Boot Starters, que son descriptores de dependencia que simplifican la gestión de dependencias en un proyecto.

c) Hacer click en GENERATE. Se descargará un archivo .zip con el proyecto generado.

Paso 2: importar el proyecto en Eclipse

En la carpeta de descargas tendríamos que encontrar el archivo customer-service.zip, que contiene todos los archivos del proyecto. Descomprimir este archivo en la carpeta de nuestro workspace.

La estructura del proyecto generado es la siguiente:

crear-microservicios-con-spring-boot-estructura-proyecto

La herramienta ha generado la estructura del proyecto y los archivos necesarios para el inicio de la aplicación. Estos archivos son:

  • pom.xml (Project Object Model): archivo de Maven que contiene información esencial sobre el proyecto.
  • CustomerServiceApplication.java: es la clase principal del proyecto. Contiene el método main() y está marcada con la anotación @SpringBootApplication.
  • CustomerServiceApplicationTests.java
  • application.properties

Ahora debemos generar los archivos de proyecto para Eclipse. Desde una terminal y ubicados en el directorio raíz del proyecto ejecutar el siguiente comando:

mvn eclipse:eclipse

Hacer click derecho en el workspace de Eclipse para desplegar el menú contextual y seleccionar la opción Import…

import-eclipse-1

En el diálogo que se despliega seleccionar Existing Projects into Workspace (dentro de la carpeta General) y luego click en Next:

import-eclipse-2

En el siguiente diálogo, en la opción Select root directory seleccionar la carpeta raíz del proyecto. Opcionalmente, también se puede seleccionar el Working set para el proyecto:

crear-microservicios-con-spring-boot-import-eclipse-3

Finalizada la importación del proyecto, se debería ver en el workspace de Eclipse como sigue:

crear-microservicios-con-spring-boot-eclipse-workspace

Paso 3: implementar el API de Clientes

Nuestro ejemplo consistirá en un servicio con dos endpoints para alta y listado de clientes respectivamente para lo cual crearemos en primer lugar la clase Customer como entidad cliente en nuestro modelo:

package com.jcodepoint.customerservice;

public class Customer {
	private Integer id;
	private String firstName;
	private String lastName;
	private String location;
	
	public Integer getId() {
		return id;
	}
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getFirstName() {
		return firstName;
	}
	
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	
	public String getLastName() {
		return lastName;
	}
	
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	
	public String getLocation() {
		return location;
	}
	
	public void setLocation(String location) {
		this.location = location;
	}
}

Para terminar de crear el microservicio, implementaremos la clase CustomerController para implementar nuestro servicio RESTful:

package com.jcodepoint.customerservice;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomerController {

    private static Map<Integer, Customer> customers = new HashMap<>(); 	
	
    @PostMapping("/customer")  
    public String addCustomer(@RequestBody Customer customer) { 
        customers.put(customer.getId(), customer); 
        return ""; 
    } 	
	
    @GetMapping("/customer")  
    public List<Customer> getCustomers() { 
        return new ArrayList<Customer>(customers.values()); 
    }    
	
}

Notar que:

  • Se utiliza un HashMap para almacenar las entidades que se ingresen mediante la operación POST.
  • La anotación @RestController marca a la clase como servicio RESTful. La anotación @RestController simplifica la implementación de servicios web RESTful al combinar las funcionalidades de @Controller y @ResponseBody, lo que permite la serialización automática del objeto devuelto en HttpResponse y maneja varias API REST como solicitudes GET, POST, Delete y PUT.
  • La clase cuenta con dos métodos para implementar operaciones POST y GET, para alta y consulta, respectivamente.

Paso 4: ejecutar y consumir el microservicio

A los efectos de este ejemplo vamos a desplegar el microservicio en nuestro ambiente de desarrollo y a acceder a los endpoints utilizando un cliente REST.

Para levantar la aplicación ejecutamos el siguiente comando de Maven desde la terminal:

mvn spring-boot:run

El anterior comando desplegará nuestra aplicación en el servidor Apache Tomcat embebido.

Para acceder a los endpoints podemos utilizar cualquier cliente REST como Postman, Insomnia, etc.

Consumir servicio POST

A continuación se muestra la URL de acceso y el JSON del body con los datos del cliente a ingresar:

crear-microservicios-con-spring-boot-post-request

La respuesta del servicio muestra status 200 OK, por lo tanto los datos fueron almacenados en el HashMap:

crear-microservicios-con-spring-boot-post-response

Consumir servicio GET

A continuación se muestra la URL de acceso a la operación de consulta. Esperamos que la misma liste las entidades almacenadas en el HashMap:

crear-microservicios-con-spring-boot-get-request

La respuesta del servicio muestra status 200 OK y un array con la entidad cargada en la llamada al servicio anterior:

crear-microservicios-con-spring-boot-get-response

Conclusión

En este artículo hemos visto los pasos necesarios para crear y probar un API REST. El siguiente paso es documentar nuestra API para facilitar el acceso a los usuarios. En este artículo explicamos cómo documentar API con Swagger.

Además, se debe considerar agregarle seguridad para restringir el acceso a los endpoints en caso de que el API sea publicada en Internet. Esto lo haremos con JSon Web Token (JWT) y lo explicamos en este artículo.


Te puede interesar

Palabras reservadas en Java

Las palabras reservadas en Java son un componente crucial de la sintaxis del lenguaje para formar los bloques básicos del lenguaje.

Seguir leyendo →

Crear un arquetipo de Maven

Crear un arquetipo de Maven permite generar nuevos proyectos de similares caracteríticas a partir de una plantilla.

Seguir leyendo →

Seguridad en Rest API con JWT

En este artículo explicamos cómo agregar una capa de seguridad en Rest API con JWT para permitir el acceso solo a los usuarios autorizados.

Seguir leyendo →

Documentar un API REST con Swagger

En este artículo se demostrará como documentar un API REST con swagger utilizando la implementación SpringFox de la especificación Swagger 2.

Seguir leyendo →