负载均衡算法之加权随机算法的简单实现

加权随机算法实现负载均衡
本文介绍了如何在Go语言中实现加权随机算法的负载均衡。通过创建带有权重的HttpServer服务,利用随机数生成器结合权重比例选择服务器,以此达到更智能的负载效果。示例代码展示了具体实现过程,包括创建服务器、设置权重和加权随机选择服务器的逻辑。

1、我们在前面写过“随机算法”来实现简单的负载均衡。
https://blog.youkuaiyun.com/github_26672553/article/details/99701928

用过nginx配置负载均衡,可能会写过类似这样的配置:

upstream lb {
	server xxxxxx1 weight=1
	server xxxxxx2 weight=2
}

这表示server1和server2的比重为1:2

2、在go里我们也可以简单实现

#以1:2为例,我们构建一个切片
[011]
#然后随机去一个索引

3、下面开始具体实现
要给HttpServer服务添加权重配置,那么首先需要修改下面代码:

//目标server类
type HttpServer struct {
   
   
	Host   string
	Weight int
}

//初始化HttpServer对象
func NewHttpServer(host string, weight int) *HttpServer {
   
   
	return &HttpServer{
   
   Host: host, Weight: weight}
}

这样在创建server的时候传递weight参数作为权重参数:NewHttpServer("http://localhost:9091", 1)

4、包里有个init()函数,当引入包的时候会自动执行此函数。
我们整理一下代码:把添加httpserver和用于实现权重分配的切片的创建都写在这个函数里:

//定义负载均衡对象
var LB *LoadBalance

// 定义用于之后加权随机计算的切片
var ServerIndices []int

//引入这个包就会自动执行这个函数
func init() {
   
   
	LB = NewLoadBalance()
	//给其添加2个服务
	//这里写死,常规做法是引入配置文件
	LB.AddServer(NewHttpServer("http://localhost:9091", 1))
	LB.AddServer(NewHttpServer("http://localhost:9092", 2))

	//下面代码实现了 [0 1 1]
	//9091这个httpServer权重为1,9092这个httpServer权重为2
	for index, server := range  LB.Servers{
   
   
		if server.Weight > 0 {
   
   
			for i := 0; i < server.Weight; i++ {
   
   
				ServerIndices = append(ServerIndices, index)
			}
		}
	}

	fmt.Println(ServerIndices)	//[0 1 1]
}

这段代码是核心,首先是创建负载均衡对象,然后往里添加server,最后循环取出server根本权重值组装[0 1 1]这样的切片。

4、下面就是加权随机算法,也就是先从ServerIndices切片中随机取索引,然后根据索引取出ServerIndices切片的值,然后把该值作为多个server的索引,取出一个server。


//加权随机算法
func (this *LoadBalance) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值