Spring Boot × K8s 监控实战-集成 Prometheus 与 Grafana
在微服务架构中,应用的可观测性至关重要。Kubernetes 已成为容器化部署的标准,但其自身的监控能力有限,需要与其他工具集成才能实现详细的运行数据采集与分析。
本文将通过 Spring Boot + Kubernetes + Prometheus + Grafana 实战,打造一套高效监控体系,实现“数据采集 → 存储 → 分析 → 可视化”的完整流程。
相关工具简介:
• Kubernetes(K8S):容器化应用的部署与管理平台,其自带的监控能力较为基础。
• Prometheus:开源的云原生监控系统,拉取(pull)Spring Boot Actuator 暴露的监控数据,并提供强大的查询与分析。
• Grafana:可视化工具,将 Prometheus 数据呈现为直观的仪表盘,帮助开发和运维人员实时监控应用状态。
一、搭建监控基础
1.1 配置 Spring Boot 集成 Prometheus
Spring Boot 可以集成 Prometheus,具体步骤如下。
步骤 1:添加必要的依赖
在pom.xml中添加以下依赖:
<!-- Actuator 依赖:提供应用的管理和监控端点 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><!-- Prometheus 依赖:支持 Prometheus 采集监控数据 -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
解析:
Spring Boot Actuator 提供应用运行状态的管理端点,如:
• /actuator/health:应用健康检查
• /actuator/metrics:应用度量指标
• /actuator/prometheus:提供 Prometheus 可抓取的监控数据
Prometheus:
• 以定时抓取(pull模式) 的方式,从指定的 HTTP 端点获取监控数据。
• 默认会读取/actuator/prometheus端点的数据,并存储、分析、提供查询功能。
步骤 2:启用 Prometheus 端点
在application.properties或application.yml中配置 Actuator 端点:
management:endpoints:web:exposure:include: health,metrics,prometheus
这样,/actuator/prometheus端点会暴露,Prometheus 可以抓取该数据。
解析
• 指示 Spring Boot仅暴露health、metrics和prometheus三个管理端点,避免暴露过多无关信息。
• health 端点 是默认启动端点,无需再显示开启。
1.2 Kubernetes 中配置监控
将 Spring Boot 应用部署到 Kubernetes 时,需要确保 Prometheus 能抓取到应用的监控数据。
步骤1:安装Prometheus
使用 Helm 在 Kubernetes 集群中安装 Prometheus Operator:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack
说明:
• helm install prometheus prometheus-community/kube-prometheus-stack:安装 Prometheus 及相关组件,如 Grafana、Alertmanager。
• 默认情况下,Prometheus 会自动发现 Kubernetes 中的 Pod、Service 进行监控,但我们仍需确保 Spring Boot 应用的监控端点可被 Prometheus 访问。
步骤2:创建 Service公开监控端点
创建 KubernetesService文件,并指定要暴露的端口,确保 Prometheus 可以访问/actuator/prometheus端点。
在service.yaml 中配置:
apiVersion: v1
kind: Service
metadata:name: spring-boot-app
spec:ports:- port: 8080targetPort: 8080name: httpselector:app: spring-boot
应用该配置:
kubectl apply -f service.yaml
说明:
• spring-boot-app是Service的名称,它映射到了 Spring Boot 应用的 8080 端口。
• Prometheus 会通过spring-boot-app.default.svc.cluster.local:8080访问应用的/actuator/prometheus端点。这是 Kubernetes 中的 DNS 服务自动解析的规则。
1.3 Prometheus 配置抓取数据
在 Kubernetes 集群中,修改 Prometheus 配置,使其能够定期抓取 Spring Boot 应用的监控数据。
步骤1:配置 Prometheus
1.在 Prometheus 配置目录(如果使用helm安装,则ConfigMap可能已默认配置)下,创建prometheus-config.yaml,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: monitoring
data:prometheus.yml: |global:scrape_interval: 15s # 每 15 秒抓取一次数据scrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'static_configs:- targets: ['spring-boot-app.default.svc.cluster.local:8080']
2.部署ConfigMap到 Kubernetes 集群:
kubectl apply -f prometheus-config.yaml
说明:
• 该ConfigMap将被 Prometheus 读取,指定抓取 Spring Boot 应用的监控数据。
• scrape_interval: 15s表示 Prometheus 每 15 秒抓取一次监控数据。
步骤2:在 Prometheus 部署中加载 ConfigMap
1.修改 Prometheus 的Deployment文件(如果使用 Helm 安装,则需要修改values.yaml配置文件):
apiVersion: apps/v1
kind: Deployment
metadata:name: prometheusnamespace: monitoring
spec:template:spec:volumes:- name: prometheus-config-volumeconfigMap:name: prometheus-configcontainers:- name: prometheusimage: prom/prometheusvolumeMounts:- name: prometheus-config-volumemountPath: /etc/prometheussubPath: prometheus.yml
2.应用修改后的配置:
kubectl apply -f prometheus-deployment.yaml
1.4 验证 Prometheus配置
部署完成后,访问 Prometheus Web UI(默认端口9090):
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
在浏览器打开http://localhost:9090,进入Targets页面,查看spring-boot-app是否在UP状态。
总结
1.Prometheus 安装:使用 Helm 在 Kubernetes 集群中安装kube-prometheus-stack。
2.Service 创建:在 Spring Boot 应用的k8s部署文件夹下创建service.yaml并部署到 Kubernetes。
3.Prometheus 配置:
• 在 Kubernetes 中创建ConfigMap,配置 Prometheus 采集 Spring Boot/actuator/prometheus数据。
• 在 PrometheusDeployment中挂载ConfigMap,确保 Prometheus 正确加载配置。
4.验证监控是否生效:使用kubectl port-forward访问 Prometheus Web UI,确认监控数据是否正常抓取。
二、集成 Grafana可视化
2.1 配置 Grafana
使用 Helm 安装 Grafana:
helm install grafana stable/grafana
访问 Grafana 控制台(默认用户名和密码为admin):
http://<grafana-service-ip>:3000
2.2 配置 Prometheus 数据源
在 Grafana 控制台中配置 Prometheus 为数据源,URL 为:
http://prometheus-server:80
确认连接成功后,Grafana 就可以从 Prometheus 中获取监控数据。
2.3 创建监控面板
在 Grafana 中,选择 Prometheus 数据源,并根据需要创建监控面板。常见监控指标包括 JVM 内存使用、请求响应时间、系统负载、自定义业务指标等。
三、Spring Boot 应用部署到 Kubernetes
3.1 Spring Boot 应用目录结构
通常在 Spring Boot 项目中,会有应用代码和配置,以及部署相关文件,推荐的目录结构如下:
springboot-app/
│── src/ # Spring Boot 代码
│── pom.xml 或 build.gradle # 依赖管理
│── Dockerfile # 构建 Docker 镜像
│── config/ # 应用配置(如 application.yml)
│── deployment/ # K8s 部署文件
│ ├── deployment.yaml # Deployment 资源
│ ├── service.yaml # Service 资源
│ ├── configmap.yaml # 可选的 ConfigMap 资源
│ ├── ingress.yaml # 可选的 Ingress 资源
其中:
• Dockerfile:用于构建 Spring Boot 容器镜像。
• deployment/ 目录:存放 Kubernetes 相关的 YAML 配置文件,用于部署、服务等。
如下是应用部署到K8S 的步骤:
3.2 创建 Docker 镜像
在将 Spring Boot 应用部署到 Kubernetes 前,需要构建 Docker 镜像。在项目根目录下创建Dockerfile:
步骤1:创建 Docker 镜像
# 使用官方的 OpenJDK 镜像作为基础镜像
FROM openjdk:17-jdk-alpine# 设置工作目录
WORKDIR /app# 将 Spring Boot 构建的 JAR 文件复制到容器中
COPY target/myapp.jar app.jar# 设置容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]
解析:
1.FROM openjdk:11-jre-slim: 选择一个基础的 Java 镜像。
2.COPY ${JAR_FILE} app.jar: 将构建好的 Spring Boot JAR 文件复制到容器中。
3.ENTRYPOINT [“java”, “-jar”, “/app.jar”]: 设置容器启动时执行的命令,启动 Spring Boot 应用。
3.3 构建并推送镜像
步骤1:构建镜像
docker build -t springboot-app .
步骤2:推送镜像到镜像仓库
具体步骤:
1.登录 Docker Hub(如果使用 Docker Hub):
docker login
输入用户名和密码以验证身份。
2.给镜像打标签(假设镜像仓库是docker.io):
docker tag springboot-app:latest docker.io/yourusername/springboot-app:latest
为本地镜像springboot-app:latest打上标签,使其能够正确推送到 Docker Hub。yourusername是你的 Docker Hub 用户名,docker.io是 Docker Hub 默认仓库。
3.推送镜像到镜像仓库:
docker push docker.io/yourusername/springboot-app:latest
将打标签后的镜像推送到 Docker Hub 上的仓库。
3.4 部署到 Kubernetes
步骤1:创建deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:name: springboot-app
spec:replicas: 3selector:matchLabels:app: springboot-apptemplate:metadata:labels:app: springboot-appspec:containers:- name: springboot-appimage: springboot-app:latestports:- containerPort: 8080
解析:
1.replicas: 3: 部署三个副本,确保应用高可用。
2.image: springboot-app:latest: 使用构建好的 Docker 镜像。
3.containerPort: 8080: 暴露容器的 8080 端口。
步骤2:部署应用
kubectl apply -f deployment.yaml
此命令会启动一个具有 3 个副本的 Spring Boot 应用,并暴露为一个 Kubernetes 服务。
3.5 创建服务暴露应用
步骤1:创建服务文件service.yaml来暴露应用:
apiVersion: v1
kind: Service
metadata:name: spring-boot-app
spec:ports:- port: 8080targetPort: 8080selector:app: spring-boot
步骤2:应用服务
kubectl apply -f service.yaml
通过如上步骤完成应用部署后,Spring Boot 应用将运行在 Kubernetes 集群中,并可以通过 Prometheus 和 Grafana 进行监控。
四、自动发现服务监控目标
Prometheus 可以通过 Kubernetes 的服务发现功能,自动抓取集群中所有服务的数据。
在 prometheus.yml配置中启用Kubernetes 服务发现:
scrape_configs:- job_name: 'springboot-app'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]target_label: app- source_labels: [__meta_kubernetes_pod_name]target_label: pod_namemetrics_path: '/actuator/prometheus'scheme: httpport: 8080
这样 Prometheus 能够自动发现 Kubernetes 中的 Spring Boot 服务,无需手动添加监控信息。
五、Grafana 高级功能
5.1 设置报警规则
Grafana 不仅能够展示监控数据,还能够设置报警规则。您可以配置响应时间、错误率等阈值,当超过指定条件时触发报警。
以下是设置报警规则的步骤:
1.在 Grafana 仪表板中,选择一个面板,点击 “Edit”。
2.选择 “Alert” 标签,点击 “Create Alert”。
3.配置报警条件,如当响应时间大于 2 秒时触发报警。
5.2 多面板展示
Grafana 支持将不同类型的监控数据展示在同一面板上。如将 CPU 使用率、内存使用情况、请求响应时间等多个图表放在同一个仪表板上,创建一个综合的监控视图。
六、构建跨微服务的完整监控系统
在微服务架构中,监控不仅限于单一服务,而是需要跨多个服务进行集中管理。使用 Prometheus 和 Grafana可以轻松实现跨微服务的监控。
6.1 Prometheus 联邦聚合
功能:允许多个 Prometheus 实例将监控数据聚合到一个中央实例,适用于多集群环境。通过配置prometheus.yml,您可以将其他 Prometheus 实例作为数据源,进行数据聚合。
示例配置:
scrape_configs:- job_name: 'federated' # 定义抓取任务名称,这里为 'federated'metrics_path: '/federate' # 指定聚合抓取的路径,通常 Prometheus 会在 /federate 路径提供聚合数据static_configs:- targets: ['prometheus-instance-1:9090', 'prometheus-instance-2:9090'] # 配置聚合 Prometheus 实例的地址,指向其他 Prometheus
实例的 API,通常是每个集群中 Prometheus 的地址。
这样中央 Prometheus 实例将定期抓取多个实例的数据。
6.2 Grafana 跨集群展示
功能:在 Grafana 中配置多个 Prometheus 数据源,集中展示不同集群的监控数据。这样,您可以通过一个仪表板查看多个集群的指标。
操作:在 Grafana 的 “Data Sources” 设置中添加不同 Prometheus 数据源,每个数据源指向不同的集群实例。
七、总结
7.1 核心重点:
• Spring Boot 与 Kubernetes 集成
在 Kubernetes 中部署 Spring Boot 应用,实现容器化管理与自动扩展。
• Prometheus 集成与优化
使用 Spring Boot Actuator 暴露监控端点,配置 Prometheus 自动抓取数据,优化监控准确性。
• Grafana 可视化面板配置
配置 Grafana 连接 Prometheus,展示应用健康、性能和资源使用情况。
相关文章:
Spring Boot × K8s 监控实战-集成 Prometheus 与 Grafana
在微服务架构中,应用的可观测性至关重要。Kubernetes 已成为容器化部署的标准,但其自身的监控能力有限,需要与其他工具集成才能实现详细的运行数据采集与分析。 本文将通过 Spring Boot Kubernetes Prometheus Grafana 实战,打…...
SpringBoot+Mybatis通过自定义注解实现字段加密存储
😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBootMybatis实现字段加密 ⏱️ 创作时间: 2025年04月…...
Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush.
目录 Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush. 一、问题现象与本质 二、七大高频错误场景与解决方案 1、Setup初始化陷阱 2、模板中的"幽灵属性" 3、异步操作的"定时炸弹" 4、组件嵌套黑洞 5…...
第35周Zookkeeper+Dubbo Zookkeeper
第35周ZooKeeperDubbo ZooKeeper 一、周介绍 本周主要内容包括ZooKeeper、Dubbo以及面试三部分。 1.1 ZooKeeper 节点介绍 ZooKeeper的数据结构核心是每个node节点。节点具有属性、特点和功能,其数据结构为树形结构,类似于多叉树,分隔符是…...
基于tabula对pdf中多个excel进行识别并转换成word中的优化(四)
对上一节进行优化: 1、识别多个excel 2、将表格中的nan替换成空字符串 一、示例中的pdf内容 二、完整代码参考: import tabula import numpy as np from docx import Document from docx.oxml.ns import qn from docx.oxml import OxmlElementdef get_t…...
Electron-vite中ELECTRON_RENDERER_URL环境变量如何被设置的
近期我专注于前端技术栈 Electron 与 Vue3 的学习实践,依照教程网站 快速开始 | electron-vite 的快速入门指引,搭建了一个示例项目。成功完成项目下载,并通过 npm run dev 命令启动项目后,在研读项目 main 目录下的 index.ts 文件…...
Electron Forge【实战】桌面应用 —— 将项目配置保存到本地
最终效果 定义默认配置 src/initData.ts export const DEFAULT_CONFIG: AppConfig {language: "zh",fontSize: 14,providerConfigs: {}, };src/types.ts export interface AppConfig {language: zh | enfontSize: numberproviderConfigs: Record<string, Recor…...
gem5-gpu 安装过程碰到的问题记录 关于使用 Ruby + Garnet
如何使用Garnet? 这并不像一组命令行参数那么简单。要使用gem5-gpu+garnet,您可能需要修改python配置脚本。 问题是配置文件gem5-gpu/configs/gpu_protocol/VI_hammer_fusion.py指定了链接的intBW和extBW。 看来Garnet不支持这一点。然而,似乎所有的链路都是相同的带宽,所…...
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
一、基本介绍 MobileIMSDK是一套全平台原创开源IM通信层框架: 超轻量级、高度提炼,lib包50KB以内;精心封装,一套API同时支持UDP、TCP、WebSocket三种协议(可能是全网唯一开源的);客户端支持iOS…...
《阿里Qwen3开源:AI新纪元的破晓之光》
《阿里Qwen3开源:AI新纪元的破晓之光》 惊爆!阿里释放 Qwen3 “大杀器” 在人工智能的星辰大海中,每一次新模型的诞生都如同点亮一颗新星,而阿里巴巴此次发布并开源 Qwen3,无疑是投下了一枚震撼弹,瞬间吸引了全球 AI 领域的目光。这不仅是阿里在 AI 征程上的一座重要里程…...
前端防护利器:disable-devtool 使用指南 - 保护你的Web应用安全
文章目录 前端防护利器:disable-devtool 使用指南 - 保护你的Web应用安全为什么需要禁用开发者工具?什么是 disable-devtool?安装与引入通过npm/yarn安装通过CDN引入ES6模块引入配置选项详解完整使用示例检测模式说明最佳实践在线考试系统防护敏感数据保护注意事项更多资源前…...
万物皆可执行:多功能机器人正在定义新生产力法则
引言 当波士顿动力的Atlas完成高难度体操动作,当特斯拉Optimus在工厂精准分拣零件,当小鹏Iron机器人以拟态双手递上咖啡——这些场景不再只是科幻电影的桥段,而是多功能机器人(Polyfunctional Robots)带来的真实变革…...
从车道检测项目入门open cv
从车道检测项目入门open cv 前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助。同时希望各位大佬积积极提出宝贵的意见。😊😊😊(❁◡❁)(●’◡’●)╰(▽)╯ github地址:https://github.com/liz…...
Vue3取消网络请求的方法(AbortController)
在 Vue3 中,已经发出的请求是否可以被取消,取决于你使用的 HTTP 客户端库。Vue3 本身不直接处理 HTTP 请求,但通常搭配 Axios 或原生 fetch 使用。以下是两种主流方案的取消方法: 1. 使用 Axios CancelToken Axios 提供了 Cance…...
深度解析Qwen3:性能实测对标Gemini 2.5 Pro?开源大模型新标杆的部署挑战与机遇
大语言模型(LLM)的浪潮持续席卷技术圈,性能天花板不断被刷新。以 Gemini 2.5 Pro 为代表的闭源模型展现了惊人的能力,但其高昂的成本和有限的可访问性也让许多开发者望而却步。与此同时,开源力量正以前所未有的速度崛起…...
AI遇见端动态神经网络:Cephalon(联邦学习+多模态编码)认知框架构建
前引: 在数字化浪潮席卷全球的今天,数据爆炸与算力需求的指数级增长正推动着云计算向更智能、更高效的方向演进。面对海量终端设备的实时响应需求、复杂AI模型的分布式训练挑战,以及多场景数据的协同处理难题,传统云架构逐渐显露出…...
机器学习之五:基于解释的学习
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念,…...
高翔视觉slam中常见的OpenCV和Eigen的几种数据类型的内存布局及分配方式详解
vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> 内存布局及分配方式详解 1. 内存对齐的必要性 Eigen 的固定大小类型(如 Eigen::Vector2d、Eigen::Matrix4d 等)需要 16 字节内存对齐,以支持 SIMD 指令(如 SSE/AVX)的并行计算。若未对…...
电子电器架构 --- 人工智能、固态电池和先进自动驾驶功能等新兴技术的影响
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
【C++11】类的新功能
前言 上文我们学习了包装器:function和bind。function可以包装一切可调用对象,并用统一的调用方式调用不同的可调用对象。bind则可以控制函数参数个数【C11】包装器:function与bind-CSDN博客 本文我们来学习C11的类中新增的一些功能 默认的移…...
1.6 点云数据获取方式——单目相机多视图几何
图1-6-1多视图几何重建 单目相机的多视图几何研究具有重要的理论与实际意义。在理...
马井堂-区块链技术:架构创新、产业变革与治理挑战(马井堂)
区块链技术:架构创新、产业变革与治理挑战 摘要 区块链技术作为分布式账本技术的革命性突破,正在重构数字时代的信任机制。本文系统梳理区块链技术的核心技术架构,分析其在金融、供应链、政务等领域的实践应用,探讨共识算法优化、…...
MicroBlaze软核的开发使用
一、MicroBlaze 介绍 MicroBlaze 是由 Xilinx 开发的一种可配置的 32 位 RISC 软处理器内核。它作为 FPGA 设计中的 IP 核,通过 Vivado 工具进行配置和集成。MicroBlaze 提供了高度的灵活性,允许开发人员根据应用需求调整处理器的功能、性能和资源占用。…...
是从原始数据到价值挖掘的完整流程解析,涵盖数据采集、清洗、存储、处理、建模、可视化等核心环节,并附上完整代码示例(含详细注释)及技术选型建议表
以下是从原始数据到价值挖掘的完整流程解析,涵盖数据采集、清洗、存储、处理、建模、可视化等核心环节,并附上完整代码示例(含详细注释)及技术选型建议表。 一、全流程技术栈概览 阶段核心任务关键技术/工具数据采集获取原始数据…...
【爬虫】案例-获取cbh电影
以cupfox.in为例子: 观察ts文件和m3u8文件,可以知道一个完整的视频是由多个ts文件组合,而m3u8则是记录所有ts文件信息的文本 思路 1.先爬一个ts,测试能否观看 2.爬m3u8文件,通过正则分析出变化的部分 3.完整的把每个…...
分治而不割裂—分治协同式敏捷工作模式
分治而不割裂:解密敏捷协同工作模式如何驱动大企业持续领跑 在数字化浪潮中,亚马逊仅用11天完成Prime Day全球技术架构升级,华为5G基站项目组创造过单周迭代47个功能模块的纪录,这些商业奇迹的背后,都隐藏着一个共性秘…...
【MySQL】聚合查询 和 分组查询
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 🌴 一、聚合查询 🌲1.概念 🌲2.聚合查询函数 COUNT() SUM() AVG(&…...
Weka通过10天的内存指标数据计算内存指标动态阈值
在数据处理和监控系统中,动态阈值的计算是一种常见的方法,用以根据数据的实际分布和变化来调整阈值,从而更有效地监控和预警。在Weka中,虽然它主要是用于机器学习和数据挖掘的工具,但你可以通过一些间接的方法来实现…...
iOS签名的包支持推送功能吗?
推送失败的可能原因: 1. 生产包没有上报token ,所以无法推送成功,需要检查是否在企业包签名后导致无法完成apns的注册,无法从Apple取到token 2. 问题可能出在证书上,因为iOS推送有一个开发证书和一个生产证书ÿ…...
JavaWeb:后端web基础(TomcatServletHTTP)
一、今日内容 二、Tomcat 介绍与使用 介绍 基本使用 小结 配置 配置 查找进程 三、Servlet 什么是Servlet 快速入门 需求 步骤 1.新建工程-模块(Maven) 2.修改打包方式-war 3.编写代码 /*** 可以选择继承HttpServlet*/ WebServlet("/hello&q…...
关于浏览器对于HTML实体编码,urlencode,Unicode解析
目录 HTML实体编码 URL编码 Unicode编码 解析层次逻辑 为什么<script></script>不可以编码符号 为什么不能编码JavaScript:协议 为什么RCDATA标签中的都会被解析成文本 为什么HTML编码了<>无法执行 HTML实体编码 通过特殊语法(<、>…...
C++智能指针滥用带来的性能与内存问题有哪些
在现代C编程中,智能指针(Smart Pointers)已经成为开发者工具箱中不可或缺的一部分。它们作为一种对传统裸指针(Raw Pointers)的替代方案,旨在解决长期困扰C开发者的内存管理难题。C作为一门高性能的系统编程…...
C++算法(17):reverse函数用法详解,头文件<algorithm>与实战示例
在C中,std::reverse 函数用于反转容器或数组中元素的顺序,需包含头文件 <algorithm>。以下是其用法详解: 基本用法 函数原型: template <class BidirIt> void reverse(BidirIt first, BidirIt last); 参数…...
【滑动窗口】最大连续1的个数|将x减到0的最小操作数
文章目录 1.最大连续1的个数2.将x减到0的最小操作数 1.最大连续1的个数 解法: 1.暴力解法给定一个left指针固定左端点元素,再给定一个right指针从左端点元素开始遍历。 当遇到1时,让一个计数器cnt1,当遇到0时,让统计0…...
MySQL 在 CentOS 7 环境下的安装教程
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
嵌入式复习第一章
1. 嵌入式系统概念、应用与特点 2. 嵌入式系统的硬件( CPU 、外设) 3. 主要嵌入式软件系统(应用及 OS ) 4. 嵌入式系统的发展趋势 嵌入式系统定义 “以 应用为中心 ,以计算机技术为基础,并且软硬件…...
【C#】.net core6.0无法访问到控制器方法,直接404。由于自己的不仔细,出现个低级错误,这让DeepSeek看出来了,是什么错误呢,来瞧瞧
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(三)
基于前两篇内容,继续完善企业官网页面: Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(一)-CSDN博客 Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(二)-CSDN博客 3.5 联系方…...
Opencv中图像深度(Depth)和通道数(Channels)区别
在OpenCV中,图像深度(Depth)和通道数(Channels)是两个完全不同的概念,需严格区分。以下是详细解析: 图像深度(Depth) 定义:指图像中每个像素通道的位数&#…...
【网络原理】从零开始深入理解HTTP的报文格式(一)
本篇博客给大家带来的是网络HTTP协议的知识点, 重点介绍HTTP的报文格式. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅Ὠ…...
Go语言之路————接口、泛型
Go语言之路————接口 前言接口定义实操,接口的定义和实现接口的继承空接口和Any 泛型类型集 结语 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后…...
Go语言中的 `time.Tick` 函数详解
time.Tick 是 Go 标准库中用于创建周期性定时器的简便函数。 函数签名 func Tick(d Duration) <-chan Time核心功能 创建一个周期性的定时器通道当 d < 0 时返回 nil返回一个只读的时间通道,定期发送当前时间 与 NewTicker 的关系 time.Tick 是 time.New…...
打印及判断回文数组、打印N阶数组、蛇形矩阵
打印回文数组 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1方法1: 对角线对称 左上和右下是对称的。 所以先考虑左上打印, m i n ( i 1 , j 1 ) \text min(i1,j1) min(i1,j1),打印出来: 1 1 1 1 1 2 2 2 1 2 3 3 1 2 …...
【图像融合】基于非负矩阵分解分解 CNMF的高光谱和多光谱数据融合附MATLAB代码
基于CNMF的高光谱与多光谱数据融合技术详解 一、非负矩阵分解(NMF)与约束非负矩阵分解(CNMF)的核心原理 NMF的基本概念 非负矩阵分解(NMF)是一种通过将非负矩阵分解为两个非负矩阵乘积的降维方法。给定非负…...
HarmonyOS NEXT 诗词元服务项目开发上架全流程实战(一、项目介绍及实现效果)
在当今数字化时代,如何让传统文化与现代科技相结合,成为了一个值得思考的问题。诗词作为中国传统文化的重要组成部分,承载着丰富的历史信息和文化内涵。为了让更多人了解和欣赏诗词的魅力,我们决定开发一款基于HarmonyOS NEXT的诗…...
线性代数与数据学习
The Functions of Deep Learning (essay from SIAM News, December 2018) Deep Learning and Neural Nets...
Linux中的计划任务
一次性任务 功能介绍: 如果我们希望在将来的某个时间点去执行某件事件,这个事件执行完后任务就结束,那么我们 就可以使用一性计划任务。而要实现这种功能,我们需要任务 atd 服务。我们先查询一下系 统是否存在这个服务。 查看是…...
【C++】线程池
C 线程池介绍 什么是线程池? 线程池(Thread Pool) 是一种并发编程模型,用于管理和复用多个线程,避免频繁创建/销毁线程的开销。它通过预创建一组线程,并将任务提交到队列中,由空闲线程自动执行…...
美团社招一面
美团社招一面 做题 1、面试题 <style> .outer{width: 100px;background: red;height: 100px; }.inner {width: 50px;height: 50px;background: green; }</style> <div class"outer"><div class"inner"></div> </div>…...
C++:BST、AVL、红黑树
C:BST、AVL、红黑树 二叉搜索树(BST)二叉平衡搜索树(AVL)红黑树(RBT)三者对比什么情况下使用?C 标准库中的使用总结 二叉搜索树(BST) 二叉搜索树(Binary Sea…...