ALG(Alloy+Loki+Grafana)轻量级日志系统
ALG(Alloy+Loki+Grafana)轻量级日志系统
前提要求
- Grafana
- Minio
- Nginx
- Prometheus
Grafana日志收集系统旧版是PLG(Protail+Loki+Grafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种exporter功能, 代替传统模式下需要安装xxxx_exporter插件才能采集指标的情况
ALG适合云原生, 拓展性强, 但是对于传统的日志收集是很支持(后续有Alloy采集本地日志log, gz等格式案例)
读写分离模式部署ALG
初始化文件夹和一些配置文件
初始化文件夹
# log日志存储
mkdir -p /data/alg/flog/logs/log
# 日志压缩文件存储
mkdir -p /data/alg/flog/logs/gz
# minio存储
mkdir -p /data/alg/minio
创建nginx配置文件
vim /data/alg/nginx.conf
user nginx;
worker_processes 5; # worker线程数events {worker_connections 1000; # 单个worker连接数
}http {# 使用Docker内置DNS解析服务名, DNS缓存有效期10秒resolver 127.0.0.11 valid=10s;# 开启访问日志, 生产中建议关闭access_log on;# 定义上游Loki writer服务器组upstream loki_writers {server write:3100;# 保持长连接池keepalive 32;}# 定义上游Loki reader服务器组upstream loki_readers {server read:3100;keepalive 32;}# 定义上游alloy服务器组upstream alloys {server alloy:12345;}# Grafana UIserver {listen 3000;location / {proxy_pass http://grafana:3000;# 代理设置请求头, 否则Grafana会提示一直登录# 并且要设置WebSocket, 否则无法运行实时跟踪# 见https://blog.csdn.net/weixin_41287260/article/details/134630447# https://www.cnblogs.com/hahaha111122222/p/16407564.htmlproxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $http_host;}}# Loki相关日志推送, 存储等配置server {# 监听容器内 3100 端口(通过 ports 映射到宿主机 3100)启用端口复用提升性能listen 3100 reuseport;# 定义写入类请求的通用配置块location ~ ^/(api/prom/push|loki/api/v1/push) {proxy_pass http://loki_writers$request_uri;proxy_http_version 1.1;proxy_set_header Connection "";}# 定义实时日志流式传输(tail)请求的通用配置块location ~ ^/(api/prom/tail|loki/api/v1/tail) {proxy_pass http://loki_readers$request_uri;proxy_read_timeout 3600s;# 这里必须要配置WebSocket, 否则无法运行实时跟踪proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}# 定义所有 Prometheus 格式和 Loki 原生格式查询请求的通用配置块location ~ ^/(api/prom/.*|loki/api/.*) {proxy_pass http://loki_readers$request_uri;proxy_http_version 1.1;proxy_set_header Connection "";# 缓存查询结果10秒proxy_cache_valid 200 10s;}}# read 端点, 生产中应该禁外界访问(这里做演示, 所以开放), 容器内部通信即可server {listen 3101;location / {proxy_pass http://loki_readers/ready;}}# write 端点, 生产中禁外界访问(这里做演示, 所以开放), 容器内部通信即可server {listen 3102;location / {proxy_pass http://loki_writers/ready;}}# Minio UIserver {listen 9001;location / {proxy_pass http://minio:9001;# 添加websocket支持, 否则Minio会卡主, 页面一直loading# 见https://blog.csdn.net/qq_25231683/article/details/128734555proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $http_host;}}# Alloy UIserver {listen 12345;location / {proxy_pass http://alloys;}}
}
创建alloy配置文件
vim /data/alg/alloy-local-config.yaml
// ========================
// 实时调试
// ========================
livedebugging {enabled = true
}// ========================
// Docker容器日志发现和采集
// ========================
// Docker 容器发现配置
discovery.docker "flog_scrape" {// 连接 Docker daemon 的地址(Unix 套接字)host = "unix:///var/run/docker.sock" // 每5s抓取Docker信息日志refresh_interval = "5s"
}// 主要用于服务发现阶段对发现的目标(如容器、节点等)的元数据标签进行预处理。当通过服务发现机制(如基于 Docker、Kubernetes 等)发现一系列目标时,这些目标会带有各种元数据标签,这里可以对这些原始标签进行修改、添加、删除等操作,使得标签更加符
discovery.relabel "flog_scrape" {// 初始空目标列表(自动从上游发现discovery.docker "flog_scrape"填充)targets = [] // 提取容器名称rule {// 原始元数据标签(来自 Docker 的属性)source_labels = ["__meta_docker_container_name"] // 正则提取容器名称(去除路径前缀)regex = "/(.*)" // 生成新标签 container 存储处理结果target_label = "container"}// 提取项目名rule {//source_labels = ["__meta_docker_container_label_com_docker_compose_project"]regex = "(.*)" target_label = "project" }
}// Loki Docker 日志采集配置
loki.source.docker "flog_scrape" {// Docker 连接配置(需与发现模块一致)host = "unix:///var/run/docker.sock" // 要从中读取日志的容器列表, 关联发现模块获取的目标列表targets = discovery.docker.flog_scrape.targets // 日志转发目的地(指向写入模块)forward_to = [loki.write.default.receiver] // 应用标签重写规则relabel_rules = discovery.relabel.flog_scrape.rules // 目标同步频率(与发现模块同步)refresh_interval = "5s"
}// ========================
// *.log文件匹配和采集
// ========================
// 本地*.log文件匹配
local.file_match "local_log" {path_targets = [{__path__ = "/data/alg/flog/logs/log/*.log"},]
}// ========================
// 本地*.log文件采集
// ========================
loki.source.file "local_log" {// 关联发现模块获取的目标列表, 关联到本地机器日志匹配targets = local.file_match.local_log.targets// 日志转发目的地(指向写入模块)forward_to = [loki.write.default.receiver]
}// ========================
// *.gz文件匹配和采集
// ========================
// 本地*.gz文件匹配
local.file_match "local_log_gz" {path_targets = [{__path__ = "/data/alg/flog/logs/gz/*.gz"},]
}// 本地*.log文件采集
loki.source.file "local_log_gz" {// 关联发现模块获取的目标列表, 关联到本地机器日志匹配targets = local.file_match.local_log_gz.targets// 日志转发目的地(指向写入模块)forward_to = [loki.write.default.receiver]// 解压缩decompression {// 是否启用解压缩enabled = true// 开始从新的压缩文件读取之前要等待的时间initial_delay = "10s"// 使用的压缩格式Gzipformat = "gz"}
}// ========================
// Loki 日志写入配置
// ========================
loki.write "default" {// 将日志发送到的位置endpoint {// 要将日志发送到的完整 URL, Loki 接收端 API 地址url = "http://gateway:3100/loki/api/v1/push"// 发送前要累积的最大日志批次大小batch_size = "1MiB"// 发送批次前要等待的最长时间batch_wait = "1s"// 多租户标识(生产环境建议动态获取)tenant_id = "tenant1"}// 附加全局标签(当前为空配置)external_labels = {}
}
创建loki配置文件
vim /data/alg/loki-config.yaml
# ========================
# Loki 服务核心配置
# ========================
server:http_listen_address: 0.0.0.0 # 监听所有网络接口http_listen_port: 3100 # 默认 Loki 服务端口# ========================
# 集群节点发现与通信配置
# ========================
memberlist:join_members: ["read", "write", "backend"] # 需要连接的初始节点列表(建议使用IP或DNS)dead_node_reclaim_time: 30s # 节点标记为死亡后保留元数据的时间gossip_to_dead_nodes_time: 15s # 停止向死亡节点发送gossip包的时间left_ingesters_timeout: 30s # 离开节点清理超时时间bind_addr: ['0.0.0.0'] # 集群通信绑定地址bind_port: 7946 # 集群通信端口gossip_interval: 2s # 节点状态同步间隔# ========================
# 数据存储架构配置
# ========================
schema_config:configs:- from: 2023-01-01 # 配置生效起始时间store: tsdb # 使用 Prometheus TSDB 存储object_store: s3 # 对象存储类型schema: v13 # 存储格式版本index:prefix: index_ # 索引文件前缀period: 24h # 索引文件切割周期# ========================
# 公共基础配置
# ========================
common:path_prefix: /loki # 存储路径前缀replication_factor: 1 # 数据副本数(生产环境建议 >=3)compactor_address: http://backend:3100 # 压缩组件地址# 对象存储配置storage:# S3对象存储s3:endpoint: minio:9000 # S3兼容存储地址insecure: true # 禁用HTTPS(生产环境不推荐)bucketnames: loki-data # 主数据存储桶access_key_id: whiteBrocade # 访问密钥(建议使用环境变量)secret_access_key: whiteBrocade # 密钥(存在安全隐患)s3forcepathstyle: true # 强制路径访问模式# 本地文件存储(由于是容器形式启动loki, 这里指的是容器内系统)#filesystem:# # 数据保存的地方# chunks_directory: /tmp/loki/chunks# # 规则保存的地方# rules_directory: /tmp/loki/rules# 一致性哈希环配置ring:kvstore:store: memberlist # 使用memberlist实现分布式哈希环# ========================
# 告警规则配置
# ========================
ruler:storage:s3:bucketnames: loki-ruler # 独立存储告警规则的桶# ========================
# 数据压缩配置
# ========================
compactor:working_directory: /tmp/compactor # 临时工作目录(建议使用持久化存储)
docker-compose文件
ALG
- loki使用的是读写分离模式部署, 拆分成了read, write, backend三个组件
- 存储使用的Minio, 生产中建议对存储日志的桶设置过期策略, 减少存储成本
- 使用ng作为网关统一入口, 有些端口生产中不应该开放, 比如说loki的read和write的read访问
version: "3.8"
# ========================
# 自定义网络配置
# ========================
networks:loki: # 创建专用网络确保服务隔离driver: bridgeservices:# ========================# Loki 读取组件(查询节点)# ========================read:image: grafana/loki:latest# 容器名container_name: loki-read# 指定read模式启动command: "-config.file=/etc/loki/config.yaml -target=read" # 指定角色为读取节点ports:- 3100 # 映射外部访问端口- 7946 # memberlist 通信端口- 9095 # 指标暴露端口(未映射到宿主机)volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yaml # 共享配置文件healthcheck: # 健康检查策略test: ["CMD-SHELL", # 使用 shell 执行命令"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1"]interval: 10s # 每10秒检查一次timeout: 5s # 超时时间5秒retries: 5 # 最多重试5次depends_on: # 依赖Minio- minio# 定义网络锚点, 后续直接复用networks: &loki-dns # 网络别名锚点loki:aliases:- loki # 其他服务可通过 loki 域名访问# ========================# Loki 写入组件(接收节点)# ========================write:image: grafana/loki:latest# 容器名container_name: loki-write# 指定write模式启动command: "-config.file=/etc/loki/config.yaml -target=write"ports:- 3100 # 与读节点区分端口- 7946 # memberlist 通信端口- 9095 # 指标暴露端口(未映射到宿主机)volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yamlhealthcheck: # 健康检查策略test: ["CMD-SHELL", # 使用 shell 执行命令"wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1"]interval: 10s # 每10秒检查一次timeout: 5s # 超时时间5秒retries: 5 # 最多重试5次depends_on: # 依赖Minio- minionetworks:<<: *loki-dns # 复用网络别名配置# ========================# Loki 后台处理组件# ========================backend:image: grafana/loki:latest# 容器名container_name: loki-backendcommand: "-config.file=/etc/loki/config.yaml -target=backend -legacy-read-mode=false"ports:- 3100 # 默认API端口(未映射到宿主机)- 7946 # memberlist端口volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yamlnetworks:- loki# ========================# 日志采集组件(原Grafana Agent)# ========================alloy:image: grafana/alloy:latest# 容器名container_name: alloycommand: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloyports:- 12345 # Web UI端口volumes:# 将程序产生的*.log,*.gzd的父目录映射到alloy, 这样才能探测到- /data/alg/flog/logs:/data/alg/flog/logs- /data/alg/alloy-local-config.yaml:/etc/alloy/config.alloy:ro # 采集配置- /var/run/docker.sock:/var/run/docker.sock # 挂载docker socket, 如果不挂载这个, 那么没法获取到容器的日志networks:- loki# ========================# 对象存储服务(S3兼容)# ========================minio:image: minio/minio:latest# 容器名container_name: minioentrypoint: # 初始化存储目录- sh - -euc # 执行脚本的参数:e(报错退出) u(未定义变量报错) c(执行后续命令)- | # 多行脚本开始, minio创建目录挂载日志mkdir -p /data/loki-data && \mkdir -p /data/loki-ruler && \minio server /data --console-address :9001environment:- MINIO_ROOT_USER=whiteBrocade # 用户名(与Loki配置对应)- MINIO_ROOT_PASSWORD=whiteBrocade # 密码(需加密处理)- MINIO_PROMETHEUS_AUTH_TYPE=public # 开放指标volumes:- /data/alg/minio:/data # 持久化存储路径ports:- 9000 # API端口- 9001 # UI端口networks:- loki# ========================# 可视化平台# ========================grafana:image: grafana/grafana-enterprise:latest# 容器名container_name: grafana# 数据持久化environment:- GF_AUTH_ANONYMOUS_ENABLED=true # 开启匿名访问(生产环境应关闭)# 设置 Grafana 的管理员(admin)账户的初始密码为admin - GF_SECURITY_ADMIN_PASSWORD=admin# 设置Grafana的语言为简体中文- GF_VIEWER_LANGUAGE=zh-Hans# 设置 Grafana 的默认用户界面主题为暗黑模式- GF_USERS_DEFAULT_THEME=dark- GF_PATHS_PROVISIONING=/etc/grafana/provisioningentrypoint: # 覆盖默认启动命令, 动态创建Loki数据源配置- sh- -euc # 执行脚本的参数- | # 多行脚本开始mkdir -p /etc/grafana/provisioning/datasourcescat <<EOF > /etc/grafana/provisioning/datasources/ds.yamlapiVersion: 1# 初始化Loki数据源datasources:- name: Loki # 显示在UI中的名称type: loki # 数据源类型access: proxy # 通过Grafana服务代理访问url: http://gateway:3100 # 通过NG网关访问jsonData:httpHeaderName1: "X-Scope-OrgID" # # 多租户头部名称secureJsonData:httpHeaderValue1: "tenant1" # 租户IDEOF/run.shports:- 3000 # Web访问端口depends_on: # 依赖网关服务- gatewaynetworks:- loki# ========================# API网关(流量路由)# ========================gateway:image: nginx:latest# 容器名container_name: nginxvolumes:- /data/alg/nginx.conf:/etc/nginx/nginx.confports:- 3000:3000 # Grafana UI- 3100:3100 # Loki统一入口端口- 3101:3101 # read 端点- 3102:3102 # write 端点- 9001:9001 # Minio UI- 12345:12345 # Alloy UIhealthcheck: # 健康检查策略test: ["CMD", "service", "nginx", "status"]interval: 10stimeout: 5sretries: 5depends_on:- read- write- alloynetworks:- loki
ALG相关访问路径
启动ALG
Grafana UI
-
访问地址(这里换成你自己的IP): http://192.168.132.10:3000
-
账号: admin
-
密码: admin
Minio UI
- 访问地址(这里换成你自己的IP): http://192.168.132.10:9001
- 账号: whiteBrocade
- 密码: whiteBrocade
Grafana Alloy UI
- 访问地址(这里换成你自己的IP): http://192.168.132.10:12345
Loki Read/Write组件
- Read访问地址(这里换成你自己的IP): http://192.168.132.10:3101
- Write访问地址(这里换成你自己的IP): http://192.168.132.10:3102
Flog
使用flog生成日志, 模拟三种情况
- Docker容器日志
- 本地*.log日志
- 本地*.log.gz
version: "3.8"
services:# ========================# log 是一个由 mingrammer 开发的开源项目,主要用于生成常见的日志格式,如 Apache 通用日志、Apache 错误日志和 RFC3164 系统日志# 日志会输出到 容器内部的标准输出(stdout)# ========================flog-stdout:image: mingrammer/flog:latest# 容器名container_name: flog-stdout# -f json:日志格式, 这里指定为json# -d 200ms: 日志产生的速度# -t stdout: 输出类型为标准输出# -l: 无限循环生成日志command: -f json -d 200ms -t stdout -l# 这里的日志持久化, 用于应用程序产生的*.log日志以及压缩日志flog-log:image: mingrammer/flog:latest# 容器名container_name: flog-log# -f json:日志格式, 这里指定为json# -d 200ms: 日志产生的速度# -t log: s输出类型为log日志# -l: 无限循环生成日志# -w: 覆盖已存在的日志文件# -o /data/logs/test.log: 将日志输出到文件中# -p 1048576: 当日志文件达到1MB的时候就会分割日志# -b 10485760 该路径下/data/logs/*.log最多生成10MBcommand: -f json -d 200ms -l -t log -w -o /data/logs/test.log -p 1048576 -b 10485760# 将日志映射到宿主机上, 模拟非容器环境部署程序产生的日志文件volumes:- /data/alg/flog/logs/log:/data/logsflog-gz:image: mingrammer/flog:latest# 容器名container_name: flog-gz# -f json:日志格式, 这里指定为json# -t gz: 输出类型为gzip文件# -l: 无限循环生成日志# -w: 覆盖已存在的日志文件# -o /data/logs/test.log.gz: 将日志输出到test.log.gz# -p 1048576: 当日志文件达到1MB的时候就会分割日志# -b 10485760 该路径下/data/logs/*.gz最多生成10MBcommand: -f json -l -t gz -w -o /data/logs/test.log.gz -p 1048576 -b 10485760# 将日志映射到宿主机上, 模拟非容器环境部署程序产生的日志文件volumes:- /data/alg/flog/logs/gz:/data/logs
启动Flog容器, 如下图
效果
容器日志查看
访问http://192.168.132.10:3000的Grafana面板, 选择Expore, 查看Nginx容器的日志
日志如下
log日志和log.gz日志查看
访问http://192.168.132.10:3000, 通过filename标签(这个标签是alloy内置自动添加的)查看log日志
查看gz格式的压缩日志
Alloy代替Node Exporter方式采集主机信息
alloy除了可以用于收集日志, 还可以采集主机信息, 发送给Prome
参考资料
ALG
博客
Grafana 系列文章(一):基于 Grafana 的全栈可观察性 Demo
Grafana Loki 简要指南:关于标签您需要了解的一切
开源日志监控:Grafana Loki 简要指南
日志之Loki详细讲解
使用读写分离模式扩展 Grafana Loki
Loki部署模式
grafana loki的理解与配置(2.9)
轻量级日志系统docker-compose搭建Loki+Grafana+Promtail,配置、部署,查询全流程
轻量级日志系统-Loki
轻量级日志系统笔记ALG
开源项目推荐:flog
推荐一个小工具:flog
探索Flog:伪装日志流量的神器
gitcode的flog项目
Docker 环境中配置 Grafana:详细教程与常见配置项解析
项目集成grafana,并用非root用户启动
在docker-compose启动grafana,出现权限错误的解决方案
Docker上的Grafana 7.3.0存在权限问题
grafana重启后模板没有数据了 grafana新建dashboard
Docker安装grafana数据持久化+配置SMTP
springboot+Loki+Loki4j+Grafana搭建轻量级日志系统
视频
【IT老齐636】Grafana Loki vs ELK
【IT老齐710】Grafana ALG分布式日志收集架构
【IT老齐711】ALG收集Docker所有实例运行日志
Grafana+Loki+Alloy快速构建企业日志系统
k8s + loki 日志解决方案 (持续更新中)
Loki日志系统-安装、使用、告警
相关文章:

