commit 37d283e66f54d80ff84c37632585ed735df9213a Author: Asim Aslam Date: Mon Aug 17 22:44:45 2020 +0100 cleanup client/selector/lookup (#1937) * cleanup client/selector/lookup * add mdns router, remove registry from client * fix roundtripper * remove comment * fix compile issue * fix mucp test * fix api router diff --git a/mdns.go b/mdns.go new file mode 100644 index 0000000..c5812a2 --- /dev/null +++ b/mdns.go @@ -0,0 +1,117 @@ +// Package mdns is an mdns router +package mdns + +import ( + "fmt" + "net" + "strconv" + "time" + + "github.com/micro/go-micro/v3/router" + "github.com/micro/go-micro/v3/util/mdns" +) + +// NewRouter returns an initialized dns router +func NewRouter(opts ...router.Option) router.Router { + options := router.DefaultOptions() + for _, o := range opts { + o(&options) + } + if len(options.Network) == 0 { + options.Network = "micro" + } + return &mdnsRouter{options} +} + +type mdnsRouter struct { + options router.Options +} + +func (m *mdnsRouter) Init(opts ...router.Option) error { + for _, o := range opts { + o(&m.options) + } + return nil +} + +func (m *mdnsRouter) Options() router.Options { + return m.options +} + +func (m *mdnsRouter) Table() router.Table { + return nil +} + +func (m *mdnsRouter) Lookup(opts ...router.QueryOption) ([]router.Route, error) { + options := router.NewQuery(opts...) + + // check to see if we have the port provided in the service, e.g. go-micro-srv-foo:8000 + service, port, err := net.SplitHostPort(options.Service) + if err != nil { + service = options.Service + } + + // query for the host + entries := make(chan *mdns.ServiceEntry) + + p := mdns.DefaultParams(service) + p.Timeout = time.Millisecond * 100 + p.Entries = entries + + // check if we're using our own network + if len(options.Network) > 0 { + p.Domain = options.Network + } + + // do the query + if err := mdns.Query(p); err != nil { + return nil, err + } + + var routes []router.Route + + // compose the routes based on the entries + for e := range entries { + addr := e.Host + // prefer ipv4 addrs + if len(e.AddrV4) > 0 { + addr = e.AddrV4.String() + // else use ipv6 + } else if len(e.AddrV6) > 0 { + addr = "[" + e.AddrV6.String() + "]" + } else if len(addr) == 0 { + continue + } + + pt := 443 + + if e.Port > 0 { + pt = e.Port + } + + // set the port + if len(port) > 0 { + pt, _ = strconv.Atoi(port) + } + + routes = append(routes, router.Route{ + Service: service, + Address: fmt.Sprintf("%s:%d", addr, pt), + Network: p.Domain, + }) + } + + return routes, nil +} + +func (m *mdnsRouter) Watch(opts ...router.WatchOption) (router.Watcher, error) { + return nil, nil +} + +func (m *mdnsRouter) Close() error { + return nil +} + +func (m *mdnsRouter) String() string { + return "mdns" +}