此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-function 4.1.4! |
部署打包函数
Spring Cloud Function 提供了一个“部署程序”库,允许您使用隔离的类加载器启动 jar 文件(或爆炸存档或 jar 文件集)并公开其中定义的函数。这是一个非常强大的工具,例如,它允许您使函数适应一系列不同的输入输出适配器,而无需更改目标 jar 文件。无服务器平台通常内置了此类功能,因此您可以将其视为此类平台中函数调用程序的构建块(实际上,Riff Java 函数调用程序使用此库)。
标准入口点是添加到 Classpath 中,部署程序启动并查找一些配置,告诉它在哪里可以找到函数 jar。spring-cloud-function-deployer
<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.location
maven:
FunctionProperties
MANIFEST.MF
FunctionCatalog
以下是部署包含“大写”函数的 JAR 并调用它的示例。
@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
@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,即可在其中设置其他属性(请参阅下面的示例)。MavenProperties
@Bean
public MavenProperties mavenProperties() {
MavenProperties properties = new MavenProperties();
properties.setLocalRepository("target/it/");
return properties;
}
支持的打包方案
目前 Spring Cloud Function 支持多种打包场景,以便在部署函数时为您提供最大的灵活性。
简单 JAR
此打包选项意味着不依赖于与 Spring 相关的任何内容。 例如;请考虑此类 JAR 包含以下类:
. . .
public class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String value) {
return value.toUpperCase();
}
}
您需要做的就是在部署此类包时指定 and properties:location
function-class
--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.cloud.function.function-class=function.example.UpperCaseFunction;function.example.ReverseFunction
在这里,我们确定了两个要部署的函数,我们现在可以在函数目录中按名称访问它们(例如,)。catalog.lookup("reverseFunction");
有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。
-
组件扫描*
从 3.1.4 版本开始,您可以通过 [功能 Component Scan] 中描述的组件扫描功能来简化您的配置。如果你将函数类放在
包中,您可以省略属性,因为框架将自动发现函数类,在函数目录中加载它们。
请记住执行函数查找时要遵循的命名约定。例如,函数 class 将在名称 下可用。functions
spring.cloud.function.function-class
functions.UpperCaseFunction
FunctionCatalog
upperCaseFunction
Spring Boot JAR
此打包选项意味着存在对 Spring Boot 的依赖关系,并且 JAR 是作为 Spring Boot JAR 生成的。也就是说,鉴于部署的 JAR 运行在隔离的类加载器中,不会与实际部署程序使用的 Spring Boot 版本发生任何版本冲突。 例如;考虑这样的 JAR 包含以下类(如果 Spring/Spring Boot 在 Classpath 上,则它可能具有一些额外的 Spring 依赖项):
. . .
public class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String value) {
return value.toUpperCase();
}
}
和以前一样,你需要做的就是在部署这样的包时指定 和 properties:location
function-class
--spring.cloud.function.location=target/it/simplestjar/target/simplestjar-1.0.0.RELEASE.jar
--spring.cloud.function.function-class=function.example.UpperCaseFunction
有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。
Spring Boot 应用程序
此打包选项意味着您的 JAR 是完整的独立 Spring Boot 应用程序,其功能与托管的 Spring bean 相同。 和以前一样,有一个明显的假设,即存在对 Spring Boot 的依赖性,并且 JAR 是作为 Spring Boot JAR 生成的。也就是说,鉴于部署的 JAR 运行在隔离的类加载器中,不会与实际部署程序使用的 Spring Boot 版本发生任何版本冲突。 例如;请考虑此类 JAR 包含以下类:
. . .
@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 而不是 。location
definition
function-class
--spring.cloud.function.location=target/it/bootapp/target/bootapp-1.0.0.RELEASE-exec.jar
--spring.cloud.function.definition=uppercase
有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。
这个特定的部署选项在其 Classpath 上可能有也可能没有 Spring Cloud Function。从部署者的角度来看,这并不重要。 |