package micro import ( "context" "fmt" "git.nspix.com/golang/micro/gateway/rpc" "git.nspix.com/golang/micro/registry" "sync" ) type Client struct { selector *registry.Selector clientLocker sync.RWMutex clients map[string]*rpc.Client } func (c *Client) Do(ctx context.Context, r *Request) (resp Response, err error) { var ( ok bool node *registry.ServiceNode client *rpc.Client ) c.clientLocker.RLock() client, ok = c.clients[r.ServiceName] c.clientLocker.RUnlock() if ok { goto _EXEC } if node, err = c.selector.Select(ctx, r.ServiceName); err != nil { return } client = rpc.NewClient() if err = client.Dialer("tcp", fmt.Sprintf("%s:%d", node.Address, node.Port)); err != nil { return } _EXEC: return client.Do(ctx, rpc.NewRequest(r.Method, r.Body)) } func (c *Client) Close() (err error) { c.clientLocker.Lock() defer c.clientLocker.Unlock() for name, client := range c.clients { _ = client.Close() delete(c.clients, name) } return } func NewClient(reg registry.Registry) *Client { return &Client{ clients: make(map[string]*rpc.Client), selector: registry.NewSelector(reg), } }