fabric源码解读【基础篇】:配置文件组件viper

viper

Viper是一个go应用程序完整的配置解决方案。 Viper可以看作是您所有应用程序配置需求的注册表,它支持:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL和Java属性配置文件中读取
  • 实时查看和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或领事)读取
  • 从命令行标志读取
  • 读取缓冲区

地址:https://github.com/spf13/viper
下载是需要golang.org/x/text 组件支持

viper example

创建viper demo目录,增加yaml文件(fabric example 的crypto-config)
fabric源码解读【基础篇】:配置文件组件viper_第1张图片

OrdererOrgs:

  - Name: Orderer
    Domain: example.com
    CA:
        Country: US
        Province: California
        Locality: San Francisco

    Specs:
      - Hostname: orderer
PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    CA:
        Country: US
        Province: California
        Locality: San Francisco
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    CA:
        Country: US
        Province: California
        Locality: San Francisco
    Template:
      Count: 2
    Users:
      Count: 1

package main

import (
	"fmt"
	"github.com/spf13/viper"
)

func main() {
	viper.SetConfigName("crypto-config") // 设置配置文件名称
	viper.AddConfigPath("./viper") // 设置配置路径,可以多个,可以使用系统变量如&GOPATH等
	viper.SetConfigType("yaml") // 设置配置文件类型
	if err := viper.ReadInConfig();err!= nil{ // 读取配置文件
	    fmt.Println(err)
		return
	}
	fmt.Println(viper.Get("OrdererOrgs")) // 获取OrdererOrgs配置 ,结果为map
	fmt.Println(viper.Get("Name")) // 获取Name配置,不存在,会打印nil
}

执行run,结果如下:

[map[Name:Orderer Domain:example.com CA:map[Locality:San Francisco Country:US Province:California] Specs:[map[Hostname:orderer]]]]
<nil>

viper in Fabric

Fabric通过Viper组件管理yaml配置项设置与解析.

  • crypto-config.yaml
  • configtx.yaml
  • orderer.yaml
  • core.yaml
    并使用cobra组件进行绑定,fabric使用cobra组件处理命令请求,通过重置命令行选项参数,绑定Viper组件指定的配置项,以改变指定配置项的属性值,如重置logging-level配置。
    cobra请查看文章 https://blog.csdn.net/bondsui/article/details/89291738。

fabric/peer/main.go



func main() {
	// For environment variables.
	//设置环境变量前缀,peer为core,环境变量以CORE_开头。
	viper.SetEnvPrefix(cmdRoot)
	viper.AutomaticEnv() // 自动前缀
	replacer := strings.NewReplacer(".", "_") // 字符替换
	viper.SetEnvKeyReplacer(replacer)

	// Define command-line flags that are valid for all peer commands and
	// subcommands.
	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")
	// 绑定命令行logging-level值
	viper.BindPFlag("logging_level", mainFlags.Lookup("logging-level"))

	// 添加子命令
	mainCmd.AddCommand(version.Cmd())
	mainCmd.AddCommand(node.Cmd())
	mainCmd.AddCommand(chaincode.Cmd(nil))
	mainCmd.AddCommand(clilogging.Cmd(nil))
	mainCmd.AddCommand(channel.Cmd(nil))

	// 初始化viper组件,添加config路径
	//addConfigPath(v, altPath)
	//addConfigPath(v, "./")
	//AddDevConfigPath(v)
	//AddDevConfigPath("/etc/hyperledger/fabric")
	// 执行viper.ReadInConfig()
	err := common.InitConfig(cmdRoot)
	if err != nil { // Handle errors reading the config file
		logger.Errorf("Fatal error when initializing %s config : %s", cmdRoot, err)
		os.Exit(1)
	}
    // 获取peer变量,PEER_GOMAXPROCS,并设置GOMAXPROCS
	runtime.GOMAXPROCS(viper.GetInt("peer.gomaxprocs"))

	// 设置日志格式
	flogging.InitBackend(flogging.SetFormat(viper.GetString("logging.format")), logOutput)

	// 初始化msp
	var mspMgrConfigDir = config.GetPath("peer.mspConfigPath")
	// 获取mspid
	var mspID = viper.GetString("peer.localMspId")
	// 获取msptype,默认fabric
	var mspType = viper.GetString("peer.localMspType")
	if mspType == "" {
		mspType = msp.ProviderTypeToString(msp.FABRIC)
	}
	err = common.InitCrypto(mspMgrConfigDir, mspID, mspType)
	if err != nil { // Handle errors reading the config file
		logger.Errorf("Cannot run peer because %s", err.Error())
		os.Exit(1)
	}
	// 执行具体命令
	if mainCmd.Execute() != nil {
		os.Exit(1)
	}
	logger.Info("Exiting.....")
}

}

你可能感兴趣的:(区块链)