go 负载均衡,负载均衡 随机 轮询
代码记录
程序结构目录
-程序包平衡,开始
包装平衡
类型平衡器接口{
做平衡([]*实例,字符串)(*实例,错误)
} instance.go
包装平衡
导入(
strconv
)
类型实例结构{
主机字符串
港口国际
}
func NewInstance(主机字符串,端口整数)*实例{
返回实例{
主机:主机,
港口:港口,
}
}
//定义情况结构体的方法GetHost()
func(p * Instance)GetHost()string {
返回主机
}
//定义方法GetPort()
func (p *Instance) GetPort() int {
返回港口
}
func(p * Instance)String()String {
返回p.host : strconv .伊托阿港
}经理。去
包装平衡
导入 fmt
类型BalanceMgr结构{
所有平衡器映射[字符串]平衡器
}
var mgr=BalanceMgr{
所有平衡器:make(map[string]Balancer),
}
func(p *余额管理器)寄存器平衡器(名称字符串,b平衡器){
p.allBalancer[name]=b
}
func注册平衡器(名称字符串,b平衡器){
注册平衡器经理(姓名,b)
}
功能数据平衡(名称字符串,仪器[]*实例)(inst *实例,呃错误){
平衡器,正常:=mgr.allBalancer[name]
如果!好的
err=fmt错误f(“未找到%s平衡器",名称)
返回
}
fmt .Printf(使用%s平衡器\n ,名称)
仪器,错误=平衡器。天平(仪器)
返回
} random.go
包装平衡
导入(
错误
数学/兰特
)
函数初始化(){
注册平衡器(随机,RandomBalance{})
}
随机平衡结构类型{
}
func(p *随机平衡)do balance(insts[]* Instance,key.string) (inst *Instance,err error) {
如果len(insts)==0 {
错误=错误。新建("无实例")
返回
}
镜头:=镜头(仪器)
指数:=兰特。镜头
inst=insts[index]
返回
} roundrobin.go
包装平衡
导入(
错误
)
函数初始化(){
RegisterBalancer(roundrobin ,RoundRobinBalance{})
}
圆形天平结构{
curIndex int
}
func(p * RoundRobinBalance)do balance(insts[]* Instance,key.string) (inst *Instance,err error) {
如果len(insts)==0 {
错误=错误。新建("无实例")
返回
}
镜头:=镜头(仪器)
如果p.curIndex=lens {
p.curIndex=0
}
inst=insts[p.curIndex]
p.curIndex=(p.curIndex 1) % lens
返回
} - 入口main.go
主包装
导入(
fmt
./平衡
数学/兰特
操作系统
时间
)
func main() {
风险工具[]*余额。情况
对于I:=0;i 16我{
主持人:=fmt .Sprintf(192.168 .%d.%d ,rand .Intn(255),兰德Intn(255))
一:=平衡NewInstance(主机,8080)
insts=append(insts,one)
}
var balanceName=random
如果len(os .Args) 1 {
balanceName=os .参数[1]
}
对于{
inst,err :=余额DoBalance(天平名称,仪器)
如果呃!=零{
fmt .Println(do balance err:,err)
fmt .Fprintf(os .Stdout, do balance err\n )
继续
}
fmt .印刷(仪器)
时间。睡眠(时间。第二)
}
} hash.go
主包装
导入(
fmt
./平衡
哈希/crc32
数学/兰特
)
类型哈希平衡结构{
名称字符串
年龄整数
}
函数初始化(){
平衡RegisterBalancer(hash ,HashBalance{})
}
func(p * hash balance)do balance(insts[]* balance .实例,键.字符串)(inst *balance).实例,呃错误){
var defKey string=fmt .Sprintf(%d ,rand .Int())
如果len(key) 0 {
defKey=key[0]
}
镜头:=镜头(仪器)
如果镜头==0 {
err=fmtErrorf("没有后端实例")
返回
}
可接收的:=crc32 .可制造表(crc32 .IEEE)
hashVal :=crc32 .校验和([]字节(defKey),可校验)
index :=int(hashVal) % lens
inst=insts[index]
返回
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。