discoverypool.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package common
  2. import (
  3. "bet24.com/log"
  4. cclient "github.com/rpcxio/rpcx-consul/client"
  5. "github.com/smallnest/rpcx/client"
  6. //"runtime/debug"
  7. "sync"
  8. )
  9. type discoveryinfo struct {
  10. discovery client.ServiceDiscovery
  11. //plugin client.Plugin
  12. }
  13. type discoverypool struct {
  14. clients map[string]*discoveryinfo
  15. lock *sync.RWMutex
  16. }
  17. var discovery_mgr *discoverypool
  18. func getDiscoveryMgr() *discoverypool {
  19. if discovery_mgr == nil {
  20. discovery_mgr = new(discoverypool)
  21. discovery_mgr.ctor()
  22. }
  23. return discovery_mgr
  24. }
  25. func getDiscovery(serviceName string, consulAddr string) client.ServiceDiscovery {
  26. ret := getDiscoveryMgr().getDiscovery(serviceName, consulAddr)
  27. if ret == nil {
  28. return nil
  29. }
  30. return ret.discovery
  31. }
  32. func (dm *discoverypool) ctor() {
  33. dm.clients = make(map[string]*discoveryinfo)
  34. dm.lock = &sync.RWMutex{}
  35. }
  36. func (dm *discoverypool) getDiscovery(serviceName string, consulAddr string) *discoveryinfo {
  37. dm.lock.Lock()
  38. defer dm.lock.Unlock()
  39. ret, ok := dm.clients[serviceName]
  40. if !ok || ret == nil {
  41. ret = dm.openConnection(serviceName, consulAddr)
  42. dm.clients[serviceName] = ret
  43. }
  44. return ret
  45. }
  46. func (dm *discoverypool) openConnection(serviceName, consulAddr string) *discoveryinfo {
  47. d, err := cclient.NewConsulDiscovery(Service_base_path, serviceName, []string{consulAddr}, nil)
  48. if err != nil {
  49. if d != nil {
  50. d.Close()
  51. }
  52. log.Release("discoverypool.openConnection [%s] [%s] failed", serviceName, consulAddr)
  53. return nil
  54. }
  55. log.Debug("discoverypool openConnection %s", serviceName)
  56. //log.Debug("%s", debug.Stack())
  57. return &discoveryinfo{discovery: d}
  58. }