全面Kafka监控方案:从配置到指标

文章目录

  • 1.1.监控配置
  • 1.2.监控工具
  • 1.3.性能指标
    • 系统相关指标
    • GC相关指标
    • JVM相关指标
    • Topic相关指标
    • Broker相关指标
  • 1.4.性能指标说明
  • 1.5.重要指标说明

1.1.监控配置

开启JMX服务端口:kafka基本分为broker、producer、consumer三个子项,每一项的启动都需要用到 $KAFKA_HOME/bin/kafka-run-class.sh 脚本,在该脚本中,存在以下语句:

if ...
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false"fi
if ...KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
Fi

​ 在启动kafka的过程中,只要指定 JMX_PORT 的值,即可对broker、producer、consumer进行监控。目前有两种方法,在$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/bin/kafka-console-consumer.sh $KAFKA_HOME/bin/kafka-console producer.sh三个脚本中分别添加 $JMX_PORT=XXXX 语句,但是只适用于使用console方式对topic进行使用的情况。
修改$KAFKA_HOME/bin/kafka-run-class.sh 脚本中的上述语句,使其端口随机变化,可以通过 ps -ef |grep kafka 命令来获取随机的端口号,来进行监控。

1.2.监控工具

Prometheus监控Kafka

  1. 如可以采用docker部署
kafka-exporter:
docker run -ti -d --rm -p 9308:9308 danielqsj/kafka-exporter --kafka.server=192.168.0.4:9092
监控项名称阈值说明使用的公式
Kafka的Brokers在线1m !=1严重count(kafka_server_replicamanager_leadercount{job=~"$job"})
Kafka集群中副本处于同步失败或失效状态的分区数>0严重sum(kafka_topic_partition_under_replicated_
partition{topic=~"$topic", namespace=~"$kubernetes_namespace"})
Kafka集群中控制器的数量!=1严重sum(kafka_controller_kafkacontroller_activecontrollercount{job=~"$job"})
Kafka离线分区数>0严重sum(kafka_controller_kafkacontroller_offlinepartitionscount{job=~"$job"})
Kafka每秒入网络流量>=150中度avg_over_time(kafka_server_BrokerTopicMetrics_
OneMinuteRate{name="BytesInPerSec",topic=""}[1m]) / 1024 /1024
Kafka请求处理程序线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_server_KafkaRequestHandlerPool_
OneMinuteRate{name="RequestHandlerAvgIdlePercent",}[1m])

在这里插入图片描述
2. 在prometheus.yml出添加kafka配置

  - job_name: 'kafka_exporter'static_configs:- targets: ['$node1:9308']
  1. 重启prometheus加载。
  2. 在promethues的管理界面可以查看状态:
    在这里插入图片描述
  3. 然后配置grafana来展示图表效果。
  4. 告警监控项,如下表供参考:
