Fabric:搭建自定义网络

Hyperledger Fabric: V2.5.4

写在最前

  从本篇博客开始,将陆续介绍使用Fabric搭建自定义网络及部署执行链码的过程。本篇主要介绍如何搭建网络。
  由于前文在安装Fabric的时候,已经将目录fabric-samples/bin加入到了环境变量PATH中,所以正文用到cryptogenconfigtxgen等工具已经可以在系统全局使用。

1 生成证书

1.1 生成模板文件

先在~/go/src下创建一个文件夹finance_network用来保存网络和通道的所有配置文件,并在该文件下使用cryptogen工具生成crypto-config.yaml模板文件。具体如下:

cd ~/go/src
mkdir finance_network
cd finance_network
cryptogen showtemplate > crypto-config.yaml

这时,会在finance_network目录下生成一个crypto-config.yaml文件。

1.2 自定义修改文件

可以根据要搭建的网络的需求在在crypto-config.yaml文件中修改相关的配置。假设搭建的网络的需求如下:

  • 两个组织:Org1, Org2。Org1中有2个peer节点,而Org2中有2个peer节点,另外还有1个orderer节点。
  • 每个peer节点允许的用户数为2。
  • 将字符串finance加入所有Orderer组织、peer节点的域名中。

根据这些要求修改crypto-config.yaml文件,具体如下:

OrdererOrgs:
  - Name: Orderer							# orderer组织的名称
    Domain: finance.com					# orderer组织的根域名
    EnableNodeOUs: true						# 是否使用组织单元
    Specs:
      - Hostname: orderer					# 可以通过hostname设置多个orderer节点
        SANS:                               #备用主机名
          - localhost
      
    # Hostname + Domain组成该orderer节点的完整域名

PeerOrgs:									# 一个PeerOrgs设置多个peer组织
  - Name: Org1								# peer组织的名称
    Domain: org1.finance.com			    # peer组织的域名
    EnableNodeOUs: true		
    Template:								# 节点的数量
      Count: 2
    Users:									# 用户的数量
      Count: 2

  - Name: Org2
    Domain: org2.finance.com
    EnableNodeOUs: true
    Template:
      Count: 1
    Users:
      Count: 2

另外,在PeerOrgs中可以给每个组织指定CA机构(把相关语句的注释去掉就可以了)。

1.3 生成证书

修改好配置文件之后,就可以使用如下命令生成加密材料。具体如下:

cryptogen genenrate --config=crypto-config.yaml --output="organizations"

命令执行成功会显示如下信息:
在这里插入图片描述
运行完之后会在当前文件夹下生成一个名为organizations的文件夹,该文件下保存的便是所有节点和组织的加密材料(可以使用tree命令查看这个文件夹的目录结构)。这些加密材料主要用于创建和管理Fabric网络的身份验证和加密。主要包括:

  • 每个组织的根证书和私钥。每个组织将有一个唯一的“MSP ID”,用于标识其在网络中的身份。
  • 每个组织的证书颁发机构(CA)的根证书和私钥。CA用于颁发和管理组织成员的证书和身份。
  • 每个组织的每个peer节点生成证书和私钥,用于节点之间的通信和身份验证。
  • 网络中的orderer节点的证书和私钥。

2 链码链接配置

链码链接配置(Chaincode Connection Profile, CCP)文件包含了与链码相关的连接信息和配置,包括网络的URL、TLS证书、通道、链码名称和版本等。如果步配置CCP文件,客户端应用程序可能无法找到或连接到目标链码,也就无法执行与链码相关的操作,如查询数据、提交交易等。
Fabric中需要给每个组织Org配置一个ccp文件,其存放位置在organizations/
可以从fabric-samples\test-network\organizations中拷贝出ccp-template.yamlccp-generate.sh文件并放到finance_network\organization\peerOrganizations下的两个目录下,具体如下:

#假设现在所在目录为finance_network下,fabric-sample的目录根据自己的情况进行调整
cp ~/go/src/github.com/hyperledger/fabric/scripts/test-network/organizations/ccp-template.yaml organizations/peerOrganizations/org1.finance.com/connection-org1.yaml
cp ~/go/src/github.com/hyperledger/fabric/scripts/test-network/organizations/ccp-template.yaml organizations/peerOrganizations/org2.finance.com/connection-org2.yaml
cp ~/go/src/github.com/hyperledger/fabric/scripts/test-network/organizations/ccp-generate.sh organizations/ccp-generate.sh

