2018-03-14 14:12:26 +08:00
|
|
|
// Copyright (C) 2014-2018 Goodrain Co., Ltd.
|
2017-11-07 11:40:44 +08:00
|
|
|
// RAINBOND, Application Management Platform
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version. For any non-GPL usage of Rainbond,
|
|
|
|
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
|
|
|
|
// must be obtained first.
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package discover
|
|
|
|
|
|
|
|
import (
|
2019-12-24 22:41:19 +08:00
|
|
|
"errors"
|
2018-03-07 10:28:13 +08:00
|
|
|
"sync"
|
|
|
|
|
2018-04-24 16:44:59 +08:00
|
|
|
"github.com/goodrain/rainbond/api/proxy"
|
|
|
|
corediscover "github.com/goodrain/rainbond/discover"
|
|
|
|
corediscoverconfig "github.com/goodrain/rainbond/discover/config"
|
2019-12-24 22:41:19 +08:00
|
|
|
etcdutil "github.com/goodrain/rainbond/util/etcd"
|
2017-11-07 11:40:44 +08:00
|
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
//EndpointDiscover 后端服务自动发现
|
|
|
|
type EndpointDiscover interface {
|
|
|
|
AddProject(name string, proxy proxy.Proxy)
|
|
|
|
Remove(name string)
|
|
|
|
Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
var defaultEndpointDiscover EndpointDiscover
|
|
|
|
|
|
|
|
//CreateEndpointDiscover create endpoint discover
|
2019-12-24 22:41:19 +08:00
|
|
|
func CreateEndpointDiscover(etcdClientArgs *etcdutil.ClientArgs) (EndpointDiscover, error) {
|
2017-11-07 11:40:44 +08:00
|
|
|
if defaultEndpointDiscover == nil {
|
2019-12-24 22:41:19 +08:00
|
|
|
if etcdClientArgs == nil {
|
|
|
|
return nil, errors.New("etcd args is nil")
|
|
|
|
}
|
|
|
|
dis, err := corediscover.GetDiscover(corediscoverconfig.DiscoverConfig{EtcdClientArgs: etcdClientArgs})
|
2017-11-07 11:40:44 +08:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defaultEndpointDiscover = &endpointDiscover{
|
|
|
|
dis: dis,
|
2018-06-09 14:45:50 +08:00
|
|
|
projects: make(map[string]*defalt),
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return defaultEndpointDiscover, nil
|
|
|
|
}
|
|
|
|
|
2019-12-04 11:00:14 +08:00
|
|
|
//GetEndpointDiscover get endpoints discover
|
|
|
|
func GetEndpointDiscover() EndpointDiscover {
|
2017-11-07 11:40:44 +08:00
|
|
|
return defaultEndpointDiscover
|
|
|
|
}
|
|
|
|
|
|
|
|
type endpointDiscover struct {
|
2018-06-09 14:45:50 +08:00
|
|
|
projects map[string]*defalt
|
2017-11-07 11:40:44 +08:00
|
|
|
lock sync.Mutex
|
|
|
|
dis corediscover.Discover
|
|
|
|
}
|
|
|
|
|
2018-06-09 14:45:50 +08:00
|
|
|
func (e *endpointDiscover) AddProject(name string, pro proxy.Proxy) {
|
2017-11-07 11:40:44 +08:00
|
|
|
e.lock.Lock()
|
|
|
|
defer e.lock.Unlock()
|
2018-06-09 14:45:50 +08:00
|
|
|
if def, ok := e.projects[name]; !ok {
|
|
|
|
e.projects[name] = &defalt{name: name, proxys: []proxy.Proxy{pro}}
|
|
|
|
e.dis.AddProject(name, e.projects[name])
|
|
|
|
} else {
|
|
|
|
def.proxys = append(def.proxys, pro)
|
2019-12-11 13:13:11 +08:00
|
|
|
// add proxy after update endpoint first,must initialize endpoint by cache data
|
|
|
|
if len(def.cacheEndpointURL) > 0 {
|
|
|
|
pro.UpdateEndpoints(def.cacheEndpointURL...)
|
|
|
|
}
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
2018-06-09 14:45:50 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
|
|
|
func (e *endpointDiscover) Remove(name string) {
|
|
|
|
e.lock.Lock()
|
|
|
|
defer e.lock.Unlock()
|
|
|
|
if _, ok := e.projects[name]; ok {
|
|
|
|
delete(e.projects, name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func (e *endpointDiscover) Stop() {
|
|
|
|
e.dis.Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
type defalt struct {
|
2019-12-11 13:13:11 +08:00
|
|
|
name string
|
|
|
|
proxys []proxy.Proxy
|
|
|
|
cacheEndpointURL []string
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (e *defalt) Error(err error) {
|
|
|
|
logrus.Errorf("%s project auto discover occurred error.%s", e.name, err.Error())
|
|
|
|
defaultEndpointDiscover.Remove(e.name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *defalt) UpdateEndpoints(endpoints ...*corediscoverconfig.Endpoint) {
|
|
|
|
var endStr []string
|
|
|
|
for _, end := range endpoints {
|
|
|
|
if end.URL != "" {
|
2019-02-12 15:40:42 +08:00
|
|
|
endStr = append(endStr, end.Name+"=>"+end.URL)
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
logrus.Debugf("endstr is %v, name is %v", endStr, e.name)
|
2018-06-09 14:45:50 +08:00
|
|
|
for _, p := range e.proxys {
|
|
|
|
p.UpdateEndpoints(endStr...)
|
|
|
|
}
|
2019-12-11 13:13:11 +08:00
|
|
|
e.cacheEndpointURL = endStr
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//when watch occurred error,will exec this method
|
|
|
|
func (e *endpointDiscover) Error(err error) {
|
2018-06-09 14:45:50 +08:00
|
|
|
logrus.Errorf("discover error %s", err.Error())
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|