Hyperledger Fabric 开发:基于Kafka排序服务的实现

目标

实现基于kafka集群的排序服务

任务实现

实现一个基于 Kafka 提供排序服务的集群环境。在该网络环境中,我们使用2个 Org 组织,每个 Org 组织下各有2个 peer 节点,4个 orderer节点,后端使用 Kafka 集群实现排序服务,由4个 kafka 节点,3个 zookeeper 节点组成。

指定kafka实现排序服务

1.配置 crypto-config.yaml

进入fabric-samples/first-network 目录中

$ cd hyfa/fabric-samples/first-network/

将 crypto-config.yaml 配置文件备份为 crypto-config_backup.yaml ,然后编辑 crypto-config.yaml 文件,在 OrdererOrgs.Specs 中添加三个 orderer 节点,共计四个 orderer 节点

$ sudo cp crypto-config.yaml crypto-config_backup.yaml
$ sudo vim crypto-config.yaml

编辑后的 crypto-config.yaml 文件是: crypto-config.yaml

2.配置 configtx.yaml

将 configtx.yaml 配置文件备份为 configtx_backup.yaml ,然后编辑 configtx.yaml 文件,在 Orderer.Addresses 中声明四个 orderer 节点信息, 将 Orderer.OrdererType 的值由默认的 solo 修改为 kafka,在 Orderer.Addresses 下添加另外的三个 orderer 节点信息,在 Orderer.Kafka.Brokers 中添加 kafka 集群服务器的信息

$ sudo cp configtx.yaml configtx_backup.yaml
$ sudo vim configtx.yaml

编辑后configtx.yaml 的文件是:configtx.yaml

配置网络环境

1.配置 docker-compose-base.yaml

将 base/docker-compose-base.yaml 配置文件备份为 base/docker-compose-base_backup.yaml ,然后编辑 base/docker-compose-base.yaml

$ sudo cp base/docker-compose-base.yaml base/docker-compose-base_backup.yaml
$ sudo vim base/docker-compose-base.yaml

在文件中添加 zookeeper 节点信息、kafka 节点信息及修改 orderer 节点的信息,peer 节点信息不变。详细文件:docker-compose-base.yaml

2. 配置 docker-compose-cli.yaml

将 docker-compose-cli.yaml 配置文件备份为 docker-compose-cli_backup.yaml,然后编辑 docker-compose-cli.yaml 配置文件

$ sudo cp docker-compose-cli.yaml docker-compose-cli_backup.yaml
$ sudo vim docker-compose-cli.yaml

在文件中添加三个 zookeeper 节点、四个 kafka 节点及相应的 orderer 节点的信息,具体配置文件:docker-compose-cli.yaml

启动网络

关闭并清理网络环境

$ sudo ./byfn.sh down

使用 byfn.sh 生成组织结构及身份证书及所需的各项配置文件

$ sudo ./byfn.sh generate

启动网络

$ sudo docker-compose -f docker-compose-cli.yaml up  -d

查看活动容器:

$ sudo docker ps

可发现发三个 zookeeper 节点、四个 kafka 节点、四个 orderer 节点、四个 peer 节点都已经处于活动状态, 打开一个新的终端2窗口:进入 zookeeper1 容器

$sudo docker exec -it zookeeper1 bash

使用 ifconfig 命令查看容器的 IP 地址之后退出

进入 kafka0 容器并进入 kafka HOME目录

$ sudo docker exec -it kafka0 bash
$ cd opt/kafka/

查看 kafka 自动创建的 topic

 $bin/kafka-topics.sh --list --zookeeper 172.18.0.5:2181

testchainid

创建通道

返回终端 1 窗口,进入 cli 容器

$ sudo docker exec -it cli bash

设置环境变量

$ export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  && export CHANNEL_NAME=mychannel

创建通道

$peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME  -f ./channel-artifacts/channel.tx  --tls --cafile $ORDERER_CA


终端输出如下:

[channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 002 Got status: &{SERVICE_UNAVAILABLE}
[channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 004 Got status: &{SERVICE_UNAVAILABLE}
[channelCmd] InitCmdFactory -> INFO 005 Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 006 Got status: &{SERVICE_UNAVAILABLE}
[channelCmd] InitCmdFactory -> INFO 007 Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 008 Got status: &{SERVICE_UNAVAILABLE}
[channelCmd] InitCmdFactory -> INFO 009 Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 00a Got status: &{SERVICE_UNAVAILABLE}
[channelCmd] InitCmdFactory -> INFO 00b Endorser and orderer connections initialized
[cli/common] readBlock -> INFO 00c Received block: 0

创建通道之后在终端 2 窗口的 kafka 容器中再次查看 topic 信息, 发现 kafka 又自动创建了一个新的名为 mychannel 的 topic

$bin/kafka-topics.sh –list –zookeeper 172.18.0.5:2181

mychannel testchainid

返回终端 1 窗口的 cli 容器中,将当前代表的 peer0.org1.example.com 节点加入到应用通道中

$ peer channel join -b mychannel.block

终端输出如下:

[channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
[channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel

测试

安装链码

$ peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/

安装成功显示内容如下:

[chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
[chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
[chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:”OK” >

实例化链码

$ peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"

实例化成功显示如下:


[chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
[chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc

查询链码

$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

返回查询结果:100

调用链码

$ peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

返回调用结果:

[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

查询转账之后的结果

$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

返回查询结果:90

orderer 节点以集群的方式运行,在集群环境下,客户端将交易发送到任何一个 orderer 排序节点都可以,如下所示,指定Orderer2节点。

调用链码

$ peer chaincode invoke -o orderer2.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer2.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

返回调用结果:

[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

再次查询链码

$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}

返回查询结果:80

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