【实战ES】实战 Elasticsearch:快速上手与深度实践-5.1.1热点分片识别与均衡策略
👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
文章大纲
- 5.1.1 Filebeat + Logstash + ES + Kibana 全链路配置实
- 1. 架构设计与组件选型
- 1.1 技术栈对比分析
- 1.2 硬件配置推荐
- 2. Filebeat 高级配置
- 2.1 多输入源配置
- 2.2 性能优化参数
- 3. Logstash 数据处理管道
- 3.1 多阶段处理流程
- 3.2 `Grok`性能优化表
- 4. Elasticsearch 索引设计
- 4.1 ILM生命周期策略
- 4.2 索引模板配置
- 5. `Kibana` 可视化实战
- 5.1 仪表板配置要点
- 5.2 关键可视化类型对比
- 6. 全链路监控与调优
- 6.1 性能监控指标
- 6.2 典型瓶颈解决方案
- 7. 安全加固方案
- 7.1 传输层加密配置
- 7.2 权限控制矩阵
- 8. 实战案例:电商大促日志监控
- 8.1 场景参数
- 8.2 性能测试结果
5.1.1 Filebeat + Logstash + ES + Kibana 全链路配置实
日志处理全链路架构与数据流向示意图
数据采集(Filebeat):Filebeat 作为轻量级的日志采集器,通过安装在各个数据源所在的主机上的 Filebeat 代理来工作
。它会监控指定的日志文件或目录,一旦有新的日志数据产生,就会将其收集起来,并发送给Logstash
进行进一步处理。数据处理(Logstash)
:Logstash 接收来自 Filebeat 的日志数据,通过配置的过滤器(Filter)对数据进行清洗、解析和转换等操作
。例如,过滤器可以提取日志中的关键信息(如时间戳、日志级别、消息内容等),并将其转换为结构化的数据格式。数据存储(Elasticsearch)
:Elasticsearch 是一个分布式的搜索引擎和数据存储系统
,它接收来自 Logstash 的结构化日志数据,并将其存储在索引中。数据可视化(Kibana)
:Kibana 是 Elastic 生态系统中的数据可视化工具,它连接到 Elasticsearch 集群,从存储的日志数据中提取信息,并以各种可视化的方式展示出来,如柱状图、折线图、饼图、仪表盘等
。用户可以通过 Kibana 对日志数据进行交互式分析,快速发现问题、趋势和模式
。
1. 架构设计与组件选型
1.1 技术栈对比分析
EPS
,代表着 Elasticsearch 集群每秒能够处理的事件数量。20000 EPS
意味着系统具有强大的并发处理能力,能够在每秒内接收、解析、索引和存储
大量的事件数据,展示了系统应对高流量数据输入的潜力
。QPS
,每秒查询率(Queries Per Second
)。
组件 | 推荐版本 | 核心功能 | 性能基准(单节点) |
---|---|---|---|
Filebeat | 8.12.2 | 轻量级日志采集 | 20,000 EPS (事件/秒) |
Logstash | 8.12.1 | 数据清洗与富化 | 15,000 EPS (含复杂处理) |
Elasticsearch | 8.12.0 | 分布式存储与检索 | 50,000 写入QPS |
Kibana | 8.12.0 | 可视化与分析 | 支持100并发查询 |
1.2 硬件配置推荐
节点类型 | CPU | 内存 | 存储 | 网络 | 数量 |
---|---|---|---|---|---|
Filebeat | 4核 | 8GB | 100GB SSD | 1Gbps | 按需 |
Logstash | 16核 | 32GB | 500GB NVMe(临时存储) | 10Gbps | 3 |
Elasticsearch | 32核 | 128GB | 4TB NVMe x3(RAID0) | 25Gbps | 5 |
Kibana | 8核 | 16GB | 200GB SSD | 1Gbps | 2 |
2. Filebeat 高级配置
2.1 多输入源配置
# 定义 Filebeat 的输入配置,可包含多个不同类型的输入源
filebeat.inputs:# 第一个输入配置,类型为 filestream,用于收集文件流数据- type: filestream# 为该输入配置指定一个唯一的 ID,方便后续管理和识别id: nginx-access# 指定要收集的文件路径,可以使用通配符# 这里表示收集 /var/log/nginx/ 目录下所有以 access.log 开头的文件paths:- /var/log/nginx/access.log*# 为收集到的日志数据添加自定义字段# 这里添加了 log_type 字段,值为 "nginx_access",方便后续分析和过滤fields:log_type: "nginx_access"# 定义解析器,用于解析收集到的数据# 这里使用 ndjson 解析器,~ 表示使用默认配置parsers:- ndjson: ~# 第二个输入配置,类型为 container,用于收集容器日志- type: container# 为该输入配置指定一个唯一的 IDid: docker-logs# 指定要收集的容器日志文件路径# 这里表示收集 /var/lib/docker/containers/ 目录下所有容器的日志文件paths:- '/var/lib/docker/containers/*/*.log'# 定义处理器,用于对收集到的数据进行预处理# 这里使用 add_docker_metadata 处理器,~ 表示使用默认配置# 该处理器会为日志数据添加 Docker 容器的元数据,如容器 ID、名称等processors:- add_docker_metadata: ~# 第三个输入配置,类型为 syslog,用于通过 UDP 协议收集 Syslog 数据- type: syslog# 配置 Syslog 的 UDP 协议相关参数protocol.udp:# 指定监听的主机和端口# 0.0.0.0 表示监听所有可用的网络接口,端口为 5140host: "0.0.0.0:5140"# 为收集到的日志数据添加标签# 这里添加了 "syslog" 标签,方便后续筛选和分类tags: ["syslog"]
2.2 性能优化参数
# 配置 Filebeat 的内存队列相关参数
queue.mem:# 定义内存队列中可以存储的最大事件数量# 这里设置为 4096,表示内存队列最多能容纳 4096 个事件# 当队列中的事件数量达到此上限时,新的事件可能会被阻塞或丢弃(取决于具体策略)events: 4096# 触发内存队列刷新的最小事件数量# 当队列中的事件数量达到 1024 个时,Filebeat 会尝试将这些事件刷新到输出端flush.min_events: 1024# 内存队列刷新的超时时间# 即使队列中的事件数量未达到 flush.min_events 的设定值,每经过 5 秒,Filebeat 也会将队列中的事件刷新到输出端flush.timeout: 5s# 配置 Filebeat 的输出,将收集到的事件发送到 Logstash
output.logstash:# 指定 Logstash 服务的主机和端口信息# "logstash-prod:5044" 表示 Logstash 服务所在的主机名为 logstash-prod,端口为 5044hosts: ["logstash-prod:5044"]# 设置并行工作线程的数量# 这里设置为 8,表示 Filebeat 会使用 8 个并行线程将事件发送到 Logstash,以提高发送效率worker: 8# 设置数据传输时的压缩级别# 取值范围通常是 0 - 9,0 表示不压缩,9 表示最高压缩比# 这里设置为 3,是一个在压缩率和性能之间的平衡选择,能在一定程度上减少网络传输的数据量compression_level: 3# 启用负载均衡功能# 当 hosts 配置中有多个 Logstash 实例时,Filebeat 会自动在这些实例之间进行负载均衡,避免某个实例负载过高loadbalance: true# 配置 Filebeat 的日志记录级别
# 设置为 warning 表示 Filebeat 只会记录警告级别及以上的日志信息
# 这样可以减少日志文件的大小,只关注可能影响系统正常运行的重要信息
logging.level: warning
3. Logstash 数据处理管道
3.1 多阶段处理流程
ruby
代码实现
# 定义 Logstash 的输入部分,用于接收数据
input {# 使用 beats 输入插件,用于接收来自 Filebeat 等 Beats 系列工具发送的数据beats {# 指定监听的端口,Filebeat 会将数据发送到这个端口port => 5044# 启用 SSL 加密,确保数据在传输过程中的安全性ssl => true# 指定 SSL 证书的路径,用于 SSL 加密通信ssl_certificate => "/etc/pki/tls/certs/logstash.crt"# 指定 SSL 私钥的路径,与证书配合完成 SSL 加密ssl_key => "/etc/pki/tls/private/logstash.key"}
}# 定义 Logstash 的过滤部分,用于对输入的数据进行处理和转换
filter {# 针对 NGINX 访问日志进行解析# 检查数据中的 [fields][log_type] 字段是否为 "nginx_access"if [fields][log_type] == "nginx_access" {# 使用 grok 过滤器,它可以根据正则表达式模式从日志消息中提取字段grok {# 定义匹配模式,用于解析 NGINX 访问日志的每一行# 将不同的部分提取到对应的字段中,如客户端 IP、请求方法、响应状态码等match => { "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} %{NUMBER:bytes} "%{DATA:referrer}" "%{DATA:useragent}"' }}# 使用 date 过滤器,将时间戳字符串转换为 Logstash 内部的日期对象date {# 指定时间戳字段和对应的日期格式,用于解析时间match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]}# 使用 useragent 过滤器,解析用户代理字符串# 提取浏览器、操作系统等信息到新的 "ua" 字段中useragent {source => "useragent"target => "ua"}}# 通用字段处理部分,对所有接收到的数据都进行操作mutate {# 将 "response" 和 "bytes" 字段的数据类型转换为整数类型convert => {"response" => "integer""bytes" => "integer"}# 从数据中移除 "message" 字段,因为它的信息可能已经被解析到其他字段中remove_field => ["message"]}
}# 定义 Logstash 的输出部分,用于将处理后的数据发送到目标位置
output {# 使用 elasticsearch 输出插件,将数据发送到 Elasticsearch 集群elasticsearch {# 指定 Elasticsearch 集群的节点地址hosts => ["es - node1:9200","es - node2:9200"]# 定义索引名称,采用动态索引的方式,根据日期每天创建一个新的索引index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"# 指定索引模板的路径,用于在 Elasticsearch 中创建索引时的初始配置template => "/etc/logstash/templates/nginx - template.json"# 指定索引模板的名称template_name => "nginx - access"# 启用索引生命周期管理(ILM),可以自动管理索引的生命周期,如滚动、删除等ilm_enabled => true}# 调试输出部分,在生产环境中建议关闭# 将处理后的数据以易读的 Ruby 调试格式输出到标准输出stdout {codec => rubydebug { metadata => true }}
}
3.2 Grok
性能优化表
Grok
是一个非常实用的工具,通常结合Logstash
一起使用,用于解析非结构化的日志数据并将其转换为结构化的数据,以便于在 Elasticsearch 中进行索引、搜索和分析。- 是一种基于正则表达式的模式匹配语言。
- 常用预定义模式
%{IPORHOST}
:用于匹配 IP 地址或主机名。%{USER}
:匹配用户名。%{HTTPDATE}
:匹配 HTTP 日期格式,如 01/Jan/2024:12:00:00 +0800。%{WORD}
:匹配一个单词。%{NUMBER}
:匹配一个数字。
模式复杂度 | 原始性能(事件/秒) | 优化策略 | 优化后性能 | 提升幅度 |
---|---|---|---|---|
简单模式 | 12,000 | 预编译正则表达式 | 15,000 | 25%↑ |
中等模式 | 8,500 | 使用Oniguruma 引擎 | 11,200 | 32%↑ |
复杂模式 | 3,200 | 模式分解+条件判断 | 5,800 | 81%↑ |
4. Elasticsearch 索引设计
4.1 ILM生命周期策略
PUT _ilm/policy/logs-policy
{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50gb","max_age": "7d"},"set_priority": {"priority": 100}}},"warm": {"min_age": "7d","actions": {"forcemerge": {"max_num_segments": 1},"shrink": {"number_of_shards": 1}}},"delete": {"min_age": "30d","actions": {"delete": {}}}}}
}
4.2 索引模板配置
// 创建一个名为 logs-template 的索引模板
PUT _index_template/logs-template
{// 定义索引模板匹配的索引名称模式// 这里表示该模板将应用于所有以 "logs-" 开头的索引"index_patterns": ["logs-*"],// 定义当创建匹配此模板的索引时所使用的设置和映射"template": {// 索引的设置部分,包含一些与索引性能、存储、生命周期等相关的参数"settings": {// 指定索引的主分片数量为 3// 主分片用于存储索引数据,多个主分片可以实现数据的分布式存储和并行处理"number_of_shards": 3,// 指定每个主分片的副本分片数量为 1// 副本分片是主分片的复制,用于提高数据的可用性和容错性"number_of_replicas": 1,// 指定该索引将使用名为 "logs-policy" 的索引生命周期管理策略// 索引生命周期管理可以自动管理索引的各个阶段,如热、温、冷、删除等"index.lifecycle.name": "logs-policy",// 指定索引使用的压缩编解码器为 "best_compression"// 该编解码器会以较高的压缩率对索引数据进行压缩,以节省磁盘空间,但可能会增加一定的 CPU 开销"index.codec": "best_compression"},// 索引的映射部分,定义了索引中字段的类型和结构"mappings": {// 设置动态映射规则为 "strict"// 这意味着只有在映射中显式定义的字段才能被索引,新字段不会自动添加到映射中"dynamic": "strict",// 定义索引中各个字段的具体属性"properties": {// 定义 "@timestamp" 字段的类型为日期类型// 该字段通常用于存储日志事件的时间戳,方便进行时间范围的查询和分析"@timestamp": { "type": "date" },// 定义 "message" 字段的类型为文本类型// 文本类型适用于存储较长的文本内容,支持全文搜索"message": { "type": "text" },// 定义 "response" 字段的类型为整数类型// 该字段可能用于存储响应状态码等整数值"response": { "type": "integer" },// 定义 "geoip" 字段为对象类型// 对象类型可以包含多个子字段,用于组织相关的信息"geoip": {"type": "object",// 定义 "geoip" 对象中的子字段"properties": {// 定义 "location" 字段的类型为地理点类型// 地理点类型用于存储地理位置信息,如经纬度,方便进行地理空间查询"location": { "type": "geo_point" }}}}}}
}
5. Kibana
可视化实战
5.1 仪表板配置要点
// 向 Kibana 的 API 发起 POST 请求,用于创建一个新的仪表盘(dashboard)对象
POST /api/saved_objects/dashboard
{// 定义仪表盘对象的属性"attributes": {// 仪表盘的标题,这里设置为 "Nginx访问监控""title": "Nginx访问监控",// 仪表盘的描述信息,说明该仪表盘用于实时流量分析"description": "实时流量分析仪表板",// 仪表盘上的面板配置,包含多个可视化面板"panelsJSON": [{// 第一个面板的类型为时间序列图(timeseries)"type": "timeseries",// 该面板的标题为 "请求量趋势""title": "请求量趋势",// 该面板的参数配置"params": {// 指定要查询的索引模式,这里表示查询所有以 "logs-nginx-" 开头的索引"index": "logs-nginx-*",// 指定时间字段,用于按照时间进行数据聚合和展示,这里使用 "@timestamp" 字段"time_field": "@timestamp",// 指定时间间隔为 1 小时,即按每小时进行数据聚合"interval": "1h",// 时间序列图的系列配置"series": [{// 系列的名称为 "总请求量""name": "总请求量",// 聚合方式为计数,即统计每个时间间隔内的请求数量"aggregation": "count"}]}},{// 第二个面板的类型为饼图(pie)"type": "pie",// 该面板的标题为 "HTTP状态码分布""title": "HTTP状态码分布",// 该面板的参数配置"params": {// 指定要查询的索引模式,同样查询所有以 "logs-nginx-" 开头的索引"index": "logs-nginx-*",// 分割模式为按词项(terms)分割,即根据某个字段的值进行分组"split_mode": "terms",// 指定用于分组的字段为 "response",通常这个字段存储的是 HTTP 状态码"terms_field": "response",// 显示前 5 个分组的结果,即只展示出现次数最多的 5 个 HTTP 状态码的分布情况"size": 5}}]}
}
5.2 关键可视化类型对比
图表类型 | 适用场景 | 性能影响 | 数据精度 | 交互性 |
---|---|---|---|---|
时间序列图 | 流量趋势分析 | 低 | 高 | 强 |
热力图 | 异常检测 | 中 | 中 | 中 |
地理地图 | IP分布分析 | 高 | 高 | 弱 |
数据表 | 原始日志查看 | 低 | 最高 | 弱 |
6. 全链路监控与调优
6.1 性能监控指标
组件 | 关键指标 | 健康阈值 | 告警阈值 | 监控工具 |
---|---|---|---|---|
Filebeat | Harvester活跃数 | < 1000 | > 2000 | Metricbeat |
Logstash | Pipeline延迟 | < 500ms | > 2s | Prometheus |
Elasticsearch | 索引延迟 | < 1s | > 5s | Elastic监控 |
Kibana | 查询响应时间 | < 3s | > 10s | APM |
Harvester
是 Filebeat 中负责实际读取文件内容的核心组件- Harvester 是 Filebeat 里的一个文件读取器,当 Filebeat 监测到有符合采集规则的文件时,会为每个文件启动一个 Harvester 实例。
- 它的主要任务是逐行读取文件内容,将读取到的行封装成事件,然后发送给 Filebeat 的 spooler 进行后续处理。
APM(Application Performance Monitoring)
- 用于对应用程序的性能进行监控和分析。
- 功能特点: 性能指标监控、分布式追踪、错误分析、用户体验监控。
6.2 典型瓶颈解决方案
-
场景:日志处理延迟突增
-
- 问题定位:
# 查看Logstash节点状态 GET _nodes/stats/pipelines?filter_path=nodes.*.pipelines# 检查热点线程 GET _nodes/hot_threads
-
- 优化策略:
# 管道配置用于控制 Logstash 处理事件的方式和效率pipeline:# 批处理相关配置,影响 Logstash 一次处理的事件数量和处理时间间隔batch:# 每次批处理的事件数量# 原值为 250,现调整为 125# 减小批量大小可能会降低每次处理的数据量,使处理更加灵活,适用于事件产生速度不均匀或者对实时性要求较高的场景size: 125# 批处理的延迟时间(单位:毫秒)# 原值为 100,现调整为 50# 缩短延迟时间可以让 Logstash 更快地处理事件,提高数据处理的实时性delay: 50# 工作线程数量# 原值为 4,现调整为 8# 增加工作线程数量可以提高 Logstash 的并发处理能力,加快事件处理速度,但同时也会增加系统资源的消耗workers: 8# 是否按顺序处理事件# 设置为 false 表示不按顺序处理,这样可以提高处理效率,但可能会导致事件处理的顺序与输入顺序不一致# 对于对事件顺序要求不高的场景,关闭顺序处理可以提升性能ordered: false# 以下是对 Logstash 运行时所使用的 Java 虚拟机(JVM)堆内存进行配置# LS_JAVA_OPTS 是一个环境变量,用于设置 JVM 的启动参数LS_JAVA_OPTS: "-Xms8g -Xmx8g"# -Xms8g 表示 JVM 堆内存的初始大小为 8GB# -Xmx8g 表示 JVM 堆内存的最大大小为 8GB# 增加堆内存可以让 Logstash 有更多的内存空间来处理大量的数据,减少因内存不足导致的性能问题和错误# 但同时也需要确保系统有足够的物理内存支持,否则可能会导致系统性能下降或出现内存溢出错误
LS_JAVA_OPTS
通常是指与 Logstash(LS 可能是 Logstash 的缩写)相关的 Java 虚拟机(JVM)选项配置变量。Logstash 是基于 Java 开发的开源数据处理引擎,用于采集、处理和转发数据。- 通过合理配置
LS_JAVA_OPTS
,可以优化 Logstash 的性能、提高稳定性,并满足不同的运行需求和场景。
-
- 优化效果:
指标 优化前 优化后 提升比例 处理延迟 4.2s 0.8s 81%↓ CPU使用率
95% 68% 28%↓ 吞吐量 8K EPS 14K EPS 75%↑
7. 安全加固方案
7.1 传输层加密配置
# Filebeat配置部分,用于设置 Filebeat 输出数据的目标及相关安全配置
output.logstash:# 指定 Logstash 服务的主机和端口,这里表示将数据发送到名为 "logstash" 的主机的 5044 端口hosts: ["logstash:5044"]# SSL 相关配置,用于启用和配置 Filebeat 与 Logstash 之间的 SSL 加密通信ssl:# 启用 SSL 加密,设置为 true 表示开启enabled: true# 证书颁发机构(CA)证书路径,用于验证 Logstash 服务器证书的合法性# Filebeat 使用该 CA 证书来确认它连接的 Logstash 服务器是受信任的certificate_authorities: ["/etc/pki/ca.crt"]# Filebeat 客户端证书路径,用于向 Logstash 服务器进行身份验证# Logstash 可以使用该证书来确认连接的客户端是合法的certificate: "/etc/pki/client.crt"# Filebeat 客户端私钥路径,与客户端证书配合使用,用于加密和解密通信数据key: "/etc/pki/client.key"# Elasticsearch配置部分,主要涉及 X-Pack 安全模块中传输层的 SSL 配置
xpack.security.transport.ssl:# 启用传输层的 SSL 加密,设置为 true 表示开启enabled: true# 证书验证模式,这里设置为 "certificate" 表示进行证书验证# 这意味着 Elasticsearch 会验证连接的对等方(如其他节点或客户端)的证书verification_mode: certificate# 密钥库路径,密钥库包含了 Elasticsearch 用于 SSL 通信的私钥和证书# "certs/elastic-certificates.p12" 是存储密钥和证书的文件路径keystore.path: certs/elastic-certificates.p12# 信任库路径,信任库包含了 Elasticsearch 信任的证书颁发机构的证书# 这里信任库路径与密钥库路径相同,表明使用相同的证书文件来验证对等方的证书truststore.path: certs/elastic-certificates.p12
7.2 权限控制矩阵
角色 | 数据访问范围 | 操作权限 | 适用场景 |
---|---|---|---|
log_viewer | logs-* | read, view_index_metadata | 普通运维人员 |
log_admin | logs-* | manage, create_index | 系统管理员 |
alert_manager | .kibana-event-log-* | read, index | 监控告警系统 |
report_user | 特定索引模式 | read | 审计与报表生成 |
8. 实战案例:电商大促日志监控
8.1 场景参数
{"业务场景": "双11大促监控","日志规模": {"峰值QPS": "120,000 EPS","单日数据量": "8TB","保留周期": "30天"},"架构特性": ["自动扩缩容","多级缓存","实时异常检测"]
}
8.2 性能测试结果
测试阶段 | 写入延迟(p95) | 查询响应时间 | 系统可用性 |
---|---|---|---|
预热阶段 | 23ms | 280ms | 100% |
峰值压力 | 89ms | 1.2s | 99.98% |
故障恢复 | 自动切换5.8s | - | 99.95% |
p95
P95 指的是第 95 百分位数
。它是一种统计指标,将一组数据从小到大排序后,处于第 95% 位置的值就是 P95。- 例如,有 100 个数据,将它们按从小到大排列,第 95 个数据的值就是 P95。在性能测试和数据分析中,
P95 常用于衡量数据的分布和性能表现
。
附录:常用诊断命令速查表
功能 | Filebeat命令 | ES API端点 |
---|---|---|
查看采集状态 | filebeat test output | GET _cat/indices?v |
检查管道状态 | journalctl -u filebeat | GET _nodes/stats/ingest |
监控队列积压 | filebeat -e -d "*" | GET _cat/thread_pool?v |
验证配置语法 | filebeat test config | GET _cluster/pending_tasks |
最佳实践建议:
- 建议采用「
先索引模板后数据写入
」的流程- 日志类数据优先使用
时间序列索引模式
- 定期执行
_forcemerge
优化存储空间- 重要操作需通过变更管理系统审批
相关文章:
【实战ES】实战 Elasticsearch:快速上手与深度实践-5.1.1热点分片识别与均衡策略
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.1.1 Filebeat Logstash ES Kibana 全链路配置实1. 架构设计与组件选型1.1 技术栈对比分析1.2 硬件配置推荐 2. Filebeat 高级配置2.1 多输入源配置2.2 性能优化参数 3.…...
服务端和客户端通信(TCP)
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …...
练习题:76
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 复杂度分析 可能遇到的问题及注意事项 代码实现 代码解释 1. 类的定义与属性初始化 2. 定义属性的访问器(getter)方法 3. 定义属性的修改器(setter)…...
SpringBoot3项目-创建及使用
简单的介绍后端SpringBoot3项目,从0到1搭建一个完整项目,给老项目源码升级备用的知识点 一、创建项目 1、打开IDEA,通过New Project创建项目,如下图: 2、选择Spring Initializr,配置好项目信息…...
前端 | 向后端传数据,判断问题所在的调试过程
目录 编辑 1. 在 vue 文件中,在调用函数之前 先打印传入的数据 2. 在 js 文件中,打印接收到的数据 3. 在浏览器 Network 面板查看请求数据 4. 在 server.js 中查看请求数据 5. 确保 JSON 格式正确 知识点:JSON.stringify(req.body, …...
Python爬虫入门实战:爬取博客文章数据并保存
Python爬虫入门实战:爬取博客文章数据并保存 概述 本文将介绍如何使用Python的requests和BeautifulSoup库实现一个简单的网页爬虫,通过实际案例演示如何爬取博客文章数据并存储到本地文件。本文适合Python爬虫初学者,通过案例快速掌握基本爬…...
用python 的 sentiment intensity analyzer的情感分析器,将用户评论进行分类
SentimentIntensityAnalyzer 是 nltk(Natural Language Toolkit)库中的一个工具,用于进行情感分析。它会为文本返回四个得分:负向情感得分(neg)、中性情感得分(neu)、正向情感得分&a…...
Android Framework 常见面试题
以下是常见的 Android Framework 面试题,涵盖基础到高级知识点,帮助准备面试: 一、基础问题 Android 系统架构分层 描述 Android 系统的四层架构(Linux Kernel、Native、Framework、Application)及各层职责。 Zygote …...
如何面向DeepSeek编程,打造游戏开发工具集,提升工作效率
最近我在思考: 如何基于DeepSeek,来提升工作效率,构建高效游戏开发工作流。 方向有两个: A: 基于DeepSeek私有代码框架,让它完成项目代码的续写; B: 基于DeepSeek来创作一些工具,使用工具来提升效率,如…...
IDE集成开发环境MyEclipse中安装SVN
打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后,会刷新出两个选项,需要选中的 点击next,出现许可的时候选中同意,一直结束等…...
QT中使用C++调用 python脚本
1、使用QT Creator 新建项目 2、添加Python解释器 在.pro 文件中添加python头文件与链接库 INCLUDEPATH -I /usr/include/python3.8/ LIBS -L /usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8本文实验为ubuntu自带python3.8,虚拟环境中的python解释…...
C语言学习day25:WinAPI编程进阶07-游戏辅助时钟周期事件、定时器消息
接下来我们说一下时间周期(定时器)事件 我们接下来继续用上一章中的代码来举例 这次课程我们需要用的函数SetTimer()函数和KillTimer()函数 SetTimer() 语法: UINT_PTR SetTimer([in, opti…...
NVIDIA Jetson Nano的国产替代,基于算能BM1684X+FPGA+AI算力盒子,支持deepseek边缘部署
NVIDIA Jetson Nano的国产替代,基于算能BM1684X的AI算力盒子,支持deepseek边缘部署 另外,还提供BM1684XFPGAAI的解决方案。 核心板基于Sophon SG2300X SoC(也叫BM1684X)打造 带有8核ARM Cortex-A53 2.3GHz,…...
解锁STM32外设:开启嵌入式开发新世界
✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 探索 STM32 强大的外设家族 初窥门径:STM32 外设开发基础 开发方式与工具 外设配置基础步骤 深入剖析:常见外设应用实例…...
C++的内存管理
1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int…...
P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!
P8685 [蓝桥杯 2019 省 A] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列?省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单,我们可以看见测试用例的时间顺序是不同的&#x…...
nuxt2 打包优化使用“compression-webpack-plugin”插件
在使用 Nuxt.js 构建项目时,为了提高性能,通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件,用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…...
RabbitMQ知识点
1.为什么需要消息队列? RabbitMQ体系结构 操作001:RabbitMQ安装 二、安装 # 拉取镜像 docker pull rabbitmq:3.13-management # -d 参数:后台运行 Docker 容器 # --name 参数:设置容器名称 # -p 参数:映射端口号&…...
Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...
问题描述 3月6日,在使用Windsuf 时,遇到以下网络连接错误: [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…...
Spark 3.0核心新特性解析与行业应用展望
Spark 3.0核心新特性解析与行业应用展望 一、自适应查询执行(Adaptive Query Execution, AQE) 作为Spark 3.0最具突破性的优化,AQE通过运行时动态调整执行计划,解决了传统静态优化的局限性。其核心技术突破体现在三方面: 1. 动态分区合并(Dynamically Coalescing Shuf…...
基于 harbor 构建docker私有仓库
仓库(Repository)是集中存放镜像的地方,又分公共仓库和私有仓库。 有时候容易把仓库与注册服务器(Registry)混淆。 实际上注册服务器是存放仓库的具体服务器, 一个注册服务器上可以有多个仓库,…...
MySQL基本建表操作
目录 1,创建数据库db_ck 1.1创建表 1.2 查看创建好的表 2,创建表t_hero 2.1 先进入数据库Db_Ck 2.1.1 这里可以看是否进入数据库: 2.2 创建表t_Hero 2.2.1 我们可以先在文本文档里面写好然后粘贴进去,因为直接写的话,错了要重新开始 …...
低空经济快速发展,无人机人才培养及校企实验室共建技术详解
随着低空经济的快速发展,无人机作为该领域的关键技术载体,其应用范围和市场需求正在迅速扩大。为了满足这一趋势,无人机人才的培养以及校企实验室的共建成为了推动技术进步和产业升级的重要途径。以下是对无人机人才培养及校企实验室共建技术…...
电脑网络出现问题!简单的几种方法解除电脑飞行模式
在某些情况下,您可能需要关闭电脑上的飞行模式以便重新连接到 Wi-Fi、蓝牙或其他无线网络。本教程中简鹿办公将指导您如何在 Windows 和 macO S操作系统上解除飞行模式。 一、Windows 系统下解除飞行模式 通过快捷操作中心 步骤一:点击屏幕右下角的通知…...
Docker入门篇1:搜索镜像、拉取镜像、查看本地镜像列表、删除本地镜像
大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起开始入门第一篇:搜索镜像、拉取镜像、查看本地镜像…...
网络初级复习作业
作业要求: 1,学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到白度网络中的HTTP服务器 2,学校网络内部网段基于192.168.1.0/24划分:PC1可以正常访问3.3.3.0/24网段,但是PC2不允许 3,学校内部路由使用静态路由…...
Spring Boot 调用DeepSeek API的详细教程
目录 前置准备步骤1:创建Spring Boot项目步骤2:配置API参数步骤3:创建请求/响应DTO步骤4:实现API客户端步骤5:创建控制器步骤6:异常处理步骤7:测试验证单元测试示例Postman测试请求 常见问题排查…...
rpc和proto
rpc全称远程过程控制,说白了是一种对信息发送和接收的规则编写方法,来自google,这些规则会以protobuf代码存到proto文件里。我以autoGen中agent_worker.proto为例,大概长这样 syntax "proto3";package agents;option …...
我的两个医学数据分析技术思路
我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究,是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分,可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…...
GitHub上传项目
总结(有基础的话直接执行这几步,就不需要再往下看了): git init 修改git的config文件:添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…...
汇编点亮LED
目录 一、ARM常用汇编指令 二、汇编点亮LED 2.1 GPIO简述 2.2 GPIO相关寄存器 2.3 LED原理图 2.4 汇编点亮LED 一、ARM常用汇编指令 常用汇编格式: label : instruction @ comment label:标号 instruction:具体汇编指令 comment:注释内容 常…...
VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...
Python深度学习算法介绍
一、引言 深度学习是机器学习的一个重要分支,它通过构建多层神经网络结构,自动从数据中学习特征表示,从而实现对复杂模式的识别和预测。Python作为一门强大的编程语言,凭借其简洁易读的语法和丰富的库支持,成为深度学…...
hadoop集群HDFS读写性能测试
一、写测试命令 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -write -nrFiles 10 -size 10MB二、读测试命令 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-t…...
HTTPS加密原理详解
目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议,是在HTTP的基础上加入了一个加密层,由…...
react基本功
useLayoutEffect useLayoutEffect 用于在浏览器重新绘制屏幕之前同步执行代码。它与 useEffect 相同,但执行时机不同。 主要特点 执行时机:useLayoutEffect 在 DOM 更新完成后同步执行,但在浏览器绘制之前。这使得它可以在浏览器渲染之前读取和修改 DOM,避免视觉上的闪烁…...
计算机视觉|3D 点云处理黑科技:PointNet++ 原理剖析与实战指南
一、引言 在当今数字化与智能化快速发展的时代,3D 点云处理技术在多个前沿领域中发挥着重要作用。特别是在自动驾驶和机器人视觉等领域,这项技术已成为实现智能化的关键支撑。 以自动驾驶为例,车辆需要实时感知周围复杂的环境信息ÿ…...
【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽
目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...
WebAssembly技术及应用了解
WebAssembly(Wasm)是一种为Web设计的高效、低级的二进制指令格式,旨在提升Web应用的性能并支持多种编程语言。以下是对其核心概念、优势、应用场景及开发流程的系统介绍: 1. 核心概念 二进制格式:Wasm采用紧凑的二进制…...
工程化与框架系列(26)--前端可视化开发
前端可视化开发 📊 引言 前端可视化是现代Web应用中不可或缺的一部分,它能够以直观的方式展示复杂的数据和信息。本文将深入探讨前端可视化开发的关键技术和最佳实践,包括图表绘制、数据处理、动画效果等方面。 可视化技术概述 前端可视化…...
ESP32的IDF开发学习-WiFi的开启、配置与连接
前言 本章节将实现如何使用ESP32的WiFi功能,尽可能的详细地介绍 简介 ESP32中的wifi支持双工作模式 Station(STA)模式:连接到路由器或其他AP设备,可通过esp_wifi_set_mode(WIFI_MODE_STA)设置。SoftAP模式…...
2025-3-9 一周总结
目前来看本学期上半程汇编语言,编译原理,数字电路和离散数学是相对重点的课程. 在汇编语言和编译原理这块,个人感觉黑书内知识点更多,细节更到位,体系更完整,可以在老师讲解之前进行预习 应当及时复习每天的内容.第一是看书,然后听课,在一天结束后保证自己的知识梳理完整,没有…...
【网络编程】事件选择模型
十、基于I/O模型的网络开发 10.9 事件选择模型 10.0.1 基本概念 事件选择(WSAEventSelect) 模型是另一个有用的异步 I/O 模型。和 WSAAsyncSelect 模 型类似的是,它也允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知,最 主要的差别在…...
Java核心语法:从变量到控制流
一、变量与数据类型(对比Python/C特性) 1. 变量声明三要素 // Java(强类型语言,需显式声明类型) int age 25; String name "CSDN"; // Python(动态类型) age 25 name …...
信息安全与网络安全的区别_信息安全与网络安全之差异探析
在当今数字化时代,信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及,但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略,以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…...
http协议的三次握手机制
HTTP协议是基于TCP协议的,因此HTTP的三次握手机制实际上就是TCP的三次握手机制。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了确保通信的可靠性,TCP在建立连接时需要进行三次握手。下面我们详细…...
探秘沃尔什-哈达玛变换(WHT)原理
沃尔什-哈达玛变换(WHT)起源 起源与命名(20世纪早期) 数学基础:该变换的理论基础由法国数学家雅克哈达玛(Jacques Hadamard)在1893年提出,其核心是哈达玛矩阵的构造。扩展与命名&…...
C++ Windows下屏幕截图
屏幕截图核心代码(如果要求高帧率,请使用DxGI): // RGB到YUV的转换公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …...
【python爬虫】酷狗音乐爬取练习
注意:本次爬取的音乐仅有1分钟试听,仅作学习爬虫的原理,完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌,在请求里发现一段mp3文件,复制网址,确实是我们需要的url。 复制音频的…...
电路的一些设计经验
这个C37在这里位于AMS1117-3.3稳压器的输入端。这个是作为输入滤波电容,有助于平滑输入电压,减少输入电压的纹波和噪声,从而提高稳压器LDO的稳定性。 电容器储存电荷,当输入电压出现小的拨动或者纹波时,电容器可以释放…...