4.3 faas-nomad源码分析
初始化
makeDependencies(
*statsdServer,
*nodeURI,
*nomadConfig,
*consulAddr,
*consulACL,
*nomadRegion,
)bootstrap "github.com/openfaas/faas-provider"
...
bootstrap.Serve(handlers, config)工作机制
Last updated
makeDependencies(
*statsdServer,
*nodeURI,
*nomadConfig,
*consulAddr,
*consulACL,
*nomadRegion,
)bootstrap "github.com/openfaas/faas-provider"
...
bootstrap.Serve(handlers, config)Last updated
// FaaSHandlers provide handlers for OpenFaaS
type FaaSHandlers struct {
FunctionReader http.HandlerFunc
DeployHandler http.HandlerFunc
// FunctionProxy provides the function invocation proxy logic. Use proxy.NewHandlerFunc to
// use the standard OpenFaaS proxy implementation or provide completely custom proxy logic.
FunctionProxy http.HandlerFunc
DeleteHandler http.HandlerFunc
ReplicaReader http.HandlerFunc
ReplicaUpdater http.HandlerFunc
SecretHandler http.HandlerFunc
// LogHandler provides streaming json logs of functions
LogHandler http.HandlerFunc
// Optional: Update an existing function
UpdateHandler http.HandlerFunc
HealthHandler http.HandlerFunc
InfoHandler http.HandlerFunc
}handlers := createFaaSHandlers(nomadClient, consulResolver, stats, logger)
//createFaaSHandlers:
...
return &types.FaaSHandlers{
FunctionReader: handlers.MakeReader(nomadClient.Jobs(), logger, stats),
DeployHandler: handlers.MakeDeploy(nomadClient.Jobs(), *providerConfig, logger, stats),
DeleteHandler: handlers.MakeDelete(consulResolver, nomadClient.Jobs(), logger, stats),
ReplicaReader: makeReplicationReader(nomadClient.Jobs(), logger, stats),
ReplicaUpdater: makeReplicationUpdater(nomadClient.Jobs(), logger, stats),
FunctionProxy: makeFunctionProxyHandler(consulResolver, logger, stats, *functionTimeout),
UpdateHandler: handlers.MakeDeploy(nomadClient.Jobs(), *providerConfig, logger, stats),
InfoHandler: handlers.MakeInfo(logger, stats, version),
Health: handlers.MakeHealthHandler(),
SecretHandler: handlers.MakeSecretHandler(vs, logger.Named("secrets_handler")),
}// MakeExtractFunctionMiddleWare returns a middleware handler which validates
// the presence of the function name in the URI query.
func MakeExtractFunctionMiddleWare(
getVars func(*http.Request) map[string]string,
next http.HandlerFunc) http.HandlerFunc {
return func(rw http.ResponseWriter, r *http.Request) {
vars := getVars(r)
functionName := vars["name"]
if functionName == "" {
rw.WriteHeader(http.StatusBadRequest)
fmt.Fprint(rw, fmt.Errorf("No function name"))
return
}
r = r.WithContext(context.WithValue(r.Context(), FunctionNameCTXKey, functionName))
next(rw, r)
}
}// main.go:150
DeleteHandler: handlers.MakeDelete(consulResolver, nomadClient.Jobs(), logger, stats),// handlers/delete.go:41
// Delete job /v1/jobs
_, _, err = client.Deregister(nomad.JobPrefix+req.FunctionName, false, nil)
// client 经过本地的封装 定义是 client nomad.Job
// func MakeDelete(sr consul.ServiceResolver, client nomad.Job, logger hclog.Logger, stats metrics.StatsD) http.HandlerFunc
...
// handlers/delete.go:51
sr.RemoveCacheItem(req.FunctionName)// main.go:150
nomadClient.Jobs() -> client nomad.Jobtype Job interface {
// Register creates a new Nomad job
Register(*api.Job, *api.WriteOptions) (*api.JobRegisterResponse, *api.WriteMeta, error)
Info(jobID string, q *api.QueryOptions) (*api.Job, *api.QueryMeta, error)
List(q *api.QueryOptions) ([]*api.JobListStub, *api.QueryMeta, error)
Deregister(jobID string, purge bool, q *api.WriteOptions) (string, *api.WriteMeta, error)
Allocations(jobID string, allAllocs bool, q *api.QueryOptions) ([]*api.AllocationListStub, *api.QueryMeta, error)
}