Hyperledger fabric 源码分析之 peer 服务启动过程

原创 2016年08月02日 17:25:15

peer 服务是主服务。

该服务支持各种 peer 命令。

包括查询状态,和启动、停止节点服务等。

启动过程在 peer/main.go 中。

serve 函数

最重要的是 func serve(args []string) error 函数。

当执行 peer node start 命令时候被调用,启动一个节点服务。

首先是进行配置管理,根据配置信息和一些计算来构建 cache 结构,探测节点信息等。

主要调用 core.peer 包来实现。

    if err := peer.CacheConfiguration(); err != nil {
        return err
    }

    peerEndpoint, err := peer.GetPeerEndpoint()
    if err != nil {
        err = fmt.Errorf("Failed to get Peer Endpoint: %s", err)
        return err
    }

之后是启动 grpc 服务,监听到 7051 端口。

    listenAddr := viper.GetString("peer.listenAddress")

    if "" == listenAddr {
        logger.Debug("Listen address not specified, using peer endpoint address")
        listenAddr = peerEndpoint.Address
    }

    lis, err := net.Listen("tcp", listenAddr)

创建 EventHub 服务,通过调用 createEventHubServer() 方法来实现,该服务也是 grpc,只有 vp 节点才开启。

    lis, err = net.Listen("tcp", viper.GetString("peer.validator.events.address"))
    if err != nil {
        return nil, nil, fmt.Errorf("failed to listen: %v", err)
    }

    //TODO - do we need different SSL material for events ?
    var opts []grpc.ServerOption
    if comm.TLSEnabled() {
        creds, err := credentials.NewServerTLSFromFile(viper.GetString("peer.tls.cert.file"), viper.GetString("peer.tls.key.file"))
        if err != nil {
            return nil, nil, fmt.Errorf("Failed to generate credentials %v", err)
        }
        opts = []grpc.ServerOption{grpc.Creds(creds)}
    }

    grpcServer = grpc.NewServer(opts...)
    ehServer := producer.NewEventsServer(uint(viper.GetInt("peer.validator.events.buffersize")), viper.GetInt("peer.validator.events.timeout"))
    pb.RegisterEventsServer(grpcServer, ehServer)

启动数据库服务。

    db.Start()

启动一个 grpc 服务。

grpcServer := grpc.NewServer(opts...)

注册 Chaincode 支持服务。

    secHelper, err := getSecHelper()
    if err != nil {
        return err
    }

    secHelperFunc := func() crypto.Peer {
        return secHelper
    }

    registerChaincodeSupport(chaincode.DefaultChain, grpcServer, secHelper)

创建 peer 节点服务,注意区分 vp 和 nvp 节点。

    if peer.ValidatorEnabled() {
        logger.Debug("Running as validating peer - making genesis block if needed")
        makeGenesisError := genesis.MakeGenesis()
        if makeGenesisError != nil {
            return makeGenesisError
        }
        logger.Debugf("Running as validating peer - installing consensus %s", viper.GetString("peer.validator.consensus"))
        peerServer, err = peer.NewPeerWithEngine(secHelperFunc, helper.GetEngine)
    } else {
        logger.Debug("Running as non-validating peer")
        peerServer, err = peer.NewPeerWithHandler(secHelperFunc, peer.NewPeerHandler)
    }

分别注册 peer 节点服务、管理服务、devops 服务、openchain 服务等,如果开启 REST,则启动 REST 服务。

    pb.RegisterPeerServer(grpcServer, peerServer)

    // Register the Admin server
    pb.RegisterAdminServer(grpcServer, core.NewAdminServer())

    // Register Devops server
    serverDevops := core.NewDevopsServer(peerServer)
    pb.RegisterDevopsServer(grpcServer, serverDevops)

    // Register the ServerOpenchain server
    serverOpenchain, err := rest.NewOpenchainServerWithPeerInfo(peerServer)
    if err != nil {
        err = fmt.Errorf("Error creating OpenchainServer: %s", err)
        return err
    }

    pb.RegisterOpenchainServer(grpcServer, serverOpenchain)

    // Create and register the REST service if configured
    if viper.GetBool("rest.enabled") {
        go rest.StartOpenchainRESTServer(serverOpenchain, serverDevops)
    }