时间百分比rcent",}[1m])
Kafka请求处理程序线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_server
_KafkaRequestHandlerPool
_OneMinuteRate{name=“
RequestHandlerAvgIdlePercent”,}[1m])
Kafka网络处理器线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_network_
SocketServer_Value{name=“
NetworkProcessorAvgIdlePercent”,}[1m])
Kafka已建立的连接数> 3000中度> 5000严重sum(avg_over_time(kafka_
server_socket_server_metrics_
connection_count{listener=“PLAINTEXT”,}
[1m])) by (instance,app)
Kafka每秒新建连接数> 100中度> 200 严重sum(avg_over_time(kafka_server
_socket_server_metrics_connection
_creation_rate[1m])) by (instance)
Kafka请求在请求队列中等待的时间>5000中度avg_over_time(kafka_networ
k_RequestMetrics_999thPercentile
{name=“RequestQueueTimeMs”,
request=“Produce”,}[1m])
Kafka_leader处理请求的时间>5000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“LocalTimeMs”,request=“Produce”,}[1m])
Kafka请求等待follower的时间>1000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“RemoteTimeMs”,request=“Produce”,}[1m])
Kafka请求在响应队列中等待的时间>1000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“ResponseQueueTimeMs”,request=“Produce”,}[1m])
Kafka发送响应的时间>1000中度avg_over_time(kafka_network_RequestMetrics
_999thPercentile{name=“ResponseSendTimeMs”,
request=“Produce”,}[1m])
Kafka汇总传入消息速率> 200000中度avg_over_time(kafka_server_
BrokerTopicMetrics_OneMinuteRate
{name=“MessagesInPerSec”,topic=“”}[1m])
kafka消费滞后告警>1000sum(kafka_consumergroup
_lag{topic!=“sop_free_study_fix-student_wechat_detail”})
by (consumergroup, topic) > 1000
kafka-exporter停止< 1kafka_exporter_build_info
kafka server停止<1kafka_brokers
kafka监控topic实时生产速率>= 0sum(irate(kafka_topic_partition_current_
offset{topic !~ "__consumer_offsets
Kafka消费者端分区偏移量5m >= 0sum(delta(kafka_consumergroup_current
_offset[5m])/5) by (consumergroup, topic)
Kafka消费者组的当前主题分区偏移汇总sum(delta(kafka_consumergroup_current
_offset_sum[5m])/5) by (consumergroup, topic)
Kafka某个消费组消费延迟5m >100000中度sum(kafka_consumergroup_lag)
by (consumergroup,partition,topic)
Kafka某个消费者组在某个主题分区的近似滞后情况汇总sum(kafka_consumergroup_lag_sum)
by (consumergroup,partition,topic)
某个消费组成员kafka_consumergroup_
members{instance=“$instance”}
Kafka分区的位移量汇总sum(kafka_topic_partition_current_offset) by (partition,topic)
Kafka分区的同步副本数1m =0 中度sum(kafka_topic_partition_in_sync_replica)
Kafka旧主题分区偏移sum(kafka_topic_partition_oldest
_offset{topic=~“$topic”}) by (partition,topic)
Kafka主题分区的副本数1m <3中度sum(kafka_topic_partition
_replicas{topic=~“$topic”})
Kafka主题分区复制不足的分区数sum(kafka_topic_partition_under
_replicated_partition{topic=~“$topic”})
Kafka 总分区数5m >1000中度sum(kafka_topic_partitions) by(topic)

1.3.性能指标

系统相关指标

  1. 系统信息收集 java.lang:type=OperatingSystem
  2. Thread信息收集 java.lang:type=Threading
  3. 获取mmaped和direct空间
  4. 通过BufferPoolMXBean获取used、capacity、count

GC相关指标

  1. Young GC
    java.lang:type=GarbageCollector,name=G1 Young Generation
  2. Old GC
    java.lang:type=GarbageCollector,name=G1 Old Generation

JVM相关指标

通过MemoryMXBean获取JVM相关信息HeapMemoryUsage和NonHeapMemoryUsage;通过MemoryPoolMXBean获取其他JVM内存空间指标,例如:Metaspace、Codespace等

Topic相关指标

  1. Topic消息入站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=" + topic
  2. Topic消息出站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=" + topic
  3. Topic请求被拒速率
    kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic=" + topic
  4. Topic失败拉去请求速率
    kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec,topic=" + topic;
  5. Topic发送请求失败速率
    kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=" + topic
  6. Topic消息入站速率(message)
    kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=" + topic

Broker相关指标

  1. Log flush rate and time
    kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMs
  2. 同步失效的副本数
    kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
  3. 消息入站速率(消息数)
    kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
  4. 消息入站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec
  5. 消息出站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec
  6. 请求被拒速率
    kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec
  7. 失败拉去请求速率
    kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec
  8. 发送请求失败速率
    kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec
  9. Leader副本数
    kafka.server:type=ReplicaManager,name=LeaderCount
  10. Partition数量
    kafka.server:type=ReplicaManager,name=PartitionCount
  11. 下线Partition数量
    kafka.controller:type=KafkaController,name=OfflinePartitionsCount
  12. Broker网络处理线程空闲率
    kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent
  13. Leader选举比率
    kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs
  14. Unclean Leader选举比率
    kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec
  15. Controller存活数量
    kafka.controller:type=KafkaController,name=ActiveControllerCount
  16. 请求速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=Produce
  17. Consumer拉取速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=FetchConsumer
  18. Follower拉去速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=FetchFollower
  19. Request total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce
  20. Consumer fetch total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchConsumer
  21. Follower fetch total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchFollower
  22. Time the follower fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=FetchFollower
  23. Time the Consumer fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=FetchConsumer
  24. Time the Produce fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=Produce
  25. Broker I/O工作处理线程空闲率
    kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent
  26. ISR变化速率
    kafka.server:type=ReplicaManager,name=IsrShrinksPerSec

1.4.性能指标说明

指标单位具体含义
kafka.broker_offset offsetsbroker上当前消息的偏移量(offset)
kafka.consumer.bytes_inbytes/secondconsumer 字节率(bytes in rate)
kafka.consumer.delayed_requestsrequests延迟的 consumer 请求数
kafka.consumer.expires_per_secondevictions/second延迟 consumer 的请求到期(expiration)速率
kafka.consumer.fetch_raterequestsconsumer 向 broker 发送提取请求(fetch requests)的最低速率
kafka.consumer.kafka_commitswrites/second面向 Kafka 的 offset commits 速率
kafka.consumer.max_lagoffsets最大消费滞后(consumer lag)
kafka.consumer.messages_inmessages/secondconsumer 消息消费(consumption)的速率
kafka.consumer.zookeeper_commitswrites/second面向 ZooKeeper 的 offset commits 速率
kafka.consumer_lagoffsetsconsumer 和 broker 之间的消息滞后(lag)
kafka.consumer_offsetoffsetsconsumer 的当前消息偏移量(current message offset)
kafka.expires_secevictions/second延迟生产者(delayed producer)的请求到期(request expiration)速率
kafka.follower.expires_per_secondevictions/second关注者(followers)的请求到期(request expiration)速率
kafka.log.flush_rateflushes/second日志刷新速率
kafka.messages_inmessages传入(incoming)信息速率
kafka.net.bytes_inbytes/second传入(incoming)字节速率
kafka.net.bytes_outbytes/second传出(outgoing)字节速率
kafka.net.bytes_rejectedbytes/second被拒绝(rejected)的字节速率
kafka.producer.bytes_outbytes/secondproducer 字节输出速率
kafka.producer.delayed_requestsrequests延迟的 producer 请求数
kafka.producer.expires_per_secondsevictions/secondproducer 请求到期率
kafka.producer.io_waitnanosecondsProducer I/O 等待时间
kafka.producer.message_ratemessages/secondProducer 消息速率
kafka.producer.request_latency_avgmillisecondsProducer 平均请求延迟
kafka.producer.request_raterequests/secondproducer 每秒钟的请求数
kafka.producer.response_rateresponses/secondproducer 每秒钟的响应数
kafka.replication.isr_expandsnodes/second副本加入 ISR 池的速率
kafka.replication.isr_shrinksnodes/second副本离开 ISR 池的速率
kafka.replication.leader_electionsevents/second领导选举(Leader election)频率
kafka.replication.unclean_leader_electionsevents/secondUnclean 的领导选举(Leader election)频率
kafka.replication.under_replicated_partitions未使用的分区数
kafka.request.fetch.failedrequests客户端获取请求(fetch request)失败次数
kafka.request.fetch.failed_per_secondrequests/second每秒钟的客户端获取请求(fetch request)失败率
kafka.request.fetch.time.99percentilerequests/second获取请求(fetch request)时间的第 99 百分位的值
kafka.request.fetch.time.avgrequests/second获取请求(fetch request)时间的平均值
kafka.request.handler.avg.idle.pctfractions请求处理程序线程(request handler threads)的平均空闲时间占比
kafka.request.metadata.time.99percentilemilliseconds元数据(metadata)请求时间的第 99 百分位的值
kafka.request.metadata.time.avgmilliseconds元数据(metadata)请求时间的的平均值
kafka.request.offsets.time.99percentilemillisecondsoffset 请求时间的第 99 百分位的值
kafka.request.offsets.time.avgmillisecondsoffset 请求时间的平均值
kafka.request.produce.failedrequests失败的产品请求(produce requests)数
kafka.request.produce.failed_per_secondrequests/second每秒钟的产品请求(produce requests)失败率
kafka.request.produce.time.99percentilerequests/second产品请求(produce requests)时间的第 99 百分位的值
kafka.request.produce.time.avgrequests/second产品请求(produce requests)平均时间
kafka.request.update_metadata.time.99percentilemilliseconds更新元数据请求(update metadata requests)时间的第 99 百分位的值
kafka.request.update_metadata.time.avgmilliseconds更新元数据请求(update metadata requests)时间的平均值

1.5.重要指标说明

参照kafka-manager管理工具
1.

kafka.replication.under_replicated_partitions:
Under Replicated Partitions

: 在一个运行健康的集群中,处于同步状态的副本数(ISR)应该与总副本数(简称AR:Assigned Repllicas)完全相等,如果分区的副本远远落后于leader,那这个follower将被ISR池删除,随之而来的是IsrShrinksPerSec(可理解为isr的缩水情况,后面会讲)的增加。由于kafka的高可用性必须通过副本来满足,所有有必要重点关注这个指标,让它长期处于大于0的状态。
2. Brokers Spread:
broker使用率,如kafka集群9个broker,某topic有7个partition,则broker spread: 7 / 9 = 77%
3. Brokers Leader Skew:
leader partition是否存在倾斜,如kafka集群9个broker,某topic14个partition,则正常每个broker有2个leader partition。若其中一个broker有0个leader partition,一个有4个leader partition,则broker leader skew: (4 - 2) / 14 = 14%
由于kafka所有读写都在leader上进行, broker leader skew会导致不同broker的读写负载不均衡,配置参数 auto.leader.rebalance.enable=true 可以使kafka每5min自动做一次leader的rebalance,消除这个问题。
4. Lag:
表示consumer的消费能力,计算公式为Lag = LogSize - Consumer Offset,Kafka Manager从zk获取LogSize,从kafka __consumer_offsets topic读取Offset。两步操作存在一个时间gap,因此吞吐很大的topic上会出现LogSize > Offset 的情况。导致Lag负数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/496252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试

VirtualBox下ubuntu23.04使用主机串口以及使用 minicom 进行串口调试 一、打开设备管理器看主机&#xff08;Window系统&#xff09;是否识别出串口&#xff0c;我这边显示的串行通信端口是COM3 二、打开VirtualBox&#xff0c;设置串口和USB设备 串口设置&#xff1a; 启用…

解决PDF.js部署到IIS服务器上后报错mjs,.ftl 404 (Not Found)

一、报错问题描述&#xff1a;部署到IIS服务器上后,浏览器控制台报错报错mjs,.ftl 404 (Not Found)&#xff0c;pdf也浏览不了 二、解决方法&#xff1a;在IIS服务器添加MIME类型 将下面类型添加即可 .mjs application/javascript .ftl application/octet-stream保存后&…

Jmeter下载安装配置教程(多版本)

目录 一、介绍 JMeter的主要特点&#xff1a; 使用场景&#xff1a; 二、下载 (一)下载最新版本 (二)下载历史版本 (三)配置环境变量 ​(四)查看版本 (五)启动方式 一、介绍 Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对各种服务进行负载测试和性…

PTA数据结构编程题7-1最大子列和问题

我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 ​ , N 2 ​ , …, N K ​ }&#xff0c;“连续子列”被定义为{ N i ​ , N i1 ​ , …, N j ​ }&#xff0c;其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…

【路径规划】原理及实现

路径规划&#xff08;Path Planning&#xff09;是指在给定地图、起始点和目标点的情况下&#xff0c;确定应该采取的最佳路径。常见的路径规划算法包括A* 算法、Dijkstra 算法、RRT&#xff08;Rapidly-exploring Random Tree&#xff09;等。 目录 一.A* 1.算法原理 2.实…

在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)

一、概述 记录时间 [2024-12-26] 本文讲述如何在 Vue3 项目中使用计时器组件。具体包括开发环境的配置&#xff0c;ViteVue 项目的创建&#xff0c;Element Plus 插件的使用&#xff0c;以及计时器组件的创建和使用。 想要直接实现计时器组件&#xff0c;查看文章的第四部分。…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 一 系统环境配置&#xff1a; 1.更换源&#xff1a; sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list2.更新源&#xff1a; sudo apt upgradesudo apt updatesudo apt dist-upgrade sudo apt-get updat…

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

MySQL45讲 第三十六讲 为什么临时表可以重名?——阅读总结

文章目录 MySQL45讲 第三十六讲 为什么临时表可以重名&#xff1f;——阅读总结一、引言二、临时表与内存表的区别&#xff08;一&#xff09;内存表&#xff08;二&#xff09;临时表 三、临时表的特性&#xff08;一&#xff09;可见性与生命周期&#xff08;二&#xff09;与…

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算&#xff08;算术运算、关系运算、逻辑运算&#xff09;&#xff0c;即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…

深度学习-78-大模型量化之Quantization Aware Training量化感知训练QAT

文章目录 1 量化感知训练1.1 QAT的核心思想1.2 QAT的工作原理1.2.1 第一个维度1.2.2 第二个维度2 大模型的1-bits时代BitNet2.1 BitLinear层2.2 权重量化2.3 激活量化2.4 反量化3 大模型处于1.58Bits状态3.1 零值的作用3.2 量化3.3 效果4 参考附录1 量化感知训练 PTQ方法的一个…

(亲测)frp对外提供简单的文件访问服务-frp静态文件效果

话说有一天&#xff0c;希望将软件安装包放到网上&#xff0c;希望类似如下效果&#xff0c;正好在调试frp docker版&#xff0c;看到frp有个【对外提供简单的文件访问服务】功能&#xff0c;网上搜索也没相关效果图&#xff0c;所以顺手测试一下&#xff0c;截了几张图&#x…

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中&#xff0c;安全始终是首要考虑的因素之一。特别是在施工现场&#xff0c;工人佩戴安全帽是确保人身安全的基本要求。然而&#xff0c;人工监督难免会有疏漏&#xff0c;尤其是在大型工地或复杂环境中&#xff0c;确保每个人都佩戴安全帽变得非…

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计&#xff0c;通过优化硬件组成和软件设计&#xff0c;实现高效率和高准确度的检定工作&#xff0c;有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…

【漫话机器学习系列】022.微积分中的链式求导法则(chain rule of Calculus)

链式求导法则&#xff08;Chain Rule of Calculus&#xff09; 链式求导法则是微积分中的重要工具&#xff0c;用于处理复合函数的求导。它描述了如何计算一个函数的函数&#xff08;复合函数&#xff09;的导数。 1. 链式法则的定义 假设有一个复合函数 y f(g(x))&#xff…

TP5 动态渲染多个Layui表格并批量打印所有表格

记录&#xff1a; TP5 动态渲染多个Layui表格每个表格设置有2行表头&#xff0c;并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例&#xff1a; /*** Nod…

开发微信小程序的过程与心得

起因 作为家长&#xff0c;我近期参与了学校的护学岗工作。在这个过程中&#xff0c;我发现需要使用水印相机来记录护学活动&#xff0c;但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员&#xff0c;我决定利用自己的技术背景&#xff0c;开发一个…

新建一个springboot项目

注意版本注意版本注意版本&#xff01;&#xff01;&#xff01; 参考&#xff1a; 我的IDEA 2022.2.3 是通过IDEA内嵌的功能来完成该项目的创建的。 一、创建 其实按截图走就够了&#xff0c;别弄的太麻烦了。 注意版本 注意&#xff0c;springboot的版本要是最新的&…