企業視訊遠端通話會議系統EasyRTC如何將Golang程式修改為服務程式?
阿新 • • 發佈:2020-10-21
在 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的技術已經被使用到應急消防、警用應急指揮、遠端作業等場景當中,未來也將拓寬更多的運用場景。