当前位置: 首页 > news >正文

架构学习第七周--Prometheus

目录

一、监控系统基础

二、Prometheus介绍

三、Prometheus单机部署

四、服务发现与告警功能

4.1,服务发现

4.2,告警功能实现

五、Prometheus与Kubernetes

5.1,Kubernetes指标

5.2,Prometheus集群部署

一、监控系统基础

监控系统组件:

        -指标数据的抓取

        -指标数据的存储

        -指标数据的分析和可视化

        -告警

监控体系(自底向上)

  -系统层监控

        --系统监控:CPU、Memory、Swap、Disk IO、Processes

        --网络监控:网络设备、工作负载、网络延迟、丢包率

  -中间件及基础设施类系统监控

        --消息中间件:Kafka、RocketMQ和RabbitMQ等;

        --Web服务容器:Tomcat和Jetty等;

        --数据库及缓存系统:MySQL、PostgreSQL、MogoDB、ElasticSearch和Redis等;

        --数据库连接池:ShardingSpere等;

        --存储系统:NFS和Ceph等

  -应用层监控

        --用于衡量应用程序代码的状态和性能

  -业务层监控

        --业务接口:登录数、注册数、订单量、搜索量和支付量等

监控方法论

服务类监控--Google四黄金指标:

        1,延迟(Latency):服务请求所需要的时长

        2,流量(Traffic),也称为吞吐量,衡量服务的容量需求

        3,错误(Errors),失败请求的数量,通常以绝对数量或错误请求占请求总数的百分比来表示

        4,饱和度(Saturation),衡量资源的使用情况,用于表达资源的整体利用率

系统类监控--Netflix的USE方法(Utilization Saturation and Errors Method):

        1,使用率(Utilization),显示系统资源的整体使用情况

        2,饱和度(Saturation),显示资源饱和度,如CPU的平均运行排队长度

        3,错误,(Errors),错误计数,如:网卡在数据包传输过程中检测到的以太网网络冲突了14次

容器类监控--Weave Cloud的RED方法:

        1,(Request)Rate:每秒钟接收的请求数;

        2,(Request)Errors:每秒失败的请求数;

        3,(Request)Duration:每个请求所花费的时长

二、Prometheus介绍

        Prometheus是一款时序(time series)数据库,并且可以通过服务发现机制或静态配置进行监控目标数据抓取的关键组件,结合生态系统内的其它组件,例如Pushgateway、Altermanager和Grafana等,可构成一个完整的IT监控系统。

Prometheus组件(1-4为关键组件):

        1,Prometheus Server--具有数据收集的TSDB,主要用于收集和存储时间序列数据,具有服务发现功能,如 Kuberentes的Node、Pod、Endpoints、Service、Ingress等信息
        2,AlertManager--从Prometheus Server接收到“告警通知”后,通过去重、分组、路由等预处理功能后以高效向用户完成告警信息发送

        3,Exporters--用于暴露现有应用程序或服务的指标给Prometheus Server
        4,PushGateway--接收那些通常由短期作业生成的指标数据的网关,并支持由Prometheus Server进行指标拉取操作

        5,Data Visualization--数据可视化,如Grafana等

        6,Service Discovery--动态发现待监控的Target,从而完成监控配置的重要组件,该组件目前由Prometheus Server内建支持

Prometheus抓取数据方式

        Prometheus不同于其他TSDB的是它主动从各Target上拉取(pull)数据,而非等待被监控端的推送(push),它不是事件驱动的存储系统;这种获取数据的方式有利于将配置集在Prometheus Server上完成,包括指标及采集数率等。

三种抓取途径

        Exporters--部署在现有应用程序或服务上将监控数据转换成prometheus可识别的格式并暴露在指定的URL上

        Instrumentation--应用程序自行定义将监控数据转换为prometheus格式并暴露在指定的URL上

        Pushgateway--以push方式接收那些由短期作业生成的指标数据,再由Prometheus Server定时pull获取该类数据

