「跨鍊網關的模塊化進程」插件機制演化
—— 背景——
當前,區塊鏈跨鏈平台的接入方式在架構設計上存在著較大差異,如何將應用鏈快速、便捷地接入跨鏈系統是一個亟待解決的問題。趣鏈BitXHub跨鏈服務平台採用中繼鏈+網關的跨鏈方案,其中,跨鍊網關擔任著區塊鏈間收集和傳播交易的角色。採用插件機制的設計將網關(Pier)與應用鏈交互的模塊與跨鍊網關核心功能模塊進行解耦,從而實現不同種類應用鏈高效地接入跨鏈系統。在Pier運行時,通過動態加載插件的方式完成不同應用鏈的靈活適配。為了更好的提升Pier與應用鏈的交互能力,具體應用鏈插件需要根據不同區塊鏈的特性實現具體的接口,交互接口需要滿足以下幾個功能:
1)監聽應用鏈上的跨鏈事件並傳給核心模塊進行處理;
2)執行來自於網關發出(來自於其他應用鏈)的跨鏈請求;
3)能夠主動查詢應用鏈上已收到和已執行的跨鏈請求狀態。
—— 原生插件——
—— 原生插件——
go語言從1.13 版本開始支持編譯為插件,使用方式如下
go build --buildmode=plugin -o appchain.so *.go
go項目在編譯時可以通過--buildmode 指定為插件模式,這種方式將輸出為動態鏈接文件。該文件並非可直接運行的二進製文件,而是提供給其他二進制運行時的動態調用。
優點:

優點:
優點:
缺點:
缺點:
缺點:
1)原生插件中的依賴庫與主程序必須保持完全一致,否則啟動的時候會報錯,而且不論這個依賴是直接引用還是間接引用,都會出現這個問題。
—— 轉戰RPC插件——
原生插件中嚴厲的版本限制,使得在升級插件和或網關主程序功能時,可能因為無意升級了主程序某些依賴,插件也必須作出相同的適配升級。這種方式不利於插件的完全解耦,因此我們轉向了另外一個使用RPC方式的GO插件項目。 (該項目GitHub地址:https://github.com/hashicorp/go-plugin)
go-plugin 插件的使用方式如下:
go-plugin 插件的使用方式如下:
簡單來說,go-plugin 項目實現的插件方式採用了C/S 模式,主程序作為RPC Client,具體插件作為RPC Server,Server 和Client 通信也是基於的interface 接口規範來通信。
具體使用流程如下:
1)抽象需要插件化的interface,這裡直接復用原生插件中使用的接口定義即可;
2)針對Client 端和Server 端,都實現上述接口。 Server 端的實現是具體的插件處理邏輯部分的代碼;Client 端的實現只需封裝一下gRPC處理的結果和異常信息,之後便可以做到主程序在使用插件時對於gRPC的弱感知化。
Server 實現部分:

Client 實現部分:

▲額外需要注意的是:
插件中需要調用plugin.Serve 來授權主程序使用自己的RPC服務。這裡需要注意的是,主程序和插件通信前需要進行握手,主要包括確認該插件的版本信息。
主程序使用plugin.Client 對象啟動插件,該插件是運行在另一個進程中的,所以插件崩潰並不會影響到主程序。
client與server在使用中實際上是通過進程間Socket來完成通信,這雖然犧牲了一定的性能卻換來了原生插件的單進程方案所不具備的依賴解耦、多語言支持等靈活應用。
趣鏈科技數據網格實驗室BitXHub團隊
作者簡介
作者簡介
趣鏈科技數據網格實驗室BitXHub團隊
趣鏈科技數據網格實驗室BitXHub團隊