接着需要根据实际情况修改文件:connection-org1.yaml,connection-org2.yaml。由于组织Org1中有2个peer节点,而Org2中只有1个peer节点,现成的ccp-generate.sh文件无法完成这两个文件的生成。这里分两部进行操作:

  • 第1步:手动完成connection-org1.yaml,connection-org2.yaml文件中组织、节点及端口号等信息的填充。具体如下:
    修改后的connection-org1.yaml
name: test-network-org1
version: 1.0.0
client:
  organization: Org1
  connection:
    timeout:
      peer:
        edorser: '300'
organizations:
  Org1: #设置Org1
    mspid: Org1MSP
    peers: #列出Org中的所有peer节点
    - peer0.org1.finance.com
    - peer1.org2.finance.com
    certificateAuthorities:
    - ca.org1.finance.com
peers:
  peer0.org1.finance.com:
    url: grpcs://localhost:7051 #指定peer0的端口号
    tlsCACerts:
    #将organizations/peerOrganizations/org1.finance.com/tlsca/tlsca.org1.finance.com-cert.pem中的内容复制到此处,还要注意缩进
      pem: | 
         ${PEERPEM}
    grpcOptions:
      ssl-target-name-override: peer0.org1.finance.com
      hostnameOverride: peer0.org1.finance.com

  peer1.org1.finance.com:
    url: grpcs://localhost:8051 #peer节点的端口号不能一样
    tlsCACerts:
    #同上
      pem: |
          ${PEERPEM}    
    grpcOptions:
      ssl-target-name-override: peer1.org1.finance.com
      hostnameOverride: peer1.org1.finance.com

certificateAuthorities:
  ca.org1.finance.com:
    url: https://localhost:7054
    caName: ca-org1
    tlsCACerts:

      pem: 
        - |
          ${CAPEM}
    httpOptions:
      verify: false

修改后的connection-org2.yaml

name: test-network-org2
version: 1.0.0
client:
  organization: Org2
  connection:
    timeout:
      peer:
        endorser: '300'
organizations:
  Org2:
    mspid: Org2MSP
    peers:
    - peer0.org2.finance.com
    certificateAuthorities:
    - ca.org2.finance.com
peers:
  peer0.org2.finance.com:
    url: grpcs://localhost:9051
    tlsCACerts:
      pem: |
         ${PEERPEM}
    grpcOptions:
      ssl-target-name-override: peer0.org2.finance.com
      hostnameOverride: peer0.org2.finance.com
certificateAuthorities:
  ca.org2.finance.com:
    url: https://localhost:9054
    caName: ca-org2
    tlsCACerts:
      pem:
        - |
          ${CAPEM}
    httpOptions:
      verify: false
  • 第2步:修改ccp-generate.sh文件将TLS证书的信息插入进去。
#!/bin/bash

function one_line_pem {
    echo "`awk 'NF {sub(/\\n/, ""); printf "%s\\\\\\\n",$0;}' $1`"
}

function yaml_ccp {
    local PP=$(one_line_pem $1)
    local CP=$(one_line_pem $2)
    sed -e "s#\${PEERPEM}#$PP#" \
        -e "s#\${CAPEM}#$CP#" \
        $3 | sed -e $'s/\\\\n/\\\n          /g'
}

PEERPEM=organizations/peerOrganizations/org1.finance.com/tlsca/tlsca.org1.finance.com-cert.pem
CAPEM=organizations/peerOrganizations/org1.finance.com/ca/ca.org1.finance.com-cert.pem
CONNECTION_FILE=organizations/peerOrganizations/org1.finance.com/connection-org1.yaml
echo "$(yaml_ccp $PEERPEM $CAPEM $CONNECTION_FILE)" > organizations/peerOrganizations/org1.finance.com/connection-org1.yaml

