manager.go 1.5 KB
Newer Older
E
eoLinker API Management 已提交
1 2 3 4
package discovery

import (
	"sync"
Y
Your Name 已提交
5 6 7

	"github.com/eolinker/goku-api-gateway/config"
	log "github.com/eolinker/goku-api-gateway/goku-log"
E
eoLinker API Management 已提交
8 9
)

Y
Your Name 已提交
10 11 12
var manager = &Manager{
	locker:  sync.RWMutex{},
	sources: make(map[string]ISource),
E
eoLinker API Management 已提交
13 14
}

Y
Your Name 已提交
15
//Manager manager
E
eoLinker API Management 已提交
16 17 18 19 20 21
type Manager struct {
	locker sync.RWMutex

	sources map[string]ISource
}

Y
Your Name 已提交
22 23
//ResetAllServiceConfig resetAllServiceConfig
func ResetAllServiceConfig(confs map[string]*config.DiscoverConfig) {
E
eoLinker API Management 已提交
24

Y
Your Name 已提交
25
	sources := make(map[string]ISource)
E
eoLinker API Management 已提交
26
	manager.locker.RLock()
Y
Your Name 已提交
27
	oldSources := manager.sources
E
eoLinker API Management 已提交
28
	manager.locker.RUnlock()
Y
Your Name 已提交
29
	for _, conf := range confs {
E
eoLinker API Management 已提交
30 31

		name := conf.Name
Y
Your Name 已提交
32 33
		s, has := oldSources[name]
		if has && !s.CheckDriver(conf.Driver) {
E
eoLinker API Management 已提交
34
			// 如果驱动不一样,关闭旧的
Y
Your Name 已提交
35 36 37 38
			has = false
			s.Close()
			s = nil
			delete(oldSources, name)
E
eoLinker API Management 已提交
39
		}
Y
Your Name 已提交
40 41 42 43 44
		if !has {
			driverName := conf.Driver
			driver, has := drivers[driverName]
			if !has {
				log.Error("invalid driver:", driverName)
E
eoLinker API Management 已提交
45 46
				continue
			}
Y
Your Name 已提交
47 48
			ns, err := driver.Open(name, conf.Config)
			if err != nil {
E
eoLinker API Management 已提交
49 50
				continue
			}
Y
Your Name 已提交
51
			s = ns
E
eoLinker API Management 已提交
52 53
		}

Y
Your Name 已提交
54
		sources[name] = s
Y
Your Name 已提交
55
		s.SetHealthConfig(conf.HealthCheck)
E
eoLinker API Management 已提交
56

Y
Your Name 已提交
57
		err := s.SetDriverConfig(conf.Config)
E
eoLinker API Management 已提交
58

Y
Your Name 已提交
59
		if err != nil {
E
eoLinker API Management 已提交
60 61 62 63
			continue
		}
	}

Y
Your Name 已提交
64 65
	for name, s := range oldSources {
		if _, has := sources[name]; !has {
E
eoLinker API Management 已提交
66 67 68 69 70 71 72 73 74
			s.Close()
		}
	}

	manager.locker.Lock()
	manager.sources = sources
	manager.locker.Unlock()
}

Y
Your Name 已提交
75
//GetDiscoverer getDiscoverer
Y
Your Name 已提交
76
func GetDiscoverer(discoveryName string) (ISource, bool) {
E
eoLinker API Management 已提交
77
	manager.locker.RLock()
Y
Your Name 已提交
78
	s, has := manager.sources[discoveryName]
E
eoLinker API Management 已提交
79
	manager.locker.RUnlock()
Y
Your Name 已提交
80 81
	return s, has
}