Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用

1.Hyperledger Fabric 2.x 生产环境的分布式部署

安装Go

sudo wget -P /usr/local https://studygolang.com/dl/golang/go1.15.linux-amd64.tar.gz
cd /usr/local
sudo tar -zxvf go1.15.linux-amd64.tar.gz

添加环境变量

vim ~/.bashrc

将以下内容复制到bashrc文件中,按I插入,插入完成后按ESC退出插入,输出:wq!保存退出,如下图所示

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=$HOME/go
export PATH=$PATH:/home/yujialing/go/src/github.com/hyperledger/amops/bin
export FABRIC_CFG_PATH=/home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment

更新环境变量

source ~/.bashrc

查看Go是否安装成功,成功则显示版本号

go version

在这里插入图片描述

安装docker

wget https://download.docker.com/linux/ubuntu/gpg
sudo apt-key add gpg
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

使docker加入用户组

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart

退出当前用户重登一下

sudo wget -P /usr/local/bin https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
cd /usr/local/bin/
sudo mv docker-compose-Linux-x86_64 docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

下载Fabric

cd /home/yujialing
mkdir go
mkdir go/src
mkdir go/src/github.com
mkdir go/src/github.com/hyperledger
cd go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout v2.0.0

下载二进制可执行文件和关于Fabric的docker镜像

cd scripts/
./bootstrap.sh

Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第1张图片

建立多机部署文件夹

cd /home/yujialing/go/src/github.com/hyperledger
mkdir amops
cd amops
mkdir multiple-deployment
cd /home/yujialing/go/src/github.com/hyperledger/fabric/scripts
cp -r fabric-samples/bin /home/yujialing/go/src/github.com/hyperledger/amops

设置Fabric服务的地址映射

sudo vim /etc/hosts

把以下内容填充至hosts文件中,IP需要按实际情况更改

106.xxx.xxx.xxx agridepartorderer.amops.com
120.xxx.xxx.xxx agrimacownerorderer.amops.com
42.xxx.xxx.xxx financedepartorderer.amops.com
106.xxx.xxx.xxx peer0.agridepart.amops.com
106.xxx.xxx.xxx peer1.agridepart.amops.com
120.xxx.xxx.xxx peer0.agrimacowner.amops.com
120.xxx.xxx.xxx peer1.agrimacowner.amops.com
42.xxx.xxx.xxx peer0.financedepart.amops.com
42.xxx.xxx.xxx peer1.financedepart.amops.com

开放Fabric服务所需的端口,6060、7050、7051、7052、7053、7054、8051、8052、8053、3000、8443、9443、10443、9090
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第2张图片

重启服务器网络,但我不清楚Xshell重启服务器网络的指令,所以我采用的是重启服务器的方式来达到重启网络的目的,发出指令后重启连接即可

sudo shutdown -r now

建立链码文件夹,我要部署两个链码

cd /home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment
mkdir chaincode
mkdir chaincode/agrimacadmin
mkdir chaincode/agrimacadmin/go
mkdir chaincode/cultivatedsubsidy
mkdir chaincode/cultivatedsubsidy/go

可以通过FileZilla上传链码至agrimacadmincultivatedsubsidygo文件夹中,或者通过touch命令新建链码,并通过vim编辑链码
在这里插入图片描述
到链码文件夹下,下载链码的依赖文件

cd chaincode/agrimacadmin/go
cd chaincode/cultivatedsubsidy/go
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on
go mod init
go mod vendor
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第3张图片

服务器1multiple-deployment文件夹下新建crypto-config.yaml文件和configtx.yaml文件(证书密钥和交易配置文件),用于生产证书、密钥、创世区块等文件,注:服务器2、3不用建这两个文件

cd /home/yujialing/go/src/github.com/hyperledger/amops/multiple-deployment
touch crypto-config.yaml
touch configtx.yaml

将以下内容写进crypto-config.yaml文件中

