Hyperledger Fabric是由IBM公司主導開發的一個面向企業級客戶的開源項目。Hyperledger Fabric自誕生之日起就獲得了全球眾多企業的關注,它的出現讓企業級區塊鏈應用的落地成為可能。
企業級的區塊鏈一般都是圍繞業務場景展開,區塊鏈網絡中要求所有參與方具有身份對等的架構,並建立共識協議。與比特幣和以太坊這類公鏈不同,Hyperledger Fabric網絡中的節點必須經過授權認證后才能加入整個網絡。授權認證機制將區塊鏈網絡中的各節點透明可控化,有助於企業進行有效控制。
同時為了滿足靈活多變的應用場景,Hyperledger Fabric采用了模塊化的系統設計理念,它將權限認證模塊(MSP)、共識服務模塊(Ordering Service)、背書模塊(Endorsing peers)、區塊提交模塊(committing peers)等進行分離,使開發者可以根據具體的業務場景需要,使用各自模塊,實現了模塊的可插拔設計。在我看來,Hyperledger Fabric更適合作為一個聯盟鏈的開發框架。
*Hyperledger Fabric先后經歷兩個大版本(0.6和1.x),本文討論的都是1.x系列的架構。
1. fabric簡介
fabric的交易流程圖:
交易流程步驟如下:
1) 客戶端構造交易提案發送給背書節點
2) 背書節點模擬執行交易,並進行背書
3) 客戶端收集背書節點的模擬交易結果
4) 客戶端把合法的包含簽名背書的交易發送到排序節點
5) 排序節點對交易進行排序打包並生成區塊
6) 排序節點將區塊廣播給各個組織的主節點
7) 各個組織的主節點將交易保存到區塊鏈賬本里
8) 主節點同步區塊給組織內的其他節點
9) 其他節點將區塊保存到賬本
為了更加深入了解了整個交易的流程,在此通過手動搭建基於kafka集群的多排序節點的fabric環境進行演示說明。
搭建完成之后架構圖如下:
注:搭建流程引自:https://www.cnblogs.com/neomeister/articles/9625762.html
由上圖可見orderer節點為整個區塊鏈網絡中所有合法交易進行全局排序,並將排序后的交易組合生成區塊結構。在目前的設計中,所有合法的交易信息都會從Orderer節點經過,因此Orderer節點在網絡中必須處於可靠、可信的地位。那怎樣才能保證orderer節點的高可用呢?
2. 高性能排序服務搭建
上面我們在搭建的fabric集群架構的時候,為了實現高可用我們創建了3個orderer節點,但是每次將合法交易發送給排序節點的時候必須指定其中的一個orderer節點進行交易的提交,如上面例子中對智能合約的操作:
peer chaincode invoke -o orderer0.neotest.com:7050 -C neotest1channel -n neotest1cc -c '{"Args":["invoke","a","b","1"]}'
如果指定的orderer節點down機了,本來交易提案驗證成功的該筆交易就會提交失敗。為了避免這個問題,我們參考了現有的分布式系統的架構的設計理念,引入了nginx做代理,在交易流程第四步,客戶端client與orderer集群中間新增了一台nginx做負載均衡,這樣我們提交交易的時候只需要往nginx發送交易,並且只要有一台orderer節點運轉正常,交易的提交就不會失敗。
因區塊鏈底層都是通過gRPC協議進行通信,我們需要使用1.13.10以上版本的nginx才能支持gRPC負載,我們試着搭建一下:
1) 從nginx官網上獲取版本號不低於1.13.10的源碼包,本文使用的版本為1.14.0。
2) 將nginx源碼包拷貝到centos中,並進行解壓,得到nginx的源碼;
3) 進入nginx源碼目錄中,執行如下的configure命令:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module
安裝nginx的時候我們需要添加http_ssl_module和http_v2_module模塊方法(讓web服務器支持SSL和http2)
4) make
5) make install
6) 運行以下命令看nginx是否安裝成功
進入nginx安裝目錄,運行./sbin/nginx -v
如顯示:
nginx version: nginx/1.14.0
則表示nginx安裝成功
7) 編輯nginx.conf文件,搭建負載均衡服務器
http {
server {
listen 8080 http2;
access_log logs/access.log main;
upstream grpcServers{
server orderer0.neotest.com:7050;
server orderer1.neotest.com:7051;
server orderer2.neotest.com:7052;
}
#攔截客戶端發送給排序服務器的請求
location /orderer.AtomicBroadcast {
grpc_pass grpc://grpcServers;
}
}
}
8) 啟動nginx
完成以上步驟,架構就調整成了下圖:
至此,高可用的orderer集群負載已經搭建完成,客戶端僅需往nginx機器的8080端口提交交易
peer chaincode invoke -o nginx服務器IP:端口 -C neotest1channel -n neotest1cc -c '{"Args":["invoke","a","b","1"]}'
nginx服務器會將提交的交易請求自動負載到某個orderer節點進行交易打包,提高了系統的性能和可用性以及容災容錯能力。
3. 小結
上面是本人在搭建fabric集群過程中的一點小小的探索。目前區塊鏈還處於技術早期發展階段,國內的區塊鏈在底層協議、應用和標准等方面都不夠成熟,區塊鏈技術和商業仍需不斷完善。但是區塊鏈技術是一場技術的革新,我相信它會推動人類社會各個領域創新與多元化,讓我們拭目以待吧。
本文僅代表個人觀點