bfe业余分析(一)

bfe是百度开源的一个使用golang开发的七层转发引擎,源码可以在这里找到。文档的话可以直接看中文的,比英文全很多。这里是想通过分析和使用bfe去学习和了解一下其他公司在七层引擎上面的一些想法。

这篇主要记录下bfe的基本使用。以下所有分析都基于v0.6.0

编译与运行

克隆仓库后直接运行make即可进行编译。注意go版本需要是1.13版本。编译后对应的二进制文件以及示例配置文件均放在output目录下。

运行的话需要进入output/bin目录,然后执行./bfe -c ../conf -s -d。这里说说需要注意的几个点:

  1. 启动参数制定的路径都是目录,像静态配置文件目录和日志目录
  2. 大多数配置文件以json格式保存

概念与配置

在用bfe之前需要了解下它转发时的基本概念,详细可以在文档里面找到。这里稍微概括一下就是:

  1. 产品线(product), 由host头决定(类似nginx的server块)
  2. 集群(cluster), 后端服务的集合(类似nginx的upstream)
  3. 子集群(subcluster), 这个比较特别,在集群的概念中划分除了子集群,为了方便做更多的负载均衡逻辑
  4. 实例(instance), 这个就是一个后端的地址(类似nginx upstream的一个server)

了解了这个概念后我们来看下bfe中的示例配置文件:

  1. conf/server_data_conf/host_rule.data决定产品线。配置文件中支持将多个host映射至一个产品线。这个配置文件表示example.org请求属于example_product这个产品

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
        
    {
        "Version": "init version",
        "DefaultProduct": null,
        "Hosts": {
            "exampleTag":[
                "example.org"
            ]
        },
        "HostTags": {
            "example_product":[
                "exampleTag"
            ]
        }
    }
        
  2. conf/server_data_conf/route_rule.data决定一个产品线的请求转给哪个cluster(有点nginx中location的感觉)。这个配置文件表示host中含有example.org的请求都转发到cluster_example这个集群中

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
        
    {
        "Version": "init version",
        "ProductRule": {
            "example_product": [
                {
                    "Cond": "req_host_in(\"example.org\")",
                    "ClusterName": "cluster_example"
                },
                {
                    "Cond": "default_t()",
                    "ClusterName": "cluster_example"
                }
            ]
        }
    }
        
  3. conf/cluster_conf/gslb.data指定cluster中的subcluster。这里包含两个subcluster, 后面的值对应权重。GSLB_BLACKHOLE是一个特殊的subcluster, 对应丢弃流量

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
        
    {
        "Clusters": {
            "cluster_example": {
                "GSLB_BLACKHOLE": 0,
                "example.bfe.bj": 100
            }
        },
        "Hostname": "",
        "Ts": "0"
    }
        
  4. conf/cluster_conf/cluster_table.data指定subcluster中的实例。落到这个subcluster时,请求会转发到10.199.189.26:10257

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
        
    {
        "Config": {
            "cluster_example": {
                "example.bfe.bj": [
                    {
                        "Addr": "10.199.189.26",
                        "Name": "example_hostname",
                        "Port": 10257,
                        "Weight": 10
                    }
                ]
            }
        },
        "Version": "init version"
    }
        

其他的几个点

  1. 动态reload。在修改对应的配置文件后,可以请求本地的http接口来热更新配置。例如curl http://127.0.0.1:8421/reload/server_data_conf。具体可以参考这里
  2. 监控。可以直接访问http接口来动态获取当前的监控数据。

整体感受

引擎提供了不少功能模块,挺强大的。上手的话可能需要一段时间。另外配置错误时的提示不太清楚,难以定位到问题。

顺带的

小tips, 判断一个json文件是否合法:

1
python -mjson.tool json.file