带你用Go实现二维码小游戏(下)

本篇文章我们进入项目最后的部署和监控搭建阶段,这一节会有很少的编码量,但是却能够带来最实用的知识和技术,快来阅读吧~

5 Docker镜像打包部署

接下来就到了我们项目的部署阶段,优雅的项目必须要搭配优雅的部署方式!

5.1 为什么要用Docker部署

Docker镜像打包部署Go项目带来了诸多好处,这些好处主要体现在以下几个方面:

1)环境一致性

Docker容器包含了Go项目所需的所有依赖项(如库、运行时等),确保在开发、测试和生产环境中运行的一致性,从而避免了“在我的机器上可以运行”的问题。

2)高效资源利用

Docker容器与虚拟机相比更加轻量,能够在相同硬件资源下运行更多的应用实例。

3)易于部署和管理

Docker容器可以打包Go项目及其所有依赖项,包括库、框架和工具等,无需手动安装和配置各种依赖项,简化了项目的部署和维护过程。

4)提升安全性和隔离性

每个Docker容器在独立的环境中运行,互不干扰,提高了系统的稳定性和安全性。Docker提供了多层次的安全机制,如命名空间、控制组和安全模块,确保容器的隔离性和安全性。

5.2 编写Dockerfile

下面我们就编写Dockerfile进行项目打包的预备阶段,先看一个Dockerfile的模板:

# 使用官方的Python基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 复制当前目录的所有文件到工作目录中
COPY . /app# 安装Python依赖包
RUN pip install --no-cache-dir -r requirements.txt# 暴露应用程序的端口(如果适用)
EXPOSE 5000# 定义环境变量(如果需要)
ENV NAME World# 运行应用程序的命令
CMD ["python", "app.py"]

内容解释:

1)FROM python:3.9-slim:这行指定了基础镜像。这里使用官方的Python 3.9 slim版镜像,slim版表示它去除了很多不必要的库,使得镜像更轻量。

2)WORKDIR /app:设置工作目录为/app。所有后续的指令(如COPYRUN)都会在这个目录下执行。

3)COPY . /app:将当前上下文(通常是Dockerfile所在的目录)的所有内容复制到工作目录/app中。

4)RUN pip install --no-cache-dir -r requirements.txt:使用pip安装requirements.txt中列出的所有Python依赖包。--no-cache-dir选项用于防止pip缓存,确保每次构建时都安装最新的依赖包。

5)EXPOSE 5000:声明容器运行时会监听的端口。这里假设应用程序在5000端口上运行。需要注意的是,EXPOSE指令不会实际发布端口,它只是提供一个信号,说明容器使用的网络端口。

6)ENV NAME World:设置环境变量NAME的值为World。环境变量可以在应用程序中通过os.getenv('NAME')等方式读取。

7)CMD ["python", "app.py"]:指定容器启动时执行的命令。这里使用python app.py启动Python应用程序。CMD指令可以被docker run命令行中的参数覆盖。

然后在项目的根目录新建Dockerfile:

# 使用最新的Ubuntu作为基础镜像
FROM golang:latest# 设置工作目录
WORKDIR /app# 将Go代码复制到容器中
COPY . /app# 编译Go代码
RUN go env -w GOPROXY=https://goproxy.io
RUN go mod tidy
RUN go build -o myapp# 设置容器启动时执行的命令
ENTRYPOINT ["/app/myapp"]
5.3 构建并启动Docker镜像

在项目的根目录,也就是Dockerfile所在目录下执行

docker build -t qrcode 

构建完成之后我们使用docker image命令查看:

docker imagesREPOSITORY   TAG       IMAGE ID       CREATED         SIZE
qrcode       latest    d330b8d8e269   7 seconds ago   1.11GB

启动Docker:

docker run -d -p 8081:8081 qrcode

6 监控搭建

本节我们将进行一个比较好玩的操作,就是进行服务器监控搭建,从监控对象角度可以区分为整个机器的监控和服务接口的监控,下面我们就分别讲述下这两种监控如何搭建。

6.1 为什么要进行服务器监控?

服务器监控是确保系统稳定运行、数据安全、资源优化和成本控制的关键环节。通过实时监测性能指标、检测安全风险、预测未来需求,服务器监控能有效提高服务质量,降低运营成本,满足合规要求,确保业务连续性。

6.2 常用的监控工具
6.2.1 监控工具

常用的监控工具及其作用如下:

Zabbix:作为一款开源监控软件,支持大规模部署和数据监控,提供灵活的告警机制和强大的数据采集能力。适合复杂的IT环境,减少维护成本。

Nagios:主要用于监控网络、服务器及应用程序,具有模块化架构和低资源利用率的特点。适合资源有限的小型到中型企业,确保系统稳定运行。

Prometheus:专注于时间序列数据的监控与告警,适合动态环境中的容器化应用程序监控。提供高效的时间序列数据库和灵活的查询语言,助力DevOps和SRE团队。

SolarWinds:具备出色的网络流量监控和服务器性能监控能力,帮助企业实时了解网络健康状态。适合大中型企业,提高网络管理效率。

