文档章节

golang以服务方式运行

Minho
 Minho
发布于 2016/07/13 09:23
字数 725
阅读 1641
收藏 12

golang开发的二进制程序,一般需要长期后台运行的,在linux上可以用supervisor或upstart或systemd等第三方守护进程来实现。其实golang自己也可以实现以服务的形式常驻后台。

需要的库

https://github.com/kardianos/service

这个库里面有两个接口定义,一个是:

type Service interface {
	// Run should be called shortly after the program entry point.
	// After Interface.Stop has finished running, Run will stop blocking.
	// After Run stops blocking, the program must exit shortly after.
	Run() error

	// Start signals to the OS service manager the given service should start.
	Start() error

	// Stop signals to the OS service manager the given service should stop.
	Stop() error

	// Restart signals to the OS service manager the given service should stop then start.
	Restart() error

	// Install setups up the given service in the OS service manager. This may require
	// greater rights. Will return an error if it is already installed.
	Install() error

	// Uninstall removes the given service from the OS service manager. This may require
	// greater rights. Will return an error if the service is not present.
	Uninstall() error

	// Opens and returns a system logger. If the user program is running
	// interactively rather then as a service, the returned logger will write to
	// os.Stderr. If errs is non-nil errors will be sent on errs as well as
	// returned from Logger's functions.
	Logger(errs chan<- error) (Logger, error)

	// SystemLogger opens and returns a system logger. If errs is non-nil errors
	// will be sent on errs as well as returned from Logger's functions.
	SystemLogger(errs chan<- error) (Logger, error)

	// String displays the name of the service. The display name if present,
	// otherwise the name.
	String() string
}

这个接口比较复杂,需要完全实现接口中的方法,还有一个比较简单的接口定义:

type Interface interface {
	// Start provides a place to initiate the service. The service doesn't not
	// signal a completed start until after this function returns, so the
	// Start function must not take more then a few seconds at most.
	Start(s Service) error

	// Stop provides a place to clean up program execution before it is terminated.
	// It should not take more then a few seconds to execute.
	// Stop should not call os.Exit directly in the function.
	Stop(s Service) error
}

只需要实现Start和Stop接口就行了。

一个简单的服务实例:

type program struct{}
func (p *program) Start(s service.Service) error {
    log.Println("开始服务")
    go p.run()
    return nil
}
func (p *program) Stop(s service.Service) error {
    log.Println("停止服务")
    return nil
}
func (p *program) run() {
    // 这里放置程序要执行的代码……
}

之后再main方法中实现服务初始化:

func main(){
    //服务的配置信息
    cfg := &service.Config{
        Name:        "simple",
        DisplayName: "a simple service",
        Description: "This is an example Go service.",
    }
    // Interface 接口
    prg := &program{}
    // 构建服务对象
    s, err := service.New(prg, cfg)
    if err != nil {
        log.Fatal(err)
    }
    // logger 用于记录系统日志
    logger, err := s.Logger(nil)
    if err != nil {
        log.Fatal(err)
    }
    if len(os.Args) == 2 { //如果有命令则执行
        err = service.Control(s, os.Args[1])
        if err != nil {
            log.Fatal(err)
        }
    } else { //否则说明是方法启动了
        err = s.Run()
        if err != nil {
            logger.Error(err)
        }
    }
    if err != nil {
        logger.Error(err)
    }
}

使用这以下参数 startstoprestartinstalluninstall 可用于操作服务
如 :

simple  install   -- 安装服务
simple  start     -- 启动服务
simple  stop     -- 停止服务

 

© 著作权归作者所有

Minho
粉丝 25
博文 53
码字总数 31501
作品 3
青岛
程序员
私信 提问
加载中

评论(2)

星00恋
星00恋
服务挂掉的时候,能自动重启么?
张金富
张金富
nssm也不错 https://nssm.cc
Golang开发支持平滑升级(优雅重启)的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势...

一曲
2016/12/15
183
0
基于Golang的IP地址信息查询服务

https://github.com/miraclesu/ipip 工作中经常会有通过IP匹配用户信息的需求,如确定用户所在的地区(国家/省份/城市)、运营商、时区、经纬度等等。前一阵有个Golang开发的项目也有这样的需...

mickelfeng
2017/11/22
0
0
golang在阿里开源容器项目Pouch中的应用实践

傅伟(聿歌):阿里巴巴高级研发工程师。热衷golang ,目前负责研发阿里巴巴开源容器 PouchContainer 项目的建设。 前言 可测试的功能模块,以及在没有异常机制的情况下,PouchContainer 又是...

Go中国
2018/08/29
0
0
利用supervisor在linux上部署goweb项目

最近在鼓捣golang守护进程的实现,无意发现了supervisor这个有意思的东西。supervisor是一个unix的系统进程管理软件,可以用它来管理apache、nginx等服务,若服务挂了可以让它们自动重启。当...

卐字旗下的余晖
2015/12/14
135
0
TTsoa分布式服务简单框架的简明的文档

TTsoa distributed API services all in one, include provider, consumer, monitor.provider use golang, moniter use PHP, the services info will store in mysql database.include some ......

r00txx
2016/11/01
12
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
3
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
4
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部