Golang 实现简单随机负载均衡

目录
  • 负载均衡简介
  • 随机负载均衡
  • 测试 随机负载均衡

负载均衡简介

从设备角度实现负载均衡:

硬件负载均衡:

由专门的 负载均衡器 服务提供商,在你的服务器和外部网络之间架设 服务商的 负载均衡器。服务商提供设备和方案帮你处理流量的均衡,不过因为比较费钱包国内没什么人用

软件负载均衡:

包括家喻户晓的Nginx,LVS,Tengine(阿里版Nginx)。优点就是成本比较低,但需要运维去配置、维护。会踩坑,但国内都在用基本上网找就有解决方案。

随机负载均衡

无论是Nginx,LVS 均衡负载的核心在于 网络 io 复用,负载均衡算法。其中均衡算法又分为 随机,轮询,加权轮询,哈希,而随机负载均衡算法就是本文的重点。

随机负载均衡:意味没有规律,随机在服务器队列中获得一台服务器处理请求。其代码实现如下:

package main

import (
	"fmt"
	"math/rand"
)

// 接口定义
type LoadBalance interface {
	//选择一个后端Server
	//参数remove是需要排除选择的后端Server
	Next(remove []string) *Server
	//更新可用Server列表
	UpdateServers(servers []*Server)
}

// 后端Server定义
type Server struct {
	//主机地址
	Host string
	//主机名
	Name string
	Id int
	//主机是否在线
	Online bool
}

type LoadBalanceRandom struct{
	servers []*Server
}

// 实例化 随机均衡负载
func NewLoadBalanceRandom(servers []*Server) *LoadBalanceRandom{
	newBalance := &LoadBalanceRandom{}
	newBalance.UpdateServers(servers)
	return newBalance
}

//选择一个后端Server
func (r *LoadBalanceRandom) Next() *Server {
	if len(r.servers) == 0 {
		return nil
	}

	curIndex := rand.Intn(len(r.servers))
	return r.servers[curIndex]
}

func (r *LoadBalanceRandom) Get(key string) (*Server, error) {
	return r.Next(), nil
}

//系统运行过程中,后端可用Server会更新
func (this *LoadBalanceRandom) UpdateServers(servers []*Server) {
	newServers:=make([]*Server,0)
	for _,e:=range servers {
		if e.Online==true {
			newServers=append(newServers,e)
		}
	}
	this.servers=newServers
}

测试 随机负载均衡

func main() {
	count:=make([]int,4)
	servers:=make([]*Server,0)
	servers=append(servers,&Server{Host:"1",Id:0,Online:true})
	servers=append(servers,&Server{Host:"2",Id:1,Online:true})
	servers=append(servers,&Server{Host:"3",Id:2,Online:true})
	servers=append(servers,&Server{Host:"4",Id:3,Online:true})
	lb:=NewLoadBalanceRandom(servers)

	// 创建4个Server,随机选择100000次。查看4台机器 被选中次数
	for i:=0;i<100000;i++{
		c:=lb.Next()
		count[c.Id]++
	}
	fmt.Println(count)
}

输出

// 4 个服务器选择的次数都是相对平均 [25058 24947 25105 24890]

