作者:張富春(ahfuzhang),轉載時請注明作者和參考鏈接,謝謝!
- cnblogs博客
- zhihu
- Github
- 公眾號:一本正經的瞎扯

我在多行程插件框架 hashicorp/go-plugin 的基礎上,使用 protoreflect 來決議 proto3 語法的IDL檔案,通過命令列工具自動生成多行程框架的 callee 和 caller 代碼,
專案的地址請看:https://github.com/ahfuzhang/go-plugin/tree/main/examples/code_generator
并且已經提了PR到官方,
golang自身的plugin還非常的弱,主要有這些限制:
- 其插件的編譯環境必須與宿主行程的編譯環境完全一致
- 插件可以動態加載,但是無法動態卸載
hashicorp公司(他們更出名的產品是terra-form)開源的go-plugin使用了多行程的模式來實作插件,宿主行程創建子行程,然后通過unix套接字來通訊,
雖然跨行程來通訊有一定的損耗,但對于計算的場景還是OK的,反之用于通訊則不太適合,
hashicorp/go-plugin有這樣一些不錯的特性:
- 提供了多行程插件化運行的框架,可以以多種方式寫caller端和callee端,
- 可以動態的加載插件(創建行程)、卸載插件(退出子行程)
- 因為是跨行程的通訊,所以子行程的穩定性不影響宿主行程;其所有的作業系統資源都是與主行程隔離的
- 官方甚至提供了一個用python實作子行程的例子
- 如果用go + lua的方式來寫插件,相信可以做到用lua來實作動態跨行程執行的效果
- 基于這個框架可以很容易寫出一個FAAS(Function as-a Service)框架來
- 提供了日志、加密、通訊等其他支撐性的功能
最后再介紹我實作的這個小工具:如果基于grpc的風格來寫插件,其中還是要實作一部分對grpc介面的封裝,如果每次寫插件都要寫這些重復代碼,未免有點太繁瑣了,所以可以在proto3中定義好service,并通過extension的語法來定義插件名字,具體的步驟已經寫在了檔案里,大致是:
- 通過*.proto檔案來定義請求格式、回應格式、服務介面;
- 通過
plugin_name這個extension來定義服務對應的插件名字,如果不寫,則插件名字就是服務名,
- 通過
- 通過protoc來把*.proto變成xx.pb.go的golang代碼
- 通過gen_code命令列來讀取*.proto, 生成插件需要的xx.plugin.go檔案
- 同時生成callee目錄,生成插件對應的代碼,然后在todo的位置填寫代碼
- 生成callee_test.go檔案,可以拷貝到宿主行程中,用于加載插件,
再補充一點,如果需要把一堆基本型別構成的[]interface{}陣列的資料在插件之間傳遞,我寫的上一個工具可以解決這個場景:如何在proto3中用上golang對應的interface{}型別,以及這個工具:Serilizer
Have fun, 希望對你有用, ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539997.html
標籤:其他
上一篇:Centos安裝Nginx
下一篇:Shell 標準輸入和輸出
