企业视频远程通话会议系统EasyRTC如何将Golang程序修改为服务程序?

在 EasyRTC 的开发过程中,需要将程序做成服务程序。以服务运行的程序和普通进程运行的程序不同。服务可以在配置中配置运行失败则自动运行程序,开机运行等功能。

RTC1.png

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.png

EasyRTC一直致力于技术突破,降低音视频传输过程中的时延协助客户完成场景落地。目前,RTC的技术已经被使用到应急消防、警用应急指挥、远程作业等场景当中,未来也将拓宽更多的运用场景。

猜你喜欢

转载自blog.csdn.net/TsingSee/article/details/109032348