main.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "os"
  7. "os/exec"
  8. "time"
  9. "bet24.com/log"
  10. "bet24.com/servers/micros/common"
  11. "bet24.com/utils"
  12. "github.com/smallnest/rpcx/client"
  13. )
  14. var consulAddr = common.Default_Consul_Addr
  15. func getClient(servcieName string) client.XClient {
  16. return common.GetClientPool().GetClient(servcieName, consulAddr)
  17. }
  18. type serviceInfo struct {
  19. Name string
  20. Exe string
  21. FailCount int
  22. }
  23. func (si *serviceInfo) getExecuteFile() string {
  24. if si.Exe == "" {
  25. return si.Name
  26. }
  27. return si.Exe
  28. }
  29. var services []serviceInfo
  30. const max_failed_count = 2
  31. func waitInput() {
  32. for {
  33. var endInput string
  34. fmt.Scanln(&endInput)
  35. switch endInput {
  36. case "list":
  37. dumpServices()
  38. default:
  39. log.Release("unknown command")
  40. }
  41. }
  42. }
  43. func dumpServices() {
  44. log.Release("listing services")
  45. for _, v := range services {
  46. log.Release(" %s:[%s][%d]", v.Name, v.Exe, v.FailCount)
  47. }
  48. log.Release("")
  49. }
  50. func tryRestart(exe string) {
  51. cmd := exec.Command("cmd.exe", "/c", fmt.Sprintf("start cmd.exe /k %v", exe))
  52. cmd.Start()
  53. }
  54. func loadServices() {
  55. data, err := os.ReadFile("serviceconf/monitor.json")
  56. if err != nil {
  57. log.Debug("read config failed %v", err)
  58. time.AfterFunc(time.Second*10, loadServices)
  59. return
  60. }
  61. err = json.Unmarshal(data, &services)
  62. if err != nil {
  63. log.Debug("Unmarshal config failed err:%v", err)
  64. time.AfterFunc(time.Second*10, loadServices)
  65. return
  66. }
  67. time.AfterFunc(time.Second*600, loadServices)
  68. }
  69. type Request struct {
  70. Name string
  71. }
  72. type Response struct {
  73. Data string
  74. }
  75. func sayHelloToService(si *serviceInfo) {
  76. xclient := getClient(si.Name)
  77. args := &Request{
  78. Name: si.Name,
  79. }
  80. reply := &Response{}
  81. err := xclient.Call(context.Background(), "SayHello", args, reply)
  82. if err != nil {
  83. log.Debug("failed to call service[%s]: %v", si.Name, err)
  84. common.GetClientPool().RemoveClient(si.Name)
  85. // 重启服务
  86. //exe := addFailCount(serviceName)
  87. si.FailCount++
  88. if si.FailCount >= max_failed_count {
  89. log.Release("service[%s] dead,try to restart", si.Name)
  90. si.FailCount = 0
  91. tryRestart(si.getExecuteFile())
  92. }
  93. } else {
  94. si.FailCount = 0
  95. }
  96. }
  97. func checkAllServices() {
  98. time.AfterFunc(time.Second*10, checkAllServices)
  99. for k := range services {
  100. sayHelloToService(&services[k])
  101. }
  102. }
  103. func main() {
  104. defer waitInput()
  105. // 读取配置
  106. loadServices()
  107. utils.SetConsoleTitle(fmt.Sprintf("MicroMonitor0 %d services", len(services)))
  108. checkAllServices()
  109. }