最后,启动这些服务的 grpc 服务端,启动 EventHub 的服务端。如果需要 profiling,还会打开监听服务。


更多源码分析,请参考 https://github.com/yeasy/hyperledger_code_fabric。


转载请注明:http://blog.csdn.net/yeasy/article/details/52096267。

fabric源码解析1——线头

fabric源码解析1——线头 找出分析源码的线头
  • idsuf698987
  • idsuf698987
  • 2017年07月10日 13:03
  • 1294

fabric源码解析6——GRPC服务

fabric源码解析6–GRPC服务GRPC简介GRPC是由自谷歌开发的一项多语言开源的RPC技术,在fabric用于实现客户端与服务器端的远程调用。比如chaincode,客户定义了一项rpc服务并...
  • idsuf698987
  • idsuf698987
  • 2017年07月22日 22:33
  • 739

Fabric的源码阅读方式

Hyperledger fabric,源码阅读,方式,Fabric,gRPC
  • u014732537
  • u014732537
  • 2017年10月04日 08:33
  • 426

fabric源码解析3——日志系统

fabric源码解析3——日志系统这里所说的日志,是指程序运行过程中打印到终端或日志文件,记录程序运行过程的日志,而非涉及到fabric记录交易数据,账本数据一类的交易日志。其实日志系统机制对于源码研...
  • idsuf698987
  • idsuf698987
  • 2017年07月17日 12:49
  • 652

git fabric 1.0.0 官方源码进行编译,生成 docker images

系统环境:centos 7 64位 docker docker-compose 不要使用 centos yum 仓库带的 docker,版本过低。 安装docker 官方的repo 里面的版本 ...
  • remote_roamer
  • remote_roamer
  • 2017年04月18日 15:11
  • 4581

[区块链]Hyperledger Fabric源代码(基于v1.0 beta版本)阅读之乐扣老师解读系列 (一)Fabric简介

写在前面众所周知,超级账本的fabric技术还是一个还在不断进化中的区块链框架。到目前20170613为止,还只是在beta阶段,对于这个时机开始解读源代码会不会为时过早,或者说正式版出来是不是有很大...
  • lsttoy
  • lsttoy
  • 2017年06月13日 18:01
  • 1860

Hyperledger Fabric 词汇表

Anchor Peer在一个channel上可以被所有其他peer发现的peer,channel上的每个成员都有一个anchor Peer(或多个anchor peer 来防止单点故障),允许属于不同...
  • baidu_39649815
  • baidu_39649815
  • 2017年07月28日 15:19
  • 449

在 hyperledger fabric 环境对Validating Peers布署 chaincode (智能合约)

在开发 hyperledger App 时为了要 access 分类帐的 block 必须使用 chaincode, 也就是 App上层传来的 data 将透过 chaincode 传至 block,...
  • chenjaulin
  • chenjaulin
  • 2016年12月05日 08:16
  • 2717

Hyperledger Fabric处理Peer与Peer之间通信的源码解析

1.网络初始化的过程中执行以下内容,在创建节点Engine过程中该节点作为客户端的身份连接到其他PeerpeerServer, err = peer.NewPeerWithEngine(secHelp...
  • jiang_xinxing
  • jiang_xinxing
  • 2017年01月17日 18:00
  • 1571

Hyperledger Fabric创世纪块源码解析

1.serve函数中创世纪块开始,调用MakeGenesis函数makeGenesisError := genesis.MakeGenesis() if makeGenesisError !=...
  • jiang_xinxing
  • jiang_xinxing
  • 2017年01月17日 13:20
  • 1736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hyperledger fabric 源码分析之 peer 服务启动过程
举报原因:
原因补充:

(最多只允许输入30个字)