Golang之实现一个负载均衡算法(随机,轮询)
代码记录
程序结构目录

--------程序包
package balance
type Balancer interface {
DoBalance([]*Instance, ...string) (*Instance, error)
}
balance.go
package balance import (
"strconv"
) type Instance struct {
host string
port 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)
}
instance.go
package balance
import "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
}
mgr.go
package balance import (
"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) == {
err = errors.New("No instance")
return
}
lens := len(insts)
index := rand.Intn(lens)
inst = insts[index]
return
}
random.go
package balance import (
"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) == {
err = errors.New("No instance")
return
}
lens := len(insts)
if p.curIndex >= lens {
p.curIndex =
}
inst = insts[p.curIndex]
p.curIndex = (p.curIndex + ) % lens
return
}
roundrobin.go
------入口
package main import (
"fmt"
"go_dev/day7/example/example1/balance"
"math/rand"
"os"
"time"
) func main() {
var insts []*balance.Instance
for i := ; i < ; i++ {
host := fmt.Sprintf("192.168.%d.%d", rand.Intn(), rand.Intn())
one := balance.NewInstance(host, )
insts = append(insts, one)
}
var balanceName = "random"
if len(os.Args) > {
balanceName = os.Args[]
}
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)
}
}
main.go
package main import (
"fmt"
"go_dev/day7/example/example1/balance"
"hash/crc32"
"math/rand"
) type HashBalance struct {
Name string
Age 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) > {
defKey = key[]
}
lens := len(insts)
if lens == {
err = fmt.Errorf("No backend instance")
return
}
crcTable := crc32.MakeTable(crc32.IEEE)
hashVal := crc32.Checksum([]byte(defKey), crcTable)
index := int(hashVal) % lens
inst = insts[index]
return
}
hash.go
Golang之实现一个负载均衡算法(随机,轮询)的更多相关文章
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现
直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...
- 2017-5-5/PHP实现负载均衡的加权轮询
1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载. 随机法:通过系统的随机算法,根据后端服务器的列表 ...
- 负载均衡之DNS轮询
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...
- 如何配置nginx负载均衡配置(轮询,权重,ip绑定)
集群是为了解决单节点无法服务高并发的情况,在集群中nginx是如何分配将来自客户端的请求 转发给服务器的 负载均衡可以提高网站的吞吐量(接受和响应),减轻单台服务器的压力 负载均衡提供了三种策略:轮询 ...
- Nginx几种负载均衡算法及配置实例
本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...
- Ribbon,主要提供客户侧的软件负载均衡算法。
Ribbon Ribbon,主要提供客户侧的软件负载均衡算法.Ribbon客户端组件提供一系列完善的配置选项,比如连接超时.重试.重试算法等.Ribbon内置可插拔.可定制的负载均衡组件.下面是用到的 ...
- [原]F5负载均衡示例:轮寻
/** * lihaibo 欢迎转载,请保留原地址 */ 规划: F5 1600 BIG-IP 内网 192.168.100.0 255.255.255.0 外网 10.50.20.0 255.255 ...
- 【算法】使用Golang实现加权负载均衡算法
背景描述 如下图所示,负载均衡做为反向代理,将请求方的请求转发至后端的服务节点,实现服务的请求. 在nginx中可以通过upstream配置server时,设置weight表示对应server的权重. ...
随机推荐
- Machine Learning 方向读博的一些重要期刊及会议 && 读博第一次组会时博导的交代
读博从报道那天算起到现在已经3个多月了,这段时间以来和博导总共见过两次面,寥寥数语的见面要我对剩下的几年读书生活没有了太多的期盼,有些事情一直想去做却总是打不起来精神,最后挣扎一下还是决定把和博导开学 ...
- Linux修改串口irq
/******************************************************************************* * Linux修改串口irq * 说明 ...
- Ant build.xml相关属性详解
关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序 ...
- 【转】inittab文件
原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202482 一.inittab文件背景(1)init进程的作用 使用uboot下载 ...
- Jqmobile Secha Ionic比较
1. Jqmobile 轻量级框架,它的语言基于 jquery 语言容易上手,运行速度快,但是没有 MVC 多人协作 开发的概念,项目比较大后 代码不易维护 (中小项目 1-2 个人开发很适 ...
- 你正在从一个声称代表如下的证书颁发机构安装证书 alipay truest network,希望能知道程序是怎么实现的或相关资料
你正在从一个声称代表如下的证书颁发机构安装证书 alipay truest network,希望能知道程序是怎么实现的或相关资料
- xhprof使用
一.下载安装 wget http://pecl.php.net/get/xhprof-0.9.3.tgz tar zxvf xhprof-0.9.3.tgz cd xhprof-0.9.3/exten ...
- ASP.NET 迭代控件获得行号
如何获取Repeater的当前行号,其实Repeater自身就带有这个获取当前行号的属性,而无需程序员绑定这个行号.到底要怎么实现呢?其实使用Repeater中的 Container.ItemInde ...
- HDU 1686 Oulipo(优化的KMP)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 学习笔记之C# 教程 | 菜鸟教程
C# 教程 | 菜鸟教程 http://www.runoob.com/csharp/csharp-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/r ...