區塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令一

  區塊鏈教程Fabric1.0源代碼分析Peer peer根命令入口及加載子命令,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。

Fabric 1.0源代碼筆記 之 Peer #peer根命令入口及加載子命令

1、加載環境變量配置和配置文件

Fabric支持通過環境變量對部分配置進行更新,如:CORE_LOGGING_LEVEL爲輸出的日誌級別、CORE_PEER_ID爲Peer的ID等。
此部分功能由第三方包viper來實現,viper除支持環境變量的配置方式外,還支持配置文件方式。
如下代碼爲加載環境變量配置,其中cmdRoot爲"core",即CORE_開頭的環境變量。

viper.SetEnvPrefix(cmdRoot)
viper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
//代碼在peer/main.go

加載配置文件,同樣由第三方包viper來實現,具體代碼如下:
其中cmdRoot爲"core",即/etc/hyperledger/fabric/core.yaml。

err := common.InitConfig(cmdRoot) 
//代碼在peer/main.go

如下代碼爲common.InitConfig(cmdRoot)的具體實現:

config.InitViper(nil, cmdRoot)
err := viper.ReadInConfig()
//代碼在peer/common/common.go

另附config.InitViper(nil, cmdRoot)的代碼實現:
優先從環境變量FABRIC_CFG_PATH中獲取配置文件路徑,其次爲當前目錄、開發環境目錄(即:src/github.com/hyperledger/fabric/sampleconfig)、和OfficialPath(即:/etc/hyperledger/fabric)。
AddDevConfigPath是對addConfigPath的封裝,目的是通過GetDevConfigDir()調取sampleconfig路徑。

var altPath = os.Getenv("FABRIC_CFG_PATH")
if altPath != "" {
    addConfigPath(v, altPath)
} else {
    addConfigPath(v, "./")
    err := AddDevConfigPath(v)
    addConfigPath(v, OfficialPath)
}
viper.SetConfigName(configName)
//代碼在core/config/config.go

2、加載命令行工具和命令

Fabric支持類似peer node start、peer channel create、peer chaincode install這種命令、子命令、命令選項的命令行形式。
此功能由第三方包cobra來實現,以peer chaincode install -n test_cc -v 1.0 -p
其中peer、chaincode、install、-n分別爲命令、子命令、子命令的子命令、命令選項。

如下代碼爲mainCmd的初始化,其中Use爲命令名稱,PersistentPreRunE先於Run執行用於初始化日誌系統,Run此處用於打印版本信息或幫助信息。

var mainCmd = &cobra.Command{
    Use: "peer",
    PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
        loggingSpec := viper.GetString("logging_level")

        if loggingSpec == "" {
            loggingSpec = viper.GetString("logging.peer")
        }
        flogging.InitFromSpec(loggingSpec) //初始化flogging日誌系統

        return nil
    },
    Run: func(cmd *cobra.Command, args []string) {
        if versionFlag {
            fmt.Print(version.GetInfo())
        } else {
            cmd.HelpFunc()(cmd, args)
        }
    },
}
//代碼在peer/main.go

如下代碼爲添加命令行選項,-v, --version、--logging-level和--test.coverprofile分別用於版本信息、日誌級別和測試覆蓋率分析。

mainFlags := mainCmd.PersistentFlags()
mainFlags.BoolVarP(&versionFlag, "version", "v", false, "Display current version of fabric peer server")
mainFlags.String("logging-level", "", "Default logging level and overrides, see core.yaml for full syntax")
viper.BindPFlag("logging_level", mainFlags.Lookup("logging-level"))
testCoverProfile := ""
mainFlags.StringVarP(&testCoverProfile, "test.coverprofile", "", "coverage.cov", "Done")
//代碼在peer/main.go

如下代碼爲逐一加載peer命令下子命令:node、channel、chaincode、clilogging、version。

mainCmd.AddCommand(version.Cmd())
mainCmd.AddCommand(node.Cmd())
mainCmd.AddCommand(chaincode.Cmd(nil))
mainCmd.AddCommand(clilogging.Cmd(nil))
mainCmd.AddCommand(channel.Cmd(nil))
//代碼在peer/main.go 

mainCmd.Execute()爲命令啓動。

3、初始化日誌系統(輸出對象、日誌格式、日誌級別)

如下爲初始日誌系統代碼入口,其中loggingSpec取自環境變量CORE_LOGGING_LEVEL或配置文件中logging.peer,即:全局的默認日誌級別。

flogging.InitFromSpec(loggingSpec)
//代碼在peer/main.go

未完待續感謝關注兄弟連區塊鏈教程分享!

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