随机算法 实现 负载均衡

需求:

实现一个最简单的负载均衡(均衡算法采用随机算法)。

具体实现:前端用户访问localhost:8080,通过反向代理随机分配到localhost:9091lcalhost:9092

1、确保启动这2个(或多个)90919092web服务

实现代码查看:

https://blog.csdn.net/github_26672553/article/details/99165065

2、前端访问负载均衡服务器 主要代码

func main() {
	_ = http.ListenAndServe(":8080", &ProxyHandler{})
}

3、ProxyHandler类必须实现ServeHTTP方法

//定义代理处理结构体
type ProxyHandler struct {
}

//必须实现的ServeHttp方法
func (*ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	defer func() {
		if err := recover(); err != nil {
			w.WriteHeader(500)
			log.Println(err)
		}
	}()

	//实例化负载均衡
	lb := util.NewLoadBalance()
	//给其添加2个服务
	lb.AddServer(util.NewHttpServer("http://localhost:9091"))
	lb.AddServer(util.NewHttpServer("http://localhost:9092"))
	url,_ := url2.Parse(lb.SelectForRand().Host)
	//go内置的反向代理函数
	proxy := httputil.NewSingleHostReverseProxy(url)
	proxy.ServeHTTP(w, r)

	_, _ = w.Write([]byte("index"))
}

4、下面就是最重要的部分了,创建util目录,创建loadBalance.go文件,代码如下:

package util

import (
	"math/rand"
	"time"
)

//目标server类
type HttpServer struct {
	Host string
}
//初始化HttpServer对象
func NewHttpServer(host string)*HttpServer  {
	return &HttpServer{Host:host}
}

//负载均衡类
type LoadBalance struct {
	Servers []*HttpServer
}

//初始化负载均衡对象
func NewLoadBalance() *LoadBalance {
	return &LoadBalance{Servers: make([]*HttpServer, 0)}
}
//给负载均衡添加服务
func (this *LoadBalance)AddServer(server *HttpServer)  {
	this.Servers = append(this.Servers, server)
}

//随机从负载均衡里选择一个服务
func (this *LoadBalance)SelectForRand() *HttpServer  {
	rand.Seed(time.Now().UnixNano()) //设置随机因子,精确到纳秒
	index := rand.Intn(len(this.Servers))
	return this.Servers[index]
}

5、到这里应该可以看出,我们这里实现“负载均衡”主要是通过反向代理。
我们启动程序,监听负载均衡服务器。

package main

import (
	"loadBalance/util"
	"log"
	"net/http"
	"net/http/httputil"
	url2 "net/url"
)

//定义代理处理结构体
type ProxyHandler struct {
}

//必须实现的ServeHttp方法
func (*ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	defer func() {
		if err := recover(); err != nil {
			w.WriteHeader(500)
			log.Println(err)
		}
	}()

	//实例化负载均衡
	lb := util.NewLoadBalance()
	//给其添加2个服务
	lb.AddServer(util.NewHttpServer("http://localhost:9091"))
	lb.AddServer(util.NewHttpServer("http://localhost:9092"))
	url,_ := url2.Parse(lb.SelectForRand().Host)
	//go内置的反向代理函数
	proxy := httputil.NewSingleHostReverseProxy(url)
	proxy.ServeHTTP(w, r)

	_, _ = w.Write([]byte("index"))
}

func main() {
	_ = http.ListenAndServe(":8080", &ProxyHandler{})
}

在这里插入图片描述
在这里插入图片描述 现在我们访问localhost:8080就会被随机分配到locahost:9091localhost:9092

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值