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

  • 相关阅读:
    HTTPS
    数字签名与数字证书
    oracle 10g 数据库与客户端冲突导致实例创建无监听问题
    javascript正则表达式提取子匹配项
    设计模式的分类
    【2020第一篇】环境问题基础知识
    【致 2020】2020
    【python】写demo 的时候,pycharm 编辑器总是提示"method XX may be static"
    sql 练习题 (二)
    【python项目】json 和dict 的区别
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/13853729.html
Copyright © 2020-2023  润新知