1. 程式人生 > 實用技巧 >企業視訊遠端通話會議系統EasyRTC如何將Golang程式修改為服務程式?

企業視訊遠端通話會議系統EasyRTC如何將Golang程式修改為服務程式?

在 EasyRTC 的開發過程中,需要將程式做成服務程式。以服務執行的程式和普通程序執行的程式不同。服務可以在配置中配置執行失敗則自動執行程式,開機執行等功能。

Golang已經有現成的第三方庫,可以直接做成服務。

官方網址為:https://github.com/kardianos/service

具體程式碼如下:

type program struct{}

func (p *program) Start(s service.Service) error {
   // Start should not block. Do the actual work async.
   go p.run()
   return nil
}
func (p *program) run() {
   logger := conf.GetLogger()
   logger.Info("執行中啊啊啊")
   r := router.InitRouter()
   r.Run("0.0.0.0:1413")
}
func (p *program) Stop(s service.Service) error {
   // Stop should not block. Return with a few seconds.
   return nil
}

func main() {
   cfg := conf.GetConfig()
   svcConfig := &service.Config{
      //Name:        cfg.ServiceName,
      Name:        "Test",
      DisplayName: cfg.ServiceDisplayName,
      Description: "測試服務程式",
   }

   prg := &program{}
   s, err := service.New(prg, svcConfig)
   if err != nil {
      fmt.Println("new error", err)
   }

   // 如果以命令列引數執行,安裝和解除安裝服務
   if len(os.Args) > 1 {
      if err = service.Control(s, os.Args[1]); err != nil {
         fmt.Println("執行失敗", err)
         return
      }
      fmt.Println("執行成功", os.Args[1])
      return
   }

   err = s.Run()
   if err != nil {
      fmt.Println("run error", err)
   }
}

其中 program 需要實現 Start(s server.Service) 和 Stop(s server.Service) 方法,這兩個函式都要求是非阻塞的。

以下程式碼是以服務執行的一些操作:

// 如果以命令列引數執行,安裝和解除安裝服務
if len(os.Args) > 1 {
   if err = service.Control(s, os.Args[1]); err != nil {
      fmt.Println("執行失敗", err)
      return
   }
   fmt.Println("執行成功", os.Args[1])
   return
}

當生成 testService,exe 後,可以按照以下命令生成服務:

安裝服務 testService.exe install
執行服務 testService.exe start
停止服務 testService.exe stop
重啟服務 testService.exe restart
解除安裝服務 testService.exe uninstall

因為服務為 Windows 本身的功能,有時候雖然程式以程序的方式可以正常執行,但是以服務的方式執行會出現錯誤,這點需要在程式設計過程中需要注意的。

本文只是純粹跟大家分享下技術上的內容,所以也歡迎大家跟跟我們探討。EasyRTC的版本最近進行了更新,研發了SFU版本和MCU版本,大家可以參考本文了解一下:

MCU版與SFU版在行業應用場景上有什麼不同

EasyRTC一直致力於技術突破,降低音視訊傳輸過程中的時延協助客戶完成場景落地。目前,RTC的技術已經被使用到應急消防、警用應急指揮、遠端作業等場景當中,未來也將拓寬更多的運用場景。