为了适应复杂情况的流量分发,ALB 提供了一组自定义流量匹配 DSL 名为 dslx。 在 Rule 中可以配置 dslx,最终会生成前序表达式供 ALB 规则引擎进行流量匹配。dslx 的格式如下:
- type: string # matcher
key: string (optional)
values:
- - string # op 1
- string # conditions
- - string # op 2
- string # conditiontype指定具体要匹配那个属性,目前有HOST,URL SRC_IP,METHOD,HEADER,PARAM,COOKIE这几个 matcher。- 多个 matcher 之间的关系是
AND。
- 多个 matcher 之间的关系是
key指定额外的匹配条件,比如匹配HEADER时,具体是哪一个HEADER:- 当
type是HEADER,PARAM或COOKIE时,可以指定具体的key。
- 当
- 通过
type和key我们可以明确要匹配的是哪个属性,通过values指定匹配条件:values是一个表格,每行表示一个匹配条件:- 每行的第一个元素指定匹配条件的操作符。
- 行与行之间是
OR的关系。
dslx 支持下列字段的匹配:
| 名字 | 描述 |
|---|---|
| HOST | 请求的域名 |
| URL | 请求的url |
| SRC_IP | 请求的源地址,会优先使用 x_real_ip 或者 x_forwarded_for 的 header |
| METHOD | 请求的方法 |
| HEADER | 请求的 header,可以指定 key |
| PARAM | url 的参数,可以指定 key |
| COOKIE | 请求的 cookie,可以指定 key |
dslx 支持下列的操作符:
| 名字 | 描述 |
|---|---|
| EQ | 相等 |
| STARTS_WITH | 前缀匹配 |
| ENDS_WITH | 后缀匹配 |
| IN | value 在数组内 |
| RANGE | values 是 IP,并且在某个 IP 段内 |
| EXIST | 存在这个 key,比如存在某个 header,param,cookie |
dslx:
- type: HOST
values:
- - EQ
- a.com
- type: URL
values:
- - STARTS_WITH
- /a
- - STARTS_WITH
- /b最终生成的前序表达式为 [AND [EQ HOST a.com] [OR [STARTS_WITH URL /a] [STARTS_WITH URL /a]]。
dslx:
- type: METHOD
values:
- - EQ
- POST
- type: URL
values:
- - STARTS_WITH
- /app-a
- - STARTS_WITH
- /app-b
- type: PARAM
key: group
values:
- - EQ
- vip
- type: HOST
values:
- - ENDS_WITH
- .app.com
- type: HEADER
key: LOCATION
values:
- - IN
- east-1
- east-2
- type: COOKIE
key: uid
values:
- - EXIST
- type: SRC_IP
values:
- - RANGE
- "1.1.1.1"
- "1.1.1.100"
最终生成的前序表达式为 ["AND",["EQ","METHOD","POST"],["OR",["STARTS_WITH","URL","/app-a"],["STARTS_WITH","URL","/app-b"]],["EQ","PARAM","group","vip"],["ENDS_WITH","HOST",".app.com"],["IN","HEADER","location","east-1","east-2"],["EXIST","COOKIE","uid"],["RANGE","SRC_IP","1.1.1.1","1.1.1.100"]]。