需求:
实现一个最简单的负载均衡(均衡算法采用随机算法)。
具体实现:前端用户访问localhost:8080
,通过反向代理
随机分配到localhost:9091
或lcalhost:9092
。
1、确保启动这2个(或多个)9091
、9092
web服务
实现代码查看:
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:9091
和localhost:9092