main.go 2.6 KB

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