多服务例子
最后更新于:2022-04-02 02:49:59
[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)
```
## 例子
server.go
```
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)
}
}
```
client.go
```
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)
}
```
';