Files
apinto/router/router-http/manager.go
2021-11-05 11:50:53 +08:00

151 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package router_http
import (
"crypto/tls"
"errors"
"sync"
"github.com/eolinker/eosc/config"
"github.com/eolinker/eosc/log"
traffic_http_fast "github.com/eolinker/eosc/traffic/traffic-http-fast"
"github.com/eolinker/eosc/common/bean"
"github.com/eolinker/eosc/traffic"
)
var _ iManager = (*Manager)(nil)
var (
errorCertificateNotExit = errors.New("not exist cert")
)
type iManager interface {
Add(port int, id string, config *Config) error
Del(port int, id string) error
Cancel()
}
var manager iManager
func init() {
var tf traffic.ITraffic
var cfg *config.ListensMsg
bean.Autowired(&tf)
bean.Autowired(&cfg)
bean.AddInitializingBeanFunc(func() {
log.Debug("init router manager")
manager = NewManager(tf, cfg)
})
}
//Manager 路由管理器结构体
type Manager struct {
locker sync.Mutex
routers IRouters
tf traffic_http_fast.IHttpTraffic
}
//Cancel 关闭路由管理器
func (m *Manager) Cancel() {
m.locker.Lock()
defer m.locker.Unlock()
m.tf.Close()
m.tf = nil
}
//NewManager 创建路由管理器
func NewManager(tf traffic.ITraffic, listenCfg *config.ListensMsg) *Manager {
log.Debug("new router manager")
m := &Manager{
routers: NewRouters(),
tf: traffic_http_fast.NewHttpTraffic(tf),
locker: sync.Mutex{},
}
for _, cfg := range listenCfg.Listens {
port := int(cfg.Port)
l, err := tf.ListenTcp("", port)
if err != nil {
log.Warn("worker listen tcp error:", err)
continue
}
if cfg.Scheme == "https" {
cert, err := config.NewCert(cfg.Certificate, listenCfg.Dir)
if err != nil {
log.Warn("worker create certificate error:", err)
continue
}
m.tf.Set(port, traffic_http_fast.NewHttpService(tls.NewListener(l, &tls.Config{GetCertificate: cert.GetCertificate})))
continue
}
m.tf.Set(port, traffic_http_fast.NewHttpService(l))
}
return m
}
//Add 新增路由配置到路由管理器中
func (m *Manager) Add(port int, id string, config *Config) error {
m.locker.Lock()
defer m.locker.Unlock()
if port == 0 {
srv := m.tf.All()
for p, s := range srv {
router, _, err := m.routers.Set(p, id, config)
if err != nil {
return err
}
s.Set(router.Handler)
}
return nil
}
router, _, err := m.routers.Set(port, id, config)
if err != nil {
return err
}
service, has := m.tf.Get(port)
if !has {
log.Debug("not has port")
return nil
}
service.Set(router.Handler)
return nil
}
//Del 将某个路由配置从路由管理器中删去
func (m *Manager) Del(port int, id string) error {
m.locker.Lock()
defer m.locker.Unlock()
if r, has := m.routers.Del(port, id); has {
//若目标端口的http服务器已无路由配置则关闭服务器及listener
count := r.Count()
log.Debug("after delete router,count of port:", port, " count:", count)
//if count == 0 {
// m.tf.ShutDown(port)
//} else if env.IsDebug() {
//
//}
}
return nil
}
//Add 将路由配置加入到路由管理器
func Add(port int, id string, config *Config) error {
return manager.Add(port, id, config)
}
//Del 将路由配置从路由管理器中删去
func Del(port int, id string) error {
return manager.Del(port, id)
}