golang服务控制之go-svc

文章目录

  • 程序安全退出
  • 执行代码的基本:信号拦截
  • 执行代码的改进:信号拦截包装器
  • 实践
    • 捕获键盘输入
    • 示例代码
  • go-svc介绍

程序及服务的控制是指在计算机系统中对程序和服务进行管理、监控和调控的过程。这个过程可以涉及到多个方面,包括资源管理、运行状态监测、安全性控制等。本质上而言就是正确的启动,并可控的停止或退出。在go语言中,其实就是程序安全退出、服务控制两个方面。

程序安全退出

在代码部署后,我们可能因为服务配置发生变化或其他各种原因,需要将服务停止或者重启。通常就是for循环阻塞,运行代码,然后通过control+C或者kill来强制退出。代码如下:

//file svc1.go
package mainimport ("fmt""time"
)
//当接收到Control+c,kill -1,kill -2,kill -9 均无法正常执行defer函数
func main() {fmt.Println("application is begin.")//以下代码不会执行defer fmt.Println("application is end.")for {time.Sleep(time.Second)fmt.Println("application is running.")}
}

但这种情况下,程序是不会执行defer的代码的,因此无法正确处理结束操作,会丢失一些很关键的日志记录、消息通知,非常不安全的。这时,需要引入一个简单的框架,来执行退出。

执行代码的基本:信号拦截

//file svc2.go
package mainimport ("fmt""time""os/signal""os"
)
//当接收到Control+c,kill -1,kill -2 的时候,都可以执行执行defer函数
// kill -9依然不会正常退出。
func main() {fmt.Println("application is begin.")//当程序接受到退出信号的时候,将会执行defer fmt.Println("application is end.")//协程启动的匿名函数,模拟业务代码go func(){for {time.Sleep(time.Second)fmt.Println("application is running.")}}()//捕获程序退出信号msgChan:=make(chan os.Signal,1)signal.Notify(msgChan,os.Interrupt,os.Kill)<-msgChan
}

此时,我们实现了程序退出时的信号拦截,补充业务代码就可以了。但实际业务逻辑至少涉及到初始化、业务处理、退出三大块,代码量多了,会显得比较混乱,这就需要规范代码的结构。

执行代码的改进:信号拦截包装器

考虑上述情况,我们将正常的程序定义为:

Init: 系统初始化,比如识别操作系统、初始化服务发现Consul、Zookeper的agent、数据库连接池等。
Start:程序主要业务逻辑,包括但不限于数据加载、服务注册、具体业务响应。
Stop: 程序退出时的业务,主要包括内存数据存储、服务注销。

改写之前的代码

