为什么加上“原生”,因为我们基于BFE开发已经魔改了。
路由转发是BFE作为一个七层流量代理服务的核心功能,BFE设计了一套支持多租户、多机房的路由转发模型。
(图片来源:《深入理解BFE》)
在原生路由转发功能中,bfe对租户、集群、子集群、实例的概念解释如下:
与路由相关的流程:确定租户->确定集群->确定子集群->确定实例
与转发相关的流程:获取转发器->转发请求
说明:这些步骤中的从xx配置文件中查找/获取xx配置,只是为了便于理解才这样描述,实际上,BFE在启动时就已经加载所有配置文件缓存在内存中了。
商城产品线(ShoppMall),域名为shoppmall.com,订单服务(OrderService)部署在中国机房(CN-idc0),部署三个实例。
相关配置如下:
host_rule:
{
"Version": "1.0.0",
"DefaultProduct": null,
"Hosts": {
// 对应HostTags下的配置
"ShoppMallTag":[
"shoppmall.com"
]
},
"HostTags": {
"ShoppMall":[
// 标签随便定
"ShoppMallTag"
]
}
}
route_rule:
{
"Version": "1.0.0",
"ProductRule": {
"ShoppMall": [
{
// 以/order开头的请求路由到OrderService微服务
"Cond": "req_path_prefix_in("/order")",
"ClusterName": "OrderService"
}
]
}
}
cluster_rule:
{
"Version": "init version",
"Config": {
// OrderService集群的基础配置
"OrderService": {
// 请求后端相关:连接超时等
"BackendConf": {
"TimeoutConnSrv": 2000,
"TimeoutResponseHeader": 50000,
"MaxIdleConnsPerHost": 0,
"RetryLevel": 0
},
// 心跳检测配置
"CheckConf": {
"Schem": "http",
"Uri": "/healthcheck",
"Host": "example.org",
"StatusCode": 200,
"FailNum": 10,
"CheckInterval": 1000
},
// 全局负载均衡策略配置
"GslbBasic": {
"CrossRetry": 0,
"RetryMax": 2,
"HashConf": {
"HashStrategy": 0,
"HashHeader": "Cookie:UID",
"SessionSticky": false
}
},
// 客户端读写相关
"ClusterBasic": {
"TimeoutReadClient": 30000,
"TimeoutWriteClient": 60000,
"TimeoutReadClientAgain": 30000,
"ReqWriteBufferSize": 512,
"ReqFlushInterval": 0,
"ResFlushInterval": -1,
"CancelOnClientClose": false
}
}
}
}
gslb:
{
"Clusters": {
// 订单集群的子集群配置
"OrderService": {
"GSLB_BLACKHOLE": 0,
"CN-idc0": 100
}
},
"Hostname": "",
"Ts": "0"
}
cluster_table:
{
"Version": "1.0.0",
"Config": {
// 集群
"OrderService": {
// 子集群
"CN-idc0": [
// 实例
{
"Addr": "127.0.0.1",
"Name": "example_hostname",
"Port": 8180,
"Weight": 10
},
{
"Addr": "127.0.0.1",
"Name": "example_hostname",
"Port": 8181,
"Weight": 10
},
{
"Addr": "127.0.0.1",
"Name": "example_hostname",
"Port": 8182,
"Weight": 10
}
]
}
}
客户端发送POST http://shoppmall.com/order/createOrder
请求路由过程如下:
笔者个人觉得,BFE的路由配置文件太多了,而且不太直观,有点绕,不区分租户配置,将会导致一个文件一大堆的配置,不易于管理。
可能是开源的缘故,bfe不想依赖其它第三方如配置中心、数据库之类的服务,所以才改为使用配置文件配置,又或者原本设计就是使用文件配置。而这其实与使用nginx一样,需要经常修改配置文件。