暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

轻量级faas工具fn介绍

私人物语 2020-04-12
1498

背景知识

在使用FaaS工具之前,先了解下几个概念:Serveless、BaaS和FaaS。

Serverless 无服务器架构,通常包含了两个领域BaaS(Backend as a Service)和FaaS(Function as a Service)。

BaaS(Backend as a Service)后端即服务,一般是一个个的API调用后端或别人已经实现好的程序逻辑,比如身份验证服务Auth0,阿里云图片鉴黄服务,这些BaaS通常会用来管理数据,还有很多公有云上提供的我们常用的开源软件的商用服务,比如亚马逊的RDS可以替代我们自己部署的MySQL,还有各种其它数据库和存储服务。

FaaS  Function as a Service 函数即服务,是Serverless架构的一种实现形式,当前使用广泛的是Amonzon的Lambda。FaaS本质上是一种事件驱动的由消息触发的服务,FaaS供应商一般会集成各种同步和异步的事件源,通过订阅这些事件源,可以突发或者定期地触发函数运行。

fn是一款使用golang开发的轻量级开源faas工具,它基于docker,和收费的商业服务如Amazon的Lambda等相比,可认为它是“免费的faas”。


安装并启动fn

以mac平台为例,先确保你安装了不低于17.10.0-ce
版本的docker
。在mac上,你可以通过brew cask install docker
安装桌面版docker

然后我们去fnproject/fn
仓库的github页面,在releases
里下载二进制文件fn_mac
,执行命令mv fn_mac /usr/local/bin/fn && chmod a+x /usr/local/bin/fn
将二进制文件移到系统二进制目录并赋执行权。

然后执行fn start
就可启动服务了。默认监听8080端口,curl localhost:8080
,返回{"goto":"https://github.com/fnproject/fn","hello":"world!"}


第一个function

函数是小巧但强大的代码块,通常用于处理一个简单的任务。使用函数时,不用再担心整体,只关注于你希望函数执行的任务。fn CLI
工具将帮助我们快速入门。

让我们开始创建一个函数。可以使用任何运行时(例如go
node
java
python
ruby
等)fndemo
将作为函数的名称,并创建一个名为fndemo
的目录。您可以为函数任意命名。

fn init --runtime node fndemo

cd fndemo

我们需要创建一个app
,作为函数和其他元素的顶级集合:

fn create app myapp

部署你的函数:

fn --verbose deploy --app myapp --local

--local
 标志将跳过对远程容器仓库的推送,从而加快本地开发速度。

现在我们通过invoke
命令来调用函数:

fn invoke myapp fndemo


从入门到放弃(详细讲解)


1.初始化一个函数, 指定运行时为node

fn init --runtime node fndemo

将在当前目录下生成目录fndemo
, 目录结构如下

 fndemo
├── func.js 函数文件
├── func.yaml 函数metadata, 可理解为配置文件
└── package.json 依赖文件

查看函数文件 cat func.js

const fdk=require('@fnproject/fdk');


fdk.handle(function(input){
let name = 'World';
if (input.name) {
name = input.name;
}
console.log('\nInside Node Hello World function')
return {'message': 'Hello ' + name}
})

可见它支持输入一个{"name": "xxx"}
,返回{"message": "Hello xxx"}
,若无输入则返回{"message": "Hello World"}

查看配置文件cat func.yaml

schema_version: 20180708
name: fndemo
version: 0.0.1
runtime: node
entrypoint: node func.js

显而易见,schema_version
定义了函数文件的schema版本;name
定义了函数名,和目录名相同;version
定义了用户函数的版本;runtime
定义了函数运行时;entrypoint
定义了函数被调用时,docker运行的命令入口。

2.部署这个函数

通过命令fn list contexts
检查运行上下文,不出意外,你会看到

CURRENT    NAME    PROVIDER    API URL            REGISTRY
* default default http://localhost:8080

执行命令 fn update context registry fndemouser
, 将REGISTRY
的值更新为fndemouser
, 这对于本地开发环境是必要的。

接着,执行fn create app myapp
, 将会创建一个名字为myapp
app

再之后,执行fn --verbose deploy --app myapp --local
执行部署。

注意命令要在fndemo
目录下执行, 否则没法绑定函数。

这一步将会在fndemo
目录下生成一个Dockfile
, 接着构建docker镜像,并运行镜像部署函数。这一步异常耗时,笔者等得心累。

构建好后,可以通过docker images | grep fndemouser
查看镜像信息。

3.探索你的应用

执行 fn ls apps
 查看应用列表

NAME    ID                
myapp 01E5KWM3MJNG8G00GZJ0000001

执行fn list functions myapp
 查看myapp
关联的函数列表

NAME    IMAGE                    ID
fndemo fndemouser/fndemo:0.0.1 01DJ900WFKNG8G00GZJ0000002

执行命令fn invoke myapp fndemo
 调用函数,返回{"message":"Hello World"}

可以带上参数调用 echo -n '{"name":"tony"}' | fn invoke myapp fndemo --content-type application/json
,返回{"message":"Hello tony"}

执行命令fn inspect function myapp fndemo
查看函数信息

{
"annotations": {
"fnproject.io/fn/invokeEndpoint": "http://localhost:8080/invoke/01DJ900WFKNG8G00GZJ0000002"
},
"app_id": "01E5KWM3MJNG8G00GZJ0000001",
"created_at": "2020-04-11T08:19:58.451Z",
"id": "01DJ900WFKNG8G00GZJ0000002",
"idle_timeout": 30,
"image": "fndemouser/fndemo:0.0.1",
"memory": 128,
"name": "fndemo",
"timeout": 30,
"updated_at": "2020-04-11T08:21:09.868Z"
}

可以通过访问http://localhost:8080/invoke/01DJ900WFKNG8G00GZJ0000002
来调用函数。

curl -XPOST -H "Content-Type: application/json" http://localhost:8080/invoke/01DJ900WFKNG8G00GZJ0000002

curl -XPOST -H "Content-Type: application/json" -d '{"name":"tony"}' http://localhost:8080/invoke/01DJ900WFKNG8G00GZJ0000002


到此为止,我们已经完成了快速入门使用了。如果你还没放弃,可以去github上继续追踪。

文章转载自私人物语,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论