🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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) ``` ## 例子 ### hello world <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/> ### 当使用mongodb 作为服务存储时的服务发现 不要使用`client.NewMultipleServersDiscovery()`的方式进行初始化,而是直接初始化`discovery := &client.MultipleServersDiscovery{}` 并在服务管理中循坏的方式进行节哀in听 ``` func NewClient(){ ... discovery := &client.MultipleServersDiscovery{} ... } func (x *XClient) Run() { for { oneServers, err := login_status.Service.GetIpAll("one") if err != nil { logs.Errorf("[tpc_client] one server 获取失败",err) } var pairs= make([]*client.KVPair,0,len(oneServers)) for _, addr := range oneServers { pairs = append(pairs, &client.KVPair{Key: addr}) } x.discovery.Update(pairs) time.Sleep(5*time.Second) } } ```