mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-10 12:30:25 +08:00
优化代码
This commit is contained in:
@@ -482,11 +482,7 @@ func TestFileStorage_DecodeFile(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
_, path := storage.keyPath("my-key")
|
_, path := storage.keyPath("my-key")
|
||||||
item, err := storage.decodeFile(path)
|
t.Log(path)
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
logs.PrintAsJSON(item, t)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkFileStorage_Read(b *testing.B) {
|
func BenchmarkFileStorage_Read(b *testing.B) {
|
||||||
|
|||||||
@@ -1,27 +1,71 @@
|
|||||||
package events
|
package events
|
||||||
|
|
||||||
import "sync"
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
var eventsMap = map[string][]func(){} // event => []callbacks
|
type Callbacks = []func()
|
||||||
|
|
||||||
|
var eventsMap = map[Event]map[interface{}]Callbacks{} // event => map[event key][]callback
|
||||||
var locker = sync.Mutex{}
|
var locker = sync.Mutex{}
|
||||||
|
|
||||||
|
var eventKeyId = 0
|
||||||
|
|
||||||
|
func NewKey() interface{} {
|
||||||
|
locker.Lock()
|
||||||
|
defer locker.Unlock()
|
||||||
|
eventKeyId++
|
||||||
|
return eventKeyId
|
||||||
|
}
|
||||||
|
|
||||||
// On 增加事件回调
|
// On 增加事件回调
|
||||||
func On(event string, callback func()) {
|
func On(event Event, callback func()) {
|
||||||
|
OnKey(event, nil, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnKey 使用Key增加事件回调
|
||||||
|
func OnKey(event Event, key interface{}, callback func()) {
|
||||||
|
if key == nil {
|
||||||
|
key = NewKey()
|
||||||
|
}
|
||||||
|
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
defer locker.Unlock()
|
defer locker.Unlock()
|
||||||
|
|
||||||
callbacks, _ := eventsMap[event]
|
m, ok := eventsMap[event]
|
||||||
callbacks = append(callbacks, callback)
|
if !ok {
|
||||||
eventsMap[event] = callbacks
|
m = map[interface{}]Callbacks{}
|
||||||
|
eventsMap[event] = m
|
||||||
|
}
|
||||||
|
m[key] = append(m[key], callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove 删除事件回调
|
||||||
|
func Remove(key interface{}) {
|
||||||
|
if key == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
locker.Lock()
|
||||||
|
for k, m := range eventsMap {
|
||||||
|
_, ok := m[key]
|
||||||
|
if ok {
|
||||||
|
delete(m, key)
|
||||||
|
eventsMap[k] = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
locker.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify 通知事件
|
// Notify 通知事件
|
||||||
func Notify(event string) {
|
func Notify(event Event) {
|
||||||
locker.Lock()
|
locker.Lock()
|
||||||
callbacks, _ := eventsMap[event]
|
m := eventsMap[event]
|
||||||
locker.Unlock()
|
locker.Unlock()
|
||||||
|
|
||||||
|
for _, callbacks := range m {
|
||||||
for _, callback := range callbacks {
|
for _, callback := range callbacks {
|
||||||
callback()
|
callback()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,33 @@
|
|||||||
package events
|
package events_test
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeNode/internal/events"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestOn(t *testing.T) {
|
func TestOn(t *testing.T) {
|
||||||
On("hello", func() {
|
type User struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
var u = &User{}
|
||||||
|
var u2 = &User{}
|
||||||
|
|
||||||
|
events.On("hello", func() {
|
||||||
t.Log("world")
|
t.Log("world")
|
||||||
})
|
})
|
||||||
On("hello", func() {
|
events.On("hello", func() {
|
||||||
t.Log("world2")
|
t.Log("world2")
|
||||||
})
|
})
|
||||||
On("hello2", func() {
|
events.OnKey("hello", u, func() {
|
||||||
|
t.Log("world3")
|
||||||
|
})
|
||||||
|
events.OnKey("hello", u, func() {
|
||||||
|
t.Log("world4")
|
||||||
|
})
|
||||||
|
events.Remove(u)
|
||||||
|
events.Remove(u2)
|
||||||
|
events.OnKey("hello2", nil, func() {
|
||||||
t.Log("world2")
|
t.Log("world2")
|
||||||
})
|
})
|
||||||
Notify("hello")
|
events.Notify("hello")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
"github.com/iwind/TeaGo/types"
|
"github.com/iwind/TeaGo/types"
|
||||||
@@ -27,10 +26,15 @@ func init() {
|
|||||||
SharedCityManager.Start()
|
SharedCityManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedCityManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// CityManager 中国省份信息管理
|
// CityManager 中国省份信息管理
|
||||||
type CityManager struct {
|
type CityManager struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
|
||||||
cacheFile string
|
cacheFile string
|
||||||
|
|
||||||
cityMap map[string]int64 // provinceName_cityName => cityName
|
cityMap map[string]int64 // provinceName_cityName => cityName
|
||||||
@@ -62,11 +66,8 @@ func (this *CityManager) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 定时更新
|
// 定时更新
|
||||||
ticker := utils.NewTicker(4 * time.Hour)
|
this.ticker = time.NewTicker(4 * time.Hour)
|
||||||
events.On(events.EventQuit, func() {
|
for range this.ticker.C {
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
for ticker.Next() {
|
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.ErrorObject("CITY_MANAGER", err)
|
remotelogs.ErrorObject("CITY_MANAGER", err)
|
||||||
@@ -74,6 +75,12 @@ func (this *CityManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *CityManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *CityManager) Lookup(provinceId int64, cityName string) (cityId int64) {
|
func (this *CityManager) Lookup(provinceId int64, cityName string) (cityId int64) {
|
||||||
this.locker.RLock()
|
this.locker.RLock()
|
||||||
cityId, _ = this.cityMap[types.String(provinceId)+"_"+cityName]
|
cityId, _ = this.cityMap[types.String(provinceId)+"_"+cityName]
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -26,10 +25,15 @@ func init() {
|
|||||||
SharedCountryManager.Start()
|
SharedCountryManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedCountryManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// CountryManager 国家/地区信息管理
|
// CountryManager 国家/地区信息管理
|
||||||
type CountryManager struct {
|
type CountryManager struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
|
||||||
cacheFile string
|
cacheFile string
|
||||||
|
|
||||||
countryMap map[string]int64 // countryName => countryId
|
countryMap map[string]int64 // countryName => countryId
|
||||||
@@ -61,11 +65,8 @@ func (this *CountryManager) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 定时更新
|
// 定时更新
|
||||||
ticker := utils.NewTicker(4 * time.Hour)
|
this.ticker = time.NewTicker(4 * time.Hour)
|
||||||
events.On(events.EventQuit, func() {
|
for range this.ticker.C {
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
for ticker.Next() {
|
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.ErrorObject("COUNTRY_MANAGER", err)
|
remotelogs.ErrorObject("COUNTRY_MANAGER", err)
|
||||||
@@ -73,6 +74,12 @@ func (this *CountryManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *CountryManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *CountryManager) Lookup(countryName string) (countryId int64) {
|
func (this *CountryManager) Lookup(countryName string) (countryId int64) {
|
||||||
this.locker.RLock()
|
this.locker.RLock()
|
||||||
countryId, _ = this.countryMap[countryName]
|
countryId, _ = this.countryMap[countryName]
|
||||||
|
|||||||
@@ -23,10 +23,15 @@ func init() {
|
|||||||
SharedIPListManager.Start()
|
SharedIPListManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedIPListManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IPListManager IP名单管理
|
// IPListManager IP名单管理
|
||||||
type IPListManager struct {
|
type IPListManager struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
|
||||||
db *IPListDB
|
db *IPListDB
|
||||||
|
|
||||||
version int64
|
version int64
|
||||||
@@ -52,17 +57,14 @@ func (this *IPListManager) Start() {
|
|||||||
remotelogs.ErrorObject("IP_LIST_MANAGER", err)
|
remotelogs.ErrorObject("IP_LIST_MANAGER", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ticker := time.NewTicker(60 * time.Second)
|
this.ticker = time.NewTicker(60 * time.Second)
|
||||||
if Tea.IsTesting() {
|
if Tea.IsTesting() {
|
||||||
ticker = time.NewTicker(10 * time.Second)
|
this.ticker = time.NewTicker(10 * time.Second)
|
||||||
}
|
}
|
||||||
events.On(events.EventQuit, func() {
|
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
countErrors := 0
|
countErrors := 0
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ticker.C:
|
case <-this.ticker.C:
|
||||||
case <-IPListUpdateNotify:
|
case <-IPListUpdateNotify:
|
||||||
}
|
}
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
@@ -84,6 +86,12 @@ func (this *IPListManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *IPListManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *IPListManager) init() {
|
func (this *IPListManager) init() {
|
||||||
// 从数据库中当中读取数据
|
// 从数据库中当中读取数据
|
||||||
db, err := NewIPListDB()
|
db, err := NewIPListDB()
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -26,10 +25,15 @@ func init() {
|
|||||||
SharedProviderManager.Start()
|
SharedProviderManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedProviderManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProviderManager 中国省份信息管理
|
// ProviderManager 中国省份信息管理
|
||||||
type ProviderManager struct {
|
type ProviderManager struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
|
||||||
cacheFile string
|
cacheFile string
|
||||||
|
|
||||||
providerMap map[string]int64 // name => id
|
providerMap map[string]int64 // name => id
|
||||||
@@ -61,11 +65,8 @@ func (this *ProviderManager) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 定时更新
|
// 定时更新
|
||||||
ticker := utils.NewTicker(4 * time.Hour)
|
this.ticker = time.NewTicker(4 * time.Hour)
|
||||||
events.On(events.EventQuit, func() {
|
for range this.ticker.C {
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
for ticker.Next() {
|
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.ErrorObject("PROVIDER_MANAGER", err)
|
remotelogs.ErrorObject("PROVIDER_MANAGER", err)
|
||||||
@@ -73,6 +74,12 @@ func (this *ProviderManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *ProviderManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *ProviderManager) Lookup(providerName string) (providerId int64) {
|
func (this *ProviderManager) Lookup(providerName string) (providerId int64) {
|
||||||
this.locker.RLock()
|
this.locker.RLock()
|
||||||
providerId, _ = this.providerMap[providerName]
|
providerId, _ = this.providerMap[providerName]
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -30,10 +29,15 @@ func init() {
|
|||||||
SharedProvinceManager.Start()
|
SharedProvinceManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedProvinceManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProvinceManager 中国省份信息管理
|
// ProvinceManager 中国省份信息管理
|
||||||
type ProvinceManager struct {
|
type ProvinceManager struct {
|
||||||
|
ticker *time.Ticker
|
||||||
|
|
||||||
cacheFile string
|
cacheFile string
|
||||||
|
|
||||||
provinceMap map[string]int64 // provinceName => provinceId
|
provinceMap map[string]int64 // provinceName => provinceId
|
||||||
@@ -65,11 +69,8 @@ func (this *ProvinceManager) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 定时更新
|
// 定时更新
|
||||||
ticker := utils.NewTicker(4 * time.Hour)
|
this.ticker = time.NewTicker(4 * time.Hour)
|
||||||
events.On(events.EventQuit, func() {
|
for range this.ticker.C {
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
for ticker.Next() {
|
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.ErrorObject("PROVINCE_MANAGER", err)
|
remotelogs.ErrorObject("PROVINCE_MANAGER", err)
|
||||||
@@ -77,6 +78,12 @@ func (this *ProvinceManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *ProvinceManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *ProvinceManager) Lookup(provinceName string) (provinceId int64) {
|
func (this *ProvinceManager) Lookup(provinceName string) (provinceId int64) {
|
||||||
this.locker.RLock()
|
this.locker.RLock()
|
||||||
provinceId, _ = this.provinceMap[provinceName]
|
provinceId, _ = this.provinceMap[provinceName]
|
||||||
|
|||||||
@@ -15,15 +15,22 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var SharedUpdater = NewUpdater()
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
events.On(events.EventStart, func() {
|
events.On(events.EventStart, func() {
|
||||||
updater := NewUpdater()
|
goman.New(func() {
|
||||||
updater.Start()
|
SharedUpdater.Start()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedUpdater.Stop()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updater IP库更新程序
|
// Updater IP库更新程序
|
||||||
type Updater struct {
|
type Updater struct {
|
||||||
|
ticker *time.Ticker
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUpdater 获取新对象
|
// NewUpdater 获取新对象
|
||||||
@@ -34,15 +41,19 @@ func NewUpdater() *Updater {
|
|||||||
// Start 开始更新
|
// Start 开始更新
|
||||||
func (this *Updater) Start() {
|
func (this *Updater) Start() {
|
||||||
// 这里不需要太频繁检查更新,因为通常不需要更新IP库
|
// 这里不需要太频繁检查更新,因为通常不需要更新IP库
|
||||||
ticker := time.NewTicker(1 * time.Hour)
|
this.ticker = time.NewTicker(1 * time.Hour)
|
||||||
goman.New(func() {
|
for range this.ticker.C {
|
||||||
for range ticker.C {
|
|
||||||
err := this.loop()
|
err := this.loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.ErrorObject("IP_LIBRARY", err)
|
remotelogs.ErrorObject("IP_LIBRARY", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
func (this *Updater) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 单次任务
|
// 单次任务
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ func NewAPIStream() *APIStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *APIStream) Start() {
|
func (this *APIStream) Start() {
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
this.isQuiting = true
|
this.isQuiting = true
|
||||||
if this.cancelFunc != nil {
|
if this.cancelFunc != nil {
|
||||||
this.cancelFunc()
|
this.cancelFunc()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
// 发送监控流量
|
// 发送监控流量
|
||||||
func init() {
|
func init() {
|
||||||
events.On(events.EventStart, func() {
|
events.On(events.EventStart, func() {
|
||||||
ticker := time.NewTicker(1 * time.Minute)
|
var ticker = time.NewTicker(1 * time.Minute)
|
||||||
goman.New(func() {
|
goman.New(func() {
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
// 加入到数据队列中
|
// 加入到数据队列中
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ func (this *Listener) listenTCP() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var netListener = NewClientListener(tcpListener, protocol.IsHTTPFamily() || protocol.IsHTTPSFamily())
|
var netListener = NewClientListener(tcpListener, protocol.IsHTTPFamily() || protocol.IsHTTPSFamily())
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
||||||
_ = netListener.Close()
|
_ = netListener.Close()
|
||||||
})
|
})
|
||||||
@@ -122,7 +122,7 @@ func (this *Listener) listenUDP() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
||||||
_ = listener.Close()
|
_ = listener.Close()
|
||||||
})
|
})
|
||||||
@@ -143,6 +143,8 @@ func (this *Listener) listenUDP() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *Listener) Close() error {
|
func (this *Listener) Close() error {
|
||||||
|
events.Remove(this)
|
||||||
|
|
||||||
if this.listener == nil {
|
if this.listener == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ func (this *BaseListener) Reset() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CountActiveListeners 获取当前活跃连接数
|
// CountActiveConnections 获取当前活跃连接数
|
||||||
func (this *BaseListener) CountActiveListeners() int {
|
func (this *BaseListener) CountActiveConnections() int {
|
||||||
return types.Int(this.countActiveConnections)
|
return types.Int(this.countActiveConnections)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,6 @@ type ListenerInterface interface {
|
|||||||
// Reload 重载配置
|
// Reload 重载配置
|
||||||
Reload(serverGroup *serverconfigs.ServerAddressGroup)
|
Reload(serverGroup *serverconfigs.ServerAddressGroup)
|
||||||
|
|
||||||
// CountActiveListeners 获取当前活跃的连接数
|
// CountActiveConnections 获取当前活跃的连接数
|
||||||
CountActiveListeners() int
|
CountActiveConnections() int
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ func (this *ListenerManager) TotalActiveConnections() int {
|
|||||||
|
|
||||||
total := 0
|
total := 0
|
||||||
for _, listener := range this.listenersMap {
|
for _, listener := range this.listenersMap {
|
||||||
total += listener.listener.CountActiveListeners()
|
total += listener.listener.CountActiveConnections()
|
||||||
}
|
}
|
||||||
return total
|
return total
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ func (this *Node) syncConfig(taskVersion int64) error {
|
|||||||
func (this *Node) startSyncTimer() {
|
func (this *Node) startSyncTimer() {
|
||||||
// TODO 这个时间间隔可以自行设置
|
// TODO 这个时间间隔可以自行设置
|
||||||
ticker := time.NewTicker(60 * time.Second)
|
ticker := time.NewTicker(60 * time.Second)
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("NODE", "quit sync timer")
|
remotelogs.Println("NODE", "quit sync timer")
|
||||||
ticker.Stop()
|
ticker.Stop()
|
||||||
})
|
})
|
||||||
@@ -691,7 +691,7 @@ func (this *Node) listenSock() error {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
logs.Println("NODE", "quit unix sock")
|
logs.Println("NODE", "quit unix sock")
|
||||||
_ = this.sock.Close()
|
_ = this.sock.Close()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ func (this *NodeStatusExecutor) Listen() {
|
|||||||
this.update()
|
this.update()
|
||||||
|
|
||||||
// TODO 这个时间间隔可以配置
|
// TODO 这个时间间隔可以配置
|
||||||
ticker := time.NewTicker(30 * time.Second)
|
var ticker = time.NewTicker(30 * time.Second)
|
||||||
|
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("NODE_STATUS", "quit executor")
|
remotelogs.Println("NODE_STATUS", "quit executor")
|
||||||
ticker.Stop()
|
ticker.Stop()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ func init() {
|
|||||||
SharedOriginStateManager.Start()
|
SharedOriginStateManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedOriginStateManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// OriginStateManager 源站状态管理
|
// OriginStateManager 源站状态管理
|
||||||
@@ -41,7 +44,7 @@ func NewOriginStateManager() *OriginStateManager {
|
|||||||
|
|
||||||
// Start 启动
|
// Start 启动
|
||||||
func (this *OriginStateManager) Start() {
|
func (this *OriginStateManager) Start() {
|
||||||
events.On(events.EventReload, func() {
|
events.OnKey(events.EventReload, this, func() {
|
||||||
this.locker.Lock()
|
this.locker.Lock()
|
||||||
this.stateMap = map[int64]*OriginState{}
|
this.stateMap = map[int64]*OriginState{}
|
||||||
this.locker.Unlock()
|
this.locker.Unlock()
|
||||||
@@ -58,6 +61,12 @@ func (this *OriginStateManager) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *OriginStateManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Loop 单次循环检查
|
// Loop 单次循环检查
|
||||||
func (this *OriginStateManager) Loop() error {
|
func (this *OriginStateManager) Loop() error {
|
||||||
if sharedNodeConfig == nil {
|
if sharedNodeConfig == nil {
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func init() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 系统服务管理
|
// SystemServiceManager 系统服务管理
|
||||||
type SystemServiceManager struct {
|
type SystemServiceManager struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/events"
|
"github.com/TeaOSLab/EdgeNode/internal/events"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/trackers"
|
"github.com/TeaOSLab/EdgeNode/internal/trackers"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
@@ -21,17 +20,22 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var sharedSyncAPINodesTask = NewSyncAPINodesTask()
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
events.On(events.EventStart, func() {
|
events.On(events.EventStart, func() {
|
||||||
task := NewSyncAPINodesTask()
|
|
||||||
goman.New(func() {
|
goman.New(func() {
|
||||||
task.Start()
|
sharedSyncAPINodesTask.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
sharedSyncAPINodesTask.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// SyncAPINodesTask API节点同步任务
|
// SyncAPINodesTask API节点同步任务
|
||||||
type SyncAPINodesTask struct {
|
type SyncAPINodesTask struct {
|
||||||
|
ticker *time.Ticker
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSyncAPINodesTask() *SyncAPINodesTask {
|
func NewSyncAPINodesTask() *SyncAPINodesTask {
|
||||||
@@ -39,16 +43,12 @@ func NewSyncAPINodesTask() *SyncAPINodesTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *SyncAPINodesTask) Start() {
|
func (this *SyncAPINodesTask) Start() {
|
||||||
ticker := time.NewTicker(5 * time.Minute)
|
this.ticker = time.NewTicker(5 * time.Minute)
|
||||||
if Tea.IsTesting() {
|
if Tea.IsTesting() {
|
||||||
// 快速测试
|
// 快速测试
|
||||||
ticker = time.NewTicker(1 * time.Minute)
|
this.ticker = time.NewTicker(1 * time.Minute)
|
||||||
}
|
}
|
||||||
events.On(events.EventQuit, func() {
|
for range this.ticker.C {
|
||||||
remotelogs.Println("SYNC_API_NODES_TASK", "quit task")
|
|
||||||
ticker.Stop()
|
|
||||||
})
|
|
||||||
for range ticker.C {
|
|
||||||
err := this.Loop()
|
err := this.Loop()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[TASK][SYNC_API_NODES_TASK]" + err.Error())
|
logs.Println("[TASK][SYNC_API_NODES_TASK]" + err.Error())
|
||||||
@@ -56,6 +56,12 @@ func (this *SyncAPINodesTask) Start() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *SyncAPINodesTask) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (this *SyncAPINodesTask) Loop() error {
|
func (this *SyncAPINodesTask) Loop() error {
|
||||||
var tr = trackers.Begin("SYNC_API_NODES")
|
var tr = trackers.Begin("SYNC_API_NODES")
|
||||||
defer tr.End()
|
defer tr.End()
|
||||||
|
|||||||
@@ -64,25 +64,26 @@ func NewHTTPRequestStatManager() *HTTPRequestStatManager {
|
|||||||
// Start 启动
|
// Start 启动
|
||||||
func (this *HTTPRequestStatManager) Start() {
|
func (this *HTTPRequestStatManager) Start() {
|
||||||
// 上传请求总数
|
// 上传请求总数
|
||||||
|
var monitorTicker = time.NewTicker(1 * time.Minute)
|
||||||
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
|
monitorTicker.Stop()
|
||||||
|
})
|
||||||
goman.New(func() {
|
goman.New(func() {
|
||||||
ticker := time.NewTicker(1 * time.Minute)
|
for range monitorTicker.C {
|
||||||
goman.New(func() {
|
|
||||||
for range ticker.C {
|
|
||||||
if this.totalAttackRequests > 0 {
|
if this.totalAttackRequests > 0 {
|
||||||
monitor.SharedValueQueue.Add(nodeconfigs.NodeValueItemAttackRequests, maps.Map{"total": this.totalAttackRequests})
|
monitor.SharedValueQueue.Add(nodeconfigs.NodeValueItemAttackRequests, maps.Map{"total": this.totalAttackRequests})
|
||||||
this.totalAttackRequests = 0
|
this.totalAttackRequests = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
loopTicker := time.NewTicker(1 * time.Second)
|
var loopTicker = time.NewTicker(1 * time.Second)
|
||||||
uploadTicker := time.NewTicker(30 * time.Minute)
|
var uploadTicker = time.NewTicker(30 * time.Minute)
|
||||||
if Tea.IsTesting() {
|
if Tea.IsTesting() {
|
||||||
uploadTicker = time.NewTicker(10 * time.Second) // 在测试环境下缩短Ticker时间,以方便我们调试
|
uploadTicker = time.NewTicker(10 * time.Second) // 在测试环境下缩短Ticker时间,以方便我们调试
|
||||||
}
|
}
|
||||||
remotelogs.Println("HTTP_REQUEST_STAT_MANAGER", "start ...")
|
remotelogs.Println("HTTP_REQUEST_STAT_MANAGER", "start ...")
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("HTTP_REQUEST_STAT_MANAGER", "quit")
|
remotelogs.Println("HTTP_REQUEST_STAT_MANAGER", "quit")
|
||||||
loopTicker.Stop()
|
loopTicker.Stop()
|
||||||
uploadTicker.Stop()
|
uploadTicker.Stop()
|
||||||
|
|||||||
@@ -56,17 +56,18 @@ func (this *TrafficStatManager) Start(configFunc func() *nodeconfigs.NodeConfig)
|
|||||||
this.configFunc = configFunc
|
this.configFunc = configFunc
|
||||||
|
|
||||||
// 上传请求总数
|
// 上传请求总数
|
||||||
|
var monitorTicker = time.NewTicker(1 * time.Minute)
|
||||||
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
|
monitorTicker.Stop()
|
||||||
|
})
|
||||||
goman.New(func() {
|
goman.New(func() {
|
||||||
ticker := time.NewTicker(1 * time.Minute)
|
for range monitorTicker.C {
|
||||||
goman.New(func() {
|
|
||||||
for range ticker.C {
|
|
||||||
if this.totalRequests > 0 {
|
if this.totalRequests > 0 {
|
||||||
monitor.SharedValueQueue.Add(nodeconfigs.NodeValueItemRequests, maps.Map{"total": this.totalRequests})
|
monitor.SharedValueQueue.Add(nodeconfigs.NodeValueItemRequests, maps.Map{"total": this.totalRequests})
|
||||||
this.totalRequests = 0
|
this.totalRequests = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
// 上传统计数据
|
// 上传统计数据
|
||||||
duration := 5 * time.Minute
|
duration := 5 * time.Minute
|
||||||
@@ -74,8 +75,8 @@ func (this *TrafficStatManager) Start(configFunc func() *nodeconfigs.NodeConfig)
|
|||||||
// 测试环境缩短上传时间,方便我们调试
|
// 测试环境缩短上传时间,方便我们调试
|
||||||
duration = 30 * time.Second
|
duration = 30 * time.Second
|
||||||
}
|
}
|
||||||
ticker := time.NewTicker(duration)
|
var ticker = time.NewTicker(duration)
|
||||||
events.On(events.EventQuit, func() {
|
events.OnKey(events.EventQuit, this, func() {
|
||||||
remotelogs.Println("TRAFFIC_STAT_MANAGER", "quit")
|
remotelogs.Println("TRAFFIC_STAT_MANAGER", "quit")
|
||||||
ticker.Stop()
|
ticker.Stop()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -20,10 +20,13 @@ func init() {
|
|||||||
SharedFreeHoursManager.Start()
|
SharedFreeHoursManager.Start()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
SharedFreeHoursManager.Stop()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// FreeHoursManager 计算节点空闲时间
|
// FreeHoursManager 计算节点空闲时间
|
||||||
// 以便于我们在空闲时间执行高强度的任务,如果清理缓存等
|
// 以便于我们在空闲时间执行高强度的任务,如清理缓存等
|
||||||
type FreeHoursManager struct {
|
type FreeHoursManager struct {
|
||||||
dayTrafficMap map[int][24]uint64 // day => [ traffic bytes ]
|
dayTrafficMap map[int][24]uint64 // day => [ traffic bytes ]
|
||||||
lastBytes uint64
|
lastBytes uint64
|
||||||
@@ -32,6 +35,7 @@ type FreeHoursManager struct {
|
|||||||
count int
|
count int
|
||||||
|
|
||||||
locker sync.Mutex
|
locker sync.Mutex
|
||||||
|
ticker *time.Ticker
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFreeHoursManager() *FreeHoursManager {
|
func NewFreeHoursManager() *FreeHoursManager {
|
||||||
@@ -39,8 +43,8 @@ func NewFreeHoursManager() *FreeHoursManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *FreeHoursManager) Start() {
|
func (this *FreeHoursManager) Start() {
|
||||||
var ticker = time.NewTicker(30 * time.Minute)
|
this.ticker = time.NewTicker(30 * time.Minute)
|
||||||
for range ticker.C {
|
for range this.ticker.C {
|
||||||
this.Update(atomic.LoadUint64(&teaconst.InTrafficBytes))
|
this.Update(atomic.LoadUint64(&teaconst.InTrafficBytes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,6 +117,12 @@ func (this *FreeHoursManager) IsFreeHour() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *FreeHoursManager) Stop() {
|
||||||
|
if this.ticker != nil {
|
||||||
|
this.ticker.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 对数组进行排序,并返回权重
|
// 对数组进行排序,并返回权重
|
||||||
func (this *FreeHoursManager) sortUintArrayWeights(arr [24]uint64) [24]uint64 {
|
func (this *FreeHoursManager) sortUintArrayWeights(arr [24]uint64) [24]uint64 {
|
||||||
var l = []map[string]interface{}{}
|
var l = []map[string]interface{}{}
|
||||||
|
|||||||
Reference in New Issue
Block a user