这些监控工具各有特色,能够满足不同企业的监控需求。

6.2.2 可视化工具

Grafana是一个开源的数据可视化和监控平台,它允许用户通过创建动态仪表板来监视和分析数据。Grafana支持与多种数据源(如Elasticsearch、InfluxDB、Prometheus等)集成,使得它能够展示来自这些数据源的数据。Grafana的核心功能包括数据采集、仪表盘设计、图表展示和告警通知。

此外,Grafana还具有日志分析、网络流量监控、安全监控以及能源管理等作用。作为一个流行的数据可视化和监控工具,Grafana具有开源性、丰富的功能以及灵活性等优点,适用于多种不同的监控场景。

6.3 将接口进行监控
6.3.1 总体步骤

要使用Prometheus监控Go HTTP接口的请求总量和QPS,一般有以下几个步骤:

1)安装和配置Prometheus。

2)在Go应用程序中暴露指标:使用Prometheus客户端库(如github.com/prometheus/client_golang)来暴露HTTP接口请求相关的指标。

3)配置Prometheus抓取任务:在Prometheus配置文件中添加一个作业(job),以抓取Go应用程序暴露的指标。

4)使用Prometheus或Grafana可视化数据。

##### 6.3.2 代码实现

1)下载Prometheus

首先是Prometheus下载地址:
https://prometheus.io/download/

2)Go项目添加Prometheus依赖

然后在项目根目录下载依赖

go get -u github.com/prometheus/client_golang/prometheus

3)代码改造

新增对象

var (requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{Name: "qrcode_http_requests_total",Help: "Total number of HTTP requests",})
)func init() {prometheus.MustRegister(requestsTotal)
}

改造接口:

func runHttp() {// ......mux := http.NewServeMux()mux.HandleFunc("/qrcode/gen", withMetricsHandler(uploadFileHandler))//......mux.Handle("/metrics", promhttp.Handler())_ = http.Serve(listen, mux)
}func withMetricsHandler(f func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {return func(w http.ResponseWriter, r *http.Request) {defer func() {requestsTotal.Inc()}()f(w, r)}
}

4)配置Prometheus

然后配置Prometheus的配置文件prometheus.yml

scrape_configs:# 新增如下配置- job_name: 'qrcode'  static_configs:  - targets: ['localhost:8081']  # 确保这是你的Go应用程序的地址和端口

5)测试

访问:http://localhost:9090/

6)优化

如果想区分接口进行监控,需要进行优化:

var (requestsTotalVec = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "qrcode_http_requests_total_vec",Help: "Total number of HTTP requests",}, []string{"uri"})
)func init() {prometheus.MustRegister(requestsTotalVec)
}

接口层面:

func withMetricsHandler(f func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {return func(w http.ResponseWriter, r *http.Request) {defer func() {requestsTotalVec.WithLabelValues(r.URL.Path).Inc()}()f(w, r)}
}

7)Prometheus查询语句

qrcode_http_requests_total // 请求总量irate(qrcode_http_requests_total[5m]) // 返回过去5分钟内HTTP请求数量的瞬时变化率,单位为每秒qrcode_http_requests_total_vec // 请求总量irate(qrcode_http_requests_total_vec{uri="/success"}[5m]) // 返回过去5分钟内URI的路径为/success的HTTP请求数量的瞬时变化率,单位为每秒

7 总结

到这里我们就完成了《Go语言实现二维码小游戏》从设计、接口开发再到监控运维的全部过程,希望你能从中学到东西,当然有些地方做的还不是很完善,因此在后续可能会更新一篇文章主要针对已有项目的优化,也希望屏幕前正在阅读的你能够留言给出优化建议。

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

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

相关文章

Sigrity Power SI 3D-EM Inductance Extraction模式如何进行电感的提取操作指导(一)

Sigrity Power SI 3D-EM Inductance Extraction模式如何进行电感的提取操作指导(一) Sigrity Power SI使用3D-EM Inductance Extraction模式可以进行电感的提取,以下图为例 2D 视图 <

shodan6-7---清风

shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控&#xff0c;这里可以对ip进行扫描&…

CPU算法分析LiteAIServer视频智能分析平台视频智能分析:抖动、过亮与过暗检测技术

随着科技的飞速发展&#xff0c;视频监控系统在各个领域的应用日益广泛。然而&#xff0c;视频质量的好坏直接影响到监控系统的效能&#xff0c;尤其是在复杂多变的光照条件下和高速数据传输中&#xff0c;视频画面常常出现抖动、过亮或过暗等问题&#xff0c;导致监控视频难以…

win11电脑无法找到声音输出设备怎么办?查看解决方法

电脑无法找到声音输出设备是一个常见的问题&#xff0c;尤其是在使用Windows操作系统时。幸运的是&#xff0c;大部分问题都可以通过以下几种方法来解决。 一、检查物理连接 在深入诊断之前&#xff0c;首先要检查硬件连接是否正常。这包括&#xff1a; 确保耳机、扬声器或其…

JS数据结构之“栈”、“队列”、“链表”

