BFE定义了一套模块机制,通过编写模块插件来快速开发新功能。与模块相关的代码包含以下部分:

代码目录 说明
bfe_module 包含了模块基础类型的定义,例如模块的接口、模块回调类型、回调链类型、回调框架类型
bfe_moudles 包含了内置模块的实现,例如流量管理、安全防攻击、流量可见性等类别的各种模块
bfe_server 实现了连接/请求处理的生命周期的管理,并在关键处理阶段设置了回调点。注册在这些回调点的模块回调函数链,将被顺序执行,从而支持对连接/请求的定制化处理

模块基础类型

模块的定义

BFE模块代表一个高内聚、低耦合、实现特定流量处理功能(例如检测、过滤、改写等)的代码单元。

每个模块需满足如下模块接口(BfeModule),其中:

  • Name() 方法返回模块的名称
  • Init() 方法用于执行模块的初始化
// bfe_module/bfe_module.go

type BfeModule interface {
    // Name returns the name of module.
    Name() string

    // Init initializes the module. The cbs are callback handlers for  
    // processing connection or request/response. The whs are web monitor 
    // handlers for exposing internal status or reloading specified 
    // configuration. The cr is the root path of module configuration 
    // files.
    Init(cbs *BfeCallbacks, whs *web_monitor.WebHandlers, cr string) error
}

模块除了需要实现以上基础接口外,往往还需实现特定回调接口,针对连接或请求实现自定义逻辑。关于回调接口的类型在下文详述。

模块的回调类型

在BFE中按需求场景定义了如下5种回调类型,用于处理连接、请求或响应。

// bfe_module/bfe_filter.go

// RequestFilter filters incomming requests and return a response or nil.
// Filters are chained together into a HandlerList.
type RequestFilter interface {
    FilterRequest(request *bfe_basic.Request) (int, *bfe_http.Response)
}

// ResponseFilter filters outgoing responses. This can be used to modify 
// the response before it is sent.
type ResponseFilter interface {
    FilterResponse(req *bfe_basic.Request, res *bfe_http.Response) int
}

// AcceptFilter filters incoming connections.
type AcceptFilter interface {
    FilterAccept(*bfe_basic.Session) int
}

// ForwardFilter filters to forward request
type ForwardFilter interface {
    FilterForward(*bfe_basic.Request) int
}

// FinishFilter filters finished session(connection)
type FinishFilter interface {
    FilterFinish(*bfe_basic.Session) int
}

各回调类型的详细说明如下:

回调类型 说明 示例自定义逻辑
RequestFilter 回调函数用于处理到达的请求,并可直接返回响应或继续向下执行 检测请求并限流;重定向请求;修改请求内容并继续执行
ResponseFilter 回调函数用于处理到达的响应,并可修改响应并继续向下执行 修改响应的内容;对响应进行压缩;统计响应状态码;记录请求日志
AcceptFilter 回调函数用于处理到达的连接,并可关闭连接或并继续向下执行 检测连接并限流;记录连接的TLS握手信息并继续执行
ForwardFilter 回调函数用于处理待转发的请求,并可修改请求的目的后端实例 修改请求的目标后端实例并继续执行
FinishFilter 回调函数用于处理完成的连接 记录会话日志并继续执行

回调函数的返回值决定了回调函数执行完成时后续的操作。回调函数的返回值有以下几种可能的取值:

// bfe_module/bfe_handler_list.go

// Return value of handler.
const (
    BfeHandlerFinish   = 0 // to close the connection after response
    BfeHandlerGoOn     = 1 // to go on next handler
    BfeHandlerRedirect = 2 // to redirect
    BfeHandlerResponse = 3 // to send response
    BfeHandlerClose    = 4 // to close the connection directly, with no data sent.
)

各返回值代表含义如下:

回调函数返回值 含义说明
BfeHandlerFinish 直接返回响应,在响应发送完成后关闭连接
BfeHandlerGoOn 继续向下执行
BfeHandlerRedirect 直接返回重定向响应
BfeHandlerResponse 直接返回指定的响应
BfeHandlerClose 直接关闭连接

回调链类型

回调链(HandlerList)代表了多个回调函数构成的有序列表。一个回调链中的回调函数类型是相同的。

// bfe_module/bfe_handler_list.go

// HandlerList type.
const (
    HandlersAccept   = 0 // for AcceptFilter
    HandlersRequest  = 1 // for RequestFilter
    HandlersForward  = 2 // for ForwardFilter
    HandlersResponse = 3 // for ResponseFilter
    HandlersFinish   = 4 // for FinishFilter
)

type HandlerList struct {
    handlerType int        // type of handlers (filters)
    handlers    *list.List // list of handlers (filters)
}

回调框架

回调框架管理了BFE中所有回调点对应的回调链。

// bfe_module/bfe_callback.go

// Callback point.
const (
    HandleAccept         = 0
    HandleHandshake      = 1
    HandleBeforeLocation = 2
    HandleFoundProduct   = 3
    HandleAfterLocation  = 4
    HandleForward        = 5
    HandleReadResponse   = 6
    HandleRequestFinish  = 7
    HandleFinish         = 8
)

type BfeCallbacks struct {
    callbacks map[int]*HandlerList
}

不同回调点可注册的回调函数类型不同,具体情况如下:

回调点 回调点含义 回调函数类型
HandleAccept 与用户端连接建立成功后 AcceptFilter
HandleHandshake 与用户端TLS握手成功后 AcceptFilter
HandleBeforeLocation 请求执行租户路由前 RequestFilter
HandleFoundProduct 请求执行租户路由后 RequestFilter
HandleAfterLocation 请求执行集群路由后 RequestFilter
HandleForward 请求向后端转发前 ForwardFilter
HandleReadResponse 读取到后端响应头部时 ResponseFilter
HandleRequestFinish 向用户端发送响应完成时 ResponseFilter
HandleFinish 与用户端连接处理完成时 FinishFilter

连接/请求处理及回调函数的调用

BFE在转发过程对连接/请求对处理及回调点如BFE的模块插件机制图示。在各回调点,BFE将查询指定回调点注册的回调链,并按顺序执行回调链中的各回调函数。

例如,BFE在接收到用户请求头时,将查询在HandleBeforeLocation回调点注册的回调链,然后按序执行各回调函数,并基于返回值决定后续操作。

// bfe_server/reverseproxy.go

// Get callbacks for HandleBeforeLocation
hl = srv.CallBacks.GetHandlerList(bfe_module.HandleBeforeLocation)
if hl != nil {
    // process FilterRequest handlers
    retVal, res = hl.FilterRequest(basicReq)
    basicReq.HttpResponse = res

    switch retVal {
    case bfe_module.BfeHandlerClose:
        // Close the connection directly (without reply)
        action = closeDirectly
        return

    case bfe_module.BfeHandlerFinish:
        // Close the connection after response
        action = closeAfterReply
        basicReq.BfeStatusCode = bfe_http.StatusInternalServerError
        return

    case bfe_module.BfeHandlerRedirect:
        // Make an redirect
        Redirect(rw, req, basicReq.Redirect.Url, basicReq.Redirect.Code, basicReq.Redirect.Header)
        isRedirect = true
        basicReq.BfeStatusCode = basicReq.Redirect.Code
        goto send_response

    case bfe_module.BfeHandlerResponse:
        // Send the generated response
        goto response_got
    }
}
最后编辑: kuteng  文档更新时间: 2021-05-09 11:40   作者:kuteng