Kong參考文檔
https://docs.konghq.com/gateway-oss/2.5.x/external-plugins/
Kong參考案例
https://github.com/Kong/go-plugins
傳統配置方式(動態擴展庫so)
如果是傳統配置方式,配置文件沒有配置項pluginserver_names,那麼就會去找go_plugins_dir和go_pluginserver_exe 兩個配置。而且傳統配置不支持同時開啓多個plugin服務進程。也就是讓/usr/local/bin/go-pluginserver這個可執行文件來運行多個plugin的代碼。需要將plugin編譯爲.so文件,有點像php的動態擴展庫。
01 編譯go-pluginserver可執行文件
git clone https://github.com/Kong/go-pluginserver
cd go-pluginserver目錄,執行go build 命令得到可執行文件go-pluginserver,將文件複製到/usr/local/bin目錄即可
02編譯目標plugin的.so文件
go build -buildmode=plugin go-hello-lm.go
得到go-hello-lm.so文件,將文件複製到go_plugins_dir目錄
03修改配置文件
修改配置文件/etc/kong/kong.conf,沒有該文件可以複製一個kong.conf.default
plugins = bundled,go-hello-lm
go_plugins_dir = /usr/local/kong/go_plugins_so
go_pluginserver_exe = /usr/local/bin/go-pluginserver
這個配置文件會在kong重啓的時候被解析,並將裏面的數據保存到kong服務
04重啓服務器
執行命令:kong restart 或者kong prepare && kong reload
Kong的管理系統會看到新增的自定義plugin
05給service分配plugin功能
訪問http://192.168.1.197:8000/mock-sample得到結果:
可能遇到的問題:
1.兩次編譯時go版本不一致的問題
https://github.com/Kong/go-pluginserver 下載的包go.mod使用的go版本默認是1.13,編譯so文件的本地虛擬機go版本是1.16,導致該問題出現
修改go.mod的go版本爲1.16,執行go get -u 命令升級所有依賴。重新編譯so文件即可。
2.以前的plugin不用了,需要從konga的管理系統刪除用到這個plugin的所有地方
從配置內容來看,嵌入式和傳統配置兩種配置方式不能同時使用
新版kong的配置文件默認使用的是嵌入式方式,每個plugin可以獨立運行在一個server,由於嵌入式使用的是build編譯後的最終可執行文件(不是.so),所以對編譯環境的一致就沒有要求。
傳統配置方式的/usr/local/bin/go-pluginserver也是需要go build的,如果/usr/local/bin/go-pluginserver編譯時的版本固定了,那麼後續開發的.so擴展就需要和/usr/local/bin/go-pluginserver保持一致。
嵌入式和傳統模式代碼也有區別:
嵌入式:
傳統模式: