服务发现

为什么我们需要服务发现?

为了在对等节点上执行链码、向排序者提交交易并获取交易状态的更新,应用程序通过一个由SDK公开的API进行连接。

然而,SDK需要大量的信息,以便让应用程序能够连接到相关的网络节点。除了通道上排序服务和对等节点的CA和TLS证书, 包括它们的IP地址和端口号,SDK还必须知道相关的背书策略以及哪些对等节点安装了链码(这样应用程序就知道要将链码建议发送给哪些对等节点)。

在v1.2之前,这些信息被静态编码。然而,这种实现对网络的动态变化没有反应能力(例如,对安装了相关链码的对等节点的添加,或对暂时离线的对等节点)。 静态配置也不允许应用程序对背书策略本身的变化做出反应(例如,当一个新的组织加入通道时可能会发生这种情况)。

此外,客户端应用程序无法知道哪些对等节点已更新账本,哪些没有更新。结果,应用程序可能会向账本数据与网络其余部分不同步的对等节点提交建议, 导致交易在提交后被作废,并因此浪费资源。

**发现服务(discovery service)**通过使对等节点动态计算所需的信息并以易消费的方式呈现给SDK来改进此过程。

从v2.4开始,:doc:Fabric Gateway <gateway>与服务发现进行交互,以确定哪些对等节点需要对交易进行背书,以及将交易发送到哪些排序节点。 因此,使用新的网关SDK编写的客户端应用程序根本不直接与服务发现交互。

Fabric 中的服务发现是如何工作的

在引导应用程序时,应用程序开发者/管理员已经了解了一组被信任的对等节点,这些对等节点可以提供对发现查询的真实响应。 作为客户端应用程序使用的一个好的候选对等节点是与应用程序位于同一组织中的对等节点。需要注意的是,为了让对等节点被服务发现所知晓, 它们必须定义一个peer.gossip.externalEndpoint。要了解如何做到这一点,请查看我们的:doc:discovery-cli文档。

应用程序向发现服务发出配置查询,并获取它本来需要与网络中其他节点通信所需的所有静态信息。 这些信息可以在任何时候通过向对等节点的发现服务发送后续查询来刷新。

服务运行在对等节点上,而不是应用程序上,并且利用gossip通信层维护的网络元数据信息来查找哪些对等节点在线。 它还从对等节点的状态数据库中获取信息,比如任何相关的背书策略。

通过服务发现,应用程序不再需要指定需要从哪些对等节点获得背书。SDK可以简单地向发现服务发送查询, 询问在给定通道和链码ID的情况下需要哪些对等节点。然后,发现服务将计算一个描述符,由两个对象组成:

布局(Layouts):对等节点组的列表,以及每个组中应该选择的对等节点数量。 组到对等节点的映射(Group to peer mapping):从布局中的组到通道中的对等节点的映射。在实际情况中, 每个组很可能是代表各个组织的对等节点,但因为服务API是通用的并且不知道组织的存在,这只是一个“组”。 以下是对“AND(Org1, Org2)”策略评估的描述符示例,其中每个组织中有两个对等节点。


布局(Layouts): [ 通过组计算的数量: { “Org1”: 1, “Org2”: 1, } ], 各组背书节点: { “Org1”: [peer0.org1, peer1.org1], “Org2”: [peer0.org2, peer1.org2] }

换句话说,背书策略要求Org1中的一个对等节点和Org2中的一个对等节点签名。它提供了这些组织中可以进行背书的可用对等节点的名称 (在Org1和Org2中的“peer0”和“peer1”)。

然后,SDK从列表中随机选择一个布局。在上面的例子中,背书策略是Org1 AND Org2。如果改为OR策略,SDK会随机选择Org1或Org2, 因为来自任一组织中的对等节点的签名都可以满足策略要求。

在SDK选择了一个布局后,它会根据客户端指定的条件(因为SDK可以访问像账本高度这样的元数据)从布局中的对等节点中进行选择。 例如,根据布局中每个组的对等节点数量,它可以优先选择具有更高账本高度的对等节点,或者排除应用程序已发现离线的对等节点。 如果没有单个对等节点符合条件,SDK将从最符合条件的对等节点中随机选择。

发现服务的功能

服务发现可以响应以下查询:

  • 配置查询(Configuration query):返回通道中所有组织的``MSPConfig``,以及通道的订排序端点(orderer endpoints)。
  • 对等节点成员查询(Peer membership query):返回已加入通道的对等节点。
  • 背书查询(Endorsement query):为通道中给定的链码返回一个背书描述符(endorsement descriptor)。
  • 本地对等节点成员查询(Local peer membership query):返回响应查询的对等节点的本地成员信息。

默认情况下,客户端需要是对等节点的管理员,才能响应这个查询。

特殊要求

当对等节点运行时启用了TLS时,客户端在连接到对等节点时必须提供TLS证书。如果对等节点未配置为验证客户端证书(clientAuthRequired为false), 则这个TLS证书可以是自签名的。 。