对于最新的稳定版本,请使用 spring-cloud-function 4.3.0! |
部署打包函数
Spring Cloud Function 提供了一个“部署器”库,允许您使用隔离的类加载器启动 jar 文件(或分解的存档,或一组 jar 文件)并公开其中定义的函数。这是一个非常强大的工具,例如,它允许您在不更改目标 jar 文件的情况下使函数适应一系列不同的输入输出适配器。无服务器平台通常内置了这种功能,因此您可以将其视为此类平台中函数调用器的构建块(实际上 Riff Java 函数调用器使用此库)。
标准入口是添加spring-cloud-function-deployer
到类路径,部署程序启动并查找一些配置来告诉它在哪里可以找到函数 jar。
<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 可以成功启动,则结果是一个函数
在主应用程序的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 解析的,该 MavenProperties
有效地使用本地默认值,并且适用于大多数情况。但是,如果您需要自定义,您可以简单地提供类型MavenProperties
您可以在其中设置其他属性(请参阅下面的示例)。
@Bean
public MavenProperties mavenProperties() {
MavenProperties properties = new MavenProperties();
properties.setLocalRepository("target/it/");
return properties;
}
支持的打包方案
目前,Spring Cloud Function 支持多种打包场景,让您在部署函数时具有最大的灵活性。
简单罐
此打包选项意味着不依赖于与 Spring 相关的任何内容。 例如;假设这样的 JAR 包含以下类:
. . .
public class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String value) {
return value.toUpperCase();
}
}
您需要做的就是指定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
在某些情况下,您可能希望将多个函数打包在一起。对于此类方案,您可以使用spring.cloud.function.function-class
属性列出几个类,用 来分隔它们。;
例如
--spring.cloud.function.function-class=function.example.UpperCaseFunction;function.example.ReverseFunction
在这里,我们确定了两个要部署的函数,我们现在可以在函数目录中按名称访问它们(例如catalog.lookup("reverseFunction");
).
有关更多详细信息,请参阅此处提供的完整示例。 您还可以在 FunctionDeployerTests 中找到相应的测试。
-
组件扫描*
从 3.1.4 版本开始,您可以通过 [功能组件扫描] 中描述的组件扫描功能来简化配置。如果将函数类放在
名为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 在类路径上,它可能有一些额外的 Spring 依赖项):
. . .
public class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String value) {
return value.toUpperCase();
}
}
和以前一样,您需要做的就是指定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,
除了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 中找到相应的测试。
这个特定的部署选项的类路径上可能有也可能没有 Spring Cloud Function。从部署者的角度来看,这并不重要。 |