fabirc1.0商业正式版本源码解析4——配置系统

2024-06-06 18:38

本文主要是介绍fabirc1.0商业正式版本源码解析4——配置系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

fabric的配置系统是程序原始数据的来源之一,虽然简单却很重要。在阅读源码过程中对于具象化程序也很有帮助。在分析peer的具体交易工作之前,我们可以先分析一下fabric的配置系统。我们还将我们的目光聚焦在/fabric/peer/main.Go的main函数中,除了一系列mainCmd的命令操作,还有viper进行的一系列配置操作,并通过err := common.InitConfig(cmdRoot)进行了配置的初始化。

fabric索取配置的途径有:环境变量,命令行参数,各种格式的配置文件。其中以配置文件为主,环境变量和命令行参数辅助,三者可以相互作用。主要的配置文件有core.yaml,orderer.yaml等,在/fabric/sampleconfig中有示例。主要使用的配置代码集中在/fabric/core/config下。

viper简介

fabric的配置系统主要运用第三方包viper,可在github.com/spf13/viper下载。viper可以对系统环境变量,yaml/json等格式的配置文件甚至是远程配置进行读取和设置,并可以在不重启服务的情况下动态设置新的配置项的值并使之实时生效,是一个专门处理配置的解决方案。 而且,viper,眼镜蛇,称自己与cobra(见peer命令结构一文)是companion,足见使用viper的理由。

viper的基础用法如下:

//设置一个要读取的配置文件名(不包含后缀),一个viper只支持一个文件名
viper.SetConfigName("config")
//设置一个搜索配置文件的路径,viper的搜索路径可以有多个
viper.AddConfigPath("/etc/appname/")
viper.AddConfigPath(".")
//读取配置文件
viper.ReadInConfig()
//获取其中一个name项的值
viper.Get("name")
//将name的值设置为Bill
viper.Set("name", "Bill")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

viper搜索路径和文件

peer命令对core.yaml的引入也是通过viper,具体过程如下:

  • /fabric/peer/main.go中定义const cmdRoot = "core"
  • main函数中调用err := common.InitConfig(cmdRoot),该参数一路向下传递。
  • InitConfig函数在/fabric/peer/common/common.go中定义,其中调用了config.InitViper(nil, cmdRoot)viper.ReadInConfig()
  • InitViper在/fabric/core/config/config.go中定义,接收cmdRoot作为参数,最终调用了viper.SetConfigName(),也即将core设置为了配置文件名。
  • common.InitConfig(cmdRoot)中的viper.ReadInConfig()则读取了该配置文件

orderer命令则使用orderer.yaml配置文件,由viper引入,具体过程如下:

  • 在/fabric/orderer/main.go中main函数调用了config.Load()
  • Load在/fabric/orderer/localconfig/config.go中定义。该文件中定义了Prefix = "ORDERER"configName string,并在init初始化函数中将configName赋值为strings.ToLower(Prefix),即orderer,也即所用的配置文件名为orderer。Load函数新建了一个用于orderer自己的viper,并调用了cf.InitViper(config, configName),其中config参数为新建的用于orderer自身的viper,configName为配置文件名orderer
  • InitViper在/fabric/core/config/config.go中定义,最终调用了viper.SetConfigName(),也即将orderer设置为了配置文件名
  • Load随后调用了config.ReadInConfig(),读取了配置文件

InitViper

上述步骤中peer和orderer在初始化配置文件时,最终都将调用的终点指向了/fabric/core/config/config.go中定义InitViper()。下面集中分析InitViper。

  • 首先判断环境变量FABRIC_CFG_PATH是否有值,如果有值,则是手工定义了FABRIC的配置文件所在路径。参考Getting Started中关于手工设置export FABRIC_CFG_PATH=$PWD(当前目录)。

  • 若没有定义该环境变量的值,则用代码添加三个路径作为搜索配置文件的路径:当前工作目录,$GOPATH/src/github.com/hyperledger/fabric/sampleconfig,/etc/hyperledger/fabric

    • 当前工作目录,调用addConfigPath(v, “./”)添加,其内部调用的是viper.AddConfigPath()。

    • $GOPATH/src/github.com/hyperledger/fabric/sampleconfig,通过调用AddDevConfigPath(v)添加。

      • AddDevConfigPath首先调用GetDevConfigDir(),读取 GOPATHsrc/github.com/hyperledger/fabric/sampleconfigfilepath.Join GOPATH和src/github.com/hyperledger/fabric/sampleconfig,形成完整的路径并返回。
      • AddDevConfigPath接着调用addConfigPath函数,其内部调用的是viper.AddConfigPath()。
    • /etc/hyperledger/fabric。定义了OfficialPath = “/etc/hyperledger/fabric”常量,如果该路径存在,则调用addConfigPath加入该路径。
  • 调用SetConfigName()设置配置文件名,所指的的配置文件名configName是由参数传递进来的。

由经由InitViper,形成了以下viper配置:

