2019-01-15 19:50:37 +03:00
|
|
|
package registry
|
2016-05-01 21:31:03 +03:00
|
|
|
|
|
|
|
import (
|
2019-07-08 10:01:42 +03:00
|
|
|
"fmt"
|
2016-05-01 21:31:03 +03:00
|
|
|
"strings"
|
|
|
|
|
2020-04-11 15:02:53 +03:00
|
|
|
"github.com/micro/go-micro/v2/util/mdns"
|
2016-05-01 21:31:03 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
type mdnsWatcher struct {
|
2019-11-06 18:49:40 +03:00
|
|
|
id string
|
2019-01-15 19:50:37 +03:00
|
|
|
wo WatchOptions
|
2016-05-01 21:31:03 +03:00
|
|
|
ch chan *mdns.ServiceEntry
|
|
|
|
exit chan struct{}
|
2019-09-09 15:11:25 +03:00
|
|
|
// the mdns domain
|
|
|
|
domain string
|
2019-11-06 18:49:40 +03:00
|
|
|
// the registry
|
|
|
|
registry *mdnsRegistry
|
2016-05-01 21:31:03 +03:00
|
|
|
}
|
|
|
|
|
2019-01-15 19:50:37 +03:00
|
|
|
func (m *mdnsWatcher) Next() (*Result, error) {
|
2016-05-01 21:31:03 +03:00
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case e := <-m.ch:
|
|
|
|
txt, err := decode(e.InfoFields)
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(txt.Service) == 0 || len(txt.Version) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2018-02-19 20:12:37 +03:00
|
|
|
// Filter watch options
|
|
|
|
// wo.Service: Only keep services we care about
|
|
|
|
if len(m.wo.Service) > 0 && txt.Service != m.wo.Service {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2016-05-01 21:31:03 +03:00
|
|
|
var action string
|
|
|
|
|
|
|
|
if e.TTL == 0 {
|
|
|
|
action = "delete"
|
|
|
|
} else {
|
|
|
|
action = "create"
|
|
|
|
}
|
|
|
|
|
2019-01-15 19:50:37 +03:00
|
|
|
service := &Service{
|
2016-05-01 21:31:03 +03:00
|
|
|
Name: txt.Service,
|
|
|
|
Version: txt.Version,
|
|
|
|
Endpoints: txt.Endpoints,
|
|
|
|
}
|
|
|
|
|
2019-09-09 15:11:25 +03:00
|
|
|
// skip anything without the domain we care about
|
|
|
|
suffix := fmt.Sprintf(".%s.%s.", service.Name, m.domain)
|
|
|
|
if !strings.HasSuffix(e.Name, suffix) {
|
2016-05-01 21:31:03 +03:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2019-01-15 19:50:37 +03:00
|
|
|
service.Nodes = append(service.Nodes, &Node{
|
2019-09-09 15:11:25 +03:00
|
|
|
Id: strings.TrimSuffix(e.Name, suffix),
|
2019-07-08 10:01:42 +03:00
|
|
|
Address: fmt.Sprintf("%s:%d", e.AddrV4.String(), e.Port),
|
2016-05-01 21:31:03 +03:00
|
|
|
Metadata: txt.Metadata,
|
|
|
|
})
|
|
|
|
|
2019-01-15 19:50:37 +03:00
|
|
|
return &Result{
|
2016-05-01 21:31:03 +03:00
|
|
|
Action: action,
|
|
|
|
Service: service,
|
|
|
|
}, nil
|
|
|
|
case <-m.exit:
|
2019-07-01 17:43:50 +03:00
|
|
|
return nil, ErrWatcherStopped
|
2016-05-01 21:31:03 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mdnsWatcher) Stop() {
|
|
|
|
select {
|
|
|
|
case <-m.exit:
|
|
|
|
return
|
|
|
|
default:
|
|
|
|
close(m.exit)
|
2019-11-06 18:49:40 +03:00
|
|
|
// remove self from the registry
|
|
|
|
m.registry.mtx.Lock()
|
|
|
|
delete(m.registry.watchers, m.id)
|
|
|
|
m.registry.mtx.Unlock()
|
2016-05-01 21:31:03 +03:00
|
|
|
}
|
|
|
|
}
|