Prometheus的监控数据

        Prometheus仅用于以“键值”形式存储时序式的聚合数据,它并不支持存储文本信息。因为同一指标可能会适配到多个目标或设备,因此它使用“标签”作为元数据,这些标签还可以作为过滤器进行指标过滤及聚合运算。

监控数据描述方法:

        Counter--计数器,用于保存单调递增型的数据,例如站点访问次数等;不能为负值,也不支持减少,但可以重置回0

        Gauge--仪表盘,用于存储有着起伏特征的指标数据,例如内存空闲大小等

        Histogram--直方图,它会在一段时间范围内对数据进行采样,并将其计入可配置的bucket之中;Histogram能够存储更多的信息,包括样本值分布在每个bucket(bucket自身的可配置)中的数量、所有样本值之和以及总的样本数量,从而Prometheus能够使用内置的函数进行样本平均值、样本分位值的计算

        Summary--摘要,Histogram的扩展类型,但它是直接由被监测端自行聚合计算出分位数,并将计算结果响应给Prometheus Server的样本采集请求;因而,其分位数计算是由由监控端完成

        Instance:能够接收Prometheus Server数据抓取操作的每个网络端点(endpoint)

        Job:具有类似功能的Instance的集合。例如一个MySQL主从复制集群中的所有MySQL进程

        PromQL(全称为Prometheus Query Language):Prometheus内置的数据查询语言,支持用户进行实时的数据查询及聚合操作;PromQL支持处理两种向量,并内置提供了一组用于数据处理的函数

        --即时向量:最近一次的时间戳上跟踪的数据指标;

        --时间范围向量:指定时间范围内的所有时间戳上的数据指标;

Prometheus特性

    关键特性:

        -多维护数据模型:以指标名称及附加的label标识时间序列

        -特有的数据查询语言:PromQL

        -单个服务器节点即可正常工作,不依赖分布式存储

        -基于HTTP协议,以Pull模式完成指标数据采集

        -借助于PushGateway,支持Push模式的指标数据采集

        -使用服务发现机制动态发现Target,或静态配置要监控的Target

        -支持多种Graph和Dashboard

    不适用的场景:

        -Prometheus是一款指标监控系统,不适合存储事件及日志;

        -Prometheus认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期数据,因而不支持针对大量的历史数据进行存储;若需要存储长期的历史数据,需要将数据保存于InfluxDB或OpenTSDB等系统中;

        -Prometheus的集群机制成熟度不高;

Prometheus TSDB数据存储格式为

        -以每2小时为一个时间窗口,并存储为一个单独的block;

        -block会压缩、合并历史数据块,随着压缩合并,其block数量会减少;

        -block的大小并不固定,但最小会保存两个小时的数据

        Prometheus v3.0的TSDB每秒可以处理数百万个样本,这是通过预写日志(WAL)来实现。WAL工作逻辑:新采集的数据将先写入内存中并停留一段时间,然后即会被刷写到磁盘并映射进内存中,当内存映射的块或内存中的块老化到一定程度时,它会将作为持久块刷写到磁盘block,随着时间经过block会合并,直到超过保留期限删除。

三、Prometheus单机部署

下载链接:Download | Prometheushttps://prometheus.io/download/https://prometheus.io/download/https://prometheus.io/download/

#将下载的安装包解压至本地

root@k8s-master01:~# tar xf prometheus-2.53.3.linux-amd64.tar.gz -C /usr/local/        
root@k8s-master01:~# ln -s /usr/local/prometheus-2.53.3.linux-amd64 /usr/local/prometheus
root@k8s-master01:~# cd /usr/local/prometheus/
root@k8s-master01:/usr/local/prometheus# ls
LICENSE  NOTICE  console_libraries  consoles  prometheus  prometheus.yml  promtool
root@k8s-master01:~# useradd -r prometheus                                        #创建服务用户
root@k8s-master01:~# mkdir /usr/local/prometheus/data 
root@k8s-master01:~# chown -R prometheus.prometheus /usr/local/prometheus/data
root@k8s-master01:~# vim /lib/systemd/system/prometheus.service                      #创建serivice文件

