能否用connection.yaml中定义的orderer覆盖服务发现的orderer?
解决Hyperledger Explorer强制使用connection.yaml中定义的Orderer节点问题
我之前在对接Oracle Blockchain Service(OBS)和Hyperledger Explorer的时候也碰到过几乎一模一样的坑——OBS的多租户特性导致服务发现返回了不属于我网络的共享Orderer,直接把Explorer搞超时了。好在是可以强制让Explorer优先使用你connection.yaml里配置的节点的,给你分享两个可行的方案:
方案1:直接禁用服务发现(最简单高效)
如果你的Fabric网络节点结构相对固定,不需要动态发现peer节点,直接关掉服务发现就能强制Explorer读取connection.yaml里的配置:
- 找到Explorer对应的网络配置文件(通常是
config.json或者你自定义的连接配置),找到discovery.enabled字段,把它设为false。 - 确保你的
connection.yaml里已经完整配置了目标Orderer节点:包括正确的url(比如OBS提供的grpcs://orderer-xxx.ob.oraclecloud.com:7050)、TLS证书路径/内容,以及grpcOptions里的TLS相关设置,必须和OBS控制台给出的信息完全匹配。 - 重启Explorer服务,查看日志确认它现在连接的是你指定的Orderer,再尝试查询数据,超时问题应该就能解决。
方案2:保留服务发现但过滤Orderer节点(适合需要动态peer的场景)
如果你的网络需要依赖服务发现来获取peer节点,但只想过滤掉陌生的Orderer,可以修改Explorer的代码逻辑:
- 找到Explorer中处理Fabric服务发现结果的代码段(一般在
fabric-client相关的模块里),在获取到服务返回的Orderer列表后,添加一个过滤步骤:只保留与connection.yaml中定义的Orderer地址完全匹配的节点。 - 举个简单的代码示例(伪代码):
// 获取服务发现的orderer列表 let discoveredOrderers = await client.getOrderers(); // 从connection.yaml读取预定义的orderer地址列表 let predefinedOrderers = config.orderers.map(o => o.url); // 过滤出匹配的orderer let filteredOrderers = discoveredOrderers.filter(orderer => predefinedOrderers.includes(orderer._url)); // 替换客户端使用的orderer列表 client._orderers = filteredOrderers; - 重新构建Explorer(如果是用容器部署的话要重新打包镜像),重启后就能让服务发现只保留你需要的Orderer节点。
额外注意事项
- 一定要仔细核对
connection.yaml里的Orderer配置,OBS的Orderer节点域名和端口都有严格要求,写错一个字符都可能连不上。 - 如果是用TLS连接,确保
tlsCACerts指向的证书是OBS提供的根CA证书,不能用本地生成的证书。
内容的提问来源于stack exchange,提问作者Aditya Arora
相关产品推荐
相关产品推荐

