Golang实现随机负载均衡-《GO开发知识笔记》

admin 2025-11-04 01:20:32 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 负载均衡简介
  • 随机负载均衡
  • 测试 随机负载均衡

    负载均衡简介

    设备角度实现负载均衡:

    • 硬件负载均衡:由专门的 负载均衡器 服务提供商,在你的服务器和外部网络之间架设 服务商的 负载均衡器。服务商提供设备和方案帮你处理流量的均衡,不过因为比较费钱包国内没什么人用
    • 软件负载均衡:包括家喻户晓的NginxLVSTengine(阿里版Nginx)。优点就是成本比较低,但需要运维去配置、维护。会踩坑,但国内都在用基本上网找就有解决方案

      随机负载均衡

      无论是NginxLVS 均衡负载的核心在于 网络 io 复用负载均衡算法。其中均衡算法又分为 随机轮询加权轮询哈希,而随机负载均衡算法就是本文的重点。随机负载均衡:意味没有规律,随机在服务器队列中获得一台服务器处理请求。其代码实现如下:
      1. package main
      2. import (
      3. "fmt"
      4. "math/rand"
      5. )
      6. // 接口定义
      7. type LoadBalance interface {
      8. //选择一个后端Server
      9. //参数remove是需要排除选择的后端Server
      10. Next(remove []string) *Server
      11. //更新可用Server列表
      12. UpdateServers(servers []*Server)
      13. }
      14. // 后端Server定义
      15. type Server struct {
      16. //主机地址
      17. Host string
      18. //主机名
      19. Name string
      20. Id int
      21. //主机是否在线
      22. Online bool
      23. }
      24. type LoadBalanceRandom struct{
      25. servers []*Server
      26. }
      27. // 实例化 随机均衡负载
      28. func NewLoadBalanceRandom(servers []*Server) *LoadBalanceRandom{
      29. newBalance := &LoadBalanceRandom{}
      30. newBalance.UpdateServers(servers)
      31. return newBalance
      32. }
      33. //选择一个后端Server
      34. func (r *LoadBalanceRandom) Next() *Server {
      35. if len(r.servers) == 0 {
      36. return nil
      37. }
      38. curIndex := rand.Intn(len(r.servers))
      39. return r.servers[curIndex]
      40. }
      41. func (r *LoadBalanceRandom) Get(key string) (*Server, error) {
      42. return r.Next(), nil
      43. }
      44. //系统运行过程中,后端可用Server会更新
      45. func (this *LoadBalanceRandom) UpdateServers(servers []*Server) {
      46. newServers:=make([]*Server,0)
      47. for _,e:=range servers {
      48. if e.Online==true {
      49. newServers=append(newServers,e)
      50. }
      51. }
      52. this.servers=newServers
      53. }

      测试 随机负载均衡

      1. func main() {
      2. count:=make([]int,4)
      3. servers:=make([]*Server,0)
      4. servers=append(servers,&Server{Host:"1",Id:0,Online:true})
      5. servers=append(servers,&Server{Host:"2",Id:1,Online:true})
      6. servers=append(servers,&Server{Host:"3",Id:2,Online:true})
      7. servers=append(servers,&Server{Host:"4",Id:3,Online:true})
      8. lb:=NewLoadBalanceRandom(servers)
      9. // 创建4个Server,随机选择100000次。查看4台机器 被选中次数
      10. for i:=0;i<100000;i++{
      11. c:=lb.Next()
      12. count[c.Id]++
      13. }
      14. fmt.Println(count)
      15. }
      输出
      1. // 4 个服务器选择的次数都是相对平均
      2. [25058 24947 25105 24890]
    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  6