一、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:選填,不合法的原因
六、結語
配置平臺根據校驗結果,調整下發策略,實現智能化下發等。