为BFE编写扩展插件(1) – 回调点
扩展插件机制是所有现代化的七层负载均衡开源软件都具有的能力。通过扩展插件机制,可以很方便的为BFE增加新的功能,同时又能保持BFE代码组织的清晰逻辑。
由于涉及BFE扩展插件的内容比较多,将分为多篇文章来讲解。今天首先讲解“回调点”。
1. 扩展插件和回调点
BFE扩展插件机制是围绕“回调点”来完成的。模块插件的基本工作原理如下:
在BFE的转发过程中,提供多个回调点(参见图1)。在图1中,包括2个处理步骤,3个回调点。
对于一个扩展插件,可以针对这些回调点对应编写回调函数(参见图1)。在图1中,扩展插件提供了2个回调函数。
在模块初始化时,把这些回调函数注册到对应的回调点(参见图1)。对于某个回调点,注册在这里的多个回调函数形成了一个链表或队列(参见图2)
在处理一个连接或请求时,当执行到某个回调点时,会顺序执行所有注册的回调函数(参见图2)
图1 扩展插件的回调函数和主流程的回调点
图2 在回调点注册的回调函数队列
2. BFE处理的主流程
BFE处理的主流程如图2所示。流程主要包括9步,可以分为5个大的阶段(参见图3):
(1) 建立连接和TLS握手
(2) 读取请求头部
(3) 确定租户、集群、子集群、实例
(4) 转发请求和响应
(5) 关闭连接
图3 BFE处理的主流程
3. BFE的回调点设置
在BFE中,针对主要的处理步骤,设置了9个回调点(参见图4):
HandleAccept: 位于和客户端的TCP连接建立后。
HandleHandshake:位于和客户端的SSL或TLS握手完成后。
HandleBeforeLocation:位于确定租户(产品线)之前。
HandleFoundProduct:位于确定租户(产品线)之后。
HandleAfterLocation:位于确定集群之后。
HandleForward:位于确定子集群和实例之后,以及转发请求之前。
HandleReadResponse:位于转发请求和读取到后端响应之后。
HandleRequestFinish:位于转发响应处理完毕后。
HandleFinish:位于和客户端的TCP连接关闭后。
有了这些回调点,就可以在BFE处理连接和请求的过程中塞入自己想完成的各种功能了。在编写某个扩展插件时,只需要选择合适的回调点,编写对应的回调函数。
图4 BFE的回调点设置
一个BFE的扩展插件怎么写?这方面的具体内容将在下一篇文章中细说。心急的读者可以参阅《万亿级流量转发:BFE核心技术与实现》中的说明。也可以参阅位于https://github.com/baidu/bfe-book 的在线图书。
虎年春节就要到了,提前拜个早年,预祝大家虎虎生威,虎年大吉!
欢迎关注“BFE开源项目”微信公众号,获得本项目的更多更新。谢谢!