ALG(Alloy+Loki+Grafana)轻量级日志系统
ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...
【漫话机器学习系列】121.偏导数(Partial Derivative)
偏导数(Partial Derivative)详解 1. 引言 在数学分析、机器学习、物理学和工程学中,我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量,而是由多个变量共同决定的。那么,当其中某一个变量发生变化时&…...

Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)
IDEA 社区版如何创建 Spring Boot 项目(详细教程) Spring Boot 以其简洁、高效的特性,成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导,但 社区版(Community Edition)…...

QT中串口打开按钮如何点击打开后又能点击关闭
前言: if (!portOpen) { // 打开串口 if (!sp18Controller->initializePort("COM5", 38400)) { QMessageBox::critical(this, "Error", "Failed to open serial port."); return; } ui->btnOpenPort_2->setText("Close…...

【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...

springboot011基于springboot的课程作业管理系统(源码+包运行+LW+技术指导)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得难了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等,你想解决的问题,今天…...

快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C过度,我们首先要掌握的一些基础知识,以便于我们快速进入C的学习,为后面的学习打下基础。 这篇文章的主要内容有: 1&#x…...

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)
一、时间计算的三大核心场景 当你遇到这些需求时,本文就是你的救星🌟: 倒计时功能:计算活动剩余天数 用户行为分析:统计操作间隔时间 跨国系统:多时区时间统一管理 报表生成:自动计算同比/环…...

