Service.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. @Time : 2020/9/7 19:51
  3. @Author : xuhanlin
  4. @File : Service.go
  5. @Description : 服务管理器
  6. */
  7. package service
  8. import (
  9. log "Server-Core/Server/Base/Log"
  10. "errors"
  11. "sync"
  12. )
  13. var m *mgr
  14. type context struct {
  15. name string
  16. args []interface{}
  17. ch chan Msg
  18. h Handler
  19. }
  20. type mgr struct {
  21. serviceByName map[string]*context
  22. wg sync.WaitGroup
  23. }
  24. func Init() error {
  25. m = new(mgr)
  26. m.serviceByName = make(map[string]*context)
  27. return nil
  28. }
  29. func UnInit() {
  30. for _, v := range m.serviceByName {
  31. v.h.UnInit()
  32. close(v.ch)
  33. }
  34. m.wg.Wait()
  35. m.serviceByName = make(map[string]*context)
  36. }
  37. func Run() {
  38. for _, v := range m.serviceByName {
  39. if v.h.Status() == false {
  40. log.Warn("重启服务 name:%s", v.name)
  41. v.h.Init(v.ch, &m.wg, v.args...)
  42. go v.h.Run()
  43. m.wg.Add(1)
  44. }
  45. }
  46. }
  47. func Register(name string, h Handler, args ...interface{}) error {
  48. _, ok := m.serviceByName[name]
  49. if ok {
  50. return errors.New("服务已注册: " + name)
  51. }
  52. c := new(context)
  53. c.name = name
  54. c.ch = make(chan Msg, 1000)
  55. c.h = h
  56. c.args = args
  57. err := h.Init(c.ch, &m.wg, c.args...)
  58. if err != nil {
  59. return err
  60. }
  61. go h.Run()
  62. m.serviceByName[name] = c
  63. m.wg.Add(1)
  64. return nil
  65. }
  66. func Send(name string, cmd string, args ...interface{}) {
  67. c, ok := m.serviceByName[name]
  68. if !ok {
  69. log.Warn("服务未注册name:%s", c.name)
  70. }
  71. var msg Msg
  72. msg.Cmd = cmd
  73. msg.Args = args
  74. c.ch <- msg
  75. if len(c.ch) > int(float64(cap(c.ch))*0.8) {
  76. log.Warn("服务负载过高name:%s,total:%d,cur:%d")
  77. }
  78. }
  79. func Call(name string, cmd string, args ...interface{}) ([]interface{}, error) {
  80. c, ok := m.serviceByName[name]
  81. if !ok {
  82. return []interface{}{}, errors.New("服务未注册: " + name)
  83. }
  84. done := make(chan []interface{})
  85. var msg Msg
  86. msg.Cmd = cmd
  87. msg.Args = args
  88. msg.Sync = true
  89. msg.Done = done
  90. c.ch <- msg
  91. if len(c.ch) > int(float64(cap(c.ch))*0.8) {
  92. log.Warn("服务负载过高name:%s,total:%d,cur:%d")
  93. }
  94. ret := <-done
  95. close(msg.Done)
  96. return ret, nil
  97. }