搜索路径(二选一)

  • FABRIC_CFG_PATH指定的路径
  • ./,$GOPATH/src/github.com/hyperledger/fabric/sampleconfig,/etc/hyperledger/fabric

搜索的配置文件名

  • core —— 核心配置,供各个模块使用
  • orderer —— orderer配置,orderer使用

另外注意InitViper的第一个参数,v *viper.Viper。在InitViper函数中,无论是添加搜索路径(使用的是addConfigPath函数),还是设置要搜索的配置文件名(viper自身的SetConfigName函数),都分为全局的viper和特定的viper(也就是参数v)。最终由viper.AddConfigPath或viper.SetConfigName完成的,则是全局的,由v.AddConfigPath或v.SetConfigName完成的,则是特定的。这样就可以很方便的初始化需要单独使用viper的模块,如orderer就是单独使用一条毒蛇,其在/fabric/orderer/localconfig/config.go中的Load函数中,config := viper.New()新养了一条自己的蛇,然后将此蛇通过参数传给InitViper,cf.InitViper(config, configName)。

安全文件配置

安全配置相关的代码在/fabric/peer/main.go中没有体现,而是在/fabric/peer/node/start.go中的serve函数中才初次出现。若grpc服务中使用了TLS网络,则需要.key,.crt,.ca文件配套文件。在此简略介绍,关于TLS,将会在将来专门的文章中详细介绍。

在/fabric/peer/node/start.go中的serve函数中secureConfig, err := peer.GetSecureConfig()获取安全配置。

使用的安全配置结构为/fabric/core/comm/server.go中定义的SecureServerConfig,用于一个grpc服务端实例。 
.key,.crt,.ca文件所在的目录都是在core.yaml中定义都的tls文件夹中,当使用TLS网络时,会读取这些文件的数据到SecureServerConfig对象中。在GetSecureConfig()函数中,使用ioutil.ReadFile读取由/fabric/core/config/config.go中定义的config.GetPath(“…”)函数获取的tls路径下的相应文件。如/etc/hyperledger/fabric/tls/server.crt。

命令选项配置

以peer start命令为例,在/fabric/peer/node/start.go中startCmd()函数中,flags.BoolVarP(&chaincodeDevMode, "peer-chaincodedev", "", false,"Whether peer in chaincode development mode")设置了peer start命令的选项之一为peer-chaincodedev,用于赋值文件中的全局变量chaincodeDevMode,该变量指定了chaincode的模式。chaincode的模式在core.yaml中也有定义,chaincode.mode的值为net,为默认选项。而当执行peer start 命令时指定了选项peer-chaincodedev=true,也即将chaincodeDevMode赋值为true,在serve()函数中,就会使用viper.Set("chaincode.mode", chaincode.DevModeUserRunsChaincode)将chaincode的模式值设置成了dev

环境变量配置

在fabric目前的阶段,各个peer都是在容器中运行的,因此环境变量指的是各个容器中的环境变量。在各个容器的启动脚本中对容器的一些环境变量也进行了设置。在peer-base-no-tls.yaml(见源码解析1——线头)中,如peer容器中,设置了如下环境变量:

    - CORE_PEER_ADDRESSAUTODETECT=true
    - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
    - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2ecli_default
    - CORE_LOGGING_LEVEL=ERROR
    ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

在fabric/peer/main.go中的开始,即对容器的环境变量进行了获取并设置:

    //设置了环境变量前置,在此也就是peerviper.SetEnvPrefix(cmdRoot)//将环境变量加载进来了viper.AutomaticEnv()replacer := strings.NewReplacer(".", "_")//将环境变量中的_换成.,这样就和yaml文件的配置相匹配了。//因为viper读取yaml文件所形成的配置项就是按层级并以.分隔的格式,如peer.addressviper.SetEnvKeyReplacer(replacer)

这篇关于fabirc1.0商业正式版本源码解析4——配置系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036918

相关文章

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

ONLYOFFICE 8.1 版本桌面编辑器测评

在现代办公环境中,办公软件的重要性不言而喻。从文档处理到电子表格分析,再到演示文稿制作,强大且高效的办公软件工具能够极大提升工作效率。ONLYOFFICE 作为一个功能全面且开源的办公软件套件,一直以来都受到广大用户的关注与喜爱。而其最新发布的 ONLYOFFICE 8.1 版本桌面编辑器,更是带来了诸多改进和新特性。本文将详细评测 ONLYOFFICE 8.1 版本桌面编辑器,探讨其在功能、用户

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Visual Studio中,MSBUild版本问题

假如项目规定了MSBUild版本,那么在安装完Visual Studio后,假如带的MSBUild版本与项目要求的版本不符合要求,那么可以把需要的MSBUild添加到系统中,然后即可使用。步骤如下:            假如项目需要使用V12的MSBUild,而安装的Visual Studio带的MSBUild版本为V14。 ①到MSDN下载V12 MSBUild包,把V12包解压到目录(