为业务网络部署REST服务器
在生产环境中部署Hyperledger Composer REST服务器时,例如使用Docker Swarm或Kubernetes,REST服务器应配置为高可用性。这意味着您必须部署REST服务器的多个实例,并且应将这些实例配置为共享数据。例如,应共享诸如业务网卡,区块链标识和REST API身份验证设置之类的数据,以便REST API客户端可以向任何实例发出请求,而无需重新进行身份验证。
商务网卡和商务网卡商店
REST服务器使用在启动期间指定的业务网卡连接并发现已部署的业务网络中的资产,参与者和事务。需要此信息才能生成REST API。此业务网卡称为发现业务网卡。默认情况下,发现业务网卡还用于处理对REST API的所有请求。但是,REST服务器也可以配置为多用户模式,这允许经过身份验证的用户提供自己的业务网卡来处理对REST API的请求。
为了使用发现业务网卡,必须首先将该业务网卡导入REST服务器可用的业务网卡存储中。默认业务网卡存储是具有路径的本地文件系统目录~/.composer
(其中~
是当前用户主目录)。将Docker镜像用于REST服务器时,必须将卷装入包含导入的发现业务网卡的默认业务网卡存储的位置。在REST服务器的Docker镜像中,REST服务器使用的业务网卡存储位于目录中/home/composer/.composer
(因为Docker镜像中的REST服务器始终在composer
用户下运行)。
业务网卡包含连接配置文件,该配置文件描述如何连接到运行已部署的业务网络的Hyperledger Fabric网络。请注意,连接配置文件必须在REST服务器的Docker镜像中有效,并且主机名必须正确且可由此Docker镜像访问。
使用持久性数据存储配置REST服务器
有关经过身份验证的用户及其钱包(在启用多用户模式时包含该用户业务网卡)的所有信息都通过LoopBack连接器保留在LoopBack数据源中。默认情况下,REST服务器使用LoopBack“内存”连接器来保留用户信息,这些信息在REST服务器终止时会丢失。REST服务器应配置LoopBack连接器,该连接器将数据存储在高可用性数据源(例如数据库)中。
您应该能够使用任何LoopBack连接器,但我们建议您为NoSQL数据库使用LoopBack连接器。例如,MongoDB或Apache CouchDB。
需要安装LoopBack连接器,以便REST服务器找到并使用它。您可以使用以下方法安装其他LoopBack连接器npm
:
复制
npm install -g loopback-connector-mongodb
最后,您需要为REST服务器提供LoopBack连接器所需的连接信息。应使用COMPOSER_DATASOURCES
环境变量提供此连接信息。有关可用于配置REST服务器的环境变量的更多信息,请参阅参考文档:Hyperledger Composer REST Server
使用其他Node.js模块扩展REST服务器的Docker镜像
为了将REST服务器部署为具有其他LoopBack连接器和Passport策略的Docker容器,您必须扩展hyperledger/composer-rest-server
Docker镜像。
下面是一个示例Dockerfile,它将MongoDB的LoopBack连接器和GitHub的Passport策略添加到Docker镜像:
复制
FROM hyperledger/composer-rest-server
RUN npm install --production loopback-connector-mongodb passport-github && \
npm cache clean --force && \
ln -s node_modules .node_modules
您可以通过将Dockerfile放在目录中并使用docker build
命令来构建此Docker镜像,例如:
复制
docker build -t myorg/my-composer-rest-server .
您可能需要将此Docker映像发布到Docker映像存储库(例如Docker Hub),以便将其与基于云的Docker部署服务一起使用。
使用Docker部署持久且安全的REST服务器
以下示例将演示如何使用Docker部署REST服务器。部署的REST服务器将使用MongoDB保留数据,并使用GitHub身份验证进行保护。
这些示例基于作为Developer Tutorial的一部分部署到Hyperledger Fabric v1.2的业务网络,可能需要调整您的配置,例如,如果Docker网络名称不匹配。
-
通过运行以下
复制composer network ping
命令,确保业务网络的有效业务网卡位于本地业务网卡存储中。此示例在业务网络上为admin
用户使用my-network
业务网卡:composer network ping -c admin@my-network
请注意,在继续之前,必须使用该
composer network ping
命令测试与业务网络的连接。如果业务网卡仅包含用户ID和注册密钥,则该composer network ping
命令将触发注册过程发生并且证书将存储在业务网卡中。这是不建议使用泊坞窗图像的REST服务器时使用商业网络卡只有一个用户ID和注册的秘密。 -
为名为的MongoDB启动Docker镜像的实例
复制mongo
。此MongoDB实例将用于为REST服务器保留有关经过身份验证的用户及其钱包(在启用多用户模式时包含该用户业务网卡)的所有信息。docker run -d --name mongo --network composer_default -p 27017:27017 mongo
请注意,MongoDB实例附加到名为的Docker网络
composer_default
。这意味着MongoDB实例将在composer_default
使用主机名命名的Docker网络上可用mongo
。我们将使用主机名mongo
在后续步骤中配置REST服务器。根据您的Docker网络配置,您可能需要指定不同的Docker网络名称。MongoDB端口27017
也使用端口在主机网络上公开27017
,因此如果需要,您可以使用其他MongoDB客户端应用程序与此MongoDB实例进行交互。 -
通过添加MongoDB的LoopBack连接器和GitHub身份验证的Passport策略,扩展REST服务器的Docker镜像。在本地文件系统上创建一个新的空目录,并
复制Dockerfile
在新目录中创建一个新文件,其中包含以下内容:FROM hyperledger/composer-rest-server RUN npm install --production loopback-connector-mongodb passport-github && \ npm cache clean --force && \ ln -s node_modules .node_modules
通过
复制docker build
在包含Dockerfile
您刚刚创建的文件的目录中运行以下命令来构建扩展的Docker镜像:docker build -t myorg/my-composer-rest-server .
如果此命令成功完成,则会
myorg/my-composer-rest-server
构建一个名为的新Docker镜像,并将其存储在系统上的本地Docker注册表中。如果您希望在其他系统上使用此Docker镜像,则可能需要将Docker镜像推送到Docker注册表中,例如Docker Hub。 -
使用环境变量而不是命令行选项配置REST服务器的Docker镜像。创建一个名为
复制envvars.txt
存储REST服务器环境变量的新文件,其中包含以下内容:COMPOSER_CARD=admin@my-network COMPOSER_NAMESPACES=never COMPOSER_AUTHENTICATION=true COMPOSER_MULTIUSER=true COMPOSER_PROVIDERS='{ "github": { "provider": "github", "module": "passport-github", "clientID": "REPLACE_WITH_CLIENT_ID", "clientSecret": "REPLACE_WITH_CLIENT_SECRET", "authPath": "/auth/github", "callbackURL": "/auth/github/callback", "successRedirect": "/", "failureRedirect": "/" } }' COMPOSER_DATASOURCES='{ "db": { "name": "db", "connector": "mongodb", "host": "mongo" } }'
请注意,
admin@my-network
已将发现业务网卡的名称设置为COMPOSER_CARD
环境变量的值。我们通过指定环境变量never
的值来禁用生成的REST API中的命名空间COMPOSER_NAMESPACES
。我们通过将COMPOSER_AUTHENTICATION
环境变量设置为启用了REST API客户端的身份验证true
,并通过将COMPOSER_MULTIUSER
环境变量设置为启用了多用户模式true
。我们通过在
COMPOSER_PROVIDERS
环境变量中为GitHub配置Passport策略,将我们的REST服务器配置为使用GitHub身份验证。请注意,您必须使用GitHub中的相应配置替换它们REPLACE_WITH_CLIENT_ID
,REPLACE_WITH_CLIENT_SECRET
才能使此配置成功运行。我们已经通过在
COMPOSER_DATASOURCES
环境变量中为MongoDB配置LoopBack连接器来配置我们的REST服务器以使用我们的MongoDB实例。请注意,mongo
已在host
名为的LoopBack数据源的属性中指定了MongoDB实例的主机名db
。通过运行以下命令将环境变量加载到当前shell中:
复制source envvars.txt
如果打开新的shell,例如新的终端窗口或选项卡,则必须
source
再次运行相同的命令以将环境变量加载到新shell中。有关可用于配置REST服务器的环境变量的更多信息,请参阅参考文档:Hyperledger Composer REST Server
-
通过运行以下
复制docker run
命令,为在步骤3中创建的REST服务器启动扩展Docker镜像的新实例:docker run \ -d \ -e COMPOSER_CARD=${COMPOSER_CARD} \ -e COMPOSER_NAMESPACES=${COMPOSER_NAMESPACES} \ -e COMPOSER_AUTHENTICATION=${COMPOSER_AUTHENTICATION} \ -e COMPOSER_MULTIUSER=${COMPOSER_MULTIUSER} \ -e COMPOSER_PROVIDERS="${COMPOSER_PROVIDERS}" \ -e COMPOSER_DATASOURCES="${COMPOSER_DATASOURCES}" \ -v ~/.composer:/home/composer/.composer \ --name rest \ --network composer_default \ -p 3000:3000 \ myorg/my-composer-rest-server
请注意,我们已经通过使用多个
-e
选项传递了我们在之前步骤中设置的所有环境变量。如果需要添加或删除任何其他环境变量来配置REST服务器,则还必须添加或删除相应的-e
选项。我们通过指定将本地商业网卡商店安装到REST服务器Docker容器中
-v ~/.composer:/home/composer/.composer
。这允许REST服务器在尝试加载使用COMPOSER_CARD
环境变量指定的发现业务网卡时访问和使用我们的本地业务网卡存储。我们还指定了Docker网络名称
composer_default
和Docker容器的名称rest
。这意味着REST服务器实例将在composer_default
使用主机名命名的Docker网络上可用rest
。REST服务器端口3000
也使用端口在主机网络上公开3000
。您可以使用该
复制docker logs
命令检查REST服务器是否已成功启动,例如:docker logs -f rest
如果REST服务器已成功启动,那么您将看到它输出类似于的日志消息
Browse your REST API at http://localhost:3000/explorer
。
现在REST服务器已成功启动,您可以使用以下URL访问在Docker容器内运行的REST服务器:http:// localhost:3000 / explorer /。
最后的笔记
在本指南中,您已经了解了如何使用Docker启动REST服务器的单个实例,其中该单个实例配置为将MongoDB用作持久性数据存储。要获得REST服务器的真正高可用性生产部署,您需要:
- 配置持久性数据存储的高可用性实例,例如MongoDB副本集。
- 运行REST服务器Docker镜像的多个实例。通过使用
--name
参数更改Docker容器的名称,以及使用参数更新或删除后续REST服务器实例的主机端口映射,可以轻松完成此操作-p 3000:3000
。 - 部署负载均衡器(例如Nginx),以便从REST服务器的所有实例中的客户端分发REST请求。
完成这三项任务后,您应该能够停止,重新启动或删除任何REST服务器实例(但不是全部!),而不会失去对通过REST部署的业务网络的访问权限。