应用程序开发 - 应用程序设计元素 - 网关
网关代表应用程序管理网络交互,使其专注于业务逻辑。应用程序连接到网关,然后使用该网关的配置管理所有后续交互。
在本主题中,我们将介绍:
- 为什么网关很重要
- 应用程序如何使用网关
- 如何定义静态网关
- 如何为服务发现定义动态网关
- 使用多个网关
1. 场景
Hyperledger Fabric 网络通道可以不断变化。由网络中不同组织贡献的对端节点,交易排序器和 CA 组件将会来来往往。造成这种情况的原因包括业务需求增加或减少,以及计划内和计划外的停机。网关减轻了应用程序的负担,使它可以专注于要解决的业务问题。
MagnetoCorp 和 DigiBank 应用程序 (发行和购买) 将各自的网络交互委托给其网关。每个网关都了解网络通道拓扑,其中包括两个组织 MagnetoCorp 和 DigiBank 的多个对端节点和交易排序器,使应用程序专注于业务逻辑。对端节点可以使用 gossip 协议在组织内部和组织之间交互。
网关可以由应用程序以两种不同方式使用:
-
静态:网关配置在 连接配置文件 中完全定义。应用程序可用的所有对端节点,交易排序器和 CA 在用于配置网关的连接配置文件中静态定义。例如,对于对端节点,这包括其作为支持对端节点或事件通知中心的角色。你可以在 连接配置文件主题 中了解有关这些角色的更多信息。
SDK 将结合网关 连接选项 使用此静态拓扑来管理交易提交和通知过程。连接配置文件必须包含足够的网络拓扑,以允许网关代表应用程序与网络交互;这包括网络通道,组织,交易排序器,对端节点及其角色。
-
动态:网关配置在连接配置文件中最少定义。通常,指定应用程序组织中的一个或两个对端节点,他们使用服务发现来发现可用的网络拓扑。这包括对端节点,交易排序器,通道,实例化的智能合约及其背书策略。(在生产环境中,网关配置应至少指定两个对端节点以确保可用性。)
SDK 将使用所有静态和发现的拓扑信息以及网关连接选项来管理交易提交和通知过程。作为其一部分,它还将智能地使用发现的拓扑。例如,它将使用发现的智能合约背书策略计算所需的最少背书对端节点。
你可能会问自己,静态或动态网关是否更好?需要在可预测性和响应性之间进行权衡。静态网络始终会以相同的方式运行,因为它们将网络视为不变的。从这种意义上讲,它们是可预测的 – 如果可用,它们将始终使用相同的对端节点和交易排序器。当动态网络了解网络的变化时,它们的响应速度更快 – 他们可以使用新添加的对端节点和交易排序器,从而带来额外的弹性和可扩展性,但可能会在可预测性方面付出一定的代价。通常,使用动态网络是可以的,实际上,这是网关的默认模式。
请注意,可以静态或动态使用同一连接配置文件。显然,如果要静态使用配置文件,则它必须是全面的,而动态使用只需要稀疏的人口即可。
两种样式的网关对应用程序都是透明的。无论使用静态网关还是动态网关,应用程序设计都不会改变。这也意味着某些应用程序可以使用服务发现,而其他应用程序则可以不使用。通常,使用动态发现意味着 SDK 的定义更少,更多智能。这是默认值。
2. 连接
当应用程序连接到网关时,将提供两个选项。这些用于后续的 SDK 处理:
await gateway.connect(connectionProfile, connectionOptions);
- 连接配置文件 (Connection profile):connectionProfile 是将用于 SDK 静态或动态地进行交易处理的网关配置。尽管可以在传递给网关时将其转换为 JSON 对象,但是可以使用 YAML 或 JSON 指定它:
let connectionProfile = yaml.safeLoad(fs.readFileSync('../gateway/paperNet.yaml', 'utf8'));
阅读有关 连接配置文件 以及如何配置它们的更多信息。
-
连接选项 (Connection options):connectionOptions 允许应用程序声明而不是实现所需的交易处理行为。 SDK 会解释连接选项,以控制与网络组件的交互模式,例如选择要连接的身份或用于事件通知的对端节点。这些选项可在不影响功能的情况下显着降低应用程序的复杂性。这是可能的,因为 SDK 已实现了许多应用程序否则需要的低层逻辑。连接选项控制此逻辑流。
阅读有关可用 连接选项 的列表以及何时使用它们的信息。
3. 静态
静态网关定义网络的固定视图。在 MagnetoCorp 方案中,网关可能会标识 MagnetoCorp 中的单个对端节点,DigiBank 中的单个对端节点以及 MagentoCorp 交易排序器。或者,网关可以定义 MagnetCorp 和 DigiBank 的所有对端节点和交易排序器。在这两种情况下,网关都必须定义足以使商业票据交易获得背书和分发的网络视图。
通过在 gateway.connect()
API 上显式指定连接选项 discovery: {enabled: false}
,应用程序可以静态使用网关。或者,环境变量设置 FABRIC_SDK_DISCOVERY=false
将始终覆盖应用程序选择。
检查 MagnetoCorp 发行应用程序使用的 连接配置文件。查看如何在此文件中指定所有对端节点,交易排序器甚至 CA,包括它们的角色。
值得牢记的是,静态网关代表某个时刻的网络视图。随着网络的变化,将其反映在网关文件的变化中可能很重要。当应用程序重新加载网关文件时,它们将自动获取这些更改。
4. 动态
动态网关为网络定义了一个小的固定起点。在 MagnetoCorp 方案中,动态网关可能仅识别 MagnetoCorp 中的单个对端节点。一切都会被发现!(为了提供弹性,最好定义两个这样的引导对端节点。)
如果应用程序选择了 服务发现,则网关文件中定义的拓扑将使用此过程生成的拓扑进行扩充。服务发现从网关定义开始,并使用 gossip 协议 在 MagnetoCorp 组织中查找所有连接的对端节点和交易排序器。如果已为通道定义了 锚定对端节点,则服务发现将使用跨组织的 gossip 协议来发现所连接组织中的组件。此过程还将发现在对端节点安装的智能合约及其在通道级别定义的背书策略。与静态网关一样,发现的网络必须足以使商业票据交易得到背书和分发。
动态网关是 Fabric 应用程序的默认设置。可以使用 gateway.connect()
API 上的连接选项 discovery: {enabled: true}
明确指定它们。或者,环境变量设置 FABRIC_SDK_DISCOVERY=true
将始终覆盖应用程序选择。
动态网关代表网络的最新视图。随着网络的变化,服务发现将确保网络视图正确反映了应用程序可见的拓扑。应用程序将自动获取这些更改;他们甚至不需要重新加载网关文件。
5. 多个网关
最后,对于应用程序而言,定义相同或不同网络的多个网关非常简单。此外,应用程序可以静态和动态使用命名网关。
拥有多个网关可能会有所帮助。原因如下:
- 代表不同用户处理请求。
- 同时连接到不同的网络。
- 通过同时比较其行为与现有配置来测试网络配置。
Reference
- Docs » Developing Applications » Application design elements » Gateway, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/gateway.html
- Docs » Developing Applications » Application design elements » Connection Profile, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/connectionprofile.html
- Docs » Developing Applications » Application design elements » Connection Options, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/connectionoptions.html
- Docs » Architecture Reference » Service Discovery, https://hyperledger-fabric.readthedocs.io/en/release-1.4/discovery-overview.html
- Docs » Architecture Reference » Gossip data dissemination protocol, https://hyperledger-fabric.readthedocs.io/en/release-1.4/gossip.html
- Docs » Glossary, https://hyperledger-fabric.readthedocs.io/en/release-1.4/glossary.html
项目源代码
项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp