背景知识
在使用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: 20180708name: fndemoversion: 0.0.1runtime: nodeentrypoint: 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 IDmyapp 01E5KWM3MJNG8G00GZJ0000001
执行fn list functions myapp
查看myapp
关联的函数列表
NAME IMAGE IDfndemo 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上继续追踪。