OrdererOrgs:
  - Name: Orderer
    Domain: amops.com
    Specs:
      - Hostname: agridepartorderer
      - Hostname: agrimacownerorderer
      - Hostname: financedepartorderer

PeerOrgs:
  - Name: Agridepart
    Domain: agridepart.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2 #生成证书的数量
    Users:
      Count: 1 #生成用户证书个数
  - Name: Agrimacowner
    Domain: agrimacowner.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Financedepart
    Domain: financedepart.amops.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

将以下内容写进configtx.yaml文件中

---
Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('OrdererMSP.admin')"

    - &Agridepart
        Name: AgridepartMSP
        ID: AgridepartMSP
        MSPDir: crypto-config/peerOrganizations/agridepart.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin', 'AgridepartMSP.peer', 'AgridepartMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin', 'AgridepartMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('AgridepartMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('AgridepartMSP.peer')"

        AnchorPeers:
            - Host: peer0.agridepart.amops.com
              Port: 7051

    - &Agrimacowner
        Name: AgrimacownerMSP
        ID: AgrimacownerMSP
        MSPDir: crypto-config/peerOrganizations/agrimacowner.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin', 'AgrimacownerMSP.peer', 'AgrimacownerMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin', 'AgrimacownerMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('AgrimacownerMSP.peer')"

        AnchorPeers:
            - Host: peer0.agrimacowner.amops.com
              Port: 7051

    - &Financedepart
        Name: FinancedepartMSP
        ID: FinancedepartMSP
        MSPDir: crypto-config/peerOrganizations/financedepart.amops.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin', 'FinancedepartMSP.peer', 'FinancedepartMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin', 'FinancedepartMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('FinancedepartMSP.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('FinancedepartMSP.peer')"

        AnchorPeers:
            - Host: peer0.financedepart.amops.com
              Port: 7051

Capabilities:
    Channel: &ChannelCapabilities
        V2_0: true
    Orderer: &OrdererCapabilities
        V2_0: true
    Application: &ApplicationCapabilities
        V2_0: true

Application: &ApplicationDefaults

    Organizations:

    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        LifecycleEndorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"
        Endorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"

    Capabilities:
        <<: *ApplicationCapabilities

Orderer: &OrdererDefaults

    OrdererType: etcdraft

    Addresses: # orderer 集群节点
        - agridepartorderer.amops.com:7050
        - agrimacownerorderer.amops.com:7050
        - financedepartorderer.amops.com:7050
    # Batch Timeout: The amount of time to wait before creating a batch
    BatchTimeout: 2s

    # Batch Size: Controls the number of messages batched into a block
    BatchSize:

        MaxMessageCount: 10

        AbsoluteMaxBytes: 99 MB

        PreferredMaxBytes: 512 KB

    Organizations:

    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        # BlockValidation specifies what signatures must be included in the block
        # from the orderer for the peer to validate it.
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

Channel: &ChannelDefaults

    Policies:
        # Who may invoke the 'Deliver' API
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        # Who may invoke the 'Broadcast' API
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        # By default, who may modify elements at this config level
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    Capabilities:
        <<: *ChannelCapabilities

Profiles:

    ThreeOrgsChannel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Agridepart
                - *Agrimacowner
                - *Financedepart
            Capabilities:
                <<: *ApplicationCapabilities

    SampleMultiNodeEtcdRaft:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: etcdraft
            EtcdRaft:
                Consenters:
                - Host: agridepartorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/server.crt
                - Host: agrimacownerorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/server.crt
                - Host: financedepartorderer.amops.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/server.crt
            Addresses:
                - agridepartorderer.amops.com:7050
                - agrimacownerorderer.amops.com:7050
                - financedepartorderer.amops.com:7050
            Organizations:
            - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
            - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                - *Agridepart
                - *Agrimacowner
                - *Financedepart

服务器1的操作:生成证书、密钥、创世区块、各组织的交易配置文件等

cryptogen generate --config=./crypto-config.yaml
configtxgen -profile SampleMultiNodeEtcdRaft -channelID amopsdeploy -outputBlock ./channel-artifacts/genesis.block
configtxgen -profile ThreeOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID amops
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/AgridepartMSPanchors.tx -channelID amops -asOrg AgridepartMSP
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/AgrimacownerMSPanchors.tx -channelID amops -asOrg AgrimacownerMSP
configtxgen -profile ThreeOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/FinancedepartMSPanchors.tx -channelID amops -asOrg FinancedepartMSP
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第4张图片

生成的文件需要拷贝至 服务器2、3 中,通过FileZilla传输即可
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第5张图片

编写三个组织的Fabric启动代码

同样在multiple-deployment文件夹下创建并编辑各个组织的Fabric启动代码

touch docker-compose-up.yaml

编写Fabric启动的yaml文件,这里只展现其中一个组织,其他两个组织的Fabric启动代码照葫芦画瓢即可

version: '2'

services:
  ca.agridepart.amops.com:
    container_name: ca.agridepart.amops.com
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca.agridepart.amops.com
      - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.agridepart.amops.com-cert.pem
      - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/priv_sk
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-tls/tlsca.agridepart.amops.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-tls/priv_sk
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/ca
    command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/agridepart.amops.com/ca/:/etc/hyperledger/fabric-ca-server-config
      - ./crypto-config/peerOrganizations/agridepart.amops.com/tlsca/:/etc/hyperledger/fabric-ca-server-tls
    ports:
      - "7054:7054"

  agridepartorderer.amops.com:
    container_name: agridepartorderer.amops.com
    image: hyperledger/fabric-orderer
    environment:
      - FABRIC_LOGGING_SPEC=DEBUG
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_BOOTSTRAPMETHOD=file
      - ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_OPERATIONS_LISTENADDRESS=0.0.0.0:8443
      - ORDERER_METRICS_PROVIDER=prometheus
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
        - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
        - ./crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp:/var/hyperledger/orderer/msp
        - ./crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/:/var/hyperledger/orderer/tls
    ports:
      - 7050:7050
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  peer0.agridepart.amops.com:
    container_name: peer0.agridepart.amops.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.agridepart.amops.com
      - CORE_PEER_ADDRESS=peer0.agridepart.amops.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.agridepart.amops.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.agridepart.amops.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.agridepart.amops.com:7051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
      - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9443
      - CORE_METRICS_PROVIDER=prometheus
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
       - /var/run/:/host/var/run/
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/msp:/etc/hyperledger/fabric/msp
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 7051:7051
      - 7052:7052
      - 7053:7053
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  peer1.agridepart.amops.com:
    container_name: peer1.agridepart.amops.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer1.agridepart.amops.com
      - CORE_PEER_ADDRESS=peer1.agridepart.amops.com:8051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:8051
      - CORE_PEER_CHAINCODEADDRESS=peer1.agridepart.amops.com:8052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.agridepart.amops.com:8051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.agridepart.amops.com:8051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
      # Allow more time for chaincode container to build on install.
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
      - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:10443
      - CORE_METRICS_PROVIDER=prometheus
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
       - /var/run/:/host/var/run/
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/msp:/etc/hyperledger/fabric/msp
       - ./crypto-config/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls:/etc/hyperledger/fabric/tls
    ports:
      - 8051:8051
      - 8052:8052
      - 8053:8053
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"

  cli1:
    container_name: cli1
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli1
      - CORE_PEER_ADDRESS=peer0.agridepart.amops.com:7051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/users/[email protected]/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./chaincode/agrimacadmin/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go
        - ./chaincode/cultivatedsubsidy/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"
      - "peer0.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer1.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer0.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer1.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer0.financedepart.amops.com:42.xxx.xxx.xxx"
      - "peer1.financedepart.amops.com:42.xxx.xxx.xxx"

  cli2:
    container_name: cli2
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli2
      - CORE_PEER_ADDRESS=peer1.agridepart.amops.com:8051
      - CORE_PEER_LOCALMSPID=AgridepartMSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer1.agridepart.amops.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/users/[email protected]/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./chaincode/agrimacadmin/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go
        - ./chaincode/cultivatedsubsidy/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    extra_hosts:
      - "agridepartorderer.amops.com:106.xxx.xxx.xxx"
      - "agrimacownerorderer.amops.com:120.xxx.xxx.xxx"
      - "financedepartorderer.amops.com:42.xxx.xxx.xxx"
      - "peer0.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer1.agridepart.amops.com:106.xxx.xxx.xxx"
      - "peer0.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer1.agrimacowner.amops.com:120.xxx.xxx.xxx"
      - "peer0.financedepart.amops.com:42.xxx.xxx.xxx"
      - "peer1.financedepart.amops.com:42.xxx.xxx.xxx"

服务器1、2、3的操作:启动Fabric网络

docker-compose -f docker-compose-up.yaml up -d

在这里插入图片描述

服务器1的操作:创建通道与更新组织1锚节点

docker exec -it cli1 bash
peer channel create -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/AgridepartMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

退出cli1容器,将区块文件amops.block从容器中拷贝出来,拷贝至cli2容器中,使peer1也加入区块中

exit
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/amops.block ./
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli2 bash
peer channel join -b amops.block
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第6张图片

amops.block拷贝至服务器2、3,例如通过FileZilla的方式
在这里插入图片描述

服务器2的操作:节点0、1加入通道,并更新组织2的锚节点

docker cp amops.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli1 bash
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/AgrimacownerMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

exit
docker exec -it cli2 bash
peer channel join -b amops.block

服务器3的操作:节点0、1加入通道,并更新组织3的锚节点

docker cp amops.block cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp amops.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli1 bash
peer channel join -b amops.block
peer channel update -o agridepartorderer.amops.com:7050 -c amops -f ./channel-artifacts/FinancedepartMSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem

exit
docker exec -it cli2 bash
peer channel join -b amops.block

服务器1、2、3的操作peer0peer1打包并安装链码

exit
docker exec -it cli1 bash
peer lifecycle chaincode package cultivatedsubsidy.tar.gz --path github.com/hyperledger/multiple-deployment/chaincode/cultivatedsubsidy/go --lang golang --label cultivatedsubsidy_1
peer lifecycle chaincode package agrimacadmin.tar.gz --path github.com/hyperledger/multiple-deployment/chaincode/agrimacadmin/go --lang golang --label agrimacadmin_1
peer lifecycle chaincode install cultivatedsubsidy.tar.gz
peer lifecycle chaincode install agrimacadmin.tar.gz

exit
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/cultivatedsubsidy.tar.gz ./
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/agrimacadmin.tar.gz ./
docker cp cultivatedsubsidy.tar.gz cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp agrimacadmin.tar.gz cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker exec -it cli2 bash
peer lifecycle chaincode install cultivatedsubsidy.tar.gz
peer lifecycle chaincode install agrimacadmin.tar.gz
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第7张图片

服务器1、2、3的操作:锚节点同意提交链码

exit
docker exec -it cli1 bash
peer lifecycle chaincode approveformyorg --channelID amops --name cultivatedsubsidy --version 1.0 --init-required --package-id cultivatedsubsidy_1:c90b208f62638ee5dcd88d82bac2888215a718147a965f084d7d831a94b1a347 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem
peer lifecycle chaincode approveformyorg --channelID amops --name agrimacadmin --version 1.0 --init-required --package-id agrimacadmin_1:1bf978795e1a2786aee6b0e675f9e494c3c97ec0154339731e8be56eb2d8ec74 --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第8张图片

使用任一服务器操作都可:查看链码状态是否就绪

peer lifecycle chaincode checkcommitreadiness --channelID amops --name cultivatedsubsidy --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --output json
peer lifecycle chaincode checkcommitreadiness --channelID amops --name agrimacadmin --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --output json
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第9张图片

使用任一服务器的锚节点操作都可:提交链码

peer lifecycle chaincode commit -o agridepartorderer.amops.com:7050 --channelID amops --name cultivatedsubsidy --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt
peer lifecycle chaincode commit -o agridepartorderer.amops.com:7050 --channelID amops --name agrimacadmin --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第10张图片

使用任一服务器的锚节点操作都可:初始化链码

peer chaincode invoke -o agridepartorderer.amops.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem -C amops -n cultivatedsubsidy --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt -c '{"Args":["Init"]}' –waitForEvent
peer chaincode invoke -o agridepartorderer.amops.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/msp/tlscacerts/tlsca.amops.com-cert.pem -C amops -n agrimacadmin --peerAddresses peer0.agridepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt --peerAddresses peer0.agrimacowner.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt --peerAddresses peer0.financedepart.amops.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt -c '{"Args":["Init"]}' –waitForEvent
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第11张图片

使用任一服务器操作都可:与链码进行交互

peer chaincode query -C amops -n cultivatedsubsidy -c '{"Args":["QueryCulSubsidyByKey","0"]}'
peer chaincode query -C amops -n agrimacadmin -c '{"Args":["QueryAgriMachineByKey","0"]}'

在这里插入图片描述

2.外部服务-与Java项目的结合

首先配置静态资源,包括证书密钥和连接文件
将服务器1生成的crypto-config复制到SpringBoot项目的resources目录下,并在该目录下新建名为connection.json的连接文件
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第12张图片

将以下内容复制到connection.json文件中(IP地址记得修改)

{
     
  "name": "amops",
  "version": "1.0.0",
  "client": {
     
    "organization": "Agridepart",
    "connection": {
     
      "timeout": {
     
        "peer": {
     
          "endorser": "300"
        },
        "orderer": "300"
      }
    }
  },
  "channels": {
     
    "amops": {
     
      "orderers": [
        "agridepartorderer.amops.com",
        "agrimacownerorderer.amops.com",
        "financedepartorderer.amops.com"
      ],
      "peers": {
     
        "peer0.agridepart.amops.com": {
     
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        },
        "peer0.agrimacowner.amops.com": {
     
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        },
        "peer0.financedepart.amops.com": {
     
          "endorsingPeer": true,
          "chaincodeQuery": true,
          "ledgerQuery": true,
          "eventSource": true
        }
      }
    }
  },
  "organizations": {
     
    "Agridepart": {
     
      "mspid": "AgridepartMSP",
      "peers": [
        "peer0.agridepart.amops.com"
      ],
      "certificateAuthorities": [
        "ca.agridepart.amops.com"
      ],
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    },
    "Agrimacowner": {
     
      "mspid": "AgrimacownerMSP",
      "peers": [
        "peer0.agrimacowner.amops.com"
      ],
      "certificateAuthorities": [
        "ca.agrimacowner.amops.com"
      ],
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    },
    "Financedepart": {
     
      "mspid": "FinancedepartMSP",
      "peers": [
        "peer0.financedepart.amops.com"
      ],
      "certificateAuthorities": [
        "ca.financedepart.amops.com"
      ],
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    }
  },
  "orderers": {
     
    "agridepartorderer.amops.com": {
     
      "url": "grpcs://106.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
     
        "ssl-target-name-override": "agridepartorderer.amops.com",
        "hostnameOverride": "agridepartorderer.amops.com"
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/agridepartorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    },
    "agrimacownerorderer.amops.com": {
     
      "url": "grpcs://120.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
     
        "ssl-target-name-override": "agrimacownerorderer.amops.com",
        "hostnameOverride": "agrimacownerorderer.amops.com"
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/agrimacownerorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    },
    "financedepartorderer.amops.com": {
     
      "url": "grpcs://42.xxx.xxx.xxx:7050",
      "mspid": "OrdererMSP",
      "grpcOptions": {
     
        "ssl-target-name-override": "financedepartorderer.amops.com",
        "hostnameOverride": "agrimacownerorderer.amops.com"
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/orderers/financedepartorderer.amops.com/tls/ca.crt"
      },
      "adminPrivateKeyPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/keystore/priv_sk"
      },
      "signedCertPEM": {
     
        "path": "src/main/resources/crypto-config/ordererOrganizations/amops.com/users/[email protected]/msp/signcerts/[email protected]"
      }
    }
  },
  "peers": {
     
    "peer0.agridepart.amops.com": {
     
      "url": "grpcs://106.xxx.xxx.xxx:7051",
      "grpcOptions": {
     
        "ssl-target-name-override": "peer0.agridepart.amops.com",
        "hostnameOverride": "peer0.agridepart.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/peers/peer0.agridepart.amops.com/tls/ca.crt"
      }
    },
    "peer0.agrimacowner.amops.com": {
     
      "url": "grpcs://120.xxx.xxx.xxx:7051",
      "grpcOptions": {
     
        "ssl-target-name-override": "peer0.agrimacowner.amops.com",
        "hostnameOverride": "peer0.agrimacowner.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/peers/peer0.agrimacowner.amops.com/tls/ca.crt"
      }
    },
    "peer0.financedepart.amops.com": {
     
      "url": "grpcs://42.xxx.xxx.xxx:7051",
      "grpcOptions": {
     
        "ssl-target-name-override": "peer0.financedepart.amops.com",
        "hostnameOverride": "peer0.financedepart.amops.com",
        "request-timeout": 120001
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/peers/peer0.financedepart.amops.com/tls/ca.crt"
      }
    }
  },
  "certificateAuthorities": {
     
    "ca.agridepart.amops.com": {
     
      "url": "https://106.xxx.xxx.xxx:7054",
      "httpOptions": {
     
        "verify": true
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agridepart.amops.com/ca/ca.agridepart.amops.com-cert.pem"
      },
      "registrar": [
        {
     
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    },
    "ca.agrimacowner.amops.com": {
     
      "url": "https://120.xxx.xxx.xxx:7054",
      "httpOptions": {
     
        "verify": true
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/agrimacowner.amops.com/ca/ca.agrimacowner.amops.com-cert.pem"
      },
      "registrar": [
        {
     
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    },
    "ca.financedepart.amops.com": {
     
      "url": "https://42.xxx.xxx.xxx:7054",
      "httpOptions": {
     
        "verify": true
      },
      "tlsCACerts": {
     
        "path": "src/main/resources/crypto-config/peerOrganizations/financedepart.amops.com/ca/ca.financedepart.amops.com-cert.pem"
      },
      "registrar": [
        {
     
          "enrollId": "admin",
          "enrollSecret": "adminpw"
        }
      ]
    }
  }
}

这是Java项目与Fabric交互的一个demo,运行main函数即可进行与Fabric的交互测试。参考此处代码可在Java项目的业务逻辑层实现项目与Fabric的交互

package com.scau.amops.hyperledger;

import lombok.extern.slf4j.Slf4j;
import org.hyperledger.fabric.gateway.*;
import org.hyperledger.fabric.gateway.impl.GatewayImpl;

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

@Slf4j
public class fabricdemo {
     
    private Gateway gateway;
    private Network network;
    private static final Path NETWORK_CONFIG_PATH = Paths.get("src", "main", "resources", "connection.json");
    private static final Path credentialPath = Paths.get("src", "main","resources", "crypto-config",
            "peerOrganizations", "agridepart.amops.com", "users", "[email protected]", "msp");

    public static void main(String[] args) {
     

        X509Certificate certificate = null;
        PrivateKey privateKey = null;
        Gateway gateway = null;
        try {
     
            //使用agridepart中的user1初始化一个网关wallet账户用于连接网络
            Wallet wallet = Wallets.newInMemoryWallet();
            Path certificatePath = credentialPath.resolve(Paths.get("signcerts", "[email protected]"));
            certificate = readX509Certificate(certificatePath);

            Path privateKeyPath = credentialPath.resolve(Paths.get("keystore", "priv_sk"));
            privateKey = getPrivateKey(privateKeyPath);

            wallet.put("user",Identities.newX509Identity("AgridepartMSP",certificate,privateKey));

            //根据connection.json 获取Fabric网络连接对象
            GatewayImpl.Builder builder = (GatewayImpl.Builder) Gateway.createBuilder();

            builder.identity(wallet, "user").networkConfig(NETWORK_CONFIG_PATH);
            //连接网关
            gateway = builder.connect();
            //获取amops通道
            Network network = gateway.getNetwork("amops");
            //获取合约对象
            Contract contract = network.getContract("cultivatedsubsidy");

            //查询合约对象evaluateTransaction
            byte[] queryCulSubsidyResultBefore = contract.evaluateTransaction("QueryCulSubsidyByKey","0");
            System.out.println("查询key=0结果:"+new String(queryCulSubsidyResultBefore, StandardCharsets.UTF_8));

            //创建补贴记录
            byte[] createCarResult = contract.createTransaction("CreateSubsidy")
                    .submit("10","325","1","yujialing","3000","2020-12-07","23.165767499024923","113.35528715035957","10");
            System.out.println("创建交易的结果"+new String(createCarResult, StandardCharsets.UTF_8));

            //查询合约对象evaluateTransaction
            byte[] queryCulSubsidyResultAfter = contract.evaluateTransaction("QueryCulSubsidyByKey","10");
            System.out.println("查询key=10结果:"+new String(queryCulSubsidyResultAfter, StandardCharsets.UTF_8));



        } catch (Exception e) {
     
            e.printStackTrace();
        }

    }

    private static X509Certificate readX509Certificate(final Path certificatePath) throws IOException, CertificateException {
     
        try (Reader certificateReader = Files.newBufferedReader(certificatePath, StandardCharsets.UTF_8)) {
     
            return Identities.readX509Certificate(certificateReader);
        }
    }

    private static PrivateKey getPrivateKey(final Path privateKeyPath) throws IOException, InvalidKeyException {
     
        try (Reader privateKeyReader = Files.newBufferedReader(privateKeyPath, StandardCharsets.UTF_8)) {
     
            return Identities.readPrivateKey(privateKeyReader);
        }
    }

}

运行main函数,查询key为0的数据,尝试插入并查询key为10的数据
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第13张图片
在Fabric的命令行界面查看是否成功插入,发现成功插入key为10的数据
在这里插入图片描述
在生产环境中的示例如下所示:

数据上链:
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第14张图片

数据校验:
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第15张图片

3.Hyperledger Fabric可视化监控的实现

在任一服务器配置PrometheusGrafana即可

配置Prometheus

拉取Prometheus镜像

配置一下镜像目的域名的ip映射,有的小伙伴可以直接pull镜像

ping github-production-release-asset-2e65be.s3.amazonaws.com

在这里插入图片描述

hosts文件处配置一下ip地址映射

sudo vim /etc/hosts

按照以下格式写进hosts文件

52.xxx.xxx.xxx github-production-release-asset-2e65be.s3.amazonaws.com

重启网络或者重启服务器后拉取docker镜像

docker pull prom/prometheus
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第16张图片

下载Prometheus到Hyperledger文件夹下

cd /home/ubuntu/go/src/github.com/hyperledger
wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz
tar -xvzf prometheus-2.23.0.linux-amd64.tar.gz
cd prometheus-2.23.0.linux-amd64
vim prometheus.yml

将以下内容复制到prometheus.ymlscrape_configs选项下

- job_name: 'hyperledger_metrics'
  scrape_interval: 10s
  static_configs:
  - targets: ['agridepartorderer.amops.com:8443','agrimacownerorderer.amops.com:8443','financedepartorderer.amops.com:8443','peer0.agridepart.amops.com:9443','peer1.agridepart.amops.com:10443','peer0.agrimacowner.amops.com:9443','peer1.agrimacowner.amops.com:10443','peer0.financedepart.amops.com:9443','peer1.financedepart.amops.com:10443']

Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第17张图片

启动prometheus服务

docker run -d --name prometheus-server -p 9090:9090 \
  --restart always \
  -v /home/ubuntu/go/src/github.com/hyperledger/prometheus-2.23.0.linux-amd64/prometheus.yml:/prometheus.yml \
  prom/prometheus \
  --config.file=/prometheus.yml

查看FabricNetworkMode

docker inspect agridepartorderer.amops.com
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第18张图片

查看prometheus容器id

docker ps

在这里插入图片描述

prometheus容器加入Fabric网络,格式docker network connect

docker network connect multiple-deployment_default bef8a8743005

配置可视化工具Grafana

下载并运行Grafana

wget https://dl.grafana.com/oss/release/grafana-7.3.5.linux-amd64.tar.gz
tar -zxvf grafana-7.3.5.linux-amd64.tar.gz
cd grafana-7.3.5/bin
nohup ./grafana-server > grafana-server-run.log 2>&1 &

打开浏览器,通过Grafana所在主机的IP:3000的形式访问控制面板(3000是端口号),默认账号和密码均为admin

登陆进来界面如下所示:
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第19张图片

选择配置菜单,点击增加数据源
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第20张图片

选择Prometheus作为数据源
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第21张图片

输入部署Prometheus所在的主机IP9090端口号,例如http://106xxx.xxx.xxx:9090,输入完成后拉到最下面点击Save and Test
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第22张图片

访问Grafana官网,下载Fabric模板的JSON文件

https://grafana.com/

选择Grafana菜单进入Dashboards界面
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第23张图片

在搜索框中输入Fabric后选择Hyperledger Fabric Monitoring for 1.4
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第24张图片

把Json文件下载下来
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第25张图片

下载完成后回到Grafana面板,导入刚刚下载完成的Json文件
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第26张图片

点击Upload JSON file选择文件
在这里插入图片描述
点击import导入
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第27张图片

导入完成后界面长这个样子,但有一些没数据,那么我们测试一下是否有数据
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第28张图片

比如通过Fabric Version查看指标是什么,点击下拉框,选择编辑按钮

Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第29张图片

采用的是fabric_version
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第30张图片

那我们增添新的仪表板测试一下
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第31张图片

设置指标
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第32张图片

其实是有数据的,只是数据参数设置不对
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第33张图片

我们返回主界面,把新建的仪表板移除
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第34张图片

再次编辑Fabric Version
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第35张图片

Options看到Field确实是version,但显示的是version的名称,我们将Name改为Current(当前值),注意:Fabric Version展现的是当前值,但其他的像交易提案成功次数应该设置为Total
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第36张图片

版本号就出来了,随后点击应用回到主界面
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第37张图片

主界面的Fabric Version就显示正常
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第38张图片

各位小伙伴按需设计与分配可达到自己满意的效果(这里Fabric版本号变成2.0.0是因为在服务器的Fabric版本是2.0.0,虚拟机的版本为2.2.0
Hyperledger Fabric 2.x 生产环境的分布式部署、性能测试与应用_第39张图片

4.Fabric生产网络性能测试

调试中…

欢迎小伙伴讨论,文章内容如有错误请在评论区评论或发私聊消息,谢谢你。

你可能感兴趣的:(Hyperledger,Fabric,2.x,区块链,Hyperledger,Caliper,fabric,分布式,区块链,智能合约,java)