此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-function 4.1.4spring-doc.cn

部署打包函数

Spring Cloud Function 提供了一个“部署程序”库,允许您使用隔离的类加载器启动 jar 文件(或爆炸存档或 jar 文件集)并公开其中定义的函数。这是一个非常强大的工具,例如,它允许您使函数适应一系列不同的输入输出适配器,而无需更改目标 jar 文件。无服务器平台通常内置了此类功能,因此您可以将其视为此类平台中函数调用程序的构建块(实际上,Riff Java 函数调用程序使用此库)。spring-doc.cn

标准入口点是添加到 Classpath 中,部署程序启动并查找一些配置,告诉它在哪里可以找到函数 jar。spring-cloud-function-deployerspring-doc.cn

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-function-deployer</artifactId>
	<version>${spring.cloud.function.version}</version>
</dependency>

用户至少必须提供一个 URL,这是包含的存档的 URL 或资源位置 功能。它可以选择使用前缀通过依赖项查找来定位构件(请参阅完整详细信息)。Spring Boot 应用程序是从 jar 文件引导的,使用 来定位 start 类,因此 例如,标准的 Spring Boot fat jar 运行良好。如果目标 jar 可以成功启动,则结果为函数 在主应用程序的 .已注册的函数可以通过主应用程序中的代码应用,即使 它是在隔离的类加载器中创建的(默认情况下)。spring.cloud.function.locationmaven:FunctionPropertiesMANIFEST.MFFunctionCatalogspring-doc.cn

以下是部署包含“大写”函数的 JAR 并调用它的示例。spring-doc.cn

@SpringBootApplication
public class DeployFunctionDemo {

	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(DeployFunctionDemo.class,
				"--spring.cloud.function.location=..../target/uppercase-0.0.1-SNAPSHOT.jar",
				"--spring.cloud.function.definition=uppercase");

		FunctionCatalog catalog = context.getBean(FunctionCatalog.class);
		Function<String, String> function = catalog.lookup("uppercase");
		System.out.println(function.apply("hello"));
	}
}

下面是使用 Maven URI 的示例(取自 中的一个测试):FunctionDeployerTestsspring-doc.cn

@SpringBootApplication
public class DeployFunctionDemo {

	public static void main(String[] args) {
		String[] args = new String[] {
				"--spring.cloud.function.location=maven://oz.demo:demo-uppercase:0.0.1-SNAPSHOT",
				"--spring.cloud.function.function-class=oz.demo.uppercase.MyFunction" };

		ApplicationContext context = SpringApplication.run(DeployerApplication.class, args);
		FunctionCatalog catalog = context.getBean(FunctionCatalog.class);
		Function<String, String> function = catalog.lookup("myFunction");

		assertThat(function.apply("bob")).isEqualTo("BOB");
	}
}

请记住,本地和远程存储库、用户、密码等 Maven 资源使用默认 MavenProperties 解析,这些 有效地使用本地默认值,并且适用于大多数情况。但是,如果需要自定义,只需提供一个 类型的 bean,即可在其中设置其他属性(请参阅下面的示例)。MavenPropertiesspring-doc.cn

@Bean
public MavenProperties mavenProperties() {
	MavenProperties properties = new MavenProperties();
	properties.setLocalRepository("target/it/");
	return properties;
}

支持的打包方案

目前 Spring Cloud Function 支持多种打包场景,以便在部署函数时为您提供最大的灵活性。spring-doc.cn

简单 JAR

此打包选项意味着不依赖于与 Spring 相关的任何内容。 例如;请考虑此类 JAR 包含以下类:spring-doc.cn

. . .
public class UpperCaseFunction implements Function<String, String> {
	@Override
	public String apply(String value) {
		return value.toUpperCase();
	}
}

您需要做的就是在部署此类包时指定 and properties:locationfunction-classspring-doc.cn

--spring.cloud.function.location=target/it/simplestjar/target/simplestjar-1.0.0.RELEASE.jar
--spring.cloud.function.function-class=function.example.UpperCaseFunction

在某些情况下,您可能希望将多个函数打包在一起。对于此类方案,可以使用 property 列出多个类,用 分隔它们。spring.cloud.function.function-class;spring-doc.cn

--spring.cloud.function.function-class=function.example.UpperCaseFunction;function.example.ReverseFunction

在这里,我们确定了两个要部署的函数,我们现在可以在函数目录中按名称访问它们(例如,)。catalog.lookup("reverseFunction");spring-doc.cn

有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。spring-doc.cn

从 3.1.4 版本开始,您可以通过 [功能 Component Scan] 中描述的组件扫描功能来简化您的配置。如果你将函数类放在 包中,您可以省略属性,因为框架将自动发现函数类,在函数目录中加载它们。 请记住执行函数查找时要遵循的命名约定。例如,函数 class 将在名称 下可用。functionsspring.cloud.function.function-classfunctions.UpperCaseFunctionFunctionCatalogupperCaseFunctionspring-doc.cn

Spring Boot JAR

此打包选项意味着存在对 Spring Boot 的依赖关系,并且 JAR 是作为 Spring Boot JAR 生成的。也就是说,鉴于部署的 JAR 运行在隔离的类加载器中,不会与实际部署程序使用的 Spring Boot 版本发生任何版本冲突。 例如;考虑这样的 JAR 包含以下类(如果 Spring/Spring Boot 在 Classpath 上,则它可能具有一些额外的 Spring 依赖项):spring-doc.cn

. . .
public class UpperCaseFunction implements Function<String, String> {
	@Override
	public String apply(String value) {
		return value.toUpperCase();
	}
}

和以前一样,你需要做的就是在部署这样的包时指定 和 properties:locationfunction-classspring-doc.cn

--spring.cloud.function.location=target/it/simplestjar/target/simplestjar-1.0.0.RELEASE.jar
--spring.cloud.function.function-class=function.example.UpperCaseFunction

有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。spring-doc.cn

Spring Boot 应用程序

此打包选项意味着您的 JAR 是完整的独立 Spring Boot 应用程序,其功能与托管的 Spring bean 相同。 和以前一样,有一个明显的假设,即存在对 Spring Boot 的依赖性,并且 JAR 是作为 Spring Boot JAR 生成的。也就是说,鉴于部署的 JAR 运行在隔离的类加载器中,不会与实际部署程序使用的 Spring Boot 版本发生任何版本冲突。 例如;请考虑此类 JAR 包含以下类:spring-doc.cn

. . .
@SpringBootApplication
public class SimpleFunctionAppApplication {

	public static void main(String[] args) {
		SpringApplication.run(SimpleFunctionAppApplication.class, args);
	}

	@Bean
	public Function<String, String> uppercase() {
		return value -> value.toUpperCase();
	}
}

鉴于我们正在有效地处理另一个 Spring Application 上下文,并且函数是 Spring 托管的 bean, 除了 property 之外,我们还指定了 property 而不是 。locationdefinitionfunction-classspring-doc.cn

--spring.cloud.function.location=target/it/bootapp/target/bootapp-1.0.0.RELEASE-exec.jar
--spring.cloud.function.definition=uppercase

有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。spring-doc.cn

这个特定的部署选项在其 Classpath 上可能有也可能没有 Spring Cloud Function。从部署者的角度来看,这并不重要。