12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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),
- }
- }
|