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