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各种…...
Golang的网络流量控制
# Golang的网络流量控制 什么是网络流量控制? 网络流量控制是指针对网络数据传输过程中的流量进行管理和调控的一种技术手段。通过网络流量控制,我们可以对网络中的数据传输速率、带宽使用情况、数据包丢失率等进行监控和调整,以达到优化网络…...
MRI学习笔记-Meta分析之SDM-PSI
软件介绍 软件下载:https://www.sdmproject.com/software/ 软件教程: https://zhoubolin.netlify.app/posts/sdm-psi/sdm-psi Meta-analysis of Voxel-Based Neuroimaging Studies using Seed-based d Mapping with Permutation of Subject Images (…...
Spring Boot 项目中 Redis 常见问题及解决方案
目录 缓存穿透缓存雪崩缓存击穿Redis 连接池耗尽Redis 序列化问题总结 1. 缓存穿透 问题描述 缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,请求会直接打到数据库上,导致数据库压力过大。 解决方案 缓存空值:即使…...
3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
Java集合面试篇
目录 1.概念 1.1.数组与集合的区别,用过哪些? 1.2.说说Java中的集合? 1.3.Java中的线程安全的集合是什么? 1.4.集合遍历的方法有哪些? 2.List 2.1.list可以一边遍历一边修改元素吗? 2.2.Arraylist和…...
C++入门——命名空间
C入门——命名空间 本期内容,我们正式进入C专栏。前几期内容中,我们用C语言实现了一些数据结构,包括顺序表,单链表,双向循环链表,栈和队列等等,为C的学习打下了基础。从现在开始,让…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例3: 行选择
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
pytest结合allure
Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…...
C++入门基础
文章目录 C核心特性详解(基础增强版)一、第一个C程序:Hello World完整代码解析新手常见问题 二、命名空间(详解版)1. 为什么需要命名空间?2. 命名空间使用场景3. 嵌套命名空间4. 匿名命名空间 三、输入输出…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
SpringCloud系列教程(十三):Sentinel流量控制
SpringCloud中的注册、发现、网关、服务调用都已经完成了,现在就剩下最后一部分,就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好,把平时常用的功能都集成进来了,而且非常简单高效。我们下一步就完成最后一块拼图Se…...
[MySQL初阶]MySQL(4)基本查询
标题:[MySQL初阶]MySQL(4)基本查询 水墨不写bug 文章目录 一. 数据表设计二、对数据表的操作1. Create 操作(插入数据)查看最近受影响的行数: 2. Retrieve 操作(读取数据)࿰…...
使用Open WebUI下载的模型文件(Model)默认存放在哪里?
🏡作者主页:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…...
Maven 私服的搭建与使用(一)
一、引言 在 Java 项目开发中,Maven 作为强大的项目管理和构建工具,极大地提高了开发效率,而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库,架设在局域网内,代理广域网上的远程仓库&…...
java每日精进 3.06 【多数据源】
数据库连接池(Database Connection Pool) 基本信息 是一种用于管理数据库连接的技术。它通过预先创建一定数量的数据库连接,并将其缓存在池中,供多个客户端或应用程序使用,从而减少了每次请求时连接数据库的开销。 …...
Leetcode 3469. Find Minimum Cost to Remove Array Elements
Leetcode 3469. Find Minimum Cost to Remove Array Elements 1. 解题思路2. 代码实现 题目链接:3469. Find Minimum Cost to Remove Array Elements 1. 解题思路 这一题我没啥特别好的思路,就只能动态规划了,倒是也能过,不过总…...
多线程-CompletableFuture
简介 CompletableFuture:异步任务编排工具。java 8中引入的一个类,位于juc包下,是Future的增强版。它可以让用户更好地构建和组合异步任务,避免回调地狱。 在CompletableFuture中,如果用户没有指定执行异步任务时的线…...
常用限流算法解析与实现
一、固定窗口计数器法 原理:在固定时间窗口(如1秒)内统计请求次数,超过阈值则触发限流。 Java实现: public class FixedWindowCounter { private static final long WINDOW_MS 1000; // 1秒窗口 priv…...
Swift系列02-Swift 数据类型系统与内存模型
Swift 是一门现代的、安全的编程语言,其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型,帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含: 值类型和引用类型…...
如何不重启,生效windows环境变量
场景 使用php 进行composer 时,composer 要求php7.2以上,我常用的是7.1,不想来回修改,还是重启电脑 临时修改 打印当前环境变量 echo %PATH%临时修改当前环境变量(如果需要指定的值,可将全部复制出来&a…...
Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(二):训练与推理
Ubuntu20.04本地配置IsaacLab4 4.2.0的G1训练环境(二):训练与推理 训练推理 写在前面,本文档的实现需要IsaacLab的成功安装,可参考(一)。 训练 在IsaacLab目录下,isaaclab的conda虚…...
设计模式说明
23种设计模式说明 以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例,帮助你在实际开发中灵活运用: 一、创建型模式(5种) 解决对象创建问题,降低对象耦合。 1. 单例模式(Singleton&…...
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> …...
Artec Leo+Ray II 三维扫描仪成功为VR展数字化30吨重设备-沪敖3D
挑战:在贸易展上展示重达30吨的机械设备,同时克服设备搬运和展示的难题,减轻物流负担。。 解决方案:Artec Leo、Artec Ray II、Artec Studio、Blender、Unity、Microsoft HoloLens、HTC VIVE PRO 效果:在虚拟展厅中&am…...
Redis 各数据类型使用场景详解
1. 字符串(String) 场景 1:计数器(如文章阅读量) 问题: 高并发下对同一数值进行增减操作时,需保证原子性,避免竞态条件导致数据不一致。 频繁读写可能成为性能瓶颈。 解决方案&a…...
spark写数据库用连接池找不到driver类
最近遇到一个很离谱的bug,在写spark代码把数据写到mysql的时候考虑到连接的开销,所以用了HikariCP连接池,但是无语的是程序执行死活加载不到mysql的Driver类,但是解压了jar看到mysql-conn包就在lib下面,版本也是5.x的没…...
上传文件到对象存储是选择前端还是后端
对于云上对象存储的上传方式选择(前端直传或后端代理上传),需综合考虑安全性、性能、成本、业务需求等因素。 1. 推荐前端直传的场景 适用条件: 大文件上传(如视频、大型数据集)高并发场景(如…...
NanoMQ ds笔记250306
NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq NanoMQ官方文档 https://nanomq.io/docs/zh/latest/ NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理(Message Broker),由中国的开源物联网公司 EMQ 开…...
sqlmap:从基础用法到漏洞利用实战
1. sqlmap基础认知 sqlmap是一款开源的渗透测试工具,能自动检测和利用SQL注入漏洞,支持MySQL、Oracle、PostgreSQL等多种数据库管理系统。其设计旨在简化SQL注入检测流程,助力安全人员在复杂网络环境中快速定位与评估漏洞风险。它通过发送精…...
DFS学习笔记
题目描述 X 国王有一个地宫宝库。是 nm 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值…...
C++ STL string容器全解析
一、引言 在 C 编程的广阔领域中,字符串处理是一项极为基础且频繁的操作。从简单的文本解析,到复杂的文件读取与处理,字符串几乎无处不在。而 C 中的 string 容器,就像是一把瑞士军刀,为我们处理字符串提供了强大而便…...
React基础之项目创建
项目创建 create-react-app 项目名(小写) 运行 pnpm run start 在React中,使用的语法格式是jsx,也就是js与html相结合的形式 import logo from ./logo.svg; import ./App.css; function App() { return ( <div className"App"> <head…...
迷你世界脚本道具接口:Item
道具接口:Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID,如球类等 3 getDropItemNum(...) …...
Unity摄像机跟随物体
功能描述 实现摄像机跟随物体,并使物体始终保持在画面中心位置。 实现步骤 创建脚本:在Unity中创建一个新的C#脚本,命名为CameraFollow。 代码如下: using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…...
计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
vue实现日历签到效果
在工作任务进行时,有一个签到日历的功能需求要实现,经过文档查询和样式优化实现了需求,在此记录一下。 技术背景:vue2vant(样式控件) less 一个公共样式文件 html实现部分: <div class"calenderB…...
(十 八)趣学设计模式 之 观察者模式!
目录 一、 啥是观察者模式?二、 为什么要用观察者模式?三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
笔记:在Git中.gitmodules文件的功能和作用和如何使用
一、目的:简单介绍下在Git中.gitmodules文件的功能和作用已经 .gitmodules 文件是 Git 子模块(submodule)功能的一部分,用于管理和配置子模块。子模块允许一个 Git 仓库包含另一个 Git 仓库作为其子目录,这对于管理依赖…...
Swift 常量
Swift 常量 引言 Swift 是一种由苹果公司开发的编程语言,主要用于 iOS、macOS、watchOS 和 tvOS 等平台的应用开发。在 Swift 中,常量是一种不可变的变量,它用于存储固定不变的值。了解和使用常量是 Swift 编程的基础,本文将详细介绍 Swift 常量的概念、类型、声明以及使…...
Ubuntu20.04双系统安装及软件安装(七):Anaconda3
Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…...
Google AI概览升级,AI模式全新登场!
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务, 智能体自动生成完成任务所需步骤, 执行相应动作(例如选择并调用工具), 直到任务完成。 2. 先定义工具:Tools 可以是一个函数或三方 API也…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
安卓基础组件Looper - 02 native层面的剖析
文章目录 native使用使用总结创建Looper构造函数创建(不推荐)使用举例源代码 Looper::prepare 获取Looper可忽略初始化Looper主动休眠 pollAll主动唤醒 wake 发送消息 sendMessage轮询消息 native使用 Android Native Looper 机制 - 掘金 (juejin.cn) /system/core/libutils/…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
QTday4
1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…...
服务器时间同步
方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服务器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多个 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…...
蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...
DeepSeek大模型 —— 全维度技术解析
DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…...