mirror of
				https://github.com/eolinker/apinto
				synced 2025-10-31 20:12:56 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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)
 | ||
| }
 | 
