流量網關Kong定制化多維度(URL、Cookie、Header)轉發(fā)

  1. Kong官方源碼GitHub: https://github.com/Kong/kong

  2. 定制開發(fā)需求
    a. 根據(jù)匹配的URL做轉發(fā)。
    b. 根據(jù)匹配的Cookie做轉發(fā)。
    c. 根據(jù)匹配的Header做轉發(fā)。

  3. 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ā)。

  1. 定制開發(fā)
    修改kong/router.lua腳本,根據(jù)分發(fā)路由規(guī)則重寫var.request_uri(圖二紅框代碼)。
    下圖是修改前的源代碼:


    image.png

下圖是改造后的代碼:


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容