go 负载均衡,负载均衡 随机 轮询

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: