目录
下载
脚本直接下载
下载可执行文件
上传
启动 Fn 服务
初始化 Fn 工程
创建 app
部署 function
调用 function
JSON 入参
官方文档
下载
有两种下载方式
脚本直接下载
直接在服务器执行该命令即可
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
下载可执行文件
本文演示的是直接下载可执行文件的方式,可以自定义安装路径
下载地址:
Release 0.6.31 · fnproject/cli · GitHubhttps://github.com/fnproject/cli/releases/tag/0.6.31
上传
将下载好的 fn_linux 上传到服务器上
这里上传的目录为 /usr/local/my/fnproject
mkdir fnproject
cd /fnproject
#重命名
mv fn_linux fn
#创建软链接,以便在任意路径下执行 fn 命令
ln -s /usr/local/my/fnproject/fn /usr/local/bin/fn
#添加执行权限
chmod 777 ./fn
启动 Fn 服务
启动 fn 服务前必须确保 docker 也启动了,没 docker 需要先下载 docker
# 没下载需先下载 docker
yum install -y docker-ce
# 启动docker
systemctl start docker
# 开机自启动 docker
systemctl enable docker
第一次启动,会去下载基础镜像,默认端口是8080
fn start
启动后,访问服务器 8080 端口
初始化 Fn 工程
使用 init 命令创建一个工程模板
fn init --runtime java hello
func.yaml 文件内容如下
其中 cmd 的配置就是最终要执行的方法
schema_version: 20180708
name: hello
version: 0.0.1
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk17-1.0.186
run_image: fnproject/fn-java-fdk:jre17-1.0.186
cmd: com.example.fn.HelloFunction::handleRequest
创建 app
先创建 app,然后再将刚刚用 init 创建出来的 function(模板工程中的方法) 部署在新建的 app 上
fn create --app myapp
fn list apps
部署 function
# fn deploy <APP_NAME> <FUNCTION_NAME>
fn deploy myapp hello --local
# fn inspect function <APP_NAME> <FUNCTION_NAME>
fn inspect function myapp hello
部署后会给 function 自动生成一个调用地址,可以通过 inspect 命令来查看该地址
调用 function
可以通过命令行调用
#fn invoke <APP_NAME> <FUNTION_NAME>
fn invoke myapp hello
也可以直接通过接口来调用
curl -X "POST" http://localhost:8080/invoke/01HV1XRSY8NG8G00GZJ0000002
JSON 入参
以上只是直接使用 init 创建的模板工程简单部署个云函数,实际使用中,一般都需要出入参,而出入参则是通过 json 的格式来传递的。
对模板工程做简单的修改即可,将以下两个文件分别修改入参和出参类型
vim src/main/java/com/example/fn/HelloFunction.java
vim src/test/java/com/example/fn/HelloFunctionTest.java
HelloFunction
package com.example.fn;
public class HelloFunction {
public static class Input {
public String name;
}public static class Result {
public String salutation;
}public Result handleRequest(Input input) {
Result result = new Result();
result.salutation = "Hello " + input.name;
return result;
}}
HelloFunctionTest
package com.example.fn;
import com.fnproject.fn.testing.*;
import org.junit.*;import static org.junit.Assert.*;
public class HelloFunctionTest {
@Rule
public final FnTestingRule testing = FnTestingRule.createDefault();@Test
public void shouldReturnGreeting(){
testing.givenEvent().withBody("{\"name\":\"Bob\"}").enqueue();
testing.thenRun(HelloFunction.class,"handleRequest");FnResult result = testing.getOnlyResult();
assertEquals("{\"salutation\":\"Hello Bob\"}", result.getBodyAsString());
}
}
重新部署
fn deploy --app myapp hello
curl 调用验证
curl -X "POST" -H "Content-Type: application/json" -d '{"name":"Bob"}' http://localhost:8080/invoke/01HV1XRSY8NG8G00GZJ0000002
官方文档
Introduction to Fn with Java (fnproject.io)https://fnproject.io/tutorials/JavaFDKIntroduction/#AcceptingJSONInput