go語言插件平臺的實現思路

    最近在準備給物聯網平臺添加插件模塊,然後在準備做插件的時候,發現實現Golang的插件遇到問題了,不知道要怎麼來實現這個插件的功能,因爲找來找去,發現golang插件有很多的問題,比如沒有辦法實現跨平臺,沒有辦法實現跨語言支持,比如我用c編譯成so文件或者dll文件,然後給go進行直接調用,這些都比較麻煩,然後go官方的實現插件必須要插件和主程序的版本一致,代碼一致,依賴一致等,這樣做的插件將會帶來很多的麻煩問題,比如插件的版本管理,升級這些都是問題。

然後看到網上的插件處理目前主要有兩種方式,一種是通過rpc或grpc進行支持,另外一種則是編譯型插件,編譯型插件的話,就是通過編譯源碼的方式進行插件的加入,然後通過配置文件,進行插件的啓用和關停。

 

然後通過總結和反思,我思考了一下,目前主要有以下幾種實現思路:

 

  • 1.本地socket (如果爲unix系統操作系統的話,就要使用UNIX Domain Socket, 非Unix系列系統的話,就用本地網絡比如:127.0.0.1來實現),當然可以的話,還是用UNIX Domain Socket,使用它作爲IPC的話有以下幾點優點:

 

  • 不需要經過網絡協議棧
  • 不需要打包拆包、計算校驗和、維護序號和應答等,可靠性更強

 

  • 2.使用共享內存+消息隊列:先開闢出一塊內存池用於消息的收發,一邊將數據放入內存,然後將內存地址信息通過消息隊列的形式通知對方,然後做超時機制,比如1分鐘之後,不管對方有沒有接收,都對消息進行回收。

 

  • 3.通過cgo的形式進行實現。

 

  • 4.通過解釋性語言插件進行支持。

 

經過綜合評估之後,我覺得通過socket通信的方式來進行插件的實現還是比較好的思路,畢竟不管是2還是3,功能也都能實現,也能跨語言,跨系統就不一定了,然後還有就是時間問題,以及成本問題,畢竟我們大部分人都是打工人,都是要生活的,沒有那麼多的時間和精力來搞這些沒有多大意義的東西,4的話,後期看吧,打算是支持lua語言的。

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