在 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的技术已经被使用到应急消防、警用应急指挥、远程作业等场景当中,未来也将拓宽更多的运用场景。