main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package main
  2. import (
  3. "bytes"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "os"
  8. "os/exec"
  9. "runtime"
  10. "strings"
  11. "syscall"
  12. "time"
  13. "config-server/bus"
  14. "config-server/conf"
  15. "config-server/log"
  16. "go.uber.org/dig"
  17. "infish.cn/comm"
  18. )
  19. var confFile = flag.String("conf", "./app.yaml", "conf file")
  20. func StarProcc(dir string, name string, env []string, arg ...string) error {
  21. cmd := exec.Command(name, arg...)
  22. cmd.Dir = dir
  23. cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
  24. if len(env) > 0 {
  25. cmd.Env = env
  26. }
  27. var stdoutBuf, stderrBuf bytes.Buffer
  28. stdoutIn, _ := cmd.StdoutPipe()
  29. stderrIn, _ := cmd.StderrPipe()
  30. // var errStdout, errStderr error
  31. stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
  32. stderr := io.MultiWriter(os.Stderr, &stderrBuf)
  33. go func() {
  34. io.Copy(stdout, stdoutIn)
  35. }()
  36. go func() {
  37. io.Copy(stderr, stderrIn)
  38. }()
  39. err := cmd.Start()
  40. if err != nil {
  41. fmt.Println(err)
  42. return err
  43. }
  44. fmt.Println(cmd.Process)
  45. // timout := time.After(time.Second * 5)
  46. // select {
  47. // case
  48. // case timoutTime := <-timout:
  49. // fmt.Println("started timenout", timoutTime)
  50. // return nil
  51. // }
  52. time.Sleep(2 * time.Second)
  53. fmt.Println("process status after 3 second ", cmd.ProcessState.ExitCode())
  54. return nil
  55. }
  56. func BuildApp() *dig.Container {
  57. app := dig.New()
  58. _ = app.Provide(func() (*conf.AppConf, error) {
  59. return conf.NewAppConf(*confFile)
  60. })
  61. _ = app.Provide(bus.NewNatsBus)
  62. return app
  63. }
  64. func main() {
  65. flag.Parse()
  66. app := BuildApp()
  67. fmt.Println(runtime.GOOS)
  68. fmt.Println(runtime.GOARCH)
  69. //启动nats
  70. err := app.Invoke(func(config *conf.AppConf) error {
  71. conf.AppConfig = config
  72. fmt.Println("nats config...", config.StartLocalNats, config.StartNatsPort, config.StartNatsShellParams)
  73. if !config.StartLocalNats { //是否启动nats
  74. return nil
  75. }
  76. envs := []string{}
  77. params := strings.Split(config.StartNatsShellParams, " ")
  78. wk := fmt.Sprintf("bin/v2.9.0/%s-%s", runtime.GOOS, runtime.GOARCH)
  79. fmt.Println("starting nats-server...", wk)
  80. err := StarProcc(wk, "./nats-server", envs, params...)
  81. if err != nil {
  82. return err
  83. }
  84. url := fmt.Sprintf("nats://127.0.0.1:%d", config.StartNatsPort)
  85. fmt.Println("started nats=>", url)
  86. return nil
  87. })
  88. if err != nil {
  89. log.Errorf("the nats service start fail %+v", err)
  90. panic(err)
  91. }
  92. if conf.AppConfig.StartLocalNats { //启动configer服务
  93. conf.AppConfig.Nats.Url = fmt.Sprintf("nats://127.0.0.1:%d", conf.AppConfig.StartNatsPort)
  94. }
  95. err = app.Invoke(func(config *conf.AppConf, nats *comm.NatsBus, adapters map[string]*comm.NatsBus) error {
  96. for _, remote := range adapters {
  97. if remote != nil {
  98. go remote.Run(nil)
  99. }
  100. }
  101. nats.Run(nil)
  102. return nil
  103. })
  104. if err != nil {
  105. log.Errorf("the configer service quit fail %+v", err)
  106. panic(err)
  107. }
  108. }