PEERPEM=organizations/peerOrganizations/org2.finance.com/tlsca/tlsca.org2.finance.com-cert.pem
CAPEM=organizations/peerOrganizations/org2.finance.com/ca/ca.org2.finance.com-cert.pem
CONNECTION_FILE=organizations/peerOrganizations/org2.finance.com/connection-org2.yaml
echo "$(yaml_ccp $PEERPEM $CAPEM $CONNECTION_FILE)" > organizations/peerOrganizations/org2.finance.com/connection-org2.yaml

接着执行如下命令即可生成ccp文件。

#先跳转到finance_network目录下,ccp-generate.sh文件在finance_network/organizations里
./organizations/ccp-generate.sh

关于ccp文件的配置有以下几点说明注意:

  • 需要给每一个组织配置ccp文件。
  • 该组织Org中的所有peer节点的信息都要设置。

3 启动docker容器

接下来使用docker-compose命令启动和管理docker容器。从fabric-samples/test-network/compose文件下的compose-test-net.yaml文件和docker\peercfg文件下的所有的内容复制到finance_network/compose文件夹下。具体操作如下:

#先使用cd命令跳转到~/go/src/finance_network下
#test-network的具体目录没有写全,根据自己的实际安装情况补全即可
mkdir compose
cd compose
cp fabric-samples/test-network/compose/compose-test-net.yaml compose.yaml
cp -r fabric-samples/test-network/compose/docker/peercfg docker/peercfg
cp fabric-samples/test-network/compose/docker/docker-compose-test-net.yaml docker/docker-compose.yaml

最后compose文件夹的目录如下:
在这里插入图片描述
这里compose\docker\core.yaml文件不需要修改,所以就不介绍了。先修改compose.yaml文件,具体如下:

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '3.7'
volumes: 
#所有的orderer节点和每个peer节点都需要设置
  orderer.finance.com:
  peer0.org1.finance.com:
  peer1.org1.finance.com:
  peer0.org2.finance.com:

networks:
  test:
    name: fabric_finance #这里可以根据自己的需要修改名称

