Microservicios Java
Microservicios Java
Veamos cómo esta aplicación podría haber sido diseñada como una
aplicación monolítica:
Como puede ver, toda la aplicación se incluye como un artefacto y,
por lo tanto, promueve un único punto de falla (SPOF). Si, por
algún motivo, el código analítico bloquea su JVM, perderemos la
interfaz web, las API REST y los análisis en general. Ahora,
echemos un vistazo a cómo esto podría dividirse en microservicios
manejables:
Preparándome
Para crear su proyecto de microservicio, necesitará el siguiente
software. Siga las instrucciones en sus respectivos sitios web
para instalarlos:
JDK 1.8+
Maven 3.3.9+
Cómo hacerlo…
Una vez que haya instalado el software mencionado anteriormente,
abra Spring Tool Suite. La primera vez que lo abra, se le pedirá
que elija un espacio de trabajo. Continúa e ingresa la ubicación
de tu área de trabajo En esta receta, aprenderemos cómo crear una
plantilla de proyecto Maven utilizando STS y Maven. STS viene con
la integración de Maven fuera de la caja. Así que no tenemos que
configurarle algo más. Después de que su STS IDE haya completado
el inicio, siga los pasos a continuación
Name: geolocation
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Hay más…
mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.packt.microservices -DartifactId=geolocation \
-Dname=geolocation
Como esto está fuera del alcance de este libro, no veremos cómo
importar un proyecto Maven existente en su IDE.
Preparándome
De manera similar, Spring Boot requiere una clase Java simple con
el método principal para ejecutarlo como una aplicación Spring
Boot (microservicio). Antes de comenzar a escribir su
microservicio Spring Boot, también necesitará algunas dependencias
de Maven en su archivo pom.xml.
Como hacerlo…
package com.packt.microservices.gelocation;
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
package com.packt.microservices.geolocation;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure
.SpringBootApplication;
@SpringBootApplication
SpringApplication.run(GeoLocationApplication.class,
args);
Preparandome
Cuando se trata de crear API REST, hay varios frameworks
para elegir. Como ya configuramos el ecosistema de
Spring en nuestra receta anterior, tendría más sentido y
sería mucho más fácil usar Spring MVC para exponer las
API de REST.
Cómo hacerlo...
La verdadera ventaja de Spring Boot es que no tiene que
agregar nuevas dependencias para habilitar el soporte
web para su aplicación. El archivo pom principal de
Spring Boot (spring-boot-starter-parent) se encarga de
eso por ti. Ahora veamos cómo escribir nuestra primera
API. Si está familiarizado con Spring MVC, esto debería
ser muy sencillo para usted:
package com.packt.microservices.geolocation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/geolocation")
}
Hay dos cosas a tener en cuenta aquí. La anotación de
@RestController indica que vamos a utilizar este
controlador para exponer nuestras API REST. Agrega
implícitamente la anotación @ResponseBody a todos los
métodos del controlador, ya que es algo que querría
hacer al exponer sus API REST mediante Spring MVC. La
anotación @RequestMapping especifica dónde se encuentra
su recurso HTTP. Estamos configurando @RequestMapping en
el nivel del controlador para aplicarlo a todos los
métodos del controlador.
package com.packt.microservices.geolocation;
import java.io.Serializable;
import java.util.UUID;
return latitude;
this.latitude = latitude;
}
public double getLongitude() {
return longitude;
this.longitude = longitude;
return userId;
this.userId = userId;
}
public long getTimestamp() {
return timestamp;
this.timestamp = timestamp;
package com.packt.microservices.geolocation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Repository;
@Repository
ArrayList<GeoLocation>();
geolocations.add(geolocation);
}
public List<GeoLocation> getGeoLocations() {
return Collections.unmodifiableList(geolocations);
package com.packt.microservices.geolocation;
import java.util.List;
import java.util.List;
import
org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
GeoLocationService {
@Autowired
@Override
repository.addGeoLocation(geolocation);
return geolocation;
}
@Override
return repository.getGeoLocations();
/r e f e r e n c e /h t m l /b o o t - f e a t u r e s -
t e s t i n g . h t m l .
@Autowired
private GeoLocationService service;
return service.create(geolocation);
"application/json")
return service.findAll();
}
En esta implementación, hay algunas cosas para notar. La
anotación @RequestMapping no tiene una ruta definida ya
que ya se deriva de la anotación de nivel de clase.
Tanto para los métodos create como findAll, estamos
utilizando la misma ruta pero diferentes métodos HTTP
según las mejores prácticas. Como estamos tratando solo
con JSON aquí, hemos establecido los valores de
producción y consumo en application / json. Los tipos de
retorno de los métodos create y findAll son GeoLocation
y List <GeoLocation> respectivamente. Spring MVC usa
internamente a Jackson para convertirlos a sus cadenas
JSON equivalentes.
¡Eso es! Ahora estamos listos para probar nuestra
aplicación:
1. Intentemos crear dos geolocalizaciones utilizando la
API POST y luego intentaremos recuperarlas utilizando el
método GET. Ejecute los siguientes comandos cURL en su
terminal uno por uno:
"latitude": 41.803488,
"longitude": -88.14404,
"userId": "f1196aac-470e-11e6-beb8-9e71128cae77",
"timestamp": 1468203975
"latitude": 9.568012,
"longitude": 77.962444,
"userId": "f1196aac-470e-11e6-beb8-9e71128cae77",
"timestamp": 1468203975
curl http://localhost:8080/geolocation
"latitude": 41.803488,
"longitude": -88.14404,
"userId": "f1196aac-470e-11e6-beb8-9e71128cae77",
"timestamp": 1468203975
},
{
"latitude": 9.568012,
"longitude": 77.962444,
"userId": "f1196aac-470e-11e6-beb8-9e71128cae77",
"timestamp": 1468203975
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
<artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
<version>1.0.0.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
package com.packt.microservices.geolocation;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/geolocation")
public GeoLocationApplication() {}
package com.packt.microservices.geolocation;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/")
@GET
@Produces("application/json")
plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-plugin</artifactId>
<version>1.0.0.Final</version>
<executions>
<execution>
<id>package</id>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
Microservicios de contenedorización con Docker
4. Escribiendo tu Dockerfile
Preparandome
Si ya está utilizando Spring Boot o WildFly Swarm, puede
omitir esta receta, ya que se encarga de empaquetar su
aplicación. Para hacer cumplir el paquete de su JAR
ejecutable, utilizaremos el complemento de maven-shade. Este
plugin está especialmente construido para este propósito.
Echemos un vistazo a cómo hacer esto en nuestro proyecto
SparkJava. Todo este tiempo, hemos estado ejecutando nuestro
proyecto de geolocalización-sparkjava desde el IDE. Ahora
veamos cómo podemos crear un JAR ejecutable para este
proyecto y ejecutarlo desde la línea de comandos.
Cómo hacerlo...
1. Agrega este fragmento a Build | Plugins Sección de
complementos del archivo pom.xml de su proyecto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.
resource.ManifestResourceTransformer">
<mainClass>com.packt.microservices.geolocation.GeoLocationCon
troller</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>