Files
proxy/gateway/app/app.go

99 lines
2.3 KiB
Go

package app
import (
"fmt"
"net"
"proxy-server/gateway/core"
"proxy-server/utils"
"sync"
)
type Stoppable interface {
Stop()
}
var (
Id int32
Name string
PlatformSecret string // 平台密钥,验证接收的请求是否属于平台
Edges = core.SyncMap[int32, *core.Edge]{} // 节点信息表 (包外只读!数据存储有关联性,所有写入操作只在包内进行)
Assigns = core.SyncMap[uint16, int32]{} // 分配索引 (包外只读!数据存储有关联性,所有写入操作只在包内进行)
Permits = core.SyncMap[int32, *core.Permit]{} // 节点权限表 (包外只读!数据存储有关联性,所有写入操作只在包内进行)
CtrlConnWg utils.CountWaitGroup // 控制通道计数器
DataConnWg utils.CountWaitGroup // 数据通道计数器
FwdLesWg utils.CountWaitGroup // 转发监听端口计数器
UserConnWg utils.CountWaitGroup // 用户连接计数器
UserConnMap core.SyncMap[string, *core.Conn] // 用户连接暂存
LockPortAssign = sync.Mutex{} // 锁定端口分配,防止并发冲突
EdgeUpdates = make(chan *core.Edge, 1000) // 节点更新通知通道
)
func NewEdge(id int32, port uint16, addr *net.TCPAddr) {
var host = addr.IP.String()
var edge = &core.Edge{
Id: id,
Host: &host,
Port: &port,
}
// todo 查询 geo 信息
Edges.Store(id, edge)
Assigns.Store(port, id)
EdgeUpdates <- edge
}
func TryUpdateEdge(id int32, addr *net.TCPAddr) error {
if addr == nil {
return fmt.Errorf("边缘节点 %d 地址无效", id)
}
edge, ok := Edges.Load(id)
if !ok {
return fmt.Errorf("边缘节点 %d 不存在", id)
}
host := addr.IP.String()
if edge.Host == nil || *edge.Host != host {
edge.Host = &host
EdgeUpdates <- &core.Edge{
Id: edge.Id,
Host: &host,
}
}
return nil
}
func StoreEdge(edge *core.Edge) error {
if edge == nil || edge.Id == 0 || edge.Port == nil {
return fmt.Errorf("无效的边缘节点: %+v", edge)
}
Edges.Store(edge.Id, edge)
Assigns.Store(*edge.Port, edge.Id)
return nil
}
func LoadPermit(port uint16) *core.Permit {
id, ok := Assigns.Load(port)
if !ok {
return nil
}
permit, ok := Permits.Load(id)
if !ok {
return nil
}
return permit
}
func StorePermit(def *core.PermitDef) {
Permits.Store(def.Id, &def.Permit)
}