Microservicios en Java: arquitectura y práctica de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Microservicios en Java: arquitectura y práctica de la A a la Z

\n\n

La arquitectura de microservicios (MSA) se ha convertido en el estándar de facto para construir aplicaciones modernas y escalables. A diferencia del monolito, donde todo el código es un único proceso grande, los microservicios dividen el sistema en servicios pequeños e independientemente desplegables. En este artículo, analizaremos cómo diseñar e implementar microservicios en Java utilizando tecnologías populares: Spring Boot, Docker, Kafka y Spring Cloud. Obtendrá recetas listas y ejemplos de código.

\n\n

1. Fundamentos de la arquitectura de microservicios en Java

\n\n

Antes de escribir código, es importante comprender los principios clave de MSA:

\n
    \n
  • Responsabilidad única (Single Responsibility) — cada servicio se encarga de una función de negocio (por ejemplo, Servicio de pedidos, Servicio de usuarios).
  • \n
  • Despliegue independiente — puede actualizar un servicio sin reiniciar todo el sistema.
  • \n
  • Gestión descentralizada de datos — cada servicio tiene su propia base de datos (Database per Service).
  • \n
  • Bajo acoplamiento — los servicios se comunican a través de protocolos ligeros (REST, gRPC, colas de mensajes).
  • \n
\n\n

Para Java, el framework principal es Spring Boot junto con Spring Cloud (para service discovery, configuración, API gateways). Veamos un ejemplo mínimo de microservicio.

\n\n

Ejemplo: un servicio REST simple con Spring Boot

\n
// pom.xml (fragmento de dependencias)\n<dependency>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n\n// UserServiceApplication.java\n@SpringBootApplication\npublic class UserServiceApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(UserServiceApplication.class, args);\n    }\n}\n\n// UserController.java\n@RestController\n@RequestMapping("/api/users")\npublic class UserController {\n\n    @GetMapping("/{id}")\n    public ResponseEntity<String> getUser(@PathVariable Long id) {\n        // En un proyecto real, aquí se llamaría al repositorio\n        return ResponseEntity.ok("Usuario con id: " + id);\n    }\n}
\n\n

Este microservicio escucha en el puerto 8080 y responde a solicitudes GET. Para ejecutar un segundo servicio (por ejemplo, Servicio de pedidos), simplemente cree otro proyecto Spring Boot con un puerto diferente (server.port=8081).

\n\n

2. Práctica: Docker, Kafka e interacción entre servicios

\n\n

En un sistema real, los microservicios no pueden comunicarse directamente por HTTP sin orquestación. Se utilizan dos enfoques: síncrono (REST/Feign) y asíncrono (Message Broker).

\n\n

2.1. Contenerización con Docker

\n

Cada microservicio se empaqueta en una imagen Docker. Ejemplo de Dockerfile para un servicio Java:

\n
FROM openjdk:17-jdk-slim\nCOPY target/user-service-0.0.1-SNAPSHOT.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "/app.jar"]
\n

Luego use docker-compose.yml para ejecutar todos los servicios a la vez:

\n
version: '3.8'\nservices:\n  user-service:\n    build: ./user-service\n    ports:\n      - "8080:8080"\n  order-service:\n    build: ./order-service\n    ports:\n      - "8081:8081"\n  postgres:\n    image: postgres:15\n    environment:\n      POSTGRES_DB: mydb\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: pass
\n\n

2.2. Interacción asíncrona a través de Apache Kafka

\n

Cuando un servicio necesita notificar a otros servicios sobre un evento (por ejemplo, "pedido creado"), es mejor usar Kafka. Esto desacopla los servicios y aumenta la tolerancia a fallos.

\n\n

Ejemplo de productor (Order Service envía el evento):

\n
// KafkaProducerConfig.java\n@Configuration\npublic class KafkaProducerConfig {\n    @Bean\n    public ProducerFactory<String, String> producerFactory() {\n        Map<String, Object> props = new Ha                

Blogs

Book Recommendations