4.3 faas-nomad源码分析

faas-nomad的分析按初始化、工作机制两部分。

初始化

初始化的过程要和faas-provider SDK的交互,联着分析。

  • 组件依赖

  • 身份认证

  • faas-provider定义的逻辑

  • 具体Provider相关Handlers创建

faas-nomad通过makeDependencies将需要的nomad、consul、statsd三个外部组件依赖的API客户端创建出来。

makeDependencies(
		*statsdServer,
		*nodeURI,
		*nomadConfig,
		*consulAddr,
		*consulACL,
		*nomadRegion,
)

调用faas-provider定义的初始化逻辑,将

bootstrap "github.com/openfaas/faas-provider"
...
bootstrap.Serve(handlers, config)

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方法传入的,实例化只赋值了RegisterInfoListDeregisterAllocations需要的方法。

nomad.Job 中 Job接口定义的方法与完全相同,只是抽出来faas-nomad中需要的接口,屏蔽了真实的nomad jobs API的细节。这是Go语法的特点,刚看到的时候有点奇怪(我没有完整地系统学GO语法),要是Java的话得声明相同的接口吧,其中不用的方法,还占用内存;这种赋值,也是Go语言中“实现接口的结构体中所有方法,即是接口定义的类型”的运用吧。

Last updated

Was this helpful?