From 48c8c1652d43e1a0dfa4aeef04295b5f1131e7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 23 May 2025 22:38:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=8E=A5=E5=8F=A3Server?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=BA=A6=E6=9D=9F=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9C=8D=E5=8A=A1=E5=99=A8=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abstract/{abstract.go => IBalance.go} | 0 abstract/IServer.go | 22 +++++++++++++++ define/define.go | 13 +++++---- server.go | 40 +++++++++++++++++++++------ 4 files changed, 61 insertions(+), 14 deletions(-) rename abstract/{abstract.go => IBalance.go} (100%) create mode 100644 abstract/IServer.go diff --git a/abstract/abstract.go b/abstract/IBalance.go similarity index 100% rename from abstract/abstract.go rename to abstract/IBalance.go diff --git a/abstract/IServer.go b/abstract/IServer.go new file mode 100644 index 0000000..977cf39 --- /dev/null +++ b/abstract/IServer.go @@ -0,0 +1,22 @@ +// Package abstract ... +// +// Description : abstract ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-05-23 22:30 +package abstract + +import ( + "git.zhangdeman.cn/gateway/balance/define" + "git.zhangdeman.cn/zhangdeman/exception" +) + +// IServer 服务节点集合的接口约束 +type IServer interface { + Add(node *define.SeverNode) // 在集群中添加一个节点 + Modify(node *define.SeverNode) // 修改集群中一个节点的信息 + Remove(nodeID string) // 在集群中移除一个节点 + Get() (string, exception.IException) // 获取一个访问节点 + ChangeBalance(d IBalance) // 修改负载均衡策略 +} diff --git a/define/define.go b/define/define.go index b12236d..e41dacd 100644 --- a/define/define.go +++ b/define/define.go @@ -13,9 +13,12 @@ package define // // Date : 2:46 下午 2021/4/1 type SeverNode struct { - ID string `json:"id"` // 机器编号 - Host string `json:"host"` // ip - Port int `json:"port"` // 端口 - Weight float64 `json:"weight"` // 权重 - Status int `json:"status"` // 状态 + ID string `json:"id"` // 机器编号 + Host string `json:"host"` // ip + Port int `json:"port"` // 端口 + Weight float64 `json:"weight"` // 权重 + Status int `json:"status"` // 状态 + Count uint64 `json:"count"` // 节点访问次数, 用于实现最小访问次数的策略 + CostTime uint64 `json:"cost_time"` // 节点访问耗时, 用于实现最小访问耗时的策略 + FailureCount uint64 `json:"failure_count"` // 节点访问失败次数, 用于实现最小访问失败次数的策略 } diff --git a/server.go b/server.go index 2b8f34e..eea2209 100644 --- a/server.go +++ b/server.go @@ -10,9 +10,9 @@ package balance import ( "git.zhangdeman.cn/gateway/balance/abstract" "git.zhangdeman.cn/gateway/balance/define" - "git.zhangdeman.cn/zhangdeman/easylock" "git.zhangdeman.cn/zhangdeman/exception" "reflect" + "sync" ) // NewServer ... @@ -22,7 +22,7 @@ import ( // Date : 6:51 下午 2021/4/1 func NewServer(nodeList []*define.SeverNode, d abstract.IBalance) *Server { return &Server{ - lock: easylock.NewLock(), + lock: &sync.RWMutex{}, NodeList: nodeList, Balance: d, } @@ -34,7 +34,7 @@ func NewServer(nodeList []*define.SeverNode, d abstract.IBalance) *Server { // // Date : 2:59 下午 2021/4/1 type Server struct { - lock easylock.EasyLock + lock *sync.RWMutex NodeList []*define.SeverNode Balance abstract.IBalance } @@ -45,9 +45,9 @@ type Server struct { // // Date : 3:00 下午 2021/4/1 func (s *Server) Add(node *define.SeverNode) { - _ = s.lock.Lock() + s.lock.Lock() defer func() { - _ = s.lock.Unlock() + s.lock.Unlock() }() s.NodeList = append(s.NodeList, node) } @@ -58,9 +58,9 @@ func (s *Server) Add(node *define.SeverNode) { // // Date : 5:09 下午 2021/4/1 func (s *Server) Remove(nodeID string) { - _ = s.lock.Lock() + s.lock.Lock() defer func() { - _ = s.lock.Unlock() + s.lock.Unlock() }() for nodeIndex, item := range s.NodeList { if item.ID == nodeID { @@ -76,13 +76,35 @@ func (s *Server) Remove(nodeID string) { // // Date : 5:17 下午 2021/4/1 func (s *Server) Get() (string, exception.IException) { - _ = s.lock.RLock() + s.lock.RLock() defer func() { - _ = s.lock.RUnlock() + s.lock.RUnlock() }() return s.Balance.Get(s.NodeList) } +func (s *Server) Modify(node *define.SeverNode) { + if nil == node { + return + } + s.lock.RLock() + defer func() { + s.lock.RUnlock() + }() + findExistNode := false + for nodeIndex, item := range s.NodeList { + if item.ID == node.ID { + s.NodeList[nodeIndex] = node + findExistNode = true + break + } + } + if !findExistNode { + // 没找到已存在节点, 自动降级为添加 + s.Add(node) + } +} + // ChangeBalance 修改负载均衡策略 func (s *Server) ChangeBalance(d abstract.IBalance) { if nil == d {