Creaci贸n de un microservicio con Apache TomEE

Vamos a ver c贸mo crear un sencillo microservicio utilizando para ello el servidor TomEE. En esta entrada no vamos a explicar en qu茅 consiste un microservicio, ya que hay mucha literatura al respecto en internet. Cualquiera que quiera profundizar podr谩 encontrar bastante material.

Hay diferentes formas de desarrollar microservicios: mediante Spring Boot, contenedores (como Docker), o usando un servidor embebido, entre otras. Y el uso de un servidor embebido es lo que vamos a describir aqu铆.

Para empezar, crearemos un nuevo proyecto web usando el arquetipo tomee-webapp-archetype, en concreto la versi贸n 7.0.3 y editamos el POM generado, eliminando lo que no nos hace falta en principio:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
聽聽聽聽聽聽聽聽 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
聽聽聽 <modelVersion>4.0.0</modelVersion>

聽聽聽 <groupId>com.cygnussource</groupId>
聽聽聽 <artifactId>microservice.example</artifactId>
聽聽聽 <version>1.0-ALPHA</version>
聽聽聽 <packaging>war</packaging>
聽聽聽 <name>microservice.example</name>
聽聽聽 <url>http://tomee.apache.org</url>

聽聽聽 <properties>
聽聽聽聽聽聽聽 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
聽聽聽聽聽聽聽 <maven.compiler.source>1.8</maven.compiler.source>
聽聽聽聽聽聽聽 <maven.compiler.target>1.8</maven.compiler.target>
聽聽聽 </properties>

聽聽聽 <dependencies>
聽聽聽聽聽聽聽 <dependency>
聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.tomee</groupId>
聽聽聽聽聽聽聽聽聽聽聽 <artifactId>javaee-api</artifactId>
聽聽聽聽聽聽聽聽聽聽聽 <version>7.0</version>
聽聽聽聽聽聽聽聽聽聽聽 <scope>provided</scope>
聽聽聽聽聽聽聽 </dependency>
聽聽聽 </dependencies>

聽聽聽 <build>
聽聽聽聽聽聽聽 <plugins>
聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.maven.plugins</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>maven-compiler-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>3.7.0</version>
聽聽聽聽聽聽聽聽聽聽聽 </plugin>
聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.maven.plugins</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>maven-surefire-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>2.20.1</version>
聽聽聽聽聽聽聽聽聽聽聽 </plugin>
聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.maven.plugins</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>maven-war-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>3.1.0</version>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <failOnMissingWebXml>false</failOnMissingWebXml>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </configuration>
聽聽聽聽聽聽聽聽聽聽聽 </plugin>
聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.tomee.maven</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>tomee-maven-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>7.0.3</version>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <context>microservice</context>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </configuration>
聽聽聽聽聽聽聽聽聽聽聽 </plugin>
聽聽聽聽聽聽聽 </plugins>
聽聽聽 </build>

聽聽聽 <repositories>
聽聽聽聽聽聽聽 <repository>
聽聽聽聽聽聽聽聽聽聽聽 <id>apache-snapshot</id>
聽聽聽聽聽聽聽聽聽聽聽 <name>Apache Snapshot Repository</name>
聽聽聽聽聽聽聽聽聽聽聽 <url>https://repository.apache.org/content/groups/snapshots/</url>
聽聽聽聽聽聽聽 </repository>
聽聽聽 </repositories>

</project>

Nuestro servicio de ejemplo va a ser lo m谩s simple posible: una suma de dos n煤meros enteros. El c贸digo es el siguiente:

package com.cygnussource.microservice.example.service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

@Produces({MediaType.APPLICATION_JSON})
@Path("/example")
public class TestService {
聽聽 聽
聽聽聽 @GET
聽聽聽 @Path("/sum")
聽聽聽 public Result sum(@QueryParam("n1") Integer numberOne, @QueryParam("n2") Integer numberTwo) throws Exception {
聽聽聽聽聽聽聽 return new Result(numberOne + numberTwo);
聽聽聽 }
聽聽 聽
}

La clase Result es un simple pojo que encapsula el resultado de la operaci贸n:

package com.cygnussource.microservice.example.service;

public class Result {
聽聽 聽
聽聽聽 private Integer sum;
聽聽 聽
聽聽聽 public Result() {
聽聽聽聽聽聽聽 super();
聽聽聽 }
聽聽 聽
聽聽聽 public Result(Integer sum) {
聽聽聽聽聽聽聽 this.sum = sum;
聽聽聽 }

聽聽聽 public Integer getSum() {
聽聽聽聽聽聽聽 return sum;
聽聽聽 }

聽聽聽 public void setSum(Integer sum) {
聽聽聽聽聽聽聽 this.sum = sum;
聽聽聽 }
聽聽 聽
}

En el POM, modificamos el plugin tomee-maven-plugin para generar un jar que contendr谩 una versi贸n embebida de TomEE:

聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.tomee.maven</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>tomee-maven-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>7.0.3</version>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <context>microservice</context>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <tomeeClassifier>webprofile</tomeeClassifier>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <executions>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <execution>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <phase>package</phase>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <goals>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <goal>exec</goal>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </goals>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </execution>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </executions>聽聽聽聽聽聽 聽
聽聽聽聽聽聽聽聽聽聽聽 </plugin>

Construimos el proyecto y en el directorio target, veremos el siguiente contenido:

microservicio_1

El que nos interesa el jar cuyo nombre termina en 芦-exec禄. Este archivo contiene una versi贸n embebida de TomEE, junto con la aplicaci贸n web en la que se encuentra nuestro servicio. Para ejecutar el microservicio desde la consola, usamos el comando 芦java -jar microservice.example-1.0-ALPHA-exec.jar禄:

microservicio_2

El servicio arranca en el puerto 8080 por defecto. Para probarlo, desde el navegador introducimos la URL 芦http://localhost:8080/microservice/webresources/example/sum?n1=2&n2=5禄 y el resultado es:

microservicio_3

Nuestro nuevo microservicio est谩 funcionando. La configuraci贸n del plugin tomee-maven-plugin admite muchos par谩metros. En este documento hay m谩s informaci贸n sobre los mismos.

Por ejemplo, si queremos cambiar el puerto por defecto (8080) a un puerto diferente (8081), basta con a帽adir el par谩metro 芦tomeeHttpPort禄:

聽聽聽聽聽聽聽聽聽聽聽 <plugin>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <groupId>org.apache.tomee.maven</groupId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <artifactId>tomee-maven-plugin</artifactId>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <version>7.0.3</version>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <context>microservice</context>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <tomeeClassifier>webprofile</tomeeClassifier>
                    <tomeeHttpPort>8081</tomeeHttpPort>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </configuration>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <executions>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <execution>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <phase>package</phase>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <goals>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <goal>exec</goal>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </goals>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </execution>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 </executions>聽聽聽聽聽聽 聽
聽聽聽聽聽聽聽聽聽聽聽 </plugin>

Esperamos que este peque帽o post os haya sido de utilidad. Aqu铆 os dejamos el c贸digo fuente del ejemplo.

Comentarios ( 0 )

    Escribir un comentario

    Su dirección de correo no se publicará. Los campos requeridos están señalados *