services:
  orderer.finance.com:
    container_name: orderer.finance.com
    image: hyperledger/fabric-orderer:latest
    labels:
      service: hyperledger-fabric
    environment:
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_LISTENPORT=7050
      - 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_GENERAL_BOOTSTRAPMETHOD=none
      - ORDERER_CHANNELPARTICIPATION_ENABLED=true
      - ORDERER_ADMIN_TLS_ENABLED=true
      - ORDERER_ADMIN_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_ADMIN_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_ADMIN_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_ADMIN_TLS_CLIENTROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      #orderer节点的管理监听地址
      - ORDERER_ADMIN_LISTENADDRESS=0.0.0.0:7053
      #orderer节点的操作监听地址
      - ORDERER_OPERATIONS_LISTENADDRESS=orderer.finance.com:9443
      - ORDERER_METRICS_PROVIDER=prometheus
    working_dir: /root
    command: orderer
    volumes:
    	#主要修改这一部分,注意相对路径
        - ../organizations/ordererOrganizations/finance.com/orderers/orderer.finance.com/msp:/var/hyperledger/orderer/msp
        - ../organizations/ordererOrganizations/finance.com/orderers/orderer.finance.com/tls/:/var/hyperledger/orderer/tls
        - orderer.finance.com:/var/hyperledger/production/orderer
    ports: #将容器的端口映射到主机上的端口
      - 7050:7050
      - 7053:7053
      - 9443:9443
    networks:
      - test

  peer0.org1.finance.com:
    container_name: peer0.org1.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      - FABRIC_CFG_PATH=/etc/hyperledger/peercfg
      - FABRIC_LOGGING_SPEC=INFO
      #- FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_PROFILE_ENABLED=false
      - 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
      # Peer specific variables- 需要根据自己的情况修改
      - CORE_PEER_ID=peer0.org1.finance.com
      - CORE_PEER_ADDRESS=peer0.org1.finance.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.org1.finance.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.finance.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.finance.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp
      - CORE_OPERATIONS_LISTENADDRESS=peer0.org1.finance.com:9444
      - CORE_METRICS_PROVIDER=prometheus
      - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG={"peername":"peer0org1"}
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
    volumes:
      - ../organizations/peerOrganizations/org1.finance.com/peers/peer0.org1.finance.com:/etc/hyperledger/fabric
      - peer0.org1.finance.com:/var/hyperledger/production
    working_dir: /root
    command: peer node start
    ports:
      - 7051:7051
      - 9444:9444
    networks:
      - test

  peer1.org1.finance.com:
    container_name: peer1.org1.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      - FABRIC_CFG_PATH=/etc/hyperledger/peercfg
      - FABRIC_LOGGING_SPEC=INFO
      #- FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_PROFILE_ENABLED=false
      - 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
      # Peer specific variables- 需要根据自己的情况修改
      - CORE_PEER_ID=peer1.org1.finance.com
      - CORE_PEER_ADDRESS=peer1.org1.finance.com:8051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:8051
      - CORE_PEER_CHAINCODEADDRESS=peer1.org1.finance.com:8052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.finance.com:8051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.finance.com:8051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp
      - CORE_OPERATIONS_LISTENADDRESS=peer1.org1.finance.com:9446
      - CORE_METRICS_PROVIDER=prometheus
      - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG={"peername":"peer1org1"}
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
    volumes:
      - ../organizations/peerOrganizations/org1.finance.com/peers/peer0.org1.finance.com:/etc/hyperledger/fabric
      - peer1.org1.finance.com:/var/hyperledger/production
    working_dir: /root
    command: peer node start
    ports:
      - 8051:8051
      - 9446:9446
    networks:
      - test

  peer0.org2.finance.com:
    container_name: peer0.org2.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      - FABRIC_CFG_PATH=/etc/hyperledger/peercfg
      - FABRIC_LOGGING_SPEC=INFO
      #- FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_PROFILE_ENABLED=false
      - 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
      # Peer specific variables
      - CORE_PEER_ID=peer0.org2.finance.com
      - CORE_PEER_ADDRESS=peer0.org2.finance.com:9051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:9051
      - CORE_PEER_CHAINCODEADDRESS=peer0.org2.finance.com:9052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.finance.com:9051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.finance.com:9051
      - CORE_PEER_LOCALMSPID=Org2MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp
      - CORE_OPERATIONS_LISTENADDRESS=peer0.org2.finance.com:9445
      - CORE_METRICS_PROVIDER=prometheus
      - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG={"peername":"peer0org2"}
      - CORE_CHAINCODE_EXECUTETIMEOUT=300s
    volumes:
      - ../organizations/peerOrganizations/org2.finance.com/peers/peer0.org2.finance.com:/etc/hyperledger/fabric
      - peer0.org2.finance.com:/var/hyperledger/production
    working_dir: /root
    command: peer node start
    ports:
      - 9051:9051
      - 9445:9445
    networks:
      - test

  cli:
    container_name: cli
    image: hyperledger/fabric-tools:latest
    labels:
      service: hyperledger-fabric
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - FABRIC_LOGGING_SPEC=INFO
      - FABRIC_CFG_PATH=/etc/hyperledger/peercfg
      - CORE_PEER_TLS_ENABLED=true #这一句是新增的
      #- FABRIC_LOGGING_SPEC=DEBUG
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
      - ../channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts      #这一句是新增的
      - ../organizations:/opt/gopath/src/github.com/hyperledger/fabric/peer/organizations
      - ../scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
    depends_on:
      - peer0.org1.finance.com
      - peer1.org1.finance.com
      - peer0.org2.finance.com
    networks:
      - test

修改docker-compose.yaml文件:

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '3.7'
services:
  peer0.org1.finance.com:
    container_name: peer0.org1.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      #Generic peer variables
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_finance #这个网络名称要跟着compose.yaml文件中指定的名称一起修改
    volumes:
      - ./docker/peercfg:/etc/hyperledger/peercfg
      - ${DOCKER_SOCK}:/host/var/run/docker.sock

  peer1.org1.finance.com:
    container_name: peer1.org1.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      #Generic peer variables
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_finance
    volumes:
      - ./docker/peercfg:/etc/hyperledger/peercfg
      - ${DOCKER_SOCK}:/host/var/run/docker.sock

  peer0.org2.finance.com:
    container_name: peer0.org2.finance.com
    image: hyperledger/fabric-peer:latest
    labels:
      service: hyperledger-fabric
    environment:
      #Generic peer variables
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_finance
    volumes:
      - ./docker/peercfg:/etc/hyperledger/peercfg
      - ${DOCKER_SOCK}:/host/var/run/docker.sock
  
  cli:
    container_name: cli
    image: hyperledger/fabric-tools:latest
    volumes:
      - ./docker/peercfg:/etc/hyperledger/peercfg

