Spring Cloud Function适配流程
前提条件
已有开发完成的Spring Cloud Function项目。
步骤一:改造Java项目
- 将下载的两个SDK文件放在本地目录,例如d:\\runtime中。
- 在Spring Cloud Function项目的命令行窗口中执行以下命令,将Spring Cloud Function的SDK安装到本地的maven仓库中。
- 在项目的命令行窗口中执行以下命令,将Java的Runtime SDK安装到本地的maven仓库中。
- 在Spring Cloud Function项目中的“pom.xml”文件中添加以下dependency内容:
- 添加Spring Cloud Function相关依赖。
<dependency> <groupId>com.huawei.function</groupId> <artifactId>spring-cloud-function-adapter</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.huawei.function</groupId> <artifactId>core-runtime-sdk</artifactId> </exclusion> </exclusions> </dependency>
- 添加runtime-sdk。
<dependency> <groupId>Runtime</groupId> <artifactId>Runtime</artifactId> <version>2.0.5</version> </dependency>
- 在pom.xml中添加插件用来将代码和依赖包打包到一起。请把mainClass替换为@SpringBootApplication下的类。
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.springcloudfunctionadapterdemo.SpringCloudFunctionAdapterDemoApplication</mainClass> </manifest> </archive> <finalName>${project.name}</finalName> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals><goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 添加Spring Cloud Function相关依赖。
步骤二:配置函数代码
- 配置Spring Cloud Function部分代码。
支持Function、Consumer、Supplier方法,入参即为事件函数的事件类型,可参考函数支持的触发事件自行修改需要的触发事件类型,此处以kafka事件为例。
package com.example.springcloudfunctionadapterdemo; import com.huawei.services.runtime.Context; import com.huawei.services.runtime.entity.kafka.KAFKATriggerEvent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.Message; import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @Configuration public class FunctionConfig { @Bean public Function<KAFKATriggerEvent, String> echo() { System.out.println("echo"); return payload -> String.valueOf(payload); } @Bean public Consumer<KAFKATriggerEvent> kafkaEventConsumer(){ return (input)->{ System.out.println("***************"); System.out.println(Arrays.stream(input.getRecords()).map(record -> Arrays.toString(record.getMessages())).collect(Collectors.joining())); System.out.println("***************"); }; } @Bean public Consumer<Message<KAFKATriggerEvent>> kafkaEventMessageConsumer(){ return (inputMessage)->{ KAFKATriggerEvent input = inputMessage.getPayload(); Context functionContext = (Context) inputMessage.getHeaders().get("functionContext"); System.out.println("***************"); System.out.println(functionContext.getMemorySize()); System.out.println(Arrays.stream(input.getRecords()).map(record -> Arrays.toString(record.getMessages())).collect(Collectors.joining())); System.out.println("***************"); }; } }
- 编写适配Spring Cloud Function的函数入口代码。
- 继承FunctionInvoker类,需要设置两个类,第一个为Function的入参类型,第二个为Function的返回类型。
- 编写函数执行入口:
public String execute(KAFKATriggerEvent request, Context context) throws NoSuchMethodException { return handleRequest(request, context, "echo"); }
Spring Cloud Function的函数入口完整示例代码:
package com.example.springcloudfunctionadapterdemo; import com.huawei.services.runtime.Context; import com.huawei.services.runtime.entity.kafka.KAFKATriggerEvent; import com.huawei.springframework.cloud.function.adapter.FunctionInvoker; public class Handler extends FunctionInvoker<KAFKATriggerEvent, String> { public String execute(KAFKATriggerEvent request, Context context) throws NoSuchMethodException { return handleRequest(request, context, "echo"); } public String execute2(KAFKATriggerEvent request, Context context) throws NoSuchMethodException { return handleRequest(request, context, "pageEventConsumer"); } public String execute3(KAFKATriggerEvent request, Context context) throws NoSuchMethodException { return handleRequest(request, context, "kafkaEventMessageConsumer"); } }
- 编写main函数代码。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringCloudFunctionAdapterDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudFunctionAdapterDemoApplication.class, args); } }
- 执行以下命令打包工程,生成一个名为“jar-with-dependencies.jar”的文件。
mvn package assembly:single
测试函数
- 登录函数工作流控制台,左侧导航栏选择 ,单击右上角“创建函数”进入创建函数页面,选择“创建空白函数”。
- 如图1所示,配置函数基本信息,配置完成后单击右下角“创建函数”完成创建。
- 进入函数详情页,在“代码”页签下,单击右侧 ,添加4的JAR文件上传。
- 上传成功后,选择“设置 > 常规设置”,修改需要测试的“函数执行入口”参数,本例可修改为“com.example.springcloudfunctionadapterdemo.Handler.execute”,单击 。
- 回到“代码”页签,单击代码编辑区的“测试”,选择“创建新的测试事件”,在云事件模板列表中选择需要测试的事件模板,例如本示例中使用Kafka事件,则可选择Kafka事件模板,单击“创建”。
- 单击“测试”,查看函数执行结果。
函数执行结果分为三部分,分别为函数返回(由callback返回)、执行摘要、日志输出(由console.log或getLogger()方法获取的日志方法输出),参考表1查看结果说明。