[Unit]
Description=Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/

[Service]
Restart=always
User=prometheus
EnvironmentFile=-/etc/default/prometheus
ExecStart=/usr/local/prometheus/prometheus \
            --config.file=/usr/local/prometheus/prometheus.yml \
            --storage.tsdb.path=/usr/local/prometheus/data \
            --web.console.libraries=/usr/share/prometheus/console_libraries \
            --web.enable-lifecycle \
            $ARGS
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target
root@k8s-master01:~# systemctl daemon-reload
root@k8s-master01:~# systemctl enable --now prometheus.service
root@k8s-master01:~# ss -tnlp | grep '9090'                                      #服务运行在9090端口
LISTEN 0      4096               *:9090            *:*    users:(("prometheus",pid=62248,fd=7))
root@k8s-master01:~# curl localhost:9090/metrics        #查看prometheus自身的监控参数
#此时访问本机的IP:9090可进入web管理界面

#部署node-exporter

root@k8s-master01:~# tar xf node_exporter-1.8.2.linux-amd64.tar.gz -C /usr/local
root@k8s-master01:~# ln -s /usr/local/node_exporter-1.8.2.linux-amd64 /usr/local/node_exporter
root@k8s-master01:~# vim /lib/systemd/system/node_exporter.service

[Unit]
Description=node_exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter \
  --collector.ntp \
  --collector.mountstats \
  --collector.systemd \
  --collector.ethtool \
  --collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always

[Install]
WantedBy=multi-user.target

root@k8s-master01:~# systemctl enable --now node_exporter.service
root@k8s-master01:~# curl localhost:9100/metrics            #查看node-exporter的监控参数
root@k8s-master01:~# vim /usr/local/prometheus/prometheus.yml        #添加下列参数

scrape_configs:
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "node_exporter"
    static_configs:
      - targets: ["localhost:9100"]

root@k8s-master01:~# /usr/local/prometheus/promtool check config /usr/local/prometheus/prometheus.yml                      #检测Prometheus配置文件是否有误

root@k8s-master01:~# systemctl reload prometheus.service

#其他如consul exporter(9107),blackbox exporter(9115),grafana exporter(3000),mysql exporter(9104)等二进制部署方式与上述一致

四、服务发现与告警功能

4.1,服务发现

        Prometheus Server的数据抓取工作于Pull模型,因而,它需要知道各Target的位置,对于小型系统环境可以通过static_configs指定各Target;对于大型环境需要通过器底层平台的API Server或DNS的A记录等获取Target信息。

#静态服务发现

#使用docker-compose或包安装的方式安装nginx和nginx-exporter

root@k8s-master01:~# cd /usr/local/prometheus
root@k8s-master01:/usr/local/prometheus# vim prometheus.yml                               #还原配置文件默认设置

scrape_configs:
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

root@k8s-master01:/usr/local/prometheus# systemctl reload prometheus.service

root@k8s-master01:/usr/local/prometheus# mkdir targets

root@k8s-master01:/usr/local/prometheus# vim targets/01.yaml               #创建targets文件

- targets:
  - localhost:9100
  - 172.29.7.20:9113
  labels:
    app: exporter
