Creando una función de Spring Cloud Function sobre Fn Project
Retomamos nuestras entradas sobre Fn Project, y si en la entrada anterior vimos cómo crear una función en Python en Fn, hoy os queremos contar cómo crear una función de Spring Cloud Function sobre el runtime de Fn.
Para ello, vamos a seguir una serie de pasos.
Preparación
Empezaremos arrancando Fn (en esta entrada os explicábamos cómo instalar Fn) de alguna de las siguientes maneras:
- Con «fn start» en Windows:
- Con «sudo fn start» en Linux:
Seguidamente, descargaremos la última imagen del runtime JDK para Java, que incluye el soporte Spring (para hacer el pull tendremos que haber hecho el login en Docker con «docker login»). Esto lo podremos hacer con:
docker pull fnproject/fn-java-fdk:1.0-latest
Crear la App y función
Para crear una función de tipo Spring Cloud Function, usaremos el Runtime Java lanzando algo de este tipo:
fn init --runtime java springcloudfunction-fn
Esto inicializará el runtime Java y creará la app de ejemplo. A continuación, crearemos la app con el siguiente comando:
fn create app springcloudfunction-app
Hecho esto, nos moveremos al directorio «springcloudfunction-fn», que habrá creado un archivo pom.xml (proyecto Maven), un func.yaml (Descriptor Fn) y una carpeta src para los fuentes (con una función y un test).
Para usar Spring Cloud Function, tendremos que añadir las dependencias en el pom.xml. Para eso, lo más sencillo es que copiemos las dependencias del repositorio de ejemplo de Spring Spring Cloud, que es un ejemplo de aplicación Spring Cloud Function, y concretamente añadiremos esta dependencia:
Nota: justo en el tiempo que escribía este artículo (versión 1.0.124) el proyecto fnproject ha pasado de com.fnproject.fn a io.fnproject.fn, por lo que es posible que necesitemos actualizar el pom.xml generado.
A continuación, cambiaremos la función de ejemplos que se ha creado previamente:
Vamos a convertirla en la siguiente:
Para comprobar que funciona correctamente, podemos ejecutar el Test:
Otra opción de la que disponemos es la de ejecutar un «mvn clean install»:
Hecho esto, ya podríamos hacer el build de nuestra función con un «fn build»:
Para llevar a cabo el deploy, lo conseguiremos mediante:
fn deploy --local --app springcloudfunction-app
¿Y cómo podemos invocarlo? Pues de dos formas muy sencillas:
fn invoke springcloudfunction-app springcloudfunction-fn (de fn invoke <app> <function>)
Otra posibilidad que tenemos es hacer un fn inspect function para extraer la URL directa de invocación:
fn inspect function springcloudfunction-app springcloudfunction-fn (de fn inspect function)
Para luego invocarlo con curl -X «POST» del estilo de_ http://localhost:8080/invoke/01F32KP510NG8G00GZJ0000002
Para acabar, crearemos un «Trigger HTTP» de nuestra función para poder invocarla desde http con una url tipo «http://localhost:8080/t/springcloudfunction-fn/hello». Para eso, en nuestra func.yml añadiremos lo siguiente:
Seguidamente, llevaremos a cabo un nuevo deploy:
fn deploy --local --app springcloudfunction-app
Comprobaremos que se ha creado el trigger sin problemas mediante:
fn list triggers springcloudfunction-app
Ahora, podremos invocar nuestra función a través de este endpoint con: curl -d «Luismi» -X «POST» http://localhost:8080/t/springcloudfunction-app/hello
Podéis encontrar el ejemplo completo creado en esta entrada en mi repositorio.