方案:将链代码作为服务运行
以下示例说明如何将 FabCar 链代码作为外部服务(Kubernetes 集群中的 pod)运行,然后您可以将其部署到 Oracle Blockchain Platform 。
完成以下步骤之前,请在 Oracle Blockchain Platform 中将链代码部署为外部程序包。
- 克隆包含
fabcar/external
的hyperledger/fabric-samples
系统信息库中的 GitHub 目录。该目录包含 Go 中 FabCar 链代码的外部版本、fabcar.go
和Dockerfile
文件。忽略metadata.json
和chaincode.env.example
文件。 - 修改
Dockerfile
文件,如以下示例中所示:# Use the Go image from Docker Hub with specified versions for Go and Alpine Linux FROM golang:1.13.8-alpine3.10 # Create a directory named "chaincode" in the image RUN mkdir /chaincode # Set "/chaincode" as the working directory within the image WORKDIR /chaincode # Copy the contents of the local directory into "/chaincode" in the image COPY . . # Fetch and install Go dependencies for the project RUN go get -d -v ./... # Install Go dependencies RUN go install -v ./... # Compile the Go code in the current directory, creating an executable binary named "fabcar" RUN go build -o fabcar . # Expose port 9999, indicating that the application within the container will listen on this port EXPOSE 9999 # Set the default command to run the "fabcar" executable when the container starts CMD ["/chaincode/fabcar"]
此命令序列使用 Go 和 Alpine Linux 的特定版本将用于构建新映像的基础映像设置为 Go 映像,创建目录,将该目录设置为工作目录,将本地内容复制到映像中,提取并安装 Go 相关项,编译 Go 代码,配置容器以监听端口 9999,并设置缺省命令以运行
fabcar
可执行文件。 - 运行以下命令来构建 Docker 映像,该映像创建名为
fabcar-sample
的 Docker 映像,然后可以将该映像推送到系统信息库。docker build -t fabcar-sample .
- 创建 Kubernetes 部署 YAML 文件以运行包含链代码的 Docker 映像。以下示例显示了一个
deployment.yaml
文件。从其中提取 Docker 映像的系统信息库为repository.example.org
。用于提取映像的 Kubernetes 密钥名称为ocirsecret
。CHAINCODE_SERVER_ADDRESS
值为 0.0.0.0:9999,表示服务器配置为接受端口 9999 上来自与计算机关联的任何 IP 地址的传入连接。通过选择外部链代码类型并上载.zip
文件,从在 Oracle Blockchain Platform 的对等节点上部署时显示的链代码包 ID 获取CHAINCODE_ID
值。在 Oracle Blockchain Platform UI 中,链代码 ID 显示为 chaincode_name:package_ID。对于 Java 链代码,链代码 ID 变量称为CORE_CHAINCODE_ID_NAME
。apiVersion: apps/v1 kind: Deployment metadata: name: external-fabcar-node namespace: chaincode labels: chaincode-type: external chaincode-name: external-fabcar-node spec: replicas: 1 selector: matchLabels: chaincode-type: external chaincode-name: external-fabcar-node template: metadata: labels: chaincode-type: external chaincode-name: external-fabcar-node spec: imagePullSecrets: - name: ocirsecret containers: - env: - name: CHAINCODE_SERVER_ADDRESS value: "0.0.0.0:9999" - name: CHAINCODE_ID value: "ext-fabcar-node:7f953544f26124914c29467d5079f601ddefa53375fffec830ecd70c13547877" image: repository.example.org/blockchain/fabcar-sample:latest imagePullPolicy: Always name: assettransfer ports: - containerPort: 9999 name: grpc protocol: TCP --- apiVersion: v1 kind: Service metadata: labels: chaincode-name: external-fabcar-node chaincode-type: external name: external-fabcar-node namespace: chaincode spec: ports: - name: grpc port: 9999 protocol: TCP targetPort: 9999 selector: chaincode-name: external-fabcar-node chaincode-type: external type: ClusterIP
- 运行以下命令以在
chaincode
名称空间中生成 Kubernetes 密钥。对于 name_of_secret,指定deployment.yaml
文件中的密钥。在此示例中,密钥的名称为ocirsecret
。kubectl create secret docker-registry name_of_secret -n chaincode --docker-server='repository.example.org/blockchain' --docker-username='your_username' --docker-password='auth_token'
- 运行以下命令以部署 Kubernetes pod 和服务。
kubectl apply -f deployment.yaml
现在,您可以从 Oracle Blockchain Platform 运行使用外部链代码的事务处理。