使用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
相关产品推荐
相关产品推荐

