[TOC] ## 服务失败策略与查询策略 ``` d := client.NewMultipleServersDiscovery([]*client.KVPair{{Key: addr1}, {Key: addr2}}) /** 第二参数 FailMode 失败策略 Failover 选择另一个服务器自动故障转移 Failfast 立即返回错 Failtry 再次使用当前客户端 Failbackup 选择另一个服务器如果第一个服务器不响应在指定的时间和使用快速响应。 第三参数 SelectMode 选择策略 RandomSelect 随机选择 RoundRobin 轮循 WeightedRoundRobin 加权轮循 WeightedICMP 时间加权平 ConsistentHash 哈希 Closest 最近的服务器 */ xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption) ``` ## 例子 <details> <summary>server.go</summary> ``` package main import ( "context" "github.com/smallnest/rpcx/server" ) type Args struct { A int B int } type Reply struct { C int } type Arith int func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error { reply.C = args.A * args.B return nil } func main() { s := server.NewServer() //s.Register(new(Arith), "") //两种注册方式 与下同 err := s.RegisterName("Arith", new(Arith), "") if err != nil { panic(err) } err = s.Serve("tcp", ":8972") if err != nil { panic(err) } } ``` </details> <br/> <details> <summary>client.go</summary> ``` package main import ( "context" "github.com/smallnest/rpcx/client" "log" ) func main() { type Args struct { A int B int } type Reply struct { C int } addr1 := "127.0.0.1:8973" addr2 := "127.0.0.1:8972" // #2 d := client.NewMultipleServersDiscovery([]*client.KVPair{{Key: addr1}, {Key: addr2}}) /** 第二参数 FailMode 失败策略 Failover 选择另一个服务器自动故障转移 Failfast 立即返回错 Failtry 再次使用当前客户端 Failbackup 选择另一个服务器如果第一个服务器不响应在指定的时间和使用快速响应。 第三参数 SelectMode 选择策略 RandomSelect 随机选择 RoundRobin 轮循 WeightedRoundRobin 加权轮循 WeightedICMP 时间加权平 ConsistentHash 哈希 Closest 最近的服务器 */ xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption) defer xclient.Close() // #3 args := &Args{ A: 10, B: 20, } // #4 reply := &Reply{} // #5 err := xclient.Call(context.Background(), "Mul", args, reply) if err != nil { log.Fatalf("failed to call: %v", err) } log.Printf("%d * %d = %d", args.A, args.B, reply.C) } ``` </details> <br/>