clientmgr.go 957 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package client
  2. import (
  3. "bet24.com/log"
  4. "github.com/smallnest/rpcx/client"
  5. _ "github.com/smallnest/rpcx/protocol"
  6. "sync"
  7. )
  8. type clientmgr struct {
  9. clients map[string]client.XClient
  10. lock *sync.RWMutex
  11. }
  12. var mgr *clientmgr
  13. func getClientMgr() *clientmgr {
  14. if mgr == nil {
  15. mgr = new(clientmgr)
  16. mgr.ctor()
  17. }
  18. return mgr
  19. }
  20. func (cm *clientmgr) ctor() {
  21. cm.clients = make(map[string]client.XClient)
  22. cm.lock = &sync.RWMutex{}
  23. }
  24. func (cm *clientmgr) getClient(addr string) client.XClient {
  25. cm.lock.RLock()
  26. ret, ok := cm.clients[addr]
  27. cm.lock.RUnlock()
  28. if !ok || ret == nil {
  29. ret = openConnection(addr)
  30. }
  31. cm.lock.Lock()
  32. cm.clients[addr] = ret
  33. cm.lock.Unlock()
  34. return ret
  35. }
  36. func openConnection(addr string) client.XClient {
  37. log.Debug("openConnection %s", addr)
  38. d, _ := client.NewPeer2PeerDiscovery(addr, "")
  39. _xclient := client.NewXClient("Server", client.Failtry, client.RandomSelect, d, client.DefaultOption)
  40. return _xclient
  41. }