到此这篇关于Golang 实现简单随机负载均衡 的文章就介绍到这了,更多相关Golang 随机负载均衡内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang grpc 负载均衡的方法

    微服务架构里面,每个服务都会有很多节点,如果流量分配不均匀,会造成资源的浪费,甚至将一些机器压垮,这个时候就需要负载均衡,最简单的一种策略就是轮询,顺序依次选择不同的节点访问. grpc 在客户端提供了负载均衡的实现,并提供了服务地址解析和更新的接口(默认提供了 DNS 域名解析的支持),方便不同服务的集成 使用示例 conn, err := grpc.Dial( "", grpc.WithInsecure(), // 负载均衡,使用 consul 作服务发现 grpc.WithBal

  • Django高并发负载均衡实现原理详解

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理. 那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题. 下面详细介绍负载均衡的四种实现方式 2 HTTP重定向实现负载均衡 过程描述 当用户向服务器发起请求时,请求首先

  • golang 实现一个负载均衡案例(随机,轮训)

    今天用go实现一个简单的负载均衡的算法,虽然简单,还是要写一下. 1.首先就是服务器的信息 package balance type Instance struct { host string port int } func NewInstance(host string, port int) *Instance { return &Instance{ host: host, port: port, } } func (p *Instance) GetHost() string { return

  • Golang实现四种负载均衡的算法(随机,轮询等)

    随机负载 随机挑选目标服务器 package load_balance import ( "errors" "math/rand" ) //随机负载均衡 type RandomBalance struct { curIndex int rss []string } func (r *RandomBalance) Add(params ...string) error { if len(params) == 0 { return errors.New("pa

  • Golang 实现简单随机负载均衡

    目录 负载均衡简介 随机负载均衡 测试 随机负载均衡 负载均衡简介 从设备角度实现负载均衡: 硬件负载均衡: 由专门的 负载均衡器 服务提供商,在你的服务器和外部网络之间架设 服务商的 负载均衡器.服务商提供设备和方案帮你处理流量的均衡,不过因为比较费钱包国内没什么人用 软件负载均衡: 包括家喻户晓的Nginx,LVS,Tengine(阿里版Nginx).优点就是成本比较低,但需要运维去配置.维护.会踩坑,但国内都在用基本上网找就有解决方案. 随机负载均衡 无论是Nginx,LVS 均衡负载的核

  • nginx+iis实现简单的负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 我的解释:一项任务交由一个开发人员处理总会有上限处理能力,这时可以考虑增加开发人员来共同处理这项任务,多人处理同一项任务时就会涉及到调度问题,即任务分配,这和多线程

  • Golang加权轮询负载均衡的实现

    目录 实现加权轮询负载均衡思路 加权轮询负载均衡代码 测试代码 实现加权轮询负载均衡思路 代码实现一个加权负载均衡 Weight            初始化时对节点约定的权重 currentWeight     节点临时权重,每轮都会变化 effectiveWeight   节点有效权重,默认与Weight相同 totalWeight       所有节点有效权重之和:sum(effectiveWeight) 代码实现一个加权负载均衡 currentWeight = currentWeight

  • 在 Linux 上用 DNS 实现简单的负载均衡的方法

    DNS 轮询将多个服务器映射到同一个主机名,并没有为这里展示的魔法做更多的工作. 如果你的后端服务器是由多台服务器构成的,比如集群化或者镜像的 Web 或者文件服务器,通过负载均衡器提供了单一的入口点.业务繁忙的大型电商在高端负载均衡器上花费了大量的资金,用它来执行各种各样的任务:代理.缓存.状况检查.SSL 处理.可配置的优先级.流量整形等很多任务. 但是你并不需要做那么多工作的负载均衡器.你需要的是一个跨服务器分发负载的简单方法,它能够提供故障切换,并且不太在意它是否高效和完美.DNS 轮询

  • Nginx 简单的负载均衡配置示例

    用户访问http://www.net-hb.com.cn,将其负载均衡到192.168.1.2:80.192.168.1.3:80.192.168.1.4:80.192.168.1.5:80四台服务器. 用户访问http://www.jb51.net,将其负载均衡到192.168.1.7服务器的8080.8081.8082端口. 以下为配置文件nginx.conf: 引用 [table=95%][tr][td]user www www; worker_processes 10; #error_l

  • python负载均衡的简单实现方法

    提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能.当然Nginx最强大的功能还是分发请求,不仅提供了哈希,一致性哈希,负载均衡等多种请求分发模式,还保证了自己服务的轻量和稳定.一台Nginx服务器常年工作在高并发请求的环境下,也极少宕机. 在Nginx负载均衡模式下,请求会发送到压力最小的未宕机服务器上.今天我们不考虑目标服务器的压力,用python实现最简单的负载均衡方法,即将请求发送到未宕机的服务器

  • Spring Cloud负载均衡及远程调用实现详解

    负载均衡 使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例.这时候消费者就需要负载均衡,把请求分散到各个实例.负载均衡主要有两种设计: 服务端负载均衡客户端负载均衡 对于传统的分布式服务来说,大多使用服务端负载均衡.一般会使用Nginx或者ELB等工具作为负载均衡器,如下图: 传统负载均衡 而在Spring Cloud中,使用的是「客户端负载均衡」的方式,使用「Ribbon」组件来实现客户端的负载均衡.只要引入了微服务注册中心依赖,就会自动引入Ribbon依赖.客户端负载均衡

  • 关于nginx负载均衡和反向代理的讲解

    目录 负载均衡 负载均衡分类 1.DNS负载均衡 2.IP负载均衡 3.链路层负载均衡 4.混合型负载均衡 负载均衡算法 1 轮询 2 随机 3 最少链接 4 Hash(源地址散列) 5 加权 反向代理 负载均衡 负载均衡是有多台服务器以对称的方式组成一个服务器集合,每台服务器都能具有等价的地位,都可以单独对外提供服务而无需其他服务器辅助.通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地相应用户的请求.均衡负载能够平均分配呵护请求到服务器阵

随机推荐