router: use dns as default router
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		
							
								
								
									
										91
									
								
								router/dns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								router/dns.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| package router | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| // NewRouter returns an initialized dns router | ||||
| func NewRouter(opts ...Option) Router { | ||||
| 	options := NewOptions(opts...) | ||||
| 	return &dns{options} | ||||
| } | ||||
|  | ||||
| type dns struct { | ||||
| 	options Options | ||||
| } | ||||
|  | ||||
| func (d *dns) Init(opts ...Option) error { | ||||
| 	for _, o := range opts { | ||||
| 		o(&d.options) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d *dns) Options() Options { | ||||
| 	return d.options | ||||
| } | ||||
|  | ||||
| func (d *dns) Table() Table { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d *dns) Close() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d *dns) Lookup(opts ...QueryOption) ([]Route, error) { | ||||
| 	options := NewQuery(opts...) | ||||
| 	// check to see if we have the port provided in the service, e.g. go-micro-srv-foo:8000 | ||||
| 	host, port, err := net.SplitHostPort(options.Service) | ||||
| 	if err == nil { | ||||
| 		// lookup the service using A records | ||||
| 		ips, err := net.LookupHost(host) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		p, _ := strconv.Atoi(port) | ||||
|  | ||||
| 		// convert the ip addresses to routes | ||||
| 		result := make([]Route, len(ips)) | ||||
| 		for i, ip := range ips { | ||||
| 			result[i] = Route{ | ||||
| 				Service: options.Service, | ||||
| 				Address: fmt.Sprintf("%s:%d", ip, uint16(p)), | ||||
| 			} | ||||
| 		} | ||||
| 		return result, nil | ||||
| 	} | ||||
|  | ||||
| 	// we didn't get the port so we'll lookup the service using SRV records. If we can't lookup the | ||||
| 	// service using the SRV record, we return the error. | ||||
| 	_, nodes, err := net.LookupSRV(options.Service, "tcp", d.options.Network) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// convert the nodes (net services) to routes | ||||
| 	result := make([]Route, len(nodes)) | ||||
| 	for i, n := range nodes { | ||||
| 		result[i] = Route{ | ||||
| 			Service: options.Service, | ||||
| 			Address: fmt.Sprintf("%s:%d", n.Target, n.Port), | ||||
| 			Network: d.options.Network, | ||||
| 		} | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| func (d *dns) Watch(opts ...WatchOption) (Watcher, error) { | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func (d *dns) Name() string { | ||||
| 	return d.options.Name | ||||
| } | ||||
|  | ||||
| func (d *dns) String() string { | ||||
| 	return "dns" | ||||
| } | ||||
| @@ -7,7 +7,7 @@ import ( | ||||
|  | ||||
| var ( | ||||
| 	// DefaultRouter is the global default router | ||||
| 	DefaultRouter Router | ||||
| 	DefaultRouter Router = NewRouter() | ||||
| 	// DefaultNetwork is default micro network | ||||
| 	DefaultNetwork = "micro" | ||||
| 	// ErrRouteNotFound is returned when no route was found in the routing table | ||||
|   | ||||
		Reference in New Issue
	
	Block a user