You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fabric Gateway时,指定多个Peer启动通道事务的最佳方式?

Fabric Gateway 配置多Peer避免单点故障的最佳实践

在Fabric Gateway中,无需手动在应用层分发请求来规避单点故障,官方推荐利用gRPC内置的负载均衡与故障转移机制来配置多Peer连接,具体实现方式如下:

1. 创建支持多Peer的gRPC连接

通过gRPC的负载均衡策略(如round_robin),将多个Peer地址纳入同一个连接池,SDK会自动在可用Peer间分发请求,并在某个Peer离线时自动切换到其他节点。

代码示例

假设你有多个同组织的Peer节点,可按以下方式创建gRPC连接:

import (
    "time"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "github.com/hyperledger/fabric-gateway/pkg/client"
)

func main() {
    // 加载TLS配置(需确保CA证书能验证所有Peer的身份)
    tlsConfig, err := loadTLSConfig() // 自定义加载TLS配置的函数
    if err != nil {
        panic(err)
    }

    // 多个Peer的地址列表
    peerAddresses := []string{
        "peer0.org1.example.com:7051",
        "peer1.org1.example.com:7051",
    }

    // 构建gRPC连接,启用round_robin负载均衡
    // 如果Peer地址可通过DNS解析为多个IP,直接填写域名即可,无需自定义解析器
    clientConnection, err := grpc.Dial(
        "", // 空地址,配合自定义解析器使用
        grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),
        grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)),
        grpc.WithResolvers(&multiPeerResolver{addresses: peerAddresses}),
    )
    if err != nil {
        panic(err)
    }
    defer clientConnection.Close()

    // 后续创建Gateway连接的代码与原示例一致
    gw, err := client.Connect(
        id,
        client.WithSign(sign),
        client.WithClientConnection(clientConnection),
        client.WithEvaluateTimeout(5*time.Second),
        client.WithEndorseTimeout(15*time.Second),
        client.WithSubmitTimeout(5*time.Second),
        client.WithCommitStatusTimeout(1*time.Minute),
    )
    if err != nil {
        panic(err)
    }
    defer gw.Close()
}

// 自定义gRPC地址解析器,用于处理多个Peer地址
type multiPeerResolver struct {
    addresses []string
}

func (r *multiPeerResolver) Build(target grpc.TargetInfo, cc grpc.ClientConnInterface, opts grpc.BuildOptions) (grpc.Resolver, error) {
    resolver := &multiPeerResolverImpl{
        addresses: r.addresses,
        cc:        cc,
    }
    resolver.updateState()
    return resolver, nil
}

func (r *multiPeerResolver) Scheme() string {
    return "multi-peer"
}

type multiPeerResolverImpl struct {
    addresses []string
    cc        grpc.ClientConnInterface
}

func (r *multiPeerResolverImpl) ResolveNow(o grpc.ResolveNowOptions) {}

func (r *multiPeerResolverImpl) Close() {}

func (r *multiPeerResolverImpl) updateState() {
    addrs := make([]grpc.Address, len(r.addresses))
    for i, addr := range r.addresses {
        addrs[i] = grpc.Address{Addr: addr}
    }
    _ = r.cc.UpdateState(grpc.ClientConnState{Addresses: addrs})
}

2. 关键说明

  • 负载均衡策略:除了round_robin,还可根据需求选择其他gRPC负载均衡策略(如weighted_round_robin)
  • 故障自动转移:当某个Peer节点离线时,gRPC会自动将请求路由到其他可用Peer,无需应用层干预
  • TLS配置:确保你的TLS根证书能验证所有Peer的身份,避免因证书不匹配导致连接失败
  • 无需手动分发请求:官方不推荐在应用层手动处理请求分发,gRPC的内置机制已经足够可靠

内容的提问来源于stack exchange,提问作者Myypo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:43:32