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 jakarta.inject.Inject;
import jakarta.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 over HTTP has become a very common way to write services over the past decade. While Funqy
has an HTTP binding it is not a replacement for REST. Because Funqy has to work across a variety
of protocols and function cloud platforms, it is very minimalistic and constrained. For example, if you
use Funqy you lose the ability to link (think URIs) to the data your functions spit out. You also
lose the ability to leverage cool HTTP features like cache-control
and conditional GETs. Many
developers will be ok with that as many won’t be using these REST/HTTP features or styles. You’ll
have to make the decision on what camp you are in. Quarkus does support REST integration (through Jakarta REST,
Spring MVC, Vert.x Web, and Servlet) with
various cloud/function providers, but there are some disadvantages of using that approach as well. For example,
if you want to do HTTP with AWS Lambda, this requires you to use the AWS API Gateway which may
slow down deployment and cold start time or even cost you more.
The purpose of Funqy is to allow you to write cross-provider functions so that you can move off of your current function provider if, for instance, they start charging you a lot more for their service. Another reason you might not want to use Funqy is if you need access specific APIs of the target function environment. For example, developers often want access to the AWS Context on Lambda. In this case, we tell them they may be better off using the Quarkus AWS Lambda integration instead.