Spring Cloud Function 原生镜像

工程 | Dave Syer | 2020年5月4日 | ...

以下是 Spring Cloud Function 在 AWS Lambda 上内存与计费的最新图表。它显示了计费指标 GBsec 作为 Lambda 中内存分配的函数,用于两个自定义运行时,一个使用纯 Java,另一个使用GraalVM 原生镜像,如最近Andy Clement 在此博客中所述。

aws-billing-3.x

在这两种情况下,功能都是相同的(一个简单的 POJO 到 POJO 函数),并且它们都只显示冷启动的结果。暖启动(在请求到达时函数已处于活动状态)速度更快且成本更低(除了最小的内存设置外,所有函数的成本都相同,因为 AWS 对所有函数都有最低收费)。您可以看到原生镜像启动非常快,并且比常规 JVM 运行成本低两倍多。最快的启动是在 1000MB 容器中 - 应用程序启动仅需 19 毫秒,但 AWS 准备容器需要 700 毫秒,因此计费为 800 毫秒。实际上,所有原生镜像的冷启动都计费为 800 毫秒。对于常规 JVM,最快的启动也在 1000MB 容器中,为 300 毫秒,但计费为 2200 毫秒。

为了比较,这是我一年多前在 Spring Cloud Function 发布 2.0 版本时发布的类似图表。它显示了与 1.x 版本相比的重大改进,并且还具有我在这里再次使用的自定义运行时(因此橙色条与上图中的红色条等效)。

aws-billing

常规 JVM 中的自定义运行时在 3.x 版本中大致相同,但您可以以较低的内存设置使用它,因为从那时起已发布了 Spring Boot 优化。

构建示例

示例应用程序取自Spring Graal Native 功能,但已修改为 POJO 到 POJO 的函数,迫使 Spring 做一些额外的工作。因此,与 Github 中的示例相比,我修改了函数

class Foobar implements Function<Foo, Foo> {

	@Override
	public Foo apply(Foo input) {
		System.err.println("HI: " + input.getName());
		return new Foo("hi " + input.getName() + "!");
	}
}

其中 Foo 定义如下

class Foo {
	private String name;

	public String getName() {
		return name;
	}

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

	public Foo(String name) {
		this.name = name;
	}

	Foo() {
	}
}

并在主应用程序中注册函数

	@Override
	public void initialize(GenericApplicationContext context) {
		context.registerBean("foobar", FunctionRegistration.class,
				() -> new FunctionRegistration<>(new Foobar())
						.type(FunctionType.from(Foo.class).to(Foo.class)));
	}

请注意,我正在使用函数 Bean 注册样式,尽管对于如此简单的应用程序而言,这并没有太大区别。

我还必须修改测试以确保它们与新的 POJO 签名一起使用。如果您只想快速使用,则可以删除测试和 verify.sh 以避免执行此操作。如果您想了解我做了什么,请查看我 fork 中的foo 分支

然后我以与其他示例相同的方式构建了应用程序。这会创建原生镜像并将其转储到 target 目录中

$ ./build.sh

它还会创建一个 .zip 文件以上传到 AWS。这是一个常规 JVM 版本

$ ls -l target/*.zip
-rw-rw-r-- 1 dsyer dsyer 32577121 Apr 21 09:37 target/function-aws-0.0.1-SNAPSHOT-java-zip.zip

然后这会为原生镜像创建一个 .zip 文件

$ ./mvnw package -P native
$ ls -l target/*.zip
-rw-rw-r-- 1 dsyer dsyer 32577121 Apr 21 09:37 target/function-aws-0.0.1-SNAPSHOT-java-zip.zip
-rw-rw-r-- 1 dsyer dsyer 26284838 Apr 21 09:28 target/function-aws-0.0.1-SNAPSHOT-native-zip.zip

结论

使用 Spring Cloud Function 是一种开发在 AWS 和其他平台上运行的函数的非常方便的方式。如果您还使用实验性的 Spring Graal Native 功能项目将结果编译为原生二进制可执行文件,则它们可以比常规 JVM 上的相同应用程序运行得更快。请注意,在 Spring Graal Native 功能项目中还有另一个示例,它将函数转换为独立的 Web 应用程序(该示例也有函数 Bean 注册版本)。您可以在许多允许您“自带容器”的平台上运行它。

获取 Spring 电子报

与 Spring 电子报保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部