mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-13 12:22:26 +08:00
82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
package air
|
|
|
|
import (
|
|
airClient "flswld.com/air-api/client"
|
|
"flswld.com/common/config"
|
|
"flswld.com/logger"
|
|
"strings"
|
|
"time"
|
|
"wind/entity"
|
|
)
|
|
|
|
type Air struct {
|
|
serviceAddressMap *entity.AddressMap
|
|
}
|
|
|
|
func NewAir(addressMap *entity.AddressMap) (r *Air) {
|
|
r = new(Air)
|
|
r.serviceAddressMap = addressMap
|
|
airClient.SetAirAddr(config.CONF.Air.Addr, config.CONF.Air.Port)
|
|
go r.fetchHttpService()
|
|
go r.pollHttpService()
|
|
return r
|
|
}
|
|
|
|
func (a *Air) syncServiceMap(responseData *airClient.ResponseData) {
|
|
a.serviceAddressMap.Lock.Lock()
|
|
for _, v := range config.CONF.Routes {
|
|
instanceSlice := responseData.Service[v.ServiceName]
|
|
serviceAddress := make([]string, 0)
|
|
for _, vv := range instanceSlice {
|
|
if strings.Contains(vv.InstanceAddr, "http://") {
|
|
serviceAddress = append(serviceAddress, vv.InstanceAddr)
|
|
}
|
|
}
|
|
a.serviceAddressMap.Map[v.ServiceName] = serviceAddress
|
|
}
|
|
a.serviceAddressMap.Lock.Unlock()
|
|
}
|
|
|
|
// 从注册中心获取所有服务
|
|
func (a *Air) fetchHttpService() {
|
|
ticker := time.NewTicker(time.Second * 600)
|
|
for {
|
|
var responseData *airClient.ResponseData
|
|
var err error
|
|
responseData, err = airClient.FetchAllHttpService()
|
|
if err != nil {
|
|
logger.LOG.Error("fetch all http service error: %v", err)
|
|
return
|
|
}
|
|
a.syncServiceMap(responseData)
|
|
a.serviceAddressMap.Lock.RLock()
|
|
logger.LOG.Debug("fetch tick finished, serviceAddressMap: %v", a.serviceAddressMap.Map)
|
|
a.serviceAddressMap.Lock.RUnlock()
|
|
<-ticker.C
|
|
}
|
|
}
|
|
|
|
// 从注册中心长轮询监听所有服务变化
|
|
func (a *Air) pollHttpService() {
|
|
lastTime := int64(0)
|
|
for {
|
|
nowTime := time.Now().UnixNano()
|
|
if time.Duration(nowTime-lastTime) < time.Second {
|
|
time.Sleep(time.Millisecond * 100)
|
|
continue
|
|
}
|
|
lastTime = time.Now().UnixNano()
|
|
var responseData *airClient.ResponseData
|
|
var err error
|
|
responseData, err = airClient.PollAllHttpService()
|
|
if err != nil {
|
|
logger.LOG.Error("poll all http service error: %v", err)
|
|
continue
|
|
}
|
|
a.syncServiceMap(responseData)
|
|
a.serviceAddressMap.Lock.RLock()
|
|
logger.LOG.Debug("poll finished, serviceAddressMap: %v", a.serviceAddressMap.Map)
|
|
a.serviceAddressMap.Lock.RUnlock()
|
|
}
|
|
}
|