var slaveDns = map[int]map[string]interface{}{
0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 8},
1: {"connectstring": "root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8", "weight": 4},
2: {"connectstring": "root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8", "weight": 2},
var i int = -1 //表示上一次选择的服务器
var cw int = 0 //表示当前调度的权值
var gcd int = 2 //当前所有权重的最大公约数 比如 2,4,8 的最大公约数为:2
算法思路:
cw为当前的权重,遍历每个服务器,如果服务器的权值大于cw,则该服务器执行一次,一轮轮询之后,cw-gcd;
之后重复上诉步骤
func getDns() string {
for {
i = (i + 1) % len(slaveDns)
if i == 0 {
cw = cw - gcd
if cw <= 0 {
cw = getMaxWeight()
if cw == 0 {
return ""
if weight, _ := slaveDns[i]["weight"].(int); weight >= cw {
return slaveDns[i]["connectstring"].(string)
func getMaxWeight() int {
max := 0
for _, v := range slaveDns {
if weight, _ := v["weight"].(int); weight >= max {
max = weight
return max
func main() {
note := map[string]int{}
s_time := time.Now().Unix()
for i := 0; i < 100; i++ {
s := getDns()
fmt.Println(s)
if note[s] != 0 {
note[s]++
} else {
note[s] = 1
e_time := time.Now().Unix()
fmt.Println("total time: ", e_time-s_time)
fmt.Println("--------------------------------------------------")
for k, v := range note {
fmt.Println(k, " ", v)
执行结果:
C:/go/bin/go.exe build [D:/PROGRAM/Golang/src/study/roundRobin]
成功: 进程退出代码 0.
D:/PROGRAM/Golang/src/study/roundRobin/roundRobin.exe [D:/PROGRAM/Golang/src/study/roundRobin]
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8
。。。(中间部分省略)
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
total time: 0
--------------------------------------------------
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8 58
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8 28
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8 14
成功: 进程退出代码 0.