部署打包的函数

Spring Cloud Function 提供了一个名为"deployer"的库,允许你使用一个隔离类加载器启动一个 jar 文件(或展开的存档,或一组 jar 文件),并暴露其中定义的函数。这是一项非常强大的工具,允许你,例如,将函数适配到不同的输入-输出适配器,而无需更改目标 jar 文件。许多无服务器平台都内置了这种功能,因此你可以将其视为在这些平台中构建函数调用器的构建块(事实上,Riff 的 Java 函数调用器就使用了这个库)。spring-doc.cadn.net.cn

标准入口点是向classpath添加spring-cloud-function-deployer,部署者启动并查找一些配置来告诉它在哪里找到函数jar。spring-doc.cadn.net.cn

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

用户至少必须提供一个spring.cloud.function.location,这是一个包含函数的存档的URL或资源位置。它可以可选地使用maven:前缀从依赖关系查找中查找构件(有关完整信息,请参见FunctionProperties)。Spring Boot应用程序从jar文件引导,使用MANIFEST.MF来定位启动类,以便标准Spring Boot胖jar可以很好地工作,例如。如果可以成功启动目标jar,则结果是在主应用程序的FunctionCatalog中注册一个函数。可以在主应用程序中通过代码应用已注册的函数,即使它是在默认情况下隔离的类加载器中创建的)。spring-doc.cadn.net.cn

这里是部署一个包含 'uppercase' 函数的 JAR 并调用它的示例。spring-doc.cadn.net.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的一个例子(取自FunctionDeployerTests中的一个测试用例):spring-doc.cadn.net.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 解析的。这些默认值通常适用于大多数情况。但是,如果您需要进行自定义配置,可以简单地提供一个 MavenProperties 类型的 bean,在其中您可以设置额外的属性(请参阅下面的例子)。spring-doc.cadn.net.cn

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

支持的打包场景

当前,Spring Cloud Function支持多种打包方案,为您提供最大的灵活性,以便在部署功能时。spring-doc.cadn.net.cn

Simple JAR

此打包选项意味着不依赖于与Spring相关的任何内容。<br/> 例如;假设此JAR包含以下类:spring-doc.cadn.net.cn

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

所有您需要做的就是在部署此类包时指定locationfunction-class属性:
spring-doc.cadn.net.cn

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

在某些情况下,您可能会希望一起打包多个函数。对于这些场景,您可以使用 code>0属性列出多个类,它们用 code>1分隔。spring-doc.cadn.net.cn

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

此处我们确定了两个要部署的功能,现在可以按名称(例如 0)在功能目录中访问它们。spring-doc.cadn.net.cn

有关更多详细信息,请参考完整的示例,该示例可在此处找到。您还可以在功能部署器测试中找到相应的测试。spring-doc.cadn.net.cn

自版本 3.1.4 起,您可以使用组件扫描功能简化配置,如所述。如果您将函数类放在名为functions的包中,可以省略spring.cloud.function.function-class属性,因为框架会自动发现函数类并将其加载到函数目录中。 记住在执行函数查找时要遵循的命名约定。例如,函数类functions.UpperCaseFunction将在FunctionCatalog下可用,名为upperCaseFunctionspring-doc.cadn.net.cn

Spring Boot JAR

此打包选项表示存在对 Spring Boot 的依赖关系,并且 JAR 是作为 Spring Boot JAR 生成的。也就是说,鉴于部署的 JAR 在隔离类加载器中运行,与部署程序使用的 Spring Boot 版本之间不会有任何版本冲突。例如; 考虑这样的 JAR 包含以下类(该类可能提供一些附加的 Spring 依赖项,只要 Spring /Spring Boot 在类路径上):spring-doc.cadn.net.cn

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

与之前一样,只需在部署此类软件包时指定locationfunction-class属性即可:spring-doc.cadn.net.cn

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

有关更多详细信息,请参考完整的示例,该示例可在此处找到。您还可以在功能部署器测试中找到相应的测试。spring-doc.cadn.net.cn

Spring Boot 应用程序

此打包选项意味着您的 JAR 是具有作为管理 Spring Bean 功能的完全独立的 Spring Boot 应用程序。就像以前一样,很明显有一个对 Spring Boot 的依赖项,并且该 JAR 以 Spring Boot JAR 格式生成。也就是说,考虑到部署的 JAR 在隔离类加载器中运行,在使用实际部署程序的 Spring Boot 版本时不会有任何版本冲突。例如;考虑这样的 JAR 包含以下类:spring-doc.cadn.net.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应用上下文,而且函数是spring管理的bean,除了location属性外,我们还指定definition属性而不是function-classspring-doc.cadn.net.cn

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

有关更多详细信息,请参考完整的示例,该示例可在此处找到。您还可以在功能部署器测试中找到相应的测试。spring-doc.cadn.net.cn

此特定部署选项可能在其类路径中包含Spring Cloud Function。从部署程序的角度来看,这并不重要。