代码记录

程序结构目录

--------程序包

balance.go

package balancetype Balancer interface {DoBalance([]*Instance, ...string) (*Instance, error)
}

instance.go

package balanceimport ("strconv"
)type Instance struct {host stringport int
}func NewInstance(host string, port int) *Instance {return &Instance{host: host,port: port,}
}//定义Instance结构体的方法GetHost()
func (p *Instance) GetHost() string {return p.host
}//定义方法GetPort()
func (p *Instance) GetPort() int {return p.port
}
func (p *Instance) String() string {return p.host + ":" + strconv.Itoa(p.port)
}

mgr.go

package balanceimport "fmt"type BalanceMgr struct {allBalancer map[string]Balancer
}var mgr = BalanceMgr{allBalancer: make(map[string]Balancer),
}func (p *BalanceMgr) registerBalancer(name string, b Balancer) {p.allBalancer[name] = b
}
func RegisterBalancer(name string, b Balancer) {mgr.registerBalancer(name, b)
}
func DoBalance(name string, insts []*Instance) (inst *Instance, err error) {balancer, ok := mgr.allBalancer[name]if !ok {err = fmt.Errorf("Not found %s balancer", name)return}fmt.Printf("use %s balancer\n", name)inst, err = balancer.DoBalance(insts)return
}

random.go

package balanceimport ("errors""math/rand"
)func init() {RegisterBalancer("random", &RandomBalance{})
}type RandomBalance struct {}func (p *RandomBalance) DoBalance(insts []*Instance, key ...string) (inst *Instance, err error) {if len(insts) == 0 {err = errors.New("No instance")return}lens := len(insts)index := rand.Intn(lens)inst = insts[index]return
}

roundrobin.go

package balanceimport ("errors"
)func init() {RegisterBalancer("roundrobin", &RoundRobinBalance{})
}type RoundRobinBalance struct {curIndex int
}func (p *RoundRobinBalance) DoBalance(insts []*Instance, key ...string) (inst *Instance, err error) {if len(insts) == 0 {err = errors.New("No instance")return}lens := len(insts)if p.curIndex >= lens {p.curIndex = 0}inst = insts[p.curIndex]p.curIndex = (p.curIndex + 1) % lensreturn
}

------入口

main.go

package mainimport ("fmt""../balance""math/rand""os""time"
)func main() {var insts []*balance.Instancefor i := 0; i < 16; i++ {host := fmt.Sprintf("192.168.%d.%d", rand.Intn(255), rand.Intn(255))one := balance.NewInstance(host, 8080)insts = append(insts, one)}var balanceName = "random"if len(os.Args) > 1 {balanceName = os.Args[1]}for {inst, err := balance.DoBalance(balanceName, insts)if err != nil {fmt.Println("do balance err:", err)fmt.Fprintf(os.Stdout, "do balance err\n")continue}fmt.Println(inst)time.Sleep(time.Second)}
}

hash.go

package mainimport ("fmt""../balance""hash/crc32""math/rand"
)type HashBalance struct {Name stringAge  int
}func init() {balance.RegisterBalancer("hash", &HashBalance{})
}
func (p *HashBalance) DoBalance(insts []*balance.Instance, key ...string) (inst *balance.Instance, err error) {var defKey string = fmt.Sprintf("%d", rand.Int())if len(key) > 0 {defKey = key[0]}lens := len(insts)if lens == 0 {err = fmt.Errorf("No backend instance")return}crcTable := crc32.MakeTable(crc32.IEEE)hashVal := crc32.Checksum([]byte(defKey), crcTable)index := int(hashVal) % lensinst = insts[index]return
}

Golang之实现一个负载均衡算法(随机,轮询)相关推荐

  1. 负载均衡算法--加权轮询法(Weight Round Robin)

    接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...

  2. 负载均衡算法-权重轮询均衡

    ②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.

  3. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  4. 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  5. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  6. 负载均衡之加权轮询算法

    在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...

  7. nginx负载均衡之加权轮询

    当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...

  8. php管理智能dns,负载均衡之DNS轮询

    域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服务器, ...

  9. 负载均衡之DNS轮询

    大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...

最新文章

  1. LeetCode实战:求众数
  2. 清华北大,已经没人本科就找工作了
  3. Scriptaculous创始人作序推荐——《Ajax实战:Prototype与Scriptaculous篇》
  4. UIBarButtonItem使用困惑
  5. python php linux-Linux 中PHP的安装教程
  6. uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示
  7. python删除符合条件的行_这十道经典Python笔试题,全做对算我输
  8. android放大镜无广告,Android放大镜的实现代码
  9. 直流调速器(有刷电调)的工作原理
  10. SAP HANA Express Edition (HXE)-二进制安装使用步骤
  11. CSS中怎么让DIV水平居中
  12. FOSCommentBundle功能包:指南索引页
  13. 中文的习题解答中国人看懂, 英文的习题解答外国人能看懂
  14. Linux基础知识总结一
  15. Android 12中系统Wallpaper详解1--锁屏透看壁纸和桌面透看壁纸的切换
  16. ArcGIS软件的基本使用
  17. php 会员卡管理页面,21.4.3 会员资料管理界面
  18. 串口总线舵机之配置舵机
  19. Java——继承的概念
  20. vue2 qrcodejs2链接生成二维码

热门文章

  1. [js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程连载中...
  2. 计算机的颜色储存格式(索引色 真彩色)
  3. 用C#写的一个注册表操作类
  4. asp.net Page页面中的一个有用属性
  5. 二值图像连通 C语言,二值图像统计连通区域C语言版
  6. java 安卓 html_java – Android的HtmlUnit替代品?
  7. Java Decimal范围_Java BigDecimal初探
  8. idea基于spring boot的依赖分开打包
  9. UTF-8格式的文本文件程序读取异常
  10. Zuul之Filter详解