GoFrame框架中Prometheus Metric组件监控的优势与实践
文章摘要
GoFrame 是一款轻量、高效且模块化的 Go 语言全能型框架,在 Go 生态中以其企业级应用能力和简洁设计受到开发者青睐。随着微服务架构的普及,性能监控成为开发中不可或缺的一环,而 Prometheus 凭借其强大的时间序列数据处理能力和灵活的拉取模型,已成为行业标准。本文将深入探讨 GoFrame 中内置的 Prometheus Metric 组件的优势与实践经验,剖析其开箱即用、抽象解耦等特性,并结合实际电商微服务项目,分享具体的实现步骤、踩坑教训和优化方案。通过本文,你将掌握如何利用 GoFrame 的监控能力,快速构建高效、可扩展的系统观测体系,少走弯路,提升项目质量。无论你是 Go 新手还是有一定经验的开发者,这篇指南都将为你提供实用的思路和可复制的经验。
一、引言
1.1 背景介绍
近年来,Go 语言凭借其高并发特性、简洁语法和强大的标准库,在后端开发领域迅速崛起,尤其在微服务架构中占据了一席之地。然而,随着系统规模的增长,开发者常常面临性能瓶颈、分布式系统观测困难等痛点。如何实时掌握服务的健康状态、快速定位问题,成为微服务开发中的核心挑战。
在这个背景下,GoFrame 作为一款全能型框架应运而生。它不仅提供了轻量高效的 HTTP Server、强大的 ORM 和依赖注入机制,还通过模块化设计满足了企业级开发的需求。与此同时,监控的重要性日益凸显。Prometheus 作为业界公认的监控标准,以其时间序列数据存储、灵活的 PromQL 查询语言和主动拉取模型,为开发者提供了强大的观测工具。在 GoFrame 中,Prometheus Metric 组件的内置支持将这两者的优势结合在一起,为开发者带来了更便捷的监控体验。
想象一下,监控就像给系统装上一双“眼睛”,让你随时洞悉它的运行状态。而 GoFrame 的 Metric 组件,就像一位贴心的助手,帮你把这双眼睛轻松嵌入到项目中,无需繁琐的配置或额外的依赖。
1.2 目标读者画像
本文面向那些已经掌握了 Go 基础开发技能,但希望进一步提升系统可观测性的开发者。你可能有 1-2 年的 Go 开发经验,熟悉过 Gin 或 Echo 等轻量框架,写过简单的 Web 服务,但对 GoFrame 还是个“新手”。在监控方面,你或许接触过日志记录或简单的指标统计,却还没有深入使用 Prometheus 或其他高级工具。如果你是这样一位开发者,那么本文将为你打开一扇窗,带你走进 GoFrame 和 Prometheus 的结合之道。
1.3 文章价值
通过本文,你将学会如何利用 GoFrame 的 Prometheus Metric 组件,快速搭建一个高效、可扩展的监控系统。更重要的是,我会结合实际项目经验,分享一些常见的“坑”和解决方案,帮助你在实践中少走弯路。无论是优化 HTTP 请求延迟,还是监控业务指标(如订单创建成功率),本文都将提供清晰的步骤和代码示例,让你不仅“知其然”,还能“知其所以然”。
从引言过渡到下一章,我们将先对 GoFrame 和 Prometheus Metric 组件做一个全面的介绍,为后续的深入分析和实践打下基础。让我们一起揭开这场技术探索的序幕吧!
二、GoFrame与Prometheus Metric组件简介
在深入探讨 GoFrame 的 Prometheus Metric 组件之前,我们需要先了解它的“出身”和“搭档”。这一章将带你认识 GoFrame 框架的核心特性,简单了解 Prometheus 的工作原理,并揭示两者在监控领域的巧妙结合。如果你把框架比作一辆车,那么 Metric 组件就是它的仪表盘——既直观又实用。让我们从框架本身开始,逐步拆解这个监控体系的基石。
2.1 GoFrame框架概述
GoFrame 是一款为 Go 开发者打造的全能型框架,目标是提供轻量、高效且模块化的开发体验。它涵盖了 HTTP Server、ORM、依赖注入、配置管理等功能,几乎可以满足从小型工具到企业级应用的所有需求。与其他热门框架如 Gin 或 Echo 相比,GoFrame 的特色在于其模块化设计和企业级能力。比如,Gin 更专注于轻量级的 Web 服务开发,而 GoFrame 则通过内置的工具链和扩展性,适应更复杂的场景。
举个例子,GoFrame 就像一个“多功能工具箱”,你可以根据项目需求自由组合工具,而不是被局限在单一用途的“螺丝刀”(如 Gin)。以下是一个简单的对比表格,帮助你快速了解它与其他框架的差异:
特性 | GoFrame | Gin | Echo |
---|---|---|---|
核心定位 | 全能型框架 | 轻量级 Web 框架 | 轻量级 Web 框架 |
模块化设计 | 是 | 否 | 否 |
内置 ORM | 是 | 否 | 否 |
依赖注入 | 是 | 需手动实现 | 需手动实现 |
企业级支持 | 强 | 弱 | 弱 |
这种设计让 GoFrame 在需要快速迭代或构建复杂系统的团队中尤为受欢迎。
2.2 Prometheus简介
接下来,我们聊聊 Prometheus——一个在微服务监控领域几乎无人不知的名字。Prometheus 是一个开源的时间序列数据库,最初由 SoundCloud 开发,现已成为 CNCF(云原生计算基金会)的毕业项目。它的核心在于时间序列数据和拉取模型:服务暴露指标端点(如 /metrics
),Prometheus 定期“拉取”这些数据进行存储和分析。
Prometheus 的几个关键概念包括:
- 时间序列数据:用时间戳记录指标变化,像一条河流记录水位的起伏。
- 拉取模型:主动从服务拉取数据,而不是被动等待推送。
- PromQL:强大的查询语言,能轻松计算速率、百分位数等复杂指标。
在 Go 生态中,Prometheus 通过 prometheus/client_golang
库提供支持,开发者可以用它定义 Counter、Gauge、Histogram 等指标类型。可以说,Prometheus 就像系统的“健康档案管理员”,随时记录并分析关键数据。
2.3 GoFrame中的Metric组件
现在,我们来到本文的主角:GoFrame 的 Prometheus Metric 组件。它内置于 gmetric
模块,采用了 OpenTelemetry 的设计理念,既现代化又灵活。相比直接使用 prometheus/client_golang
,GoFrame 的 Metric 组件更像一个“封装好的礼物”,无需额外引入依赖即可开箱使用。
以下是它的几个亮点:
- 默认关闭设计:组件默认处于 Noop(无操作)模式,只有通过配置启用时才会工作,避免不必要的性能开销。
- 与Prometheus集成:支持常见的指标类型,如 Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)。
- 简洁优雅:通过 GoFrame 的 HTTP Server,可以直接暴露
/metrics
端点,Prometheus 即可拉取数据。
举个简单的示意图,说明它在系统中的位置:
[业务服务] --> [GoFrame HTTP Server] --> [/metrics 端点] --> [Prometheus 拉取]| |+----[gmetric 模块]----+
从功能上看,Metric 组件像是 GoFrame 为开发者准备的一条“快捷通道”,让你无需费力搭建监控基础架构,就能直达目标。
通过这一章,我们已经对 GoFrame 的全能特性和 Prometheus 的监控能力有了初步认识,也看到了 Metric 组件如何将两者无缝衔接。接下来,我们将深入剖析 GoFrame Metric 组件的具体优势和特色功能,并通过对比分析,展示它在实际开发中的独特价值。准备好了吗?让我们继续这场技术之旅!
三、GoFrame Metric组件的优势与特色功能
在了解了 GoFrame 和 Prometheus 的基础后,我们现在聚焦于 Metric 组件的核心价值。如果说监控是系统的“脉搏”,那么 GoFrame 的 Metric 组件就是一位“贴心的医生”,不仅能快速诊断问题,还能提供灵活的治疗方案。这一章将详细分析它的优势、特色功能,并通过与其他方案的对比,揭示其在实际开发中的独特魅力。让我们一探究竟!
3.1 优势
GoFrame 的 Metric 组件之所以让人眼前一亮,离不开以下几个关键优势:
-
开箱即用
你无需额外引入第三方库,像prometheus/client_golang
这样的依赖管理麻烦在这里不复存在。只需简单配置,Metric 组件就能无缝融入你的项目。就像买了一台新电脑,打开包装就能用,无需自己组装配件。 -
抽象解耦设计
Metric 组件基于接口实现,开发者可以轻松切换不同的 Exporter(如 Prometheus、Zipkin),甚至自定义实现。这种设计就像搭积木,底层的“接口积木”固定,顶层的“功能积木”可以随意替换,灵活性极高。 -
统一的float64类型
在指标定义中,GoFrame 统一使用float64
类型,避免了int64
和float64
类型转换的繁琐。想象一下,如果每次测量体重都要在“斤”和“公斤”间换算多麻烦,而 Metric 组件直接帮你统一了“单位”。 -
轻量化实现
默认情况下,组件处于 Noop 模式,只有启用后才会切换到工作状态。这种“按需加载”的设计,确保了资源敏感场景下的性能开销最小化。就像一盏智能灯,默认关闭,需要时才会点亮。
以下是一个总结表格,直观展示这些优势:
优势 | 描述 | 实际收益 |
---|---|---|
开箱即用 | 无需额外依赖,直接启用 | 减少配置时间 |
抽象解耦 | 接口化设计,可切换 Exporter | 易于扩展和维护 |
统一 float64 | 避免类型转换 | 简化开发逻辑 |
轻量化实现 | 默认 Noop,按需启用 | 节省系统资源 |
3.2 特色功能
除了基础优势,Metric 组件还提供了一些令人惊喜的特色功能,让监控变得更高效、更灵活:
-
同步与异步指标支持
同步指标适合实时采集,比如记录 HTTP 请求计数;异步指标则更适合延迟计算场景,比如定时统计内存使用率。就像直播和录播的区别,直播实时更新,录播则可以稍后剪辑播放。 -
可扩展的Exporter
除了 Prometheus,Metric 组件还支持 Zipkin 等其他监控后端,甚至允许自定义 Exporter。想象一下,你的监控数据可以像快递一样,选择不同的“物流公司”送达目的地。 -
自动开关机制
根据配置文件动态启用或禁用监控功能,避免冗余计算。比如在开发环境关闭监控,生产环境开启,就像空调的节能模式,根据需求自动调节。
以下是一个简单的示意图,展示 Metric 组件的工作流程:
[业务逻辑] --> [同步/异步指标采集] --> [gmetric 模块] --> [Exporter 输出] --> [Prometheus/其他]| |+----[HTTP Server /metrics]----+
这些功能的结合,让 Metric 组件在灵活性和易用性上都表现突出。
3.3 与其他方案对比
为了更直观地理解 Metric 组件的价值,我们将它与直接使用 prometheus/client_golang
和其他框架(如 Gin 结合 Prometheus)的方案进行对比:
-
与prometheus/client_golang对比
直接使用client_golang
需要手动定义指标、注册到 HTTP 端点并管理依赖,配置稍显繁琐。而 GoFrame 的 Metric 组件内置了这些功能,开箱即用,减少了重复劳动。例如,在client_golang
中,你需要这样定义一个 Counter:import "github.com/prometheus/client_golang/prometheus"var counter = prometheus.NewCounter(prometheus.CounterOpts{Name: "requests_total",Help: "Total number of requests", })func init() {prometheus.MustRegister(counter) }
-
与Gin结合Prometheus的差异
在 Gin 中,你需要自己引入client_golang
,编写中间件并手动暴露端点,整个过程需要更多手动操作。而 GoFrame 的内置支持让这些步骤被“隐藏”在框架内部,开发者只需关注业务逻辑。这就像开车,Gin 是手动挡,需要你自己挂挡踩离合,而 GoFrame 是自动挡,直接踩油门就能走。
方案 | 配置复杂度 | 集成难度 | 扩展性 | 性能开销 |
---|---|---|---|---|
GoFrame Metric | 低 | 低 | 高 | 按需启用,低 |
client_golang 直接使用 | 中 | 中 | 高 | 常驻,高 |
Gin + Prometheus | 高 | 高 | 中 | 常驻,高 |
通过对比可以看出,GoFrame 的 Metric 组件在易用性和效率上占据明显优势,尤其适合快速开发和迭代的场景。
通过这一章,我们已经深入了解了 GoFrame Metric 组件的优势和特色功能,从开箱即用到灵活扩展,每一个特点都为开发者节省了宝贵的时间和精力。但光有理论还不够,接下来我们将走进一个真实的电商微服务项目,分享具体的实践步骤、代码示例以及踩坑经验。准备好动手实践了吗?让我们进入下一站!
四、基于实际项目的实践经验
理论固然重要,但技术的真正价值体现在实践中。这一章,我们将走进一个真实的电商微服务项目,通过 GoFrame 的 Prometheus Metric 组件实现全面的监控体系。从项目背景到具体实现,再到踩坑经验,我会为你提供一幅清晰的“实战蓝图”。如果说前几章是“纸上谈兵”,那么这一章就是“真刀真枪”的演练。让我们开始吧!
4.1 项目背景
假设我们正在开发一个电商微服务系统,包含以下核心服务:
- 商品服务:负责商品信息查询和更新。
- 订单服务:处理订单创建和状态管理。
- 库存服务:管理库存扣减和查询。
在这个系统中,我们需要监控以下关键指标:
- HTTP 请求的延迟和错误率,确保服务响应迅速且稳定。
- 业务指标,如订单创建成功数,帮助业务团队分析销售趋势。
- 系统资源使用情况,如内存和 CPU,避免性能瓶颈。
这些需求并不复杂,但要实现高效的监控,却需要一个简单易用的工具。GoFrame 的 Metric 组件恰好满足了这一点。接下来,我们将一步步展示如何在订单服务中实现这些监控目标。
4.2 实现步骤与示例代码
4.2.1 启用Metric组件
第一步是将 Metric 组件集成到服务中。以下是基础代码:
package mainimport ("github.com/gogf/gf/contrib/metric/otelmetric/v2""github.com/gogf/gf/v2/net/ghttp"
)func main() {s := ghttp.GetServer()go otelmetric.StartPrometheusMetricsServer(8000, "/metrics")s.BindHandler("/order/create", OrderHandler)s.SetPort(8080)s.Run()
}// OrderHandler 处理订单创建请求
func OrderHandler(r *ghttp.Request) {r.Response.Write("Order created successfully")
}
代码注释:
StartPrometheusMetricsServer()
:激活内置的 Metric 功能。BindHandler
:绑定订单创建的路由。
启用后,Prometheus 可以直接访问 http://localhost:8080/metrics
获取指标数据。
4.2.2 自定义指标
为了监控订单创建次数,我们定义一个 Counter 指标:
package mainimport ("context""github.com/gogf/gf/v2/net/ghttp""github.com/gogf/gf/v2/os/gmetric"
)// 定义订单创建计数器
var (meter = gmetric.GetGlobalProvider().Meter(gmetric.MeterOption{})orderCounter = meter.MustCounter("goframe.metric.demo.counter",gmetric.MetricOption{Help: "order_created_total",Unit: "Total number of orders created",},)
)func OrderHandler(r *ghttp.Request) {// 模拟订单创建逻辑orderCounter.Inc(context.Background()) // 订单创建成功时计数加1r.Response.Write("Order created successfully")
}
代码注释:
meter.MustCounter
:创建 Counter 类型的指标,名称遵循 Prometheus 命名规范。Inc()
:每次订单创建成功时递增计数器。
4.2.3 监控HTTP请求延迟
为了分析请求延迟,我们使用 Histogram 指标,并通过中间件实现通用监控:
package mainimport ("github.com/gogf/gf/contrib/metric/otelmetric/v2""github.com/gogf/gf/v2/net/ghttp""github.com/gogf/gf/v2/os/gmetric""time"
)// 定义请求延迟直方图
var (meter = gmetric.GetGlobalProvider().Meter(gmetric.MeterOption{})requestDuration = meter.MustHistogram("goframe.metric.demo.histogram",gmetric.MetricOption{Help: "http_request_duration_seconds",Unit: "HTTP request duration in seconds",},)
)// 中间件:记录请求耗时
func MiddlewareMetrics(r *ghttp.Request) {start := time.Now()// 执行后续逻辑r.Middleware.Next()duration := time.Since(start).Seconds()requestDuration.Record(duration) // 记录耗时
}func main() {s := ghttp.GetServer()go otelmetric.StartPrometheusMetricsServer(8000, "/metrics")s.Use(MiddlewareMetrics) // 应用中间件s.BindHandler("/order/create", OrderHandler)s.SetPort(8080)s.Run()
}
代码注释:
meter.MustHistogram
:创建 Histogram 指标,用于统计延迟分布。Record
:记录每次请求的耗时,Prometheus 可据此计算分位数(如 P95、P99)。s.Use
:将中间件应用到所有路由。
以下是一个简化的工作流程示意图:
[HTTP 请求] --> [MiddlewareMetrics] --> [记录耗时] --> [业务逻辑] --> [orderCounter.Inc()]| |+----[requestDuration.Observe()]----+
4.3 最佳实践
在实践中,我们总结了几条经验,帮助你更高效地使用 Metric 组件:
-
指标命名规范
遵循 Prometheus 约定,如http_requests_total
、order_created_total
,确保指标名称清晰且语义明确。 -
合理选择指标类型
- Counter:用于累加数据,如订单总数。
- Gauge:用于波动数据,如当前库存量。
- Histogram:用于分布统计,如请求延迟。
-
中间件封装
将通用的监控逻辑(如请求耗时、错误计数)封装为中间件,避免代码重复。 -
避免高基数标签
不要在指标中加入高基数标签(如用户 ID),否则会导致内存爆炸。正确的标签示例:{method="POST", status="200"}
。
4.4 踩坑经验
实战中难免遇到问题,以下是我们踩过的“坑”及解决方案:
-
问题1:未启用监控导致指标不可见
现象:访问/metrics
时没有数据。
原因:忘记调用EnableMetrics()
。
解决:检查代码,确保在服务启动时启用了监控。 -
问题2:精度丢失
现象:小数值指标偶尔出现偏差。
原因:float64
在极小值计算时可能失准。
解决:避免直接操作小数,或调整业务逻辑(如放大后再计算)。 -
问题3:性能瓶颈
现象:高并发下指标采集影响性能。
原因:过于频繁的指标记录(如每毫秒采集一次)。
解决:调整采集频率,或使用异步指标处理。例如:
通过这一章,我们从零开始搭建了一个电商服务的监控体系,涵盖了启用组件、自定义指标和性能优化等环节。你是不是已经跃跃欲试,想在自己的项目中试一试了?别急,接下来我们将展示这些监控方案在实际场景中的应用效果,并通过 Grafana 仪表盘直观呈现数据。让我们继续探索吧!
五、实际应用场景与效果
上一章的实践为我们打下了坚实的基础,现在是时候看看这些努力如何在实际场景中开花结果了。监控不仅是数据的堆砌,更是对系统健康状态的全面洞察。这一章,我们将基于电商微服务项目,展示 GoFrame Metric 组件在具体场景中的应用效果,并通过 Grafana 可视化呈现成果。如果你把监控比作一幅画卷,那么这一章就是揭开画布的时刻。让我们一起来欣赏吧!
5.1 场景一:微服务健康检查
在微服务架构中,服务的健康状态是首要关注点。我们利用 Counter 监控 HTTP 请求的错误率,并结合 Prometheus 的 PromQL 设置告警。例如,我们希望当 5分钟内 500 错误率超过 1% 时收到通知。
- 指标定义:在中间件中记录状态码:
var requestCounter = meter.MustCounter("goframe.metric.demo.counter",gmetric.MetricOption{Help: "http_requests_total",Unit: "Total number of HTTP requests",},
)func MiddlewareMetrics(next ghttp.HandlerFunc) ghttp.HandlerFunc {return func(r *ghttp.Request) {start := time.Now()next(r)duration := time.Since(start).Seconds()requestCounter.Inc(context.Background())requestDuration.Record(duration)}
}
- PromQL 查询:计算错误率并设置告警:
rate(http_requests_total{status="500"}[5m]) / rate(http_requests_total[5m]) > 0.01
效果:通过 Prometheus Alertmanager,我们可以在错误率超标时收到邮件或 Slack 通知。这种“主动预警”就像给系统装了个“烟雾报警器”,防患于未然。
5.2 场景二:业务指标分析
除了技术指标,业务团队更关心订单处理的表现。我们使用 Histogram 监控订单创建的延迟分布,分析高峰期的性能瓶颈:
- 指标采集:已在上一章定义
http_request_duration_seconds
。 - PromQL 查询:计算 P95 延迟:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
效果:假设高峰期 P95 延迟从 200ms 上升到 500ms,我们可以据此优化数据库查询或增加服务实例。这种洞察就像医生通过心跳图判断患者的健康状况,直击问题核心。
5.3 效果展示
为了让数据“活起来”,我们将指标导入 Grafana,构建可视化仪表盘。以下是一个简单的仪表盘示例:
面板 | 指标来源 | 作用 |
---|---|---|
请求延迟分位数 | http_request_duration_seconds | 显示 P50/P95/P99 延迟趋势 |
错误率趋势图 | http_requests_total{status="500"} | 监控服务稳定性 |
订单创建总数 | order_created_total | 反映业务增长情况 |
效果图示(文字描述,实际需 Grafana 截图):
- 延迟趋势:折线图显示高峰期延迟波动,辅助性能优化。
- 错误率:柱状图突出异常时段,便于回溯问题。
- 订单计数:曲线图展示业务增长,直观易懂。
通过这些仪表盘,团队对系统的运行状态一目了然,就像给飞船装上了导航屏幕,随时掌握航向。
5.4 扩展建议
为了进一步提升监控能力,我们还可以:
- 结合Alertmanager:实现自动化告警,如短信或电话通知。
- 服务发现:使用 Consul 或 Kubernetes SD(服务发现),动态注册监控目标,避免手动配置。
- 多维度分析:增加标签(如
region="asia"
),支持按地域分析指标。
这些扩展就像给监控系统加装“助推器”,让它在复杂场景中也能游刃有余。
通过这一章,我们看到了 GoFrame Metric 组件如何将抽象的指标转化为具体的业务价值,从健康检查到性能优化,每一步都扎实可行。现在,我们即将迎来旅程的最后一站——总结与展望。让我们回顾收获,展望未来,一起为这场技术探索画上圆满的句号吧!
六、总结与展望
经过前几章的探索,我们从 GoFrame 的 Prometheus Metric 组件起步,逐步走进了一个真实的电商微服务监控实践。从理论到代码,再到实际效果,这一路就像一场技术冒险,既充满了挑战,也收获了满满的经验。现在,让我们停下来,回顾这段旅程的精华,并展望未来的方向。
6.1 总结
GoFrame 的 Metric 组件以其简单、高效、可扩展的特点,为开发者提供了一条快速构建监控体系的捷径。它的开箱即用让我们省去了繁琐的配置,抽象解耦设计赋予了灵活扩展的能力,而轻量化实现则确保了性能与功能的平衡。在实践中,我们通过几行代码就实现了 HTTP 请求监控和业务指标采集,结合 Prometheus 和 Grafana,团队对系统的掌控力显著提升。这种“即用性”和“实用性”,无论是小型项目还是企业级应用,Metric 组件都能快速上手并持续发挥作用。
6.2 实践建议
- 对新手:从一个小项目入手,先掌握基础指标的定义和查询,再逐步引入复杂功能,如 Histogram 或告警规则。一步一个脚印,才能走得更稳。
- 对团队:建立统一的指标命名规范和管理流程,通过仪表盘和告警提升系统的可观测性。监控不是一次性任务,而是持续优化的过程。
6.3 展望
随着微服务和云原生的深入发展,GoFrame 的监控能力还有更多潜力可挖。未来,它可能会进一步增强对分布式追踪(如 OpenTelemetry Trace)的原生支持,与 Prometheus 生态形成更紧密的协同。同时,随着 Prometheus 自身的演进(如更强大的 PromQL 功能),GoFrame 的适配也将带来新的可能性。个人使用心得是,这款框架让我在开发中少走了不少弯路,尤其是在快速迭代的项目中,它就像一位可靠的“助手”,帮我专注于业务逻辑,而不是基础设施。
希望这篇文章能为你的监控之旅点亮一盏灯。欢迎留言讨论你的经验,一起成长!
相关文章:
GoFrame框架中Prometheus Metric组件监控的优势与实践
文章摘要 GoFrame 是一款轻量、高效且模块化的 Go 语言全能型框架,在 Go 生态中以其企业级应用能力和简洁设计受到开发者青睐。随着微服务架构的普及,性能监控成为开发中不可或缺的一环,而 Prometheus 凭借其强大的时间序列数据处理能力和灵…...
SQL语言的物联网
以SQL语言的物联网 引言 物联网(IoT,Internet of Things)作为一个新兴的技术领域,正迅速改变着我们的生活方式和工作模式。它通过将各种物体连接到互联网,实现了设备之间的智能通信与数据交换。随着物联网的普及&…...
戴尔笔记本 ubuntu 22.04 开机后进入initramfs界面
问题 在 Ubuntu 22.04 启动时进入 initramfs 界面,并提示 Gave up waiting for root device. Common problems: - Boot args (cat /proc/cmdline)- Check rootdelay (did the system wait long enough?) - Missing modules (cat /proc/modules; ls /dev) ALERT! …...
JavaScript BOM、事件循环
目录 BOM(浏览器对象模型) 一、window 对象 1. 窗口控制 2. 定时器 二、location 对象 三、navigator 对象 四、history 对象 五、screen 对象 六、本地存储 1. localStorage 2. sessionStorage 七、BOM 应用场景 八、总结 JavaScript 执行…...
归并排序算啊模板and三道困难级别的归并力扣算法题--LCR170,493,315
目录 归并排序算法模板: 1.1题目链接:LCR.170.交易逆序对的总数 1.2题目描述: 1.3解法(利用归并排序的过程--分治): 2.1题目链接:315.计算右侧小于当前元素的个数 2.2题目描述: 2.3解法: …...
鸿蒙 harmonyOS:项目实战 :倒计时器
代码: import { promptAction } from kit.ArkUIEntry Component struct Index {State count: number 10 // 初始倒计时秒数State timerId: number -1 // 定时器ID// 开始倒计时startCountdown() {if (this.timerId -1) {this.timerId setInterval(() > {if …...
31--当认证协议开始“选秀“:RADIUS、LDAP、AD与本地认证的C位之争
当认证协议开始"选秀":RADIUS、LDAP、AD与本地认证的C位之争 引言:认证界的"四大天王" 如果把企业网络比作夜店,那么身份认证就是门口的黑衣保安。不同风格的保安队长各有绝活: RADIUS像特种兵出身的安检专家…...
AI 数理逻辑基础之统计学基本原理(上)
目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…...
C++容器数据类型定义、测试用例
C11 标准库提供了多种容器类型,每种容器定义了多个成员类型(如 value_type、iterator 等),用于与容器交互。以下详细说明各容器的数据类型定义、测试用例及注意事项。 一、顺序容器 1. std::vector<T> 类型定义࿱…...
bun 版本管理工具 bum 安装与使用
在使用 node 的过程中,我们可能会因为版本更新或者不同项目的要求而频繁切换 node 版本,或者是希望使用更简单的方式安装不同版本的 node,这个时候我们一般会用到 nvm 或者类似的工具。 在我尝试使用 bun 的时候,安装前第一个想到…...
AI——使用numpy
文章目录 一、numpy的介绍1、ndarray介绍2、ndarray使用1、ndarray的属性2、ndarray生成数组的方法 3、修改数组的形状4、修改数组的类型5、数组去重 二、数组的运算1、逻辑运算2、通用判断函数3、三元运算符4、统计运算 三、数组间运算四、数学:矩阵 一、numpy的介…...
在线追思:一个虚拟扫墓平台,让思念不受时空限制
在线追思:一个虚拟扫墓平台,让思念不受时空限制 📢 重要分享 今天想与大家分享一个特别的网站——在线追思平台。这是一个让我们能随时随地表达对逝者思念之情的虚拟扫墓平台。 🌟 为什么需要在线追思? 在现代生活的…...
Visual Basic语言的网络协议栈
Visual Basic语言的网络协议栈 引言 在当今信息技术高速发展的时代,网络通信已经成为各类应用程序中不可或缺的部分。无论是网页浏览、文件传输,还是即时通讯,网络协议的有效实现都是保证数据顺利传输和信息安全的重要基础。在这种背景下&a…...
python速通小笔记-------4.Pandas库
1.pandas介绍 1.一维数组的创建 1.字典创建法-----------pd.Series(字典) 使用pd.Series(),参数为已经创建好了的字典 2.数组创建法-----------pd.Series(列表1,index列表2) 2.一维对象的属性 sr.values----------查看所有的vsr.index----…...
P7453 [THUSC 2017] 大魔法师 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an), b ( b 1 , b 2 , ⋯ , b n ) b(b_1,b_2,\cdots,b_n) b(b1,b2,⋯,bn) 和 c ( c 1 , c 2 , ⋯ , c n ) c(c_1,c_2,\cdots,c_n) c(c1,c2,⋯,cn)&…...
小程序API —— 58 自定义组件 - 创建 - 注册 - 使用组件
目录 1. 基本介绍2. 全局组件3. 页面组件 1. 基本介绍 小程序目前已经支持组件化开发,可以将页面中的功能模块抽取成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护࿱…...
#Liunx内存管理# 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗?
在32位Linux内核中,用户空间和内核空间的3:1默认比例可以修改为2:2,但需要权衡实际需求和潜在影响。以下是具体分析: 一、修改可行性 1.技术实现 通过内核启动参数调整虚拟地址空间划分,例如在GRUB配置中添加mem2G参数,…...
经济统计常见的同比与环比是啥意思?同比和环比有什么区别?
在经济统计领域,其实大家都会经常性看到同比还有环比,可人们对此就会觉得有些疑惑。到底是什么意思?这两者之间又有什么样的区别呢?下面就为大家来详细的介绍一下。 同比与环比是用于衡量数据变化趋势的关键指标,可以给…...
前端知识点---本地存储(javascript)
localStorage 是浏览器提供的一个 本地存储 API,可以在用户的浏览器中存储数据,数据不会随页面刷新而丢失。 1. 基本用法 (1) 存储数据(setItem) localStorage.setItem("username", "zhangsan");存储 “use…...
压测工具开发实战篇(二)——构建侧边栏以及设置图标字体
你好,我是安然无虞。 文章目录 构建侧边栏QtAwesome使用调整侧边栏宽度了解: sizePolicy属性伪状态 在阅读本文之前, 有需要的老铁可以先回顾一下上篇文章: 压测工具开发(一)——使用Qt Designer构建简单界面 构建侧边栏 我们要实现类似于下面这样的侧边栏功能: …...
【Java Stream详解】
文章目录 前言一、Stream概述1.1 什么是 Stream?1.2 Stream 和集合的区别 二、Stream的创建方式2.1 基于集合创建2.2 基于数组创建2.3 使用 Stream.generate()2.4 使用 Stream.iterate() 三、Stream常见操作3.1 中间操作(Intermediate)① fil…...
16进制在蓝牙传输中的应用
在蓝牙传输中,16进制(Hexadecimal)是一种常用的数据表示方法。它主要用于描述数据包的内容、地址、命令、参数等信息。以下是16进制在蓝牙传输中的具体应用场景和作用: 1. 数据包的表示 蓝牙通信中,所有数据最终都以二…...
TypeConverter
文章目录 基本描述主要功能接口源码主要实现最佳实践与其他组件的关系常见问题 基本描述 TypeConverter接口是Spring框架中用于在SpEL(Spring表达式语言)中进行类型转换的核心接口,它允许将不同类型的对象相互转换,例如将字符串转…...
优化 Web 性能:压缩 CSS 文件(Unminified CSS)
在 Web 开发中,CSS 文件的大小直接影响页面加载速度和用户体验。Google 的 Lighthouse 工具在性能审计中特别关注“未压缩的 CSS 文件”(Unminified CSS),指出未经过压缩的样式表会增加不必要的字节,拖慢页面渲染。本文…...
每日一个小病毒(C++)EnumChildWindows+shellcode
这里写目录标题 1. `EnumChildWindows` 的基本用法2. 如何利用 `EnumChildWindows` 执行 Shellcode?关键点:完整 Shellcode 执行示例3. 为什么 `EnumChildWindows` 能执行 Shellcode?4. 防御方法5. 总结EnumChildWindows 是 Windows API 中的一个函数,通常用于枚举所有子窗…...
leetcode数组-移除元素
题目 题目链接:https://leetcode.cn/problems/remove-element/ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为…...
Git 教程:从 0 到 1 全面指南 教程【全文三万字保姆级详细讲解】
目录 什么是 Git ? Git 与 SVN 区别 Git 安装配置 Linux 平台上安装 Centos/RedHat 源码安装 Windows 平台上安装 使用 winget 工具 Mac 平台上安装 Git 配置 用户信息 文本编辑器 差异分析工具 查看配置信息 生成 SSH 密钥(可选…...
在 Android Studio 中运行安卓应用到 MuMu 模拟器
一、准备工作 1、确保 MuMu 模拟器已正确安装并启动 从官网下载安装最新版 MuMu 模拟器。启动后,建议在设置中调整性能参数(如 CPU 核心数和内存分配),以保证流畅运行。 2、配置 Android Studio 环境(按…...
stable diffusion部署ubuntu
stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui python3.10 -m venv venv(3.11的下torch会慢得要死) source venv/bin/activate 下载checkpoint模型放入clip_version"/home/chen/软件/stable-diffusion-webu…...
《概率论与数理统计》期末复习笔记_下
目录 第4章 随机变量的数字特征 4.1 数学期望 4.2 方差 4.3 常见分布的期望与方差 4.4 协方差与相关系教 第5章 大数定律和中心极限定理 5.1 大数定律 5.2 中心极限定理 第6章 样本与抽样分布 6.1 数理统汁的基本概念 6.2 抽样分布 6.2.1 卡方分布 6.2.2 t分布 6.…...
Java异步编程实战:线框-管道模型的设计与实现
一、什么是线框-管道模型? 线框-管道模型(Pipeline-Filter Pattern)是一种经典的数据处理架构,其核心思想是将复杂任务拆分为多个独立的处理阶段(Filter),通过管道(Pipe)…...
Linux make与makefile 项目自动化构建工具
本文章将对make与makefile进行一些基础的讲解。 假设我们要建造一座房子,建造过程涉及很多步骤,比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序,并且有些步骤可能依赖于其他步骤的完成。比如,你必须先打好地基才…...
鸿蒙 harmonyOS 网络请求
应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 : 在module.json5文件里面添加网络…...
【Tauri2】014——简单使用listen和emit
前言 【Tauri2】013——前端Window Event与创建Window-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146981362?spm1001.2014.3001.5502【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001…...
解锁 C 语言安全新姿势:C11 安全函数全解析
一、开篇:C 语言安全的新护盾 在 C 语言的编程世界里,缓冲区溢出等安全问题犹如潜藏的暗礁,时刻威胁着程序的稳定与安全。为了有效应对这些挑战,C11 标准引入了一系列安全函数,也被称为 “Annex K” 标准库函数。这些…...
【centos】经常使用的脚本
磁盘挂载 yum install wget -y && wget -O auto_disk.sh http://download.bt.cn/tools/auto_disk.sh && bash auto_disk.shYum镜像源更换 bash <(curl -sSL https://linuxmirrors.cn/main.sh)Yum切换安装的java版本 sudo alternatives --config java...
Unity URP渲染管线详解
一、URP概述 Universal Render Pipeline (URP,通用渲染管线)是Unity推出的轻量级、高性能渲染管线解决方案,适用于移动平台、PC和主机等多种平台。 URP核心特点 跨平台支持:针对不同硬件自动优化 模块化设计:可扩展的渲染功能 …...
Python语言的测试用例设计
Python语言的测试用例设计 引言 随着软件开发的不断进步,测试在软件开发生命周期中的重要性日益凸显。测试用例设计是软件测试的核心,它为软件系统的验证和验证提供了实施的基础。在Python语言中,由于其简洁明了的语法和强大的内置库&#…...
【记录】kali制作绕过火绒检测的木马(仅通过MSF的方式)
目的:制作一个能够绕过火绒检测的简单木马,熟悉一下怎么使用msfvenom制作木马,因此此处使用的火绒版本较低。 工具准备:火绒安全-3.0.42.0 【点击免费下载工具】 **实验环境:**kali-2019.4 (攻击方&…...
Linux系统进程
Linux系统进程 程序开始 编译链接的引导代码 操作系统下的应用程序在main执行前也需要先执行段引导代码才能去执行main,但写应用程序时不用考虑引导代码的问题,编译连接时(准确说是链接时)由链接器将编译器中事先准备好的引导代码…...
Obsidian按下三个横线不能出现文档属性
解决方案: 需要在标题下方的一行, 按下 键盘数字0后面那个横线(英文横线), 然后回车就可以了 然后点击横线即可...
GitHub 上开源一个小项目的完整指南
GitHub 上开源一个小项目的完整指南 🚀 第一步:准备你的项目 在开源之前,确保项目是可用且有一定结构的: ✅ 最低要求 项目文件清晰、结构合理(比如:src/、README.md、LICENSE)项目能在本地正…...
大模型——MCP 集成至 LlamaIndex 的技术实践
MCP 集成至 LlamaIndex 的技术实践 一、前言 本文主要介绍了如何将 MCP(Model Context Protocol,模型上下文协议)工具转换为可以直接使用的 LlamaIndex 工具,使 LlamaIndex 用户能像使用 Claude, Cursor 等现代 AI 应用一样无缝集成这些服务。 二、技术背景 2.1 什么是…...
leetcode 1123. 最深叶节点的最近公共祖先
给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。 回想一下: 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d1如果我们假定 A 是一组节点 S …...
LeetCode热题100记录-【链表】
链表 160.相交链表 思考:只要p1和p2不相等就一直在循环里,因为就算都为null也会走到相等 记录:需要二刷 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p1 headA,p2 headB;whi…...
Python 布尔类型
Python 布尔类型(Boolean) 布尔类型是Python中的基本数据类型之一,用于表示逻辑值。它只有两个值: True - 表示真False - 表示假 1. 布尔值的基本使用 # 定义布尔变量 is_active True is_admin Falseprint(is_active) # 输出: True print(is_admi…...
恒盾C#混淆加密卫士 - 混淆加密保护C#程序
对于大部分C#开发者来说,写完代码点个发布就完事儿了,但你可能不知道——用记事本都能扒开你编译好的程序!像dnSpy这类反编译工具,分分钟能把你的EXE/DLL变回原汁原味的源代码,商业机密赤裸裸曝光不说,竞争…...
Java基础 4.4
1.方法快速入门 public class Method01 {//编写一个main方法public static void main(String[] args) {//方法使用//1.方法写好后,如果不去调用(使用),不会输出Person p1 new Person();p1.speak();//调用方法 p1.cal01();//调用计算方法1p1.cal02(10);…...
黑马点评redis改 part 1
本篇将主要阐述短信登录的相关知识,感谢黑马程序员开源,感谢提供初始源文件(给到的是实战第7集开始的代码)【Redis实战篇】黑马点评学习笔记(16万字超详细、Redis实战项目学习必看、欢迎点赞⭐收藏)-CSDN博…...
降维算法之t-SNE
t-SNE(t-Distributed Stochastic Neighbor Embedding)算法详解 先说理解: t-SNE(t-distributed Stochastic Neighbor Embedding)是一种用来“可视化高维数据”的降维方法,通俗来说,它就像一个…...