root@k8s-master01:/usr/local/prometheus# vim prometheus.yml                 #将targets文件位置添加至策略内
......

  - job_name: "exporter"
    file_sd_configs:
      - files:
        - targets/*.yaml
        refresh_interval: 2m
root@k8s-master01:/usr/local/prometheus# ./promtool check config ./prometheus.yml                #检测配置文件
Checking ./prometheus.yml
root@k8s-master01:/usr/local/prometheus# systemctl reload prometheus.service       #重新加载服务

4.2,告警功能实现

        当样本数据量较大时Prometheus Server负载较高,对于一些查询频率较高且运算较为复杂的查询来说,实时查询会存在一定程度的响应延迟。为了解决该问题,我们可以使用记录规则(Recording rule)预先运行频繁用到或计算消耗较大的表达式,并将其结果保存为一组新的时间序列。

#配置记录规则

root@k8s-master01:/usr/local/prometheus# mkdir -pv rules/{recording,alter}
root@k8s-master01:/usr/local/prometheus# vim rules/recording/rule01.yaml            #创建规则文件
groups:
- name: custom_rules
  interval: 5s
  rules:
    - record: instance:node_cpu:avg_rate5m
      expr: 100 - avg(irate(node_cpu_seconds_total{job="node", mode="idle"}[5m])) by (instance) * 100
    - record: instace:node_memory_MemFree_percent
      expr: 100 - (100 * node_memory_MemFree_bytes / node_memory_MemTotal_bytes)
    - record: instance:root:node_filesystem_free_percent
      expr: 100 * node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}

root@k8s-master01:/usr/local/prometheus# vim prometheus.yml           #添加rule文件位置
rule_files:
  - "rules/recording/*.yaml"

root@k8s-master01:/usr/local/prometheus# ./promtool check config ./prometheus.yml
root@k8s-master01:/usr/local/prometheus# systemctl reload prometheus.service

        告警规则(Alert rule)是另一种定义在Prometheus配置文件中的PromQL表达式,它通常是一个基于查询语句的布尔表达式,该表达式负责触发告警,通常可以保存为记录规则避免可能参生的延迟。

#配置告警规则

#安装alertmanager

root@k8s-master01:/usr/local/prometheus# tar xf /root/alertmanager-0.27.0.linux-amd64.tar.gz -C /usr/local/
root@k8s-master01:/usr/local/prometheus# ln -s /usr/local/alertmanager-0.27.0.linux-amd64 /usr/local/alertmanager
root@k8s-master01:/usr/local/prometheus# cd ../alertmanager
root@k8s-master01:/usr/local/alertmanager# mkdir data

root@k8s-master01:/usr/local/alertmanager# chown -R prometheus.prometheus /usr/local/alertmanager/*
root@k8s-master01:/usr/local/alertmanager# vim /lib/systemd/system/alertmanager.service

[Unit]
Description=alertmanager
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager/alertmanager \
            --config.file="/usr/local/alertmanager/alertmanager.yml" \
            --storage.path="/usr/local/alertmanager/data/" \
            --data.retention=120h \
            --log.level=info
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always

[Install]
WantedBy=multi-user.target

root@k8s-master01:/usr/local/alertmanager# systemctl enable --now alertmanager.service

#配置邮件服务,告警邮件将通过mail01@localhost发给wlm@localhost()

root@k8s-master01:/usr/local/alertmanager# vim alertmanager.yml
global:
  smtp_smarthost: 'localhost:25'
  smtp_from: 'mail01@localhost'
  smtp_require_tls: false
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email-receiver'
  routes:
  - match:
      severity: 'critical'
    receiver: 'email-receiver'
receivers:
  - name: 'email-receiver'
    webhook_configs:
      - to: ‘wlm@localhost’

#添加告警协议

root@k8s-master01:/usr/local/prometheus# vim prometheus.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 172.29.7.20:9093
rule_files:
  - "rules/recording/*.yaml"
  - "rules/alter/*.yaml"

root@k8s-master01:/usr/local/prometheus# vim rules/alter/02.yaml

groups:
- name: AllInstances
  rules:
  - alert: Instance
    expr: up == 0
    for: 1m
    annotations:
      title: 'Instance down'
      description: Instance has been down for more than 1 minute.'
      summary: 'Instance down'
    labels:
      severity: 'critical'

root@k8s-master01:/usr/local/prometheus# ./promtool test rules rules/alter/02.yaml

root@k8s-master01:/usr/local/prometheus# systemctl reload prometheus.service


#手动关闭nignx服务测试告警功能

五、Prometheus与Kubernetes

5.1,Kubernetes指标

        kubectl top node/pod--可以查看node或pod的使用情况,但是其依赖指标实现其功能(需要部署metrics组件才能使用该命令),其他组件如HPAv1(Horizontal Pod Autoscaler)同top命令一样需要API群组--metrics.k8s.io来完成扩,缩容。

root@k8s-master01:~# kubectl top nodes
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master01   150m         7%     1118Mi          61%
k8s-master02   168m         8%     1016Mi          55%
k8s-master03   140m         7%     906Mi           49%
k8s-work01     73m          3%     1164Mi          63%
k8s-work02     60m          3%     558Mi           30%
k8s-work03     70m          3%     676Mi           37%
root@k8s-master01:~# kubectl top pod -n kube-system
NAME                                   CPU(cores)   MEMORY(bytes)
coredns-857d9ff4c9-899bh               2m           36Mi
coredns-857d9ff4c9-x486f               2m           33Mi
csi-nfs-controller-77c56d9d7-k6s5v     2m           72Mi
        Metrics组件仅提供CPU和Memory的采集功能,为了更好的监控Kubernetes需要使用第三方组件如Prometheus Server扩展提供更多指标。注意:Prometheus的原生指标不被Kubernetes兼容,自身也不支持作为指标服务器使用(没有API群组作为调用入口),需要使用Prometheus Adapater提供一个API入口,注册一个群组,转换指标格式为Kubernetes兼容的格式。
        因此监控Kubernetes集群时,需要部署Prometheus Server实现监控功能,部署kube-state-metrics组件其功能相当于Kubernetes exporter,部署InfluxDB/VictoriaMetircs用于监控指标的持久化存储,AlterManager告警组件和Grafana展示组件。

5.2,Prometheus集群部署

#使用Helm在Kubernetes集群部署Prometheus

#k8s-master01        172.29.7.10

#k8s-node01           172.29.7.11

#k8s-node02           172.29.7.12

#k8s-node03           172.29.7.13

#nfs-server             172.29.7.20

#部署nfs-csi,首先需要部署NFS本地服务器或容器

root@nfs-server:~# apt install -y nfs-kernel-server                #在本地部署nfs服务器

root@nfs-server:~# mkdir /home/nfs                                      #创建nfs目录

root@nfs-server:~# vim /etc/exports

/home/nfs       *(rw,fsid=0,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
root@nfs-server:~# systemctl start nfs-server

#在所有Kubernetes节点部署nfs客户端

root@k8s-node01:~# apt -y install nfs-common

root@k8s-node02:~# apt -y install nfs-common

root@k8s-node03:~# apt -y install nfs-common

#在Kubernetes上创建storageclass资源默认调度NFS服务器

root@k8s-master01:~# cat nfs-csi-storageclass.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs.csi.k8s.io
parameters:
  server: 172.29.7.20
  share: /home/nfs
reclaimPolicy: Retain
volumeBindingMode: Immediate


#下载官方csi-driver-nfs/deploy/v4.6.0 at v4.6.0 · kubernetes-csi/csi-driver-nfs · GitHub下的yaml文件并进行部署,实现csi-nfs部署安装

root@k8s-master01:~# ls
crd-csi-snapshot.yaml    csi-nfs-driverinfo.yaml  csi-snapshot-controller.yaml  rbac-snapshot-controller.yaml
csi-nfs-controller.yaml  csi-nfs-node.yaml        rbac-csi-nfs.yaml

root@k8s-master01:~# kubectl apply -f .

#使用Helm直接部署Prometheus
root@k8s-master01:~# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
root@k8s-master01:~# helm install my-prometheus prometheus-community/prometheus --version 27.3.1
root@k8s-master01:~# kubectl create ingress ingress-my-prometheus --rule="prometheus.wlm.com/*"=my-prometheus-server:80 --class=nginx --dry-run=client -o yaml > ingress-my-prometheus.yaml                       #创建ingress资源
root@k8s-master01:~# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.110.104.45   172.29.7.51   80:30182/TCP,443:31691/TCP   2d
root@k8s-master01:~# kubectl apply -f ingress-my-prometheus.yaml
#在本地hosts解析域名和IP即可通过浏览器进行访问

相关文章:

架构学习第七周--Prometheus

目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…...

基于Nanopi duo2的WiFi智能摄像头

1.固件包烧录 https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E8.BF.9E.E6.8E.A5WiFi 固件包链接以及烧录工具都在上面链接中 烧录过程 使用读卡器将SD卡插入到电脑,然后打开烧录工具 2.通过串口工具连接板子使其连接WiFi 对应的串口工具,就是这个HyperT…...

Hive Orc表数据导出和导入

导出到hdfs:hive执行 INSERT OVERWRITE DIRECTORY /test/hdfs_dir ROW FORMAT DELIMITED FIELDS TERMINATED BY \t STORED AS ORC SELECT * FROM hive_table; HDFS导出到本地:shell执行 hdfs dfs -get /test/hdfs_dis/file_name /linux_dir/xxx 本…...

Python爬虫实战:从零到一构建数据采集系统

文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代,数据采…...

Ubuntu 的RabbitMQ安装

目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a)添加用户名:admin,密码&#xff1…...

七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)

在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…...

cuda安装

cuda WSL2急速搭建CUDA体验环境_wsl2 cuda-CSDN博客 cudnn cuDNN Archive | NVIDIA Developer pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数

ngx_os_init 声明在 src/os/unix/ngx_os.h ngx_int_t ngx_os_init(ngx_log_t *log); 定义在 src\os\unix\ngx_posix_init.c ngx_int_t ngx_os_init(ngx_log_t *log) {ngx_time_t *tp;ngx_uint_t n; #if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE)long size; #endif#if (NGX…...

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨:啥时候写的?是我写的么?疑惑重重… 所以说,好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步:第一步:申请域名并映射到外网IP &#xff0…...

QML 实现一个动态的启动界面

QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...

视频HDR技术详解,你的电脑怎么播放HDR视频?

闲聊:前两天在b站上面看到影视飓风的视频,让我有点疑惑,我不知道为什么播放视频有设备撑不住一说,所以感兴趣去ytb下载了4k原片30hz刷新的,然后测试一下我的电脑能不能播放,发现还是可以的,视觉…...

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核功能之,主要来拦截的请求,在指定法前后,根据业务需要执预先设定的代码。 也就是说,允许开发员提前预定义些逻辑,在的请…...

2025年度福建省职业院校技能大赛高职组“信息安全管理与评估”赛项规程

2025 年度福建省职业院校技能大赛 高 职组“ 信息安全管理与评估 ”赛项规程 一、赛项名称 省赛编号:GZ032 赛项名称:信息安全管理与评估 赛项组别:高职组 竞赛形式: 团体赛 二、竞赛目的 为全面贯彻落实国家网络强国战略&#x…...

Vue 中 nextTick 的原理详解

1. 为什么需要 nextTick Vue 采用 异步渲染机制,当响应式数据发生变化时,Vue 并不会立即更新 DOM,而是将这些变化放入一个 队列 中,并在 同一事件循环(Event Loop)中合并相同的修改,最后执行批…...

vue 手写分页

【先看效果】 &#xff08;1&#xff09;内容小于2页 不展示页码 &#xff08;2&#xff09;1 < 内容页数< 限定展示页码 展示&#xff1a;页码、上下页&#xff1b;隐藏&#xff1a;首页、末页图标&#xff0c;上、下一区间码。即&#xff1a;&#xff08;页数&#…...

跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现

小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…...

DuodooBMS源码解读之 sale_change模块

销售变更模块用户使用手册 一、模块概述 本扩展模块主要包含两个主要的 Python 文件&#xff1a;sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py&#xff0c;提供了销售变更报表查看和销售变更单下载的功能。以下是详细的使用说明…...

基于 Highcharts 实现 Vue 中的答题统计柱状图组件

在现代 Web 开发中&#xff0c;数据可视化是一个重要的组成部分&#xff0c;而 Highcharts 是一个广泛使用的 JavaScript 图表库&#xff0c;可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中&#xff0c;我们将基于 Highcharts 创建一个用于答题统计的柱状图&#…...

MySQL 插入更新语句(insert…on duplicate key update语句 )

我们日常在使用 insert into 语句向表中插入数据时&#xff0c;一定遇到过主键或唯一索引冲突的情况&#xff0c;当遇到这种情况时&#xff0c;MySQL默认的反应是报错并停止执行后续的语句&#xff0c;为了避免这种情况&#xff0c;你有3种选择&#xff1a; 使用insert ignore…...

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…...

基于LM Arena 的 LLM 基准测试排行榜:DeepSeek-R1 排名第 5

打开 Arena 网站&#xff1a;https://lmarena.ai/&#xff0c;点开 Leaderboard 可以看到上图的排行榜&#xff0c;可以看到 DeepSeek-R1 排名第 5。...

游戏引擎学习第116天

回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化&#xff0c;尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库&#xff0c;而是深入理解代码并进行优化。当前阶段正进行SIMD&#xff08;单指令多数据&#xff09;优化&#xff0c;使用Intel推荐…...

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…...

当湖南家具遇上DeepSeek:极满家开启智能家居新时代

在湖南的街头巷尾&#xff0c;总流传着这样一句话&#xff1a;家具有温度&#xff0c;生活才有味道。走进铂乐极满家的展厅&#xff0c;只有被阳光浸润的原木香气&#xff0c;和智能家居跳动的温暖建议。DeepSeek就推荐了能自动调节高度的智能款&#xff0c;连护眼灯角度都算好…...

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…...

Docker挂载数据显式挂载和隐式挂载的区别

项目使用的Docker file 创建数据卷挂载点&#xff0c;结果发现宿主机目录中的数据卷路径下是空的&#xff0c;才知道docker file中创建的数据卷是隐式挂载&#xff0c;并不会在宿主机上留下持久化数据&#xff0c;随着容器被删除隐式挂载的数据卷也会跟着被删除 后面改为在jen…...

深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)

HTTP协议概述 1.1 HTTP的基本概念 HTTP是一种应用层协议&#xff0c;使用TCP作为传输层协议&#xff0c;默认端口是80&#xff0c;基于请求和响应的方式&#xff0c;即客户端发起请求&#xff0c;服务器响应请求并返回数据&#xff08;HTML&#xff0c;JSON&#xff09;。在H…...

MySQL八股学习笔记

文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute&#xff08;1&#xf…...

C++ 设计模式-备忘录模式

游戏存档实现&#xff0c;包括撤销/重做、持久化存储、版本控制和内存管理 #include <iostream> #include <memory> #include <deque> #include <stack> #include <chrono> #include <fstream> #include <sstream> #include <ct…...

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…...

【动态规划篇】:解析背包问题--动态规划塑造的算法利器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;动态规划篇–CSDN博客 文章目录 一.01背包问题1.模板题2.例题1.分割等和子集2.目标和3.最后…...

ok113i平台——多媒体播放器适配

1. 视频播放支持 1.1 在Linux平台交叉编译ffmpeg动态库&#xff0c;详情查看《ok113i平台——交叉编译音视频动态库》 提取如下动态库&#xff1a; libavcodec.so.58.134.100 libavdevice.so.58.13.100 libavfilter.so.7.110.100 libavformat.so.58.76.100 libavutil.so.56.…...

【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库

一、总体方案 目前在使用 DeepSeek 在线环境时&#xff0c;页面经常显示“服务器繁忙&#xff0c;请稍后再试”&#xff0c;以 DeepSeek R1 现在的火爆程度&#xff0c;这个状况可能还会持续一段时间&#xff0c;所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…...

线程与进程的深入解析及 Linux 线程编程

在操作系统中&#xff0c;进程和线程是进行并发执行的两种基本单位。理解它们的区别和各自的特点&#xff0c;能够帮助开发者更好地进行多任务编程&#xff0c;提高程序的并发性能。本文将探讨进程和线程的基础概念&#xff0c;及其在 Linux 系统中的实现方式&#xff0c;并介绍…...

微信问题总结(onpageshow ,popstate事件)

此坑描述 订单详情某按钮点击&#xff0c;通过window.location.href跳转到&#xff08;外部&#xff09;第三方链接后&#xff0c;回退后&#xff0c;在ios中生命周期和路由导航钩子都失效了&#xff0c;无法触发。 在安卓中无视此坑&#xff0c; 回退没有问题 解决 原因&am…...

自己安装一台DeepSeek的服务器

找一台还可以的Linux服务器&#xff0c;登录后执行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 等待安装完成&#xff1a; 执行命令&#xff0c;根据服务器能力安装不同版本的AI模型&#xff1a; ollama run llama3.2 下一步就开始对话吧&#xff1a; llam…...

面阵工业相机提高餐饮业生产效率

餐饮行业是一个快节奏、高要求的领域&#xff0c;该领域对生产过程中每一个阶段的效率和准确性都有很高的要求。在食品加工、包装、质量控制和库存管理等不同生产阶段实现生产效率的优化是取得成功的关键步骤。面阵工业相机能够一次性捕捉对象的二维区域图像&#xff0c;并支持…...

Java 中 HTTP 协议版本使用情况剖析

Java 中 HTTP 协议版本使用情况剖析 一、HTTP/1.1 与 HTTP/2 概述 (一)HTTP/1.1 HTTP/1.1 是广泛应用且成熟的 HTTP 协议版本,它在互联网发展历程中扮演了重要角色。其特点主要包括: 连接方式:默认采用短连接,即每次请求都要建立新的 TCP 连接,请求完成后断开。不过也…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

DeepSeek 助力 Vue 开发:打造丝滑的缩略图列表(Thumbnail List)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

day56 第十一章:图论part06

108.冗余连接 注意init初始化 改进&#xff1a; 其实只有一条边冗余&#xff0c;改为&#xff0c;如果两条边在同一个集合里&#xff0c;就输出&#xff0c;不然加入。 #include <iostream> #include <vector> using namespace std;int n 1005; vector<int>…...

conda 配置源

无论是Anaconda vs Miniconda vs Miniforge 中的哪个&#xff0c;只要使用conda就涉及源&#xff0c;换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下&#xff1a; Linux: ${HOME}/.condarcmacOS: ${…...

LangChain大模型应用开发:多模态输入与自定义输出

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大模型应用开发中的多模态输入与自定义输出。 LangChain中的多模态数据输入是指将多种不同形式的数据作为输入提供给基于语言模型的应用程序或系统&#xff0c;以丰富交互内容和提…...

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…...

【Unity Shader编程】之图元装配与光栅化

执行方式&#xff1a;自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例&#xff1a;gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围&#xff08;NDC空间外&#xff09;的三角形&#xff0c;仅保…...

小游戏-记忆卡牌

1、游戏开始4张卡牌&#xff0c;每次过关后新增两张&#xff0c;总共64张卡&#xff0c;可以修改数组EMOJIS&#xff0c;添加表情&#xff0c;增加卡牌数量 2、新建txt文件&#xff0c;将代码粘贴进去&#xff0c;保存后&#xff0c;将txt修改后缀名为html的格式 <!DOCTYPE…...

数据结构——二叉树经典习题讲解

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的二叉树 递归很重要的一些注意事项&#xff1a; 1&#xff1a;递归你能不能掌握在于&#xff1…...

centos 9 时间同步服务

在 CentOS 9 中&#xff0c;默认的时间同步服务是 chrony&#xff0c;而不是传统的 ntpd。 因此&#xff0c;建议使用 chrony 来配置和管理时间同步。 以下是使用 chrony 配置 NTP 服务的步骤&#xff1a; 1. 安装 chrony 首先&#xff0c;确保系统已安装 chrony。 在 CentOS…...

视觉应用工程师(面试)

视觉应用工程师&#xff08;面试&#xff09; 1.自我介绍、会的技能、项目 2.相机和机械手调试过程 检查硬件&#xff0c;看软件驱动是否链接&#xff0c;调节相机和镜头保证能够识别这个物料&#xff0c;看接口和通讯是否正常&#xff0c;如&#xff1a;波特率&#xff0c;数…...

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end...