|
该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-function 5.0.0! |
部署打包函数
Spring Cloud Function 提供了一个“部署器”库,允许你用隔离类加载器启动 jar 文件(或爆炸归档,或一组 jar 文件),并公开其中定义的函数。这是一个相当强大的工具,例如可以让你在不更改目标jar文件的情况下,将函数适配到各种不同的输入输出适配器上。无服务器平台通常内置了这类功能,所以你可以把它看作是该平台函数调用器的构建模块(实际上 Riff Java 函数调用器就用了这个库)。
标准的切入点是添加Spring-Cloud-function-deployer对于classpath,部署器会介入,寻找某种配置来告诉它函数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或资源位置
功能。它可以选择使用梅文:前缀通过依赖查找定位工件(参见函数属性完整细节)。Spring Boot 应用程序是从 jar 文件启动的,使用清单。双重要定位起始类,所以
比如说,标准的Spring Boot胖罐子效果很好。如果目标罐能够成功启动,则结果为函数
注册在主应用中功能目录.注册函数可以通过主应用程序中的代码应用,尽管
它是在一个孤立的类加载器中创建的(默认情况下)。
这里是一个部署包含“大写”函数的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(梅文属性)你可以设置额外的属性(见下文示例)。
@Bean
public MavenProperties mavenProperties() {
MavenProperties properties = new MavenProperties();
properties.setLocalRepository("target/it/");
return properties;
}
支持的打包场景
目前 Spring Cloud Function 支持多种打包场景,以提供部署函数的最大灵活性。
简单JAR
这种打包选项并不意味着依赖任何与春季相关的内容。 例如;考虑该JAR包含以下类:
. . .
public class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String value) {
return value.toUpperCase();
}
}
你只需要具体说明位置和函数类部署此类软件包时的属性:
--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版本起,您可以通过[功能组件扫描]中描述的组件扫描功能简化配置。如果你把函数类放在
名为功能,你可以省略spring.cloud.function.function-class作为框架的属性会自动发现函数类,加载到函数目录中。
在做函数查找时,请记住应遵循的命名规范。例如函数类功能。大写功能将于功能目录以大写功能.
Spring靴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();
}
}
和之前一样,你只需要具体说明位置和函数类部署此类软件包时的属性:
--spring.cloud.function.location=target/it/simplestjar/target/simplestjar-1.0.0.RELEASE.jar
--spring.cloud.function.function-class=function.example.UpperCaseFunction
欲了解更多细节,请参阅此处完整样本。 你也可以在 FunctionDeployerTests 中找到对应的测试。
Spring靴应用
这种打包选项意味着你的JAR是一个完整的独立Spring Boot应用程序,功能是托管的Spring Beans。 和之前一样,有明显假设是对 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 管理的 Beans,
除了位置我们也指定了性质定义属性函数类.
--spring.cloud.function.location=target/it/bootapp/target/bootapp-1.0.0.RELEASE-exec.jar
--spring.cloud.function.definition=uppercase
欲了解更多细节,请参阅此处完整样本。 你也可以在 FunctionDeployerTests 中找到对应的测试。
| 这个特定的部署选项的类路径上可能有也可能没有 Spring Cloud Function。从部署者的角度来看,这并不重要。 |