Golang之实现一个负载均衡算法(随机,轮询)
代码记录
程序结构目录
--------程序包
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之实现一个负载均衡算法(随机,轮询)相关推荐
- 负载均衡算法--加权轮询法(Weight Round Robin)
接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...
- 负载均衡算法-权重轮询均衡
②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.
- 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析
本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...
- 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略
什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...
- js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...
什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...
- 负载均衡之加权轮询算法
在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...
- nginx负载均衡之加权轮询
当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...
- php管理智能dns,负载均衡之DNS轮询
域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服务器, ...
- 负载均衡之DNS轮询
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...
最新文章
- LeetCode实战:求众数
- 清华北大,已经没人本科就找工作了
- Scriptaculous创始人作序推荐——《Ajax实战:Prototype与Scriptaculous篇》
- UIBarButtonItem使用困惑
- python php linux-Linux 中PHP的安装教程
- uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示
- python删除符合条件的行_这十道经典Python笔试题,全做对算我输
- android放大镜无广告,Android放大镜的实现代码
- 直流调速器(有刷电调)的工作原理
- SAP HANA Express Edition (HXE)-二进制安装使用步骤
- CSS中怎么让DIV水平居中
- FOSCommentBundle功能包:指南索引页
- 中文的习题解答中国人看懂, 英文的习题解答外国人能看懂
- Linux基础知识总结一
- Android 12中系统Wallpaper详解1--锁屏透看壁纸和桌面透看壁纸的切换
- ArcGIS软件的基本使用
- php 会员卡管理页面,21.4.3 会员资料管理界面
- 串口总线舵机之配置舵机
- Java——继承的概念
- vue2 qrcodejs2链接生成二维码
热门文章
- [js高手之路]从零开始打造一个javascript开源框架gdom与插件开发免费视频教程连载中...
- 计算机的颜色储存格式(索引色 真彩色)
- 用C#写的一个注册表操作类
- asp.net Page页面中的一个有用属性
- 二值图像连通 C语言,二值图像统计连通区域C语言版
- java 安卓 html_java – Android的HtmlUnit替代品?
- Java Decimal范围_Java BigDecimal初探
- idea基于spring boot的依赖分开打包
- UTF-8格式的文本文件程序读取异常
- Zuul之Filter详解