官术网_书友最值得收藏!

Fabric項目涉及較多的技術領域,如Go語言、PKI證書體系、Docker容器等,因而配置來源有多種形式,歸納總結如下。

●硬編碼的默認配置。如internal/peer/common/common.go中的const CmdRoot="core",orderer/common/localconfig/config.go中的var Defaults=TopLevel{...},在源碼中常以全局變量或常量的形式存在。

●隱藏的配置項。與硬編碼的默認配置稍有區別,它是一種配置文件中通常沒有明確顯示,但源碼在獲取配置時使用的對應數據結構中存在的配置項。如sampleconfig/core.yaml中peer.BCCSP.PKCS11部分的配置,在源碼中被讀取時對應使用的是bccsp/pkcs11/conf.go中的PKCS11Opts結構體,該結構體中存在SoftVerify、Immutable這兩個配置項,但sampleconfig/core.yaml中peer.BCCSP.PKCS11中并沒有這兩個配置項。此類配置較為邊緣,但確實存在,一般使用默認值。

●配置文件。以文件形式呈現的配置,包括Fabric區塊鏈網絡配置文件和節點配置文件。網絡配置文件,如生成創世紀塊、應用通道配置交易的configtx.yaml。節點配置文件,如orderer節點啟動時讀取的orderer.yaml、peer節點啟動時讀取的core.yaml。

●環境變量。比較典型的為啟動Docker容器時所配置的環境變量,如FABRIC_CFG_PATH,定義了節點使用的配置文件的路徑。

●命令行參數。如執行peer chaincode install -p時,通過-p指定鏈碼源碼路徑。

Fabric使用上述配置形式的配置,有如下兩個特性。

●配置的優先級和覆蓋。當一個節點啟動時,同一個配置項可能在多處均有配置,但優先級不一樣。上述配置形式中,優先級從上到下遞增,即命令行參數的配置值會覆蓋環境變量的配置值,環境變量的配置值會覆蓋配置文件的配置值,配置文件的配置值會覆蓋代碼中硬編碼的默認配置值。

●配置間的對應關系。節點(orderer或peer)是網絡的組成部分,基于此,節點的配置值要服從網絡的配置值。典型地,如configtx.yaml中定義了一個組織的MSP ID,若一個節點屬于該組織,其使用的MSP ID自然是configtx.yaml中已經定義好的值。

在具體部署時,節點一般以Docker容器的形式運行。在官方的默認鏡像中,peer.yaml、orderer.yaml分別在peer節點容器、orderer節點容器中的/etc/hyperledger/fabric目錄下。節點在配置文件的配置項和容器的環境變量是一一對應的,如core.yaml中peer下的id配置項,對應的環境變量為CORE_PEER_ID。再如orderer.yaml中General下的LedgerType配置項,對應的環境變量為ORDERER_GENERAL_LEDGERTYPE,依此類推。

提示

為釋義清晰,本書在講述源碼的過程中,若涉及配置,也會以A.B.C的形式進行引用,如core.peer.id,指core.yaml中peer下的id配置項。

在源碼層面,Fabric配置的管理主要使用第三方庫viper(項目倉庫為spf13/viper)實現。viper可以對環境變量、YAML/JSON等格式的配置文件,甚至是遠程配置,進行讀取和設置,是一個專用于處理配置的解決方案。viper提供的配置具有優先級,由低到高為“硬編碼的默認配置 < 配置文件 < 環境變量 < 命令行參數 < viper.Set函數”。此外,viper對于配置項的大小寫是不敏感的,在讀取配置時,viper均會將配置項轉化為小寫,如對于3個配置abc=1、ABC=1或AbC=1,viper均視為同一個配置項abc。

viper的典型用法,也是Fabric使用的方式,如代碼清單2-1所示。

代碼清單2-1 viper的典型用法

1.  //1.viper讀取環境變量
2.  viper.SetEnvPrefix("CORE")  //設置環境變量前綴,若為core,會將core變為大寫并設為前綴
3.  viper.AutomaticEnv()        //獲取當前系統所有以CORE為前綴的環境變量
4.  replacer := strings.NewReplacer(".", "_")  //將環境變量名稱中的 . 換成 _
5.  viper.SetEnvKeyReplacer(replacer)
6.  //2.viper獲取配置文件
7.  viper.SetConfigName("config_name")   //設置配置文件名,不包含后綴,viper自動判斷
8.  viper.AddConfigPath("/app/config/path")
9.  viper.AddConfigPath(".")             //設置查找配置文件的路徑,可以有多個
10. viper.ReadInConfig()                 //讀取配置文件中的所有配置項
11. viper.Get("common.name")             //獲取common下name項的值
12. viper.Set("common.name", "Bill")     //將common下name項的值設置為Bill
主站蜘蛛池模板: 金堂县| 呼伦贝尔市| 唐河县| 板桥市| 宁波市| 茂名市| 辽宁省| 张掖市| 都安| 田东县| 桓台县| 山东| 麻城市| 吴川市| 新田县| 南木林县| 仁布县| 天津市| 漠河县| 玉环县| 察隅县| 团风县| 东宁县| 互助| 乐昌市| 万年县| 海丰县| 汶川县| 嘉荫县| 绍兴县| 巴马| 独山县| 博爱县| 汾阳市| 霞浦县| 闽侯县| 临清市| 阳山县| 沅陵县| 瑞金市| 石台县|