代码拉取完成,页面将自动刷新
package sdp
import (
"fmt"
"gitee.com/saxon134/go-utils/saCache"
"gitee.com/saxon134/go-utils/saData"
"gitee.com/saxon134/go-utils/saData/saUrl"
"gitee.com/saxon134/go-utils/saHttp"
"gitee.com/saxon134/go-utils/saLog"
"gitee.com/saxon134/sysmain/errs"
"math/rand"
"strings"
"time"
)
var _last map[string]string
// Discovery 查找可用服务
func (m *Client) Discovery(app string) (host string, port int) {
if app == "" {
return "", 0
}
var last = ""
if _last == nil {
_last = map[string]string{}
}
last = _last[app]
var sdpAry = m.getSdpAry(app)
var lastIsOk = false //尽量选择一个跟上次的不一样的实例
if sdpAry != nil && len(sdpAry) > 0 {
var weight = 0
for _, v := range sdpAry {
var link = fmt.Sprintf("%s:%d", v.Host, v.Port)
if last != link {
weight += v.Weight
} else {
lastIsOk = true
}
}
if weight > 0 {
var r = rand.Intn(weight)
for _, v := range sdpAry {
var link = fmt.Sprintf("%s:%d", v.Host, v.Port)
if last != link {
if weight >= r {
_last[app] = fmt.Sprintf("%s:%d", v.Host, v.Port)
return saUrl.QueryDecode(v.Host), v.Port
}
weight += v.Weight
}
}
}
if lastIsOk {
var ary = strings.Split(last, ":")
if len(ary) == 2 {
return saUrl.QueryDecode(ary[0]), saData.Int(ary[1])
}
}
}
return "", 0
}
func (m *Client) getSdpAry(app string) []*Instance {
var cacheTime = time.Minute
if m.redis != nil {
cacheTime = time.Second * time.Duration((m.pingSecond + 3))
}
value, _ := saCache.MSetWithFunc("discoveryApp:"+app, cacheTime, func() (interface{}, error) {
if m.redis != nil {
var sdpAry = make([]*Instance, 0, 10)
var key = fmt.Sprintf(RedisAppKey, app)
err := m.redis.GetObj(key, &sdpAry)
if m.redis.IsError(err) {
return nil, err
}
return sdpAry, nil
} else {
var params = map[string]string{"app": app}
if m.secret != "" {
var timestamp = saData.I64tos(time.Now().Unix())
params["timestamp"] = timestamp
params["sign"] = saData.Md5(m.secret+timestamp, true)
}
res, err := saHttp.Get(saUrl.ConnectUri(m.sysmainUrl, "sdp/discovery"), params)
if err != nil {
saLog.Err("discovery error:", err)
return nil, err
}
var resObj = struct {
Result []*Instance
}{Result: make([]*Instance, 0, 5)}
_ = saData.StrToModel(res, &resObj)
if len(resObj.Result) == 0 {
return nil, errs.ErrorNotExisted
}
return resObj.Result, err
}
})
if v, ok := value.([]*Instance); ok {
return v
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。