一、json配置校验必要性
现如今网关配置多采用热加载架构,即线上配置随时更新,而无需reload。在该背景下,使用json格式呈现的配置文件无法第一时间知道配置方式是否有误。极端情况下,客户请求的过程中暴露出问题,导致5XX、宕机等问题,从而影响整个节点的服务质量。由此,预先的json配置校验就变得非常必要。
二、网关json配置校验方案简述
独立一组机器作为中心校验节点,该节点的环境与线上保持一致(同步升级与回退),由配置平台在下发配置之前,将整个json配置文件发送请求到中心校验节点的网关特定接口,由网关告知平台这些变量是否都合法,若是都合法,则回复“0”,不合法则回复“1”,且返回那些不合法的变量的说明。网关根据json解析到的lua模块,调用check函数进行配置校验。
三、校验接口概述
采用中心校验的方式,配置平台在下发配置之前,将全量的json配置整合后发送到网关json配置校验接口。网关解析json配置,根据解析到的lua模块名称,以对应的json配置作为入参,调用该模块对应的check函数。网关将所有check函数的调用结果进行整合,以json形式响应给配置平台。
注:若是未检测到check函数,则直接跳过该lua模块的校验。
四、json配置拼接示例
[
{
"server_name":"server1.com",
"level":1,
"data":{
"ports":{
"80":"1",
"443":"1"
},
"server_name":"server1.com",
"ssl_certificate":"server.crt",
"ssl_certificate_key":"server.key",
"http2":"on",
"locations":[
{
"/":{
"internal":"0",
"plugin_lua_functions":{
"req_rewrite":[
[
"set_vars",
{
"set_var_list":{
"&gzip":"on",
"&gzip_min_length":"1k",
"&gzip_types":"text/xml text/plain text/css application/javascript application/x-javascript text/javascript application/json"
}
}
],
[
"set_vars",
{
"set_var_list":{
"proxy_buffer_size":"32k"
}
}
],
[
"set_vars",
{
"set_var_list":{
"proxy_buffers":"4 32k"
}
}
]
]
}
}
}
]
}
},
{
"server_name":"server2.com",
"level":2,
"data":{
"ports":{
"80":"1",
"443":"1"
},
"server_name":"server2.com",
"locations":[
{
"/":{
"internal":"0",
"plugin_lua_functions":{
"req_rewrite":[
[
"set_vars",
{
"set_var_list":{
"proxy_buffer_size":"32k"
}
}
],
[
"set_vars",
{
"set_var_list":{
"proxy_buffers":"4 32k"
}
}
]
]
}
}
}
]
}
},
...
]
五、配置校验相应示例
{
"res":"0" / "1",
"details":{} / [
{
"server_name":"server1.com",
"level":1/2/3
"detail":[
{
"func_name":"set_vars",
"fail_msg":"Missing conf :set_var_list",
"phase":"req_rewrite"
},
{
"origin_code":"hhhh:...",
"func_name":"set_vars",
"fail_msg":"Configuration is invalid",
"phase":"req_rewrite"
}
]
},
{
"server_name":"server2.com",
"level":1/2/3
"detail":[
{
"func_name":"set_vars",
"fail_msg":"Module configuration is missing",
"phase":"req_rewrite"
}
]
}
... ...
]
}
具体如下:
①校验不含非法配置:
res字段显示"0",details字段为{}
②校验含非法配置:
res字段显示"1",details字段为不合法的配置的详细信息,包括字段:server_name、level、detail和fail_msg字段:
server_name:选填,不合法配置所属的域名
level:选填,不合法配置所属的层级,level数值和对应含义如下:
1:边缘层,2:中间层,3:回源层
detail:选填,不合法配置清单,该字段内又包括以下四个字段:
phase:不合法配置所属的lua执行阶段
func_name:不合法配置所属的lua模块
origin_code:不合法的具体配置
fail_msg:不合法的原因
fail_msg:选填,不合法的原因
六、结语
配置平台根据校验结果,调整下发策略,实现智能化下发等。