//file svc3.go
package mainimport ("fmt""time""study1/svc"
)type Program struct {}func (p *Program) Start()error  {fmt.Println("application is begin.")//必须非阻塞,因此通过协程封装。go func(){for {time.Sleep(time.Second)fmt.Println("application is running.")}}()return nil
}
func (p *Program)Init()error{

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS2学习(二):仿真案例汇总(基于Ubuntu_2004 ROS2_noetic)

文章目录 一、slam仿真1、安装环境依赖2、创建Turtlebot3目录并下载安装3、配置Turtlebot3环境4、运行slam仿真 一、slam仿真 1、安装环境依赖 sudo apt install ros-noetic-cartographer ros-noetic-cartographer-ros2、创建Turtlebot3目录并下载安装 mkdir -p catkin_turt…

Chrome浏览器好用的几个扩展程序

Chrome好用的扩展程序 背景目的介绍JsonHandle例子未完待续。。。。。。 背景 偶然在往上看到Chrome有很多好用的扩展程序&#xff0c;比较好用&#xff0c;因此记录下比较实用的扩展程序。 目的 记录Chrome浏览器好用的插件。 介绍 JsonHandle下载以及无法扩展插件的解决…

YOLOv5目标检测学习(2):运行一个yolo应用所需要配置的深度学习环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、CUDA、CUDNN的下载安装1.1 CUDA的安装1.2 cuDNN的配置 二、anaconda的安装1.卸载python2.安装anaconda 三、Pytorch、python虚拟环境安装1.创建虚拟环境2.安…

【算法训练营】:期末考试

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题12-1 题目描述 输入格式 输出格式 输出到标准输出。 输出一行一个整数…

php 把数字转化为大写中文

1. 120002129.25 转化后壹億贰仟萬贰仟壹佰贰拾玖圆贰角伍分2. 12000.2145 转化后壹萬贰仟圆贰角壹分肆厘伍毫3. 1020001211 转化后壹拾億贰仟萬壹仟贰佰壹拾壹圆整大致思路这样的: 从小数点分割成两部分,整数部分和小数部分分别处理。 整数四个一组进行处理,用substr函数分…

蓝桥杯练习题-特殊日期

问题描述&#xff1a; 对于一个日期&#xff0c;我们可以计算出年份的各个数位上的数字之和&#xff0c;也可以分别计算月和日的各位数字之和。 请问1900年1月1日至9999年12月31日总共有多少天&#xff1f;年份的数位数字之和等于月的数位数字之和加日的数位之和 例如&#xff…

电销平台架构的演变与升级

简介 信也科技电销平台承载了公司400多坐席的日常外呼任务&#xff0c;随着公司业务规模不断增长&#xff0c;业务复杂度不断提升&#xff0c;营销模式需要多样化&#xff0c;营销流程需要更加灵活。为了更好地赋能业务、提高客户转化率&#xff0c;电销平台不断升级优化&#…

利用Spring整合Redis

文章目录 利用Spring整合Redis引入依赖配置Redis 访问RedisString类型数据Hash类型数据List类型数据Set类型数据SortedSort类型数据全局key简化多次访问同一个key情况代码 Redis中的事务核心方法execute()事务代码实例 参考文献 利用Spring整合Redis 引入依赖 spring-boot-st…

springboot快速构建项目

1.Spring的基本步骤 2.构建项目 第一次下包速度比较慢&#xff0c;可以考虑使用镜像 至此项目构建完成 3.启动并配置数据库 新建一个数据库&#xff0c;新建一个表 下面这里也可以【重构-重命名】为yml后缀&#xff08;代码可粘下面的&#xff0c;后面有写&#xff09; Yml后…

FreeRTOS_day2

作业&#xff1a;1.使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。 2.总结DMA空闲中断接收数据的使用方法 打开DAM,允许接收外部设备数据&#xff0c;调用中断接收回调函数

Eclipse调试技巧 条件断点 监视

实验代码 import java.util.Scanner;public class Test {// 判断n是否为质数public static boolean isPrime(int n){if (n < 2)return false;for (int i 2; i < n; i){if (n % i 0)return false;}return true;}public static void main(String[] args){Scanner scanne…

前端每日一练:深入理解CSS浮动、问题及清除浮动解决方案

深入理解CSS浮动、问题及解决方案 在CSS布局中&#xff0c;浮动&#xff08;float&#xff09;是一种常见的布局属性&#xff0c;用于控制元素在其父元素中的位置&#xff0c;使其可以浮动到左侧或右侧。然而&#xff0c;浮动也会引起一些常见的问题&#xff0c;主要涉及到高度…

专治Java底子差,线程操作篇(1)

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

[网络安全] PKI

一、PKI 概述 名称; 公钥基础设施 (Public Key Facility) 作用: 通过加密技术和数字签名保证信息安全 组成: 公钥机密技术、数字证书、CA、RA 二、信息安全三要素 机密性&#xff1a;确保仅信息发收双方 能看懂信息 完整性&#xff1a; 确保信息发收完整&#xff0c;不被破坏 …

最新基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

前端每日一练:如何隐藏一个元素​?

css 中隐藏元素的方法有很多&#xff0c;但他们也各有差异&#xff0c;不同场景选择合适的方式能事倍功半&#xff01; 方式​ 占位​ 点击事件​ display: none​ ❌​ ❌​ opacity: 0​ ✅​ ✅​ visibility: hidden​ ✅​ ❌​ clip-path: circle(0)​ ✅​…

支小蜜校园防欺凌系统如何有效应对学生霸凌?

学生霸凌不仅直接伤害到被霸凌者的身心健康&#xff0c;也对整个校园的和谐氛围构成了威胁。为了应对这一问题&#xff0c;校园防欺凌系统应运而生&#xff0c;成为维护校园安全、保护学生权益的重要工具。那么当校园防欺凌系统面对学生霸凌时&#xff0c;该如何有效应对呢&…

STM32CubeMX学习笔记8 -ADC

1. ADC简介 ADC 是Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。简单地说就是将模拟电压值&#xff0c;转换成对应的肉眼…

ACM题解Day10|总结篇|进制转化,GCD ,LCM ,二分答案

&#x1f525;博客介绍&#xff1a; 27dCnc [Cstring中find_first_not_of()函数和find_last_not_of()函数-CSDN博客] 方差,期望 概率 今日打卡: 算法周总结 ACM题解Day3| To Crash or not To Crash,Integer Prefix ,I don’t want to pay for the Late Jar-CSDN博客 第3题:…

单例服务拆分为分布式架构

将独立业务服务拆分为分布式 为啥会有这个想法&#xff1f;因为我要造锤子&#xff0c;拿着造好的锤子&#xff0c;去找锤子&#xff0c;没有造锤子的经验无法找一个造锤子的坑。 现有情况说明 单机软件&#xff1a;就是将软件安装在自己的电脑上&#xff0c;自己用的那种&…