代码拉取完成,页面将自动刷新
package load_balancer
import (
"errors"
"fmt"
"gitee.com/os-lee/easy-paas/common"
"gitee.com/os-lee/easy-paas/common/discovery"
"gitee.com/os-lee/easy-paas/gateway/internal/dao"
"net/http"
"net/url"
"sync"
)
type Server struct {
URL *url.URL
Weight int // 权重,用于权重负载均衡
}
// Balancer 接口定义了所有负载均衡策略都应实现的公共方法
type Balancer interface {
Pick(*http.Request) *Server
}
type BaseBalancer struct {
servers []Server
mu sync.RWMutex
}
// Handler 各个业务的负载均衡器
var Handler *LoadBalancer
func init() {
Handler = newLoadBalancer()
}
type LoadBalancer struct {
// key:ServiceName val:load_balancer.Balancer
LoadBalancerMap sync.Map
}
func newLoadBalancer() *LoadBalancer {
return &LoadBalancer{
LoadBalancerMap: sync.Map{},
}
}
func (l *LoadBalancer) Get(service *dao.ServiceDetail) (Balancer, error) {
key := service.Info.ServiceName
if value, ok := l.LoadBalancerMap.Load(key); ok {
return value.(Balancer), nil
}
// 服务发现
rMsgs, err := discovery.EtcdCli.DiscoverServices(service.LoadBalance.ProxyName)
if err != nil || len(rMsgs) == 0 {
msg := fmt.Sprintf("没有可用的地址,服务名: %s, 被代理名: %s, err:%v",
service.Info.ServiceName, service.LoadBalance.ProxyName, err)
return nil, errors.New(msg)
}
var servers []Server
for _, msg := range rMsgs {
server := Server{
URL: common.MustParseURL(common.ProtocolConverter(msg.ServiceProtocolCode) + msg.ServiceAddr),
Weight: 1,
}
servers = append(servers, server)
}
// 获取负载均衡器
lb := new(Factory).Produce(service.LoadBalance.RoundType, servers)
l.LoadBalancerMap.Store(key, lb)
return lb, err
}
func (l *LoadBalancer) Update(serviceName string) {
// 直接删除即可,获取时会重新创建
l.LoadBalancerMap.Delete(serviceName)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。