一、栈 JS中没有栈这种数据类型&#xff0c;创建栈其实是创建数组。push&#xff08;内容&#xff09;入栈&#xff1b;pop&#xff08;&#xff09;出栈&#xff1b; const stack []; stack.push(1); stack.push(2); const item1 stack.pop(); const item2 stack.pop(); …

【51单片机】串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

嵌入式web开发:boa、lighttpd

嵌入式web开发&#xff1a;boa、lighttpd https://blog.csdn.net/m0_37105371/category_10937068.html BOA服务器的移植-CSDN博客 【第1部分&#xff1a;boa服务器部署到ubuntu里】 http://www.boa.org/boa-0.94.13.tar.gz tar xvzf boa-0.94.13.tar.gz cd boa-0.94.13/src/ a…

RC高通滤波器Bode图分析(传递函数零极点)

RC高通滤波器 我们使得R1K&#xff0c;C1uF&#xff1b;电容C的阻抗为Xc&#xff1b; 传递函数 H ( s ) u o u i R X C R R 1 s C R s R C 1 s R C &#xff08;其中 s j ω &#xff09; H(s)\frac{u_{o} }{u_{i} } \frac{R }{X_{C}R} \frac{R }{\frac{1}{sC}R} \fra…

Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码

Python决策树、随机森林、朴素贝叶斯、KNN&#xff08;K-最近邻居&#xff09;分类分析银行拉新活动挖掘潜在贷款客户|附数据代码 最近我们被客户要求撰写关于银行拉新活动的研究报告&#xff0c;包括一些图形和统计输出。 项目背景&#xff1a;银行的主要盈利业务靠的是贷款&…

撰写开发信利器,高效工具助你赢在起点

ZohoCampaigns是电子邮件营销平台&#xff0c;提供创建、发送和分析邮件方案。其优势包括易用性、丰富模板、精准筛选、自动化和详细报告。外贸人员可用其高效发送开发信&#xff0c;追踪效果并优化策略&#xff0c;促进业务增长。 一、为什么选择Zoho Campaigns&#xff1f; …

协程5 --- 栈切换

文章目录 ucontext相关函数例子ucontext_t结构 setjump、longjump相关函数例子jmp_buf结构 汇编实现解析图示 ucontext 相关函数 #include <ucontext.h> int getcontext(ucontext_t *ucp);初始化ucp结构体&#xff0c;将当前上下文保存在ucp中。 int setcontext(const …

【Linux】Pinctrl子系统和GPIO子系统

Pinctrl子系统 在许多soc内部包含了多个pin控制器&#xff0c;通过pin控制器的寄存器&#xff0c;我们可以配置一个或者一组引脚的功能和特性。Linux内核为了统一各soc厂商的pin脚管理&#xff0c;提供了pinctrl子系统。该系统的作用&#xff1a; 在系统初始化的时候&#xf…

《Vue3 报错》Uncaught TypeError: s.finally is not a function

解决方案&#xff1a; 新建文件 my-polyfill.js // 当浏览器环境不支持Promise.prototype.finally if (!Promise.prototype[finally]) {Promise.prototype[finally] function(callback) {let P this.constructor;return this.then(value > P.resolve(callback()).then(…

RabbitMQ 七种工作模式介绍

目录 1.简单模式队列 2.WorkQueue(⼯作队列) 3 Publish/Subscribe(发布/订阅) 4 Routing(路由模式) 5.Topics(通配符模式) 6 RPC(RPC通信) 7 Publisher Confirms(发布确认) RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的 1.简单模式队列…

数组类算法【leetcode】

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 二分查找 用于有序数组中&#xff0c;没有重复的数组。…

Pandas 数据分析工具详细教程

Pandas 数据分析工具详细教程 Pandas 是一个强大的 Python 数据分析库&#xff0c;广泛应用于数据科学、数据分析和机器学习等领域。它提供了高效的数据操作和分析功能&#xff0c;使得数据处理变得简单而高效。本文将详细介绍 Pandas 的基本概念、数据结构、常用操作及其在数…

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力

作者&#xff1a;肯梦 本文将演示如何使用事件总线&#xff08;EventBridge&#xff09;&#xff0c;向量检索服务&#xff08;DashVector&#xff09;&#xff0c;函数计算&#xff08;FunctionCompute&#xff09;结合灵积模型服务 [ 1] 上的 Embedding API [ 2] &#xff0…

GooglePlay: 应用和游戏的内容分级

对于后台私信的开发者们,希望能够携带详细过审记录和拒审邮件一同发来,方便我们尽快解决问题 应用与游戏 为您的应用或游戏选择类别和标签选择要添加的标签选择类别并添加标签类别示例与应用、游戏以及两者中所投放广告的内容分级相关的要求应用如何获得内容分级内容分级的用…

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg&#xff0c;将红框内路径修改为自己电脑的“Notepad.exe路径”后&#xff0c;再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

[复健计划][紫书]Chapter 7 暴力求解法

7.1 简单枚举 例7-1 Division uva725 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好为数字0&#xff5e;9的一个排列&#xff08;可以有前导0&#xff09;&#xff0c;2≤n≤79。枚举fghij&#xff0c;验证a…