Kong Go Plugin 方式2:動態擴展庫so加載

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保持一致。

嵌入式和傳統模式代碼也有區別:

嵌入式:

傳統模式:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章