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。

鼠标消息处理流程

                                                                                                    ...
  • lumg
  • lumg
  • 2001-08-03 20:47:00
  • 906

hyperledger fabric 结构分析(三)

本文解决的问题是:本Peer节点如何接收其他节点的数据,接到数据如何处理? 之前两节的分析是命令来源是CLI client,如何连接到Devops服务器、如何发送给Consensus模块、如何发送...
  • xjmtxwd24
  • xjmtxwd24
  • 2016-10-12 14:55:30
  • 3303

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

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

fabric源码解析8——peer的System Chaincode

fabric源码解析8——peer的System Chaincode综述关于System Chaincode,下文中以系统链码称之。这是个人翻译,依据是Chaincode本质是注册存储到链上的一段逻辑...
  • idsuf698987
  • idsuf698987
  • 2017-07-26 11:00:17
  • 1794

Hyperledger fablic 1.0 在centos7环境下的安装与部署和动态增加节点

Hyperledger fablic 1.0 在centos7环境下的安装与部署和动态增加节点一、安装docker 执行代码如下: curl -sSL https://get.daocloud.io/...
  • zhaoliang1131
  • zhaoliang1131
  • 2017-02-06 19:41:36
  • 3527

fabric源码解析6——GRPC服务

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

ProtoBuf 与 gRPC 你需要知道的知识

ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。用户写好 .proto 描述文件,之后使用 proto...
  • yeasy
  • yeasy
  • 2016-08-12 11:16:27
  • 24197

gRPC简介

gRPC-Go gRPC是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架, 有关详细信息,请参阅gRPC快速入门指南。 安装 要安装此软件包,您需要安装Go并在计...
  • jiang_xinxing
  • jiang_xinxing
  • 2017-01-13 16:19:00
  • 859

fabirc1.0商业正式版本源码解析6——GRPC服务

GRPC简介 GRPC是由自谷歌开发的一项多语言开源的RPC技术,在fabric用于实现客户端与服务器端的远程调用。比如chaincode,客户定义了一项rpc服务并相应生成了客户端代码和服务端代码...
  • u011386109
  • u011386109
  • 2017-08-31 16:08:19
  • 268

超级账本Fabric的架构与设计

超级账本Fabric项目自诞生之日起就吸引了全球众多企业的密切关注,已经先后发布了两个大的版本,0.6实验版本(2016年9月)和1.0正式版本(2017年7月)。...
  • Blockchain_lemon
  • Blockchain_lemon
  • 2017-09-07 11:09:03
  • 11507
收藏助手
不良信息举报
您举报文章:Hyperledger fabric 源码分析之 peer 服务启动过程
举报原因:
原因补充:

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