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 *