关闭

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

标签: 区块链Blockchainhyperledger
5390人阅读 评论(1) 收藏 举报
分类:

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。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:297725次
    • 积分:3965
    • 等级:
    • 排名:第8449名
    • 原创:110篇
    • 转载:0篇
    • 译文:1篇
    • 评论:51条
    最新评论