随着无服务器开发的日益普及以及多云和混合云架构的更多采用,平台之间的竞争也日益激烈。这为开发人员提供了许多关于在何处在无服务器平台上运行函数的选择,从公共托管服务到本地 Kubernetes。
如果您读过我之前关于 Java 无服务器的文章,您会了解到如何开始使用 Quarkus 开发 Java 无服务器函数,以及如何优化这些无服务器函数以在 Kubernetes 上运行。那么,接下来您应该做些什么来使您的无服务器函数更好地适应您可用的众多选择呢?
作为一个线索,想想为什么 Linux 容器(Docker、LXC、cri-o)变得如此流行:可移植性。正是可移植性使容器成为事实上的打包技术,用于将事物从开发人员的本地机器大规模迁移到 Kubernetes 环境。这意味着开发人员和运维人员无需担心开发环境和生产环境之间的不兼容性和不一致性。
为了采用多云和混合云架构,无服务器函数开发也应考虑这些容器可移植性优势。如果没有可移植性,开发人员在跨多个无服务器运行时开发和部署相同的无服务器函数时,可能必须学习和使用不同的 API、命令行界面 (CLI) 工具和软件开发工具包 (SDK)。资源有限(例如,时间、精力、成本和人力资源)的开发人员将被这些选项淹没,以至于他们会发现难以选择最佳选项。

(Daniel Oh,CC BY-SA 4.0)
下次您踏入无服务器舞池时,请使用 Funqy
Quarkus Funqy 扩展支持可移植的 Java API,供开发人员编写无服务器函数并将其部署到异构无服务器运行时,包括 AWS Lambda、Azure Functions、Google Cloud 和 Knative。它也可以作为独立服务使用。Funqy 帮助开发人员在无服务器舞池中翩翩起舞,而无需更改代码。
这是一个关于如何使用 Quarkus Funqy 构建可移植无服务器函数的快速示例。
1. 创建 Quarkus Funqy Maven 项目
生成一个 Quarkus 项目 (quarkus-serverless-func
) 以创建一个带有 Funqy 扩展的简单函数
$ mvn io.quarkus:quarkus-maven-plugin:1.13.6.Final:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=quarkus-serverless-func \
-Dextensions="funqy-http" \
-DclassName="org.acme.getting.started.GreetingResource"
2. 在本地运行无服务器函数
打开 src/main/java/org/acme/getting/started
目录中的 Funqy.java
文件
public class Funqy {
private static final String CHARM_QUARK_SYMBOL = "c";
@Funq (1)
public String charm(Answer answer) { (2)
return CHARM_QUARK_SYMBOL.equalsIgnoreCase(answer.value) ? "You Quark!" : "? Wrong answer";
}
public static class Answer {
public String value; (3)
}
}
在上面的代码中
(1) 注解使该方法成为基于 Funqy API 的可暴露函数。默认情况下,函数名称等同于方法名称 (charm
)。
(2) 指示 Java 类 (Answer
) 作为输入参数,String
类型作为输出。
(3) 当调用函数时,应参数化 value
。
注意:Funqy 在构建时进行类型内省以加快启动时间,因此 Funqy 编组层不会在运行时注意到任何派生类型。
通过 Quarkus Dev Mode 运行函数
$ ./mvnw quarkus:dev
输出应如下所示
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO [io.quarkus] (Quarkus Main Thread) quarkus-serverless-func 1.0.0-SNAPSHOT on JVM (powered by Quarkus x.x.x.) started in 2.908s. Listening on: http://localhost:8080
INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, kubernetes]
现在该函数正在您的本地开发环境中运行。使用 RESTful API 访问该函数
$ http://localhost:8080/charm?value=s
输出应为
? Wrong answer
如果您将 value=c
作为参数传递下去,您将看到
You Quark!
3. 选择一个无服务器平台来部署 Funqy 函数
现在,当您在下图中添加 Quarkus Funqy 扩展之一时,您可以将可移植函数部署到您首选的无服务器平台。优势在于您无需更改代码;您只需要调整一些配置,例如函数导出和目标无服务器平台。

(Daniel Oh,CC BY-SA 4.0)
尝试使用 Knative Serving 部署该函数(如果您已将其安装在您的 Kubernetes 集群中)。将以下扩展添加到 Quarkus Funqy 项目
$ ./mvnw quarkus:add-extension -Dextensions="kubernetes,container-image-docker"
打开 src/main/resources/
目录中的 application.properties
文件。然后添加以下变量以配置 Knative 和 Kubernetes 资源——确保将 changeit
替换为您的容器注册表组名(DockerHub 中的用户名)
quarkus.container-image.build=true
quarkus.container-image.group=changeit
quarkus.container-image.push=true
quarkus.container-image.builder=docker
quarkus.kubernetes.deployment-target=knative
容器化该函数,然后将其推送到外部容器注册表
$ ./mvnw clean package
输出应以 BUILD SUCCESS
结尾。然后将在 target/kubernetes
目录中生成一个 knative.yml
文件。现在您应该可以使用以下命令创建一个带有该函数的 Knative 服务(确保登录到 Kubernetes 集群并更改您要创建 Knative 服务的命名空间)
$ kubectl create -f target/kubernetes/knative.yml
输出应如下所示
service.serving.knative.dev/quarkus-serverless-func created
4. 在 Kubernetes 中测试 Funqy 函数
获取函数的 REST API 并记下其输出
$ kubectl get rt
NAME URL READY REASON
quarkus-serverless-func http://quarkus-serverless-func-YOUR_HOST_DOMAIN True
使用 curl
命令快速访问该函数
$ http://http://quarkus-serverless-func-YOUR_HOST_DOMAIN/charm?value=c
您会看到与本地相同的输出
You Quark!
注意:由于 Knative Serving 的默认行为,该函数将在 30 秒内缩减到零。在这种情况下,当 REST API 被调用时,Pod 将自动扩容。
接下来是什么?
您已经了解了开发人员如何使用 Quarkus 创建可移植的 Java 无服务器函数,并将它们跨无服务器平台(例如,带有 Kubernetes 的 Knative)部署。Quarkus 使开发人员能够避免在创建相同的函数并将其部署到多个无服务器平台时产生冗余。我将在本系列的下一篇文章中解释如何使用 Java 和 Knative 启用 CloudEvents Bind。
评论已关闭。