go服务运行框架go-svc
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的更多相关文章
- 玩转Windows服务系列——服务运行、停止流程浅析
通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...
- WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转)
WCF服务运行一段时间后客户端无法连接WCF服务的解决办法 (转) Windows Communication Foundation (WCF)是Microsoft为构建面向服务的应用提供的分布式通信 ...
- 玩转Windows服务系列——服务运行、停止流程浅析
原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...
- 【原创】自己动手实现RPC服务调用框架
自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...
- dubbo服务运行的三种方式
dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...
- SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)
1.概念:Eureka 服务发现框架 2.具体内容 对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操 ...
- 自己动手实现RPC服务调用框架
转自:http://www.cnblogs.com/rjzheng/p/8971629.html#3977269 担心后面忘了,先转了,后面借鉴实现一下RPC -------------------- ...
- 6种微服务RPC框架,你知道几个?
开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...
- 6 种微服务 RPC 框架,你知道几个?
开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...
随机推荐
- jQuery滚屏插件XSwitch.js
1.需要有基本的HTML结构 <div style="margin-top: 124px;" id="container" data-XSwitch> ...
- Qt画笔实现波形区域图
参考文章:https://blog.csdn.net/yuxing55555/article/details/79752978 效果图: void WareArea::paintEvent(QPain ...
- 我个人对OOP的理解
OOP面向对象的思维:pay1:封装 A.避免使用非法数据赋值 B.保证数据的完整性 C.避免类内部发生修改的时候,导致整个程序的修改 pay2:继承 A.继承模拟了现实世界的关系,OOP中强调一切皆 ...
- linux network
Linux 1◆ 提供连接 2◆ connection baidu.com 3◆ vm tools install Reboot
- ubuntu16.10安装搜狗输入法
一.搜狗输入法安装 1.首先到搜狗输入法官网下载搜狗输入法,下载的是个deb文件. 搜狗输入法Linux版下载地址:http://pinyin.sogou.com/linux/?r=pinyin 2. ...
- java 单例模式5种写法
学习整理 饱汉模式(懒汉模式) // 饱汉 // UnThreadSafe public class Singleton1 { private static Singleton1 singleton ...
- frameset的固定放置模式,不能放入<form runat="server">中
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="admin_default.as ...
- Unity中Button按钮的触发监听事件
第一种方式:需要把自己添加的Button按钮属性(Inspector)中的(Button)onclick添加方法. public void BtnCreteClick() { Debug.Log(&q ...
- bzoj3277
题解: 后缀自动机 然后抄了一发题解 可以看看这个博客:http://blog.csdn.net/clover_hxy/article/details/53861268 代码: #include< ...
- getopts的使用方法
getopts的使用 语法格式:getopts [option[:]] [DESCPRITION] VARIABLE option:表示为某个脚本可以使用的选项 ":":如果某个选 ...