接着使用如下命令创建docker容器:

#先进入finance_network/compose目录
sudo DOCKER_SOCK="/var/run/docker.sock" docker-compose -f compose.yaml -f docker/docker-compose.yaml up -d

结果如下:
在这里插入图片描述
接下来可以使用docker ps -a命令以及docker logs --details <CONTAINER ID>查看容器有没有提示错误信息。
至此,Fabric上的自定义网络已经搭建完成。

参考资料

  1. https://hyperledger-fabric.readthedocs.io/en/latest/create_channel/create_channel_test_net.html
  2. https://blog.csdn.net/qq_28052455/article/details/125473299
  3. https://zhuanlan.zhihu.com/p/613633111
  4. https://blog.csdn.net/weixin_46878177/article/details/128700555

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 的第二十章:多线程

创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类&#xff0c;从类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行&#xff0c;任务是指线程在启动时执行的工作&#xff0c;start() 方法启动线程&am…

如何在自定义数据集上训练 YOLOv8 实例分割模型

在本文中&#xff0c;我们将介绍微调 YOLOv8-seg 预训练模型的过程&#xff0c;以提高其在特定目标类别上的准确性。Ikomia API简化了计算机视觉工作流的开发过程&#xff0c;允许轻松尝试不同的参数以达到最佳结果。 使用 Ikomia API 入门 通过 Ikomia API&#xff0c;我们只需…

C++ : 初始化列表 类对象作为类成员

传统方式初始化 C 提供了初始化列表语法&#xff0c;用来初始化属性 初始化列表 语法&#xff1a; 构造函数()&#xff1a;属性1(值1), 属性2&#xff08;值2&#xff09;... {} class Person { public://传统方式初始化 Person(int a, int b, int c) {m_A a;m_B b;m_C c…

生成工具集合

文章目录 前言一、SVG 波浪图片生成器二、背景图片生成器三、布局/形状分隔线四、Neumorphism五、动画按钮六、开发工具七、Interactions&#xff08;图片轮播&#xff09;八、CSS Gradient &#xff08;渐变属性&#xff09;九、获取波浪十、平滑阴影十一、CSS Clip-path Make…

图像重定向Image Retarget

1、什么是图像重定向&#xff1f; 图像重定向旨在调整图像的尺寸和比例&#xff0c;以适应不同的显示设备或布局要求。 它可以通过添加或删除像素来改变图像的宽度和高度&#xff0c;同时保持图像的内容和结构的相对比例。 这种技术可以通过保持图像的关键特征和结构来最大程度…

Java-多线程基本知识学习总结

多线程 前言一、线程的创建1、继承Thread类2、实现Runnable接口 二、线程的生命周期三、操作线程的方法1、线程的休眠2、线程的加入3、线程的礼让4、线程的优先级 四、线程同步End 前言 Java是支持多线程的编程语言&#xff0c;所谓多线程就是程序能够同时完成多种操作。 计算…

Linux中执行java命令报错:cannot execute binary file: Exec format error

网上很多文章 都是说操作系统和JDK&#xff0c;32位和64位不兼容问题 当你非常确定你的操作系统是64位&#xff0c;并且JDK也是64位的时候 或者非常确定你的操作系统是32位&#xff0c;并且JDK也是32位的时候 怎么办&#xff1f; 使用以下命令&#xff0c;查看你的操作系统…

IDEA插件推荐

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;支持三大功能&#xff1a;写完代码IDEA内一键生成API文档&#xff1b;写完代码IDEA内一键调试&#xff1b;生成API目录树&#xff0c;双击即可快速定位API定义的代码…非常好用&#xff01;而且完全免费&…

MySQL进阶-InnoDB引擎

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、语雀 、Github &#x1f389;公众号&#xff1a;猫十二懿 一、InnoDB 逻辑存储引擎 InnoDB的逻辑存储结构如下图所示&#xff1a; 大小关系&#xff1a;表空间&#xff08;Tablespace&#xff0…

