Si en este post explicábamos la base de Spring Cloud Function hoy toca ver cómo crear una función Spring Cloud Function sobre el runtime de Fn.
Para eso seguiremos estos pasos:
PASOS PREVIOS:
- Arranco Fn (en este post explicábamos cómo instalar Fn)
fn start
O sudo fn start en Linux
- Me descargo la última imagen del runtime JDK para Java que incluye el soporte Spring (para hacer el pull tendréis que haber hecho el login en Docker con docker login)
docker pull fnproject/fn-java-fdk:1.0-latest
CREAR APP Y FUNCIÓN
- Para crear una función de tipo Spring Cloud Function usaré el Runtime Java lanzando algo tipo::
fn init –runtime java springcloudfunction-fn
Esto inicializará el runtime Java y creará la app de ejemplo.
Luego creo la app con fn create app springcloudfunction-app
- Me muevo al directorio springcloudfunction-fn, que habrá creado un 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 tengo que añadir las dependencias en el pom.xml, para eso lo más sencillo es que copiemos las dependencias del repositorio https://github.com/fnproject/fn-spring-cloud-function-example que es un ejemplo de aplicación Spring Cloud Function, concretamente añadiré 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 necesitéis actualizar el pom.xml generado.
- Ahora cambiaré la función de ejemplo que se ha creado,
Convirtiéndola en
- Puedo ejecutar el Test para comprobar que la función ejecuta:
Y
O hacer un mvn clean install
- Ahora ya puedo hacer el build de mi función con fn build
- Y hacer el deploy con fn deploy –local –app springcloudfunction-app
- Para invocarlo puedo usar fn invoke springcloudfunction-app springcloudfunction-fn (de fn invoke <app> <function>)
O
- O bien hacer un fn inspect function springcloudfunction-app springcloudfunction-fn (de fn inspect function <app> <function>) para extraer la URL directa de invocación:
E invocarlo con curl -X «POST» http://localhost:8080/invoke/01F32KP510NG8G00GZJ0000002
- Para acabar crearé un Trigger HTTP de mi función para poder invocarla desde http con una url tipo http://localhost:8080/t/springcloudfunction-fn/hello
Para eso en mi func.yml añadiré esto:
Haré un nuevo deploy: fn deploy –local –app springcloudfunction-app
Y comprobaré que se ha creado el trigger: fn list triggers springcloudfunction-app
Ahora podré invocar mi 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 este post aquí: https://github.com/lmgracia/fn_project-spring-cloud-function_example