The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Funqy

Quarkus Funqy es parte de la estrategia sin servidor de Quarkus y tiene como objetivo proporcionar una API Java portátil para escribir funciones desplegables en varios entornos FaaS como AWS Lambda, Azure Functions, Google Cloud Functions, Knative y Knative Events (Cloud Events). También se puede utilizar como un servicio independiente.

Because Funqy is an abstraction that spans multiple different cloud/function providers and protocols it has to be a very simple API and thus, might not have all the features you are used to in other remoting abstractions. A nice side effect though is that Funqy is as optimized and as small as possible. This means that because Funqy sacrifices a little on flexibility, you’ll get a framework that has little to no overhead.

Fundamentos de Funqy

La API de Funqy es sencilla. Anote un método con @Funq. Este método sólo puede tener un parámetro de entrada opcional y puede o no devolver una respuesta.

import io.quarkus.funqy.Funq;

public class GreetingFunction {
    @Funq
    public String greet(String name) {
       return "Hello " + name;
    }
}

Las clases Java también pueden ser utilizadas como entrada y salida y deben seguir la convención de Java bean y tener un constructor por defecto. El tipo de Java que se declara como parámetro o tipo de retorno es el tipo que será esperado por el tiempo de ejecución de Funqy. Funqy hace una introspección de tipos en tiempo de construcción para acelerar el tiempo de arranque, por lo que cualquier tipo derivado no será notado por la capa de marshalling de Funqy en tiempo de ejecución.

Aquí hay un ejemplo de uso de un POJO como tipos de entrada y salida.

public class GreetingFunction {
    public static class Friend {
        String name;

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

    public static class Greeting {
        String msg;

        public Greeting() {}
        public Greeting(String msg) { this.msg = msg }

        public String getMessage() { return msg; }
        public void setMessage(String msg) { this.msg = msg; }
    }

    @Funq
    public Greeting greet(Friend friend) {
       return new Greeting("Hello " + friend.getName());
    }
}

Tipos reactivos asíncronos

Funqy admite el tipo reactivo Smallrye Mutiny Uni como tipo de retorno. El único requisito es que el Uni debe rellenar el tipo genérico.

import io.quarkus.funqy.Funq;
import io.smallrye.mutiny.Uni;

public class GreetingFunction {

    @Funq
    public Uni<Greeting> reactiveGreeting(String name) {
       ...
    }
}

Nombres de las funciones

The function name defaults to the method name and is case-sensitive. If you want your function referenced by a different name, parameterize the @Funq annotation as follows:

import io.quarkus.funqy.Funq;

public class GreetingFunction {

    @Funq("HelloWorld")
    public String greet(String name) {
       return "Hello " + name;
    }
}

Funqy DI

Cada clase Java de Funqy es un componente de Quarkus Arc y soporta la inyección de dependencia a través de CDI o Spring DI. Spring DI requiere incluir la dependencia de quarkus-spring-di en su construcción.

El ciclo de vida del objeto por defecto para una clase Funqy es @Dependent.

import io.quarkus.funqy.Funq;

import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingFunction {

    @Inject
    GreetingService service;

    @Funq
    public Greeting greet(Friend friend) {
        Greeting greeting = new Greeting();
        greeting.setMessage(service.greet(friend.getName()));
        return greeting;
    }
}

Inyección de contexto

The Funqy API will usually not allow you to inject or use abstractions that are specific to a protocol (i.e. HTTP) or function API (i.e. AWS Lambda). There are exceptions to the rule though, and you may be able to inject contextual information that is specific to the environment you are deploying in.

No recomendamos inyectar información contextual específica de un tiempo de ejecución. Mantenga sus funciones portátiles.

La información contextual se inyecta a través de la anotación @Context, que puede utilizarse en un parámetro de función o en un campo de clase. Un buen ejemplo es la interfaz io.quarkus.funqy.knative.events.CloudEvent que viene con nuestra integración Funqy Knative Cloud Events:

import io.quarkus.funqy.Funq;
import io.quarkus.funqy.Context;
import io.quarkus.funqy.knative.events.CloudEvent;

public class GreetingFunction {

    @Funq
    public Greeting greet(Friend friend, @Context CloudEvent eventInfo) {
        System.out.println("Received greeting request from: " eventInfo.getSource());

        Greeting greeting = new Greeting();
        greeting.setMessage("Hello " + friend.getName()));
        return greeting;
    }
}

¿Debo usar Funqy?

REST sobre HTTP se ha convertido en una forma muy común de escribir servicios en la última década. Aunque Funqy tiene un enlace HTTP, no es un sustituto de REST. Debido a que Funqy tiene que trabajar a través de una variedad de protocolos y plataformas de nube de funciones, es muy minimalista y limitado. Por ejemplo, si usted Funqy pierdes la capacidad de enlazar (piensa en URIs) a los datos que tus funciones escupen. También También se pierde la capacidad de aprovechar las características de HTTP como cache-control y GETs condicionales. Muchos desarrolladores de desarrolladores estarán de acuerdo con esto ya que muchos no utilizarán estas características o estilos REST/HTTP. Usted tendrá que tendrá que tomar la decisión de en qué campo se encuentra. Quarkus soporta la integración REST (a través de JAX-RS, Spring MVC, Vert.x Web, y Servlet) con varios proveedores de nube/función, pero hay algunas desventajas de usar ese enfoque también. Por ejemplo, si quieres hacer HTTP con AWS Lambda, esto requiere que uses el AWS API Gateway que puede ralentizar el despliegue y el tiempo de arranque en frío o incluso costarle más.

El propósito de Funqy es permitirte escribir funciones entre proveedores para que puedas dejar tu actual proveedor de funciones si, por ejemplo, empiezan a cobrarte mucho más por su servicio. Otra razón por la que podría no querer usar Funqy es si necesita acceder a APIs específicas del entorno de funciones de destino. Por ejemplo, los desarrolladores suelen querer acceder al Contexto de AWS en Lambda. En este caso, les decimos que puede ser mejor utilizar la integración de Quarkus Amazon Lambda en su lugar.