消息队列MQ

文章目录 同步通讯和异步通讯什么是MQ?一.RabbitMQ概述二.SpringAMQP1.Work Queue 工作队列2.发布订阅-Fanout Exchange3.发布订阅-DirectExchange4.发布订阅-TopicExchange 3.消息转换器 同步通讯和异步通讯 其实在之前的JAVASE中就已经在线程一章中接触过了同步和异步的概念…

实战:登录接口测试用例举例

以下是一些可能的登录接口测试用例&#xff08;使用Python编写的&#xff09;&#xff1a; 1. 测试正常情况下的登录接口&#xff1a; # 请求URL url "https://example.com/api/login" # 请求参数 username "testuser" password "testpassword&q…

数据治理框架和成熟度模型

数据治理成熟度模型 一个企业的数据治理能力越高&#xff0c;所享受到数据治理带来的价值也会越多&#xff0c;如增加收入、减少成本、降低风险等。于是&#xff0c;很多企业想要准确地评估本公司的数据治理能力&#xff0c;可以利用数据治理成熟度模型方法&#xff0c;包括 D…

摄影网站的技术 SEO:提示和最佳实践

摄影就是要给人留下良好的第一印象。如果你想在竞争中领先&#xff0c;摄影师的SEO是您可以采用的最佳营销方法之一。 我们都曾有过这样的经历&#xff1a;你建立了一个漂亮的作品集网站来吸引更多的业务。网站上线并在社交媒体上推广后&#xff0c;您就可以坐等了。网站访问量…

堆的应用(堆排序、Top-K问题)

文章目录 1 堆排序2 Top-K问题 1 堆排序 堆排序是一种基于二叉堆&#xff08;通常使用数组实现&#xff09;的排序算法。 它的基本思想是利用堆这种数据结构的性质&#xff0c;通过建立一个堆&#xff08;大堆或小堆&#xff09;&#xff0c;使得堆的根节点是所有节点中的最大值…

牛客 算法题 golang语言实现

题目 HJ101 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 10001≤n≤1000 &#xff0c;元素大小满足 0 ≤ &#xfffd; &#…

提升企业网络安全的得力助手——EventLog Analyzer网络日志管理

在当今数字化时代&#xff0c;企业的网络安全问题变得尤为重要。为了更好地应对日益增多的威胁和安全漏洞&#xff0c;企业需要一种高效的网络日志管理工具&#xff0c;EventLog Analyzer便是其中一款卓越的解决方案。 EventLog Analyzer EventLog Analyzer是一款综合性的网络…

探索短剧市场的商机:打造短视频平台的全方位指南

目前短剧市场蓬勃发展&#xff0c;上半年备案数远超电视剧&#xff0c;彰显了短剧小程序市场潜力巨大&#xff0c;商业价值巨大。用户对短小精悍娱乐内容的需求不断增加&#xff0c;而新兴市场中有限的短剧小程序正好能够迎合这一需求。 搭建短视频平台的关键步骤&#xff1a; …

GOAT:多模态、终身学习、平台无关的机器人通用导航系统

机器人应用中涉及到的核心技术包括&#xff1a;环境感知与理解、实时定位与建图、路径规划、行为控制等。GOAT通过多模态结合终生学习的方式让你的机器人可以在未知环境中搜索和导航到任何物体。小白也可以零门槛上手。 项目地址&#xff1a;https://theophilegervet.github.i…

性能优化的一般策略及方法

性能优化的一般策略及方法 在汽车嵌入式开发领域&#xff0c;性能优化始终是一个无法回避的问题&#xff1a; 座舱 HMI 想要实现更流畅的人机交互 通信中间件在给定的 CPU 资源下&#xff0c;追求更高的吞吐量 更一般的场景&#xff1a;嵌入式设备 CPU 资源告急&#xff0c;需…

Web前端开发技术:图像与多媒体文件

在现代的Web开发中&#xff0c;图像和多媒体文件在各种网站和应用程序中扮演着至关重要的角色。它们不仅能提供更丰富的内容&#xff0c;还能大大提高应用程序的吸引力和用户体验。本文将深入介绍一些关键的Web前端开发技术&#xff0c;这些技术将有助于开发者在处理图像和多媒…