Last updated
Last updated
faas-nomad
的分析按初始化、工作机制两部分。
初始化的过程要和faas-provider SDK的交互,联着分析。
组件依赖
身份认证
faas-provider定义的逻辑
具体Provider相关Handlers创建
faas-nomad通过makeDependencies
将需要的nomad、consul、statsd三个外部组件依赖的API客户端创建出来。
调用faas-provider定义的初始化逻辑,将
faas-provider的Serve
将路由与处理请求的Handlers绑定。faas-provider中规定好了这些FaaSHandlers
,这些Handlers在OpenFaaS API Gateway路由处也有设置,由网关转发给具体的Provider处理。
基于前述依赖的组件,开始createFaaSHandlers
实例化这些Handlers,在handlers
包下。
这里面需要注意的是makeFunctionProxyHandler
。它创建了一个处理函数的中间件,这个中间件感觉就像切面的概念,在下一个next http.HandlerFunc
处理前验证了请求参数中函数名是否存在。
handlers包中的Proxy
是一个http.Handler
,是真正用于调用下游函数的方法。具体来说,对faas-nomad Provider,下游函数是Nomad的job方式组织运行的,而且当前特定的是打包成docker镜像(其中有watchdog,来启动、监控forked process),以nomad的docker驱动启动job。
上面说到,faas-nomad的main.go main
方法最后调用了faas-provider的Serve
方法,这是一个阻塞方法,默认在8080
端口,启动了server,接受Gateway路由到Provider的调用请求,具体地,处理这些请求:CRUD函数、调用函数、设置副本数……。
faas-provider的功能在于调用nomad、consul、vault、statsd等客户端API,在调用过程中,有些缓存优化,如缓存函数名等。
以delete函数为例,Handler定义:
调用nomad client的job API,删除函数,再删除函数名的缓存
正是MakeDelete
方法传入的,实例化只赋值了Register
、Info
、List
、Deregister
、Allocations
需要的方法。
nomad.Job 中 Job接口定义的方法与完全相同,只是抽出来faas-nomad中需要的接口,屏蔽了真实的nomad jobs
API的细节。这是Go语法的特点,刚看到的时候有点奇怪(我没有完整地系统学GO语法),要是Java的话得声明相同的接口吧,其中不用的方法,还占用内存;这种赋值,也是Go语言中“实现接口的结构体中所有方法,即是接口定义的类型”的运用吧。