go-svc:https://github.com/judwhite/go-svc/svc

go-svc支持linux和windows,应用只需实现Service接口即可。

官方例子

package main

import (
"log"
"os"
"path/filepath" "github.com/judwhite/go-svc/svc"
) // implements svc.Service
type program struct {
LogFile *os.File
svr *server
} func main() {
prg := program{
svr: &server{},
}
defer func() {
if prg.LogFile != nil {
prg.LogFile.Close()
}
}() // call svc.Run to start your program/service
// svc.Run will call Init, Start, and Stop
if err := svc.Run(prg); err != nil {
log.Fatal(err)
}
} func (p program) Init(env svc.Environment) error {
log.Printf("is win service? %v\n", env.IsWindowsService()) // write to "example.log" when running as a Windows Service
if env.IsWindowsService() {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
return err
} logPath := filepath.Join(dir, "example.log") f, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
return err
} p.LogFile = f log.SetOutput(f)
} return nil
} func (p program) Start() error {
log.Printf("Starting...\n")
go p.svr.start()
return nil
} func (p program) Stop() error {
log.Printf("Stopping...\n")
if err := p.svr.stop(); err != nil {
return err
}
log.Printf("Stopped.\n")
return nil
}
package main

import (
"log"
"sync"
"time"
) type server struct {
data chan int exit chan struct{}
wg sync.WaitGroup
} func (s *server) start() {
s.data = make(chan int)
s.exit = make(chan struct{}) s.wg.Add(2)
go s.startSender()
go s.startReceiver()
} func (s *server) stop() error {
close(s.exit)
s.wg.Wait()
return nil
} func (s *server) startSender() {
ticker := time.NewTicker(time.Second)
count := 1
for {
select {
case <-ticker.C:
s.data <- count
count++
case <-s.exit:
s.wg.Done()
return
}
}
} func (s *server) startReceiver() {
for {
select {
case n := <-s.data:
log.Printf("%d\n", n)
case <-s.exit:
s.wg.Done()
return
}
}
}

go服务运行框架go-svc的更多相关文章

  1. 玩转Windows服务系列——服务运行、停止流程浅析

    通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...

  2. WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转)

    WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转) Windows Communication Foundation (WCF)是Microsoft为构建面向服务的应用提供的分布式通信 ...

  3. 玩转Windows服务系列——服务运行、停止流程浅析

    原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...

  4. 【原创】自己动手实现RPC服务调用框架

    自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...

  5. dubbo服务运行的三种方式

    dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...

  6. SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)

    1.概念:Eureka 服务发现框架 2.具体内容 对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操 ...

  7. 自己动手实现RPC服务调用框架

    转自:http://www.cnblogs.com/rjzheng/p/8971629.html#3977269 担心后面忘了,先转了,后面借鉴实现一下RPC -------------------- ...

  8. 6种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  9. 6 种微服务 RPC 框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

随机推荐

  1. js获取当前iframe的ID

    self.frameElement.getAttribute('id');其他属性也可以通过这种方式获取. 也可以通过 window.frameElement.id 获取当前iframe的ID

  2. 牛客网 PAT 算法历年真题 1012 : D进制的A+B (20)

    D进制的A+B (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 输入两个非负10进制整数A和B(< ...

  3. 面向对象的Java实现

    1.面向对象的Java实现--封装 1-1:封装 a.为什么需要封装(封装可以是数据方便维护.增加实用性.方便扩展等等.通过面向对象的思想,模拟现实生活中的事物.) b.什么是封装(封装就是将属性私有 ...

  4. MFC CDHtmlDialog 加载本地资源

    步骤:1.资源视图 项目右击选择资源添加,自定义添加新类型 如:JS(会增加JS文件夹)2. 选择1新建的文件夹右击 添加资源 导入 选择js文件引入3. 在资源文件Resource.h文件夹能找到资 ...

  5. web.xml之env-entry

    1.目的 定义一个jndi变量 2.schemas定义 2.web.xml中定义变量 <web-app> ... <env-entry> <env-entry-name& ...

  6. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个 依赖项。如何解决?

    之前项目做大数据批量添加使用了OracleBulkCopy,这个是引用Oracle.DataAccess.Client的命名空间,所以项目要引用一个Oracle.DataAccess.dll, 但是运 ...

  7. Redis在linux环境下的安装和部署

    官网:http://redis.io          windows版本下载地址https://github.com/MicrosoftArchive/redis/releases 1Redis建议 ...

  8. javascript 日期函数

    获取当前日期的前一天的日期    var MyDate = new Date( );  //获取昨天的日期    var yesterday = myDate.getTime()-1000*60*60 ...

  9. docker图形化管理工具portainer

    本章主要介绍docker的web图形化管理工具.这里使用 portainer(类似与dockui不过dockerui只支持单节点) 镜像名称 portainer/portainer 一.启动porta ...

  10. [POJ3416]Crossing

    Problem 给你n个点,m个询问,每个询问有x, y 问以(x,y)为原点建立的平面直角坐标系分割的第一象限和第三象限的点数和减去第二象限和第四象限的点数和 Solution 用2个树状数组维护一 ...