您的位置:首页 > 大数据 > 人工智能

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

2016-08-02 17:25 691 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息