分流转发

场景说明

  • 假设我们有一个http server对外提供服务,并且有2个服务实例;1个负责处理静态文件请求,另外1个负责处理动态请求
    • 域名:example.org
    • 以/static开头的请求都转发至静态文件服务实例;地址:10.0.0.1:8001
    • 其他的请求都转发至动态服务实例;地址:10.0.0.1:8002

样例配置上稍做修改,就可以实现上述转发功能

  • 首先,在bfe.conf上配置转发功能使用的配置文件路径
  1. hostRuleConf = server_data_conf/host_rule.data #域名规则配置文件
  2. routeRuleConf = server_data_conf/route_rule.data #分流规则配置文件
  3. clusterConf = server_data_conf/cluster_conf.data #集群配置文件
  4. clusterTableConf = cluster_conf/cluster_table.data #集群实例列表配置文件
  5. gslbConf = cluster_conf/gslb.data #子集群负载均衡配置文件
  1. {
  2. "Version": "init version",
  3. "DefaultProduct": null,
  4. "Hosts": {
  5. "exampleTag":[
  6. "example.org" // 域名example.org=>域名标签exampleTag
  7. ]
  8. },
  9. "HostTags": {
  10. "example_product":[
  11. "exampleTag" // 域名标签exampleTag=>产品线名称example_product
  12. ]
  13. }
  14. }
  • 配置集群的基础信息(server_data_conf/cluster_conf.data
    • 配置集群cluster_demo_static和cluster_demo_dynamic健康检查的参数,其他均使用默认值
  1. {
  2. "Version": "init version",
  3. "Config": {
  4. "cluster_demo_static": { // 集群cluster_demo_static的配置
  5. "CheckConf": { // 健康检查配置
  6. "Schem": "http",
  7. "Uri": "/health_check",
  8. "Host": "example.org",
  9. "StatusCode": 200
  10. }
  11. },
  12. "cluster_demo_dynamic": { // 集群cluster_demo_dynamic的配置
  13. "CheckConf": { // 健康检查配置
  14. "Schem": "http",
  15. "Uri": "/health_check",
  16. "Host": "example.org",
  17. "StatusCode": 200
  18. }
  19. }
  20. }
  21. }
  • 配置集群下挂载的实例信息(cluster_conf/cluster_table.data
    • 在cluster_demo_static和cluster_demo_dynamic集群下面分别创建子集群demo_static.all和demo_dynamic.all
    • 将静态文件服务实例10.0.0.1:8001挂载到demo_static.all子集群,动态服务实例10.0.0.1:8002挂载到demo_dynamic.all子集群
  1. {
  2. "Version": "init version",
  3. "Config": {
  4. "cluster_demo_static": { // 集群 => 子集群 => 实例列表
  5. "demo_static.all": [{ // 子集群demo_static.all
  6. "Addr": "10.0.0.1", // 实例地址:10.0.0.1
  7. "Name": "static.A", // 实例名:static.A
  8. "Port": 8001, // 实例端口:8001
  9. "Weight": 1 // 实例权重:1
  10. }]
  11. },
  12. "cluster_demo_dynamic": {
  13. "demo_dynamic.all": [{
  14. "Addr": "10.0.0.1",
  15. "Name": "dynamic.A",
  16. "Port": 8002,
  17. "Weight": 1
  18. }]
  19. }
  20. }
  21. }
  • 配置子集群内负载均衡(cluster_conf/gslb.data
    • cluster_demo_static集群的流量全部转发到demo_static.all子集群
    • cluster_demo_dynamic集群的全部流量全部转发到demo_dynamic.all子集群
  1. {
  2. "Hostname": "",
  3. "Ts": "0",
  4. "Clusters": {
  5. "cluster_demo_static": { // 集群 => 子集群权重
  6. "GSLB_BLACKHOLE": 0, // 黑洞的分流权重为0,表示不丢弃流量
  7. "demo_static.all": 100 // 权重为100,表示全部分流到demo_static.all
  8. },
  9. "cluster_demo_dynamic": {
  10. "GSLB_BLACKHOLE": 0,
  11. "demo_dynamic.all": 100
  12. }
  13. }
  14. }
  • 配置分流规则(server_data_conf/route_rule.data
    • 将/static开头的流量转发到cluster_demo_static集群
    • 其余流量转发到cluster_demo_dynamic集群
  1. {
  2. "Version": "init version",
  3. "ProductRule": {
  4. "example_product": [ // 产品线 => 分流规则
  5. {
  6. // 以/static开头的path分流到cluster_demo_static集群
  7. "Cond": "req_path_prefix_in(\"/static\", false)",
  8. "ClusterName": "cluster_demo_static"
  9. },
  10. {
  11. // 其他流量分流到cluster_demo_dynamic集群
  12. "Cond": "default_t()",
  13. "ClusterName": "cluster_demo_dynamic"
  14. }
  15. ]
  16. }
  17. }

现在,用curl验证下是否可以转发成功

curl -H “host: example.org” “http://127.1:8080/static/test.html“ 将请求转发至10.0.0.1:8001

curl -H “host: example.org” “http://127.1:8080/api/test“ 将请求转发至10.0.0.1:8002