laravel es 相关代码 ElasticSearch
来源: github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…...

题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛
小蓝随手写出了含有 n n n 个正整数的数组 a 1 , a 2 , ⋅ ⋅ ⋅ , a n {a_1, a_2, , a_n} a1,a2,⋅⋅⋅,an ,他发现可以轻松地算出有多少个有序二元组 ( i , j ) (i, j) (i,j) 满足 a j a_j aj 是 a i a_i ai 的一个因数。因此他定义一个整数对 …...

【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
未经许可,不得转载。 文章目录 SSRF漏洞成因Java中发送HTTP请求的函数1、HttpURLConnection2、HttpClient(Java 11)3、第三方库Request库漏洞示例OkHttpClient漏洞示例HttpClients漏洞示例 漏洞代码示例防范标准代码 SSRF SSRF(S…...

RabbitMQ高级特性--消息确认机制
目录 一、消息确认 1.消息确认机制 2.手动确认方法 二、代码示例 1. AcknowledgeMode.NONE 1.1 配置文件 1.2 生产者 1.3 消费者 1.4 运行程序 2.AcknowledgeMode.AUTO 3.AcknowledgeMode.MANUAL 一、消息确认 1.消息确认机制 生产者发送消息之后,到达消…...

C++复试笔记(一)
Setw 是C中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,…...

K8s 1.27.1 实战系列(四)验证集群及应用部署测试
一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...

基于Spring Boot的健美操评分管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

H5页面在移动端自动横屏
首先需要再head标签添加这样一段代码 <meta name="viewport" content="width=device-width,height=device-width,initial-scale=1.0,user-scalable=no">因为需求是为了满足WEB端和手机端都可以查看整体效果 但由于UI没有设计移动端的样式 所以我想说…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)
一、数据集的划分 (1)按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证…...

