Payara Hello-World

Ya sabia que no iban a dejar morir así como así a JEE, ahora que ya es mas independiente de Oracle seguramente evolucionara mas rápido de lo que lo había hecho, uno de los primeros servidores que me llamo mucho la atención fue Glassfish, cuando fue lanzado era el mas avanzado en JEE en su momento, creo que lo sigue siendo ya que todas las especificaciones de JEE se crean primero ahi, aunque ya no tiene soporte por parte de una empresa como lo era entonces SUN, desde luego Oracle no iba a hacerlo competir con Websphere, tan caro que les salió comprarselo a BEA.

Pero bueno pasado es pasado y los servidores JEE parecería que solo seguirían vivos en los ambientes viejos y que pocas veces cambian como bancos o empresas de seguros (donde todavía se puede encontrar AS400 y muchas cajeros corriendo Windows XP). A quien le suena el requerimiento: queremos que la aplicación funcione con las tecnologías mas modernas pero en IE6 o IE7 ?

Hace dos años me toco algo no tan extremista, pero aun teniendo estadísticas de que solo 3 clientes de mas de 2000 usaban IE9, querían que la aplicación soportara IE9. Ya me desvie del tema contando mis traumas, el caso es que yo quería compartir si es que no lo saben que Glassfish sigue siendo el servidor de referencia de JEE y una empresa lo tomo como base y creo algo bastante bastante interesante, se llama Payara y es como Glassfish con esteroides y soporte.

Y en esta época donde Nodejs y Go andan como de moda, por la onda de microservicios porque voltearíamos a ver a los viejos servidores JEE. La respuesta es porque ya no son las estructuras monolitcas que solían ser y escribir aplicaciones para estos ya no son los cientos de configuraciones que se tenían antes.

Claro que siguen siendo grandes, robustos y con muchas configuraciones, pero gracias a la ola de microservicios también hay versiones ligeras, que es en lo que me voy a enfocar. Payara ofrece una version ligera de su servidor llamada micro y tiene implementadas las siguientes especificaciones:

  • JAX-RS 2.1
  • CDI 2.0
  • JSON-P 1.1
  • Common Annotations 1.3
  • JSON-B 1.0
  • Config 1.3
  • Metrics 1.1
  • Health Check 1.0
  • Fault Tolerance 1.1
  • JWT Authentication 1.1
  • OpenAPI 1.0
  • Rest Client 1.1

Para probarlo vamos a crear un servicio Rest hello world.

Crear el proyecto

Creamos un proyecto en blanco con Gradle y Kotlin support como lo hicimos en el post de Camel con Kotlin pero le cambiamos de nombre al proyecto; las dependencias de camel y otras cosas no las agregamos en el archivo build.gradle, en su lugar agregamos la dependencia:

compileOnly group: 'org.eclipse.microprofile', name: 'microprofile', version: ‘1.3

debajo de sourceCompatibility = 1.8 agregamos

apply plugin: 'war'

y al final de archivo pegamos:

sourceSets {
    main {
        kotlin {
            srcDir "src/main/kotlin"
        }
    }
    test {
        kotlin {
            srcDir "test/main/kotlin"
        }
    }
}

Eso solo para generar el archivo war y obtener todas la dependencias de Payara en tiempo de compilación.

Creamos un Kotlin file en la carpeta Kotlin de nombre MessageApplication que sera el punto de entrada de nuestros servicios y pegamos el siguiente contenido:

import questionModule.QuestionService
import java.util.HashSet
import javax.ws.rs.ApplicationPath
import javax.ws.rs.core.Application

@ApplicationPath(“/services”)
class MessageApplication : Application() {
    private val singletons = HashSet<Any>()

    init {
        singletons.add(HelloService())
    }

    override fun getSingletons(): Set<Any> {
        return singletons
    }
}

Ahora crearemos un servicio que diga hello world en el path /hello/world, para eso creamos un Kotlin file de nombre HelloService con el siguiente contenido:

import javax.ws.rs.*
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.Response

@Path("/hello")
class HelloService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/world")
    fun getAllQuestions(): Response = Response.status(200).entity("Hello World").build()

}

Y eso es todo :D solo falta probar el servicio; para generar el war nos vamos terminal y de ahi a la ruta del proyecto y ejecutamos la siguiente instrucción:

gradle war

Eso va a crear la carpeta build/libs y ahi estará nuestro war que deberá pesar menos de 10Mb, copiamos ese war y lo ponemos en la misma carpeta donde tengamos nuestro jar de Payara micro y ejecutamos la siguiente instrucción en la terminal:

java -jar payara-micro-5.183.jar --deploy ./PayaraMicro-0.0.1.war

Listo, con eso la salida en algún momento de la consola dira:

{
    "Instance Configuration": {
        "Host": "10.237.97.147",
        "Http Port(s)": "8080",
        "Https Port(s)": "",
        "Instance Name": "Talented-Squeaker",
        "Instance Group": "MicroShoal",
        "Hazelcast Member UUID": "b700b47d-4299-4f88-aab8-a6a9c581c4bd",
        "Deployed": [
            {
                "Name": "PayaraMicro-0.0.1",
                "Type": "war",
                "Context Root": "/PayaraMicro-0.0.1"
            }
        ]
    }
}]]

[2018-09-07T16:46:33.072-0500] [] [INFO] [] [PayaraMicro] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1536356793072] [levelValue: 800] [[
 
Payara Micro URLs:
http://10.237.97.147:8080/PayaraMicro-0.0.1

'PayaraMicro-0.0.1' REST Endpoints:
GET     /PayaraMicro-0.0.1/services/application.wadl

]]

Ahora si nos vamos a nuestro navegador en el host y puerto que dice ahi con el path que definimos http://10.237.97.147:8080/PayaraMicro-0.0.1/services/hello/world en mi caso, deberemos de obtener la respuesta esperada

Como siguientes pasos voy a crear una aplicacion completa desde el front con React hasta consultas a Mysql, eso en los siguientes posts.