Kong官方源碼GitHub: https://github.com/Kong/kong
定制開發(fā)需求
a. 根據(jù)匹配的URL做轉發(fā)。
b. 根據(jù)匹配的Cookie做轉發(fā)。
c. 根據(jù)匹配的Header做轉發(fā)。Kong流程分析
根據(jù)nginx配置文件最能體現(xiàn)kong的插件加載過程,來分析kong的執(zhí)行流程
server {
server_name kong;
rewrite_by_lua_block {
Kong.rewrite()
}
access_by_lua_block {
Kong.access()
}
header_filter_by_lua_block {
Kong.header_filter()
}
body_filter_by_lua_block {
Kong.body_filter()
}
log_by_lua_block {
Kong.log()
}
}
1>. 重點關注Kong.rewrite()和Kong.access()兩個方法
a). rewrite方法:從客戶端接收作為重寫階段處理程序的每個請求執(zhí)行。在這個階段,無論是API還是消費者都沒有被識別,因此這個處理器只在插件被配置為全局插件時執(zhí)行。
b). access方法:為客戶的每一個請求而執(zhí)行,并在它被代理到上游服務之前執(zhí)行。
2>. 通過源碼得知,rewrite()階段操作的是ngx.var.uri變量,在請求處理過程中可以更改,例如執(zhí)行內部重定向后,而access()階段kong在路由匹配的時候使用的是ngx.var.request_uri原始uri,并且不可變。
參考router.lua文件:

image.png
3>. 在匹配路由前,重寫ngx.var.request_uri,以便達到根據(jù)請求URL或Cookie或Header中的配置值做路由轉發(fā)。
-
定制開發(fā)
修改kong/router.lua腳本,根據(jù)分發(fā)路由規(guī)則重寫var.request_uri(圖二紅框代碼)。
下圖是修改前的源代碼:
image.png
下圖是改造后的代碼:

image.png