从0到1入门RabbitMQ
一、同步调用 优势:时效性强,等待到结果后才返回 缺点: 拓展性差性能下降级联失败问题 二、异步调用 优势: 耦合度低,拓展性强异步调用,无需等待,性能好故障隔离,下游服务故障不影响…...

MySQL数据库复杂的增删改查操作
在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。 基础知识: 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...

点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...

本地YARN集群部署
请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...

STM32常见外设的驱动示例和代码解析
以下是针对STM32常见外设的驱动示例和代码解析,基于HAL库实现,适用于大多数STM32系列(如F1/F4/H7等),可根据具体型号调整引脚和时钟配置。 1. GPIO驱动 应用场景:控制LED、按键检测、继电器开关等。 示例代码: // 初始化LED(推挽输出) void LED_Init(void) {GPIO_In…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?
1.缓存更新策略 1.1. 缓存旁路模式(Cache Aside) 在应用里负责管理缓存,读取时先查缓存,如果命中了则返回缓存,如果未命中就查询数据库,然后返回缓存,返回缓存的同时把数据给写入缓存中。更新…...

VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...

使用OpenCV和MediaPipe库——实现人体姿态检测
目录 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 安装OpenCV 安装MediaPipe 验证安装 代码逻辑 整体代码 效果展示 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 可以通过命令行运行python --versio…...

JWT的学习
1、HTTP无状态及解决方案 HTTP一种是无状态的协议,每次请求都是一次独立的请求,一次交互之后就是陌生人。 以CSDN为例,先登录一次,然后浏览器退出,这个时候在进入CSDN,按理说服务器是不知道你已经登陆了&…...

elasticsearch是哪家的
Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...

《A++ 敏捷开发》- 18 软件需求
需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…...

计算机网络:计算机网络的组成和功能
计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...