【prometheus+grafana】快速入门搭建-服务监控各插件及企业微信告警

news2025/1/9 3:31:14

目录

1. 安装qywechat_webhook插件通知企业微信

1.1. 新建目录/opt/prometheus/qywechathook/conf

1.2. 新建编辑wx.js文件

1.3. 运行启动容器

1.4. 查看容器启动情况

1.5 企业微信通知地址为:

2. 安装altermanager

2.1. 下载altermanager

2.2. 解压altermanager

2.3. 编辑altermanager.yml

2.4. 检查配置文件

2.5. 启动altermanager

2.5.1方式1-命令后台启动altermanager

2.5.2. 启动方式2-脚本启动altermanager

2.6. 访问地址验证

3. 源码方式安装node_exporter

3.1. 下载node_exporter

3.2. 解压node_exporter

3.3. 后台启动node_exporter

3.3.1启动方式1:命令方式

3.3.2. 启动方式2:脚本方式启动node_exporter

3.4. 验证访问

4. 源码包方式安装prometheus

4.1. 下载prometheus

4.2. 解压prometheus源码包

4.3.添加rules.yml文件

4.4. 编辑prometheus.yml

4.5. 校验prometheus.yml

4.6. 后台启动prometheus

4.6.1启动方式1:命令启动

4.6.2. 启动方式2:脚本启动prometheus

4.7. 验证访问

5. 源码包方式安装grafana

5.1. 下载grafana

5.2. 解压grafana

5.3. 进入bin目录,后台启动grafana

5.3.1启动方式1:进入bin目录,命令启动

5.3.2. 启动方式2:脚本方式启动grafana

5.4. 登录grafana

5.5. 添加数据源

5.6. 搜索grafana的仪表盘模板

5.7. 在自建的grafana导入模板ID

5.8. 查看自建的grafana监控仪表盘

 6.告警效果-通知企业微信机器人


1. 安装qywechat_webhook插件通知企业微信

1.1. 新建目录/opt/prometheus/qywechathook/conf

mkdir -p /opt/prometheus/qywechathook/conf

1.2. 新建编辑wx.js文件

exports.template = function(body) {
  //企业微信群机器人API,https://work.weixin.qq.com/help?person_id=1&doc_id=13376#markdown%E7%B1%BB%E5%9E%8B
  //prometheus alert manager webhook : https://prometheus.io/docs/alerting/configuration/#webhook_config
  var alerts = body.alerts;
  var content = alerts.map(
    alert => {
      return [`# Name:${alert.labels.alertname}`, "## Labels:"]
        .concat(Object.entries(alert.labels).map(label => `<font color="comment">${label[0]}:</font>${label[1]}`))
        .concat("## Annotations:")
        .concat(Object.entries(alert.annotations).map(annotation => `<font color="comment">${annotation[0]}:</font>${annotation[1]}`))
        .join("\n")
    }
  ).concat(`<font color="comment">Status:</font><font color="${body.status === 'firing' ? 'warning' : 'info'}">${body.status}</font>`).join("\n\n")
  return {

    msgtype: "markdown",
    markdown: {
      content: content
    }
  }
}

1.3. 运行启动容器

docker run -d --name qywechat-webhook-adapter \
--restart always -p 9081:80 \
-v /opt/prometheus/qywechathook/conf/wx.js:/app/prometheusalert/wx.js \
guyongquan/webhook-adapter \
--adapter=/app/prometheusalert/wx.js=/wx=替换成自己企业微信机器人地址

1.4. 查看容器启动情况

docker ps -a

1.5 企业微信通知地址为:

#容器启动后,下面这个地址在后面安装altermanager插件里面的配置文件altermanager.yml会用到
http://127.0.0.1:8091/adapter/wx

2. 安装altermanager

2.1. 下载altermanager

下载地址:Download | Prometheus

2.2. 解压altermanager

tar -xv alertmanager-0.26.0.linux-amd64.tar.gz

2.3. 编辑altermanager.yml

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 1m
  repeat_interval: 1m
  receiver: 'qywechat.webhook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://127.0.0.1:5001/'
  - name: 'qywechat.webhook'
    webhook_configs:
      - url: 'http://127.0.0.1:8091/adapter/wx'
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance

2.4. 检查配置文件

./amtool check-config alertmanager.yml

2.5. 启动altermanager

2.5.1方式1-命令后台启动altermanager

nohup ./alertmanager --cluster.listen-address= --config.file=alertmanager.yml > /dev/null 2>&1 &

2.5.2. 启动方式2-脚本启动altermanager

#!/bin/sh  
# 时间:2023年9月24日10:37:24 
# 开发者: AL 
# 管理启停prometheus脚本  
# 检查参数个数 
PORT=9093 
NAME="altermanager" 
START_TIMEOUT=30 
 
#健康检查方法 
fun_health_check() { 
    exptime=0 
	echo "正在启动" 
    while true 
        do 
            pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1` 
            echo "检查端口${PORT}的pid 是 ${pid}" 
            if [ -z $pid ];then 
                sleep 1 
                ((exptime++)) 
                echo -n -e "启动已经用时: ${exptime}s..." 
            else 
                break 
            fi 
            if [ $exptime -gt ${START_TIMEOUT} ]; then 
                echo '启动失败' 
               exit 1 
            fi 
        done 
 
	echo "恭喜,启动${NAME} ${PORT}成功" 
 
} 
 
#启动命令 
fun_start_cmd() { 
	nohup ./alertmanager --cluster.listen-address=  --config.file=alertmanager.yml > /dev/null 2>&1 & 
} 
 
ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1` 
echo "开始查找-端口${PORT}的pid 是 ${ID}" 
if [ $# -eq 0 ]; then 
    echo "请输入控制参数,可选【start,stop,restart】" 
elif [ "$1" = "start" ]; then 
    echo "启动${NAME}" 
	if [ ! -z $ID ];then 
		echo "${PORT}端口已经占用,启动失败,请输入参数【restart】" 
	else 
		fun_start_cmd 
		fun_health_check 
	fi 
elif [ "$1" = "stop" ]; then 
    echo "停止${NAME}" 
    if [ -z $ID ];then 
		echo "${PORT}端口未启用" 
	else 
		kill -9 $ID 
		echo "${PORT}端口的进程已关闭" 
	fi 
elif [ "$1" = "restart" ]; then 
    echo "重启${NAME}" 
    if [ ! -z $ID ];then 
		kill -9 $ID 
	else 
		fun_start_cmd 
		fun_health_check 
    fi 
    
else 
    echo "请输入控制参数,可选【start,stop,restart】 " 
fi

2.6. 访问地址验证

http://10.217.108.101:9093/#/alerts

3. 源码方式安装node_exporter

3.1. 下载node_exporter

下载地址:Download | Prometheus

3.2. 解压node_exporter

在linux上解压node_exporter

tar -xf node_exporter-1.6.1.linux-amd64.tar.gz

3.3. 后台启动node_exporter

3.3.1启动方式1:命令方式

nohup ./node_exporter --web.listen-address=":9100" > /dev/null 2>&1 &

3.3.2. 启动方式2:脚本方式启动node_exporter

#!/bin/sh
# 时间:2023年9月24日09:44:06
# 开发者: AL
# 管理启停node_exporter脚本
# 检查参数个数
PORT=9100
NAME="node_exporter"
START_TIMEOUT=30

#健康检查方法
fun_health_check() {
    exptime=0
        echo "正在启动"
    while true
        do
            pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
            echo "检查端口${PORT}的pid 是 ${pid}"
            if [ -z $pid ];then
                sleep 1
                ((exptime++))
                echo -n -e "启动已经用时: ${exptime}s..."
            else
                break
            fi
            if [ $exptime -gt ${START_TIMEOUT} ]; then
                echo '启动失败'
               exit 1
            fi
        done

        echo "恭喜,启动${NAME} ${PORT}成功"

}

#启动命令
fun_start_cmd() {
        nohup ./node_exporter --web.listen-address=":${PORT}" > /dev/null 2>&1 &
}

ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
echo "开始查找-端口${PORT}的pid 是 ${ID}"
if [ $# -eq 0 ]; then
    echo "请输入控制参数,可选【start,stop,restart】"
elif [ "$1" = "start" ]; then
    echo "启动${NAME}"
        if [ ! -z $ID ];then
                echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
        else
                fun_start_cmd
                fun_health_check
        fi
elif [ "$1" = "stop" ]; then
    echo "停止${NAME}"
    if [ -z $ID ];then
                echo "${PORT}端口未启用"
        else
                kill -9 $ID
                echo "${PORT}端口的进程已关闭"
        fi
elif [ "$1" = "restart" ]; then
    echo "重启${NAME}"
    if [ ! -z $ID ];then
                kill -9 $ID
        else
                fun_start_cmd
                fun_health_check
    fi

else
    echo "请输入控制参数,可选【start,stop,restart】 "
fi

3.4. 验证访问

http://ip:端口/mertics

4. 源码包方式安装prometheus

4.1. 下载prometheus

下载地址:Download | Prometheus

4.2. 解压prometheus源码包

解压源码包到linux,opt目录下,/opt/prometheus/prometheus2.47

tar -xf prometheus-2.47.0.linux-amd64.tar.gz

4.3.添加rules.yml文件

在promethues安装目录(跟prometheus.yml)同级目录新建rule文件夹,并在rule文件加新建rules.yml

groups:
  - name: alertmanager_pod.rules        #告警规则组名,注意这和Altermanager中的组不是一个概念
    rules:
    - alert: Pod_all_cpu_usage  #告警名称,对应标签alertname
      expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 10     #告警表达式
      for: 1s   #持续时长,表示上面的表达式满足且超过两分钟才会触发告警
      labels:   #对告警附加的标签
        severity: critical
        service: pods
        project: myserver
      annotations:      #告警通知中的注释内容,可用于描述告警具体信息
        description: 容器 {{ $labels.name }} CPU 资源利用率大于 10% , (current value is {{ $value }})
        summary: Dev CPU 负载告警

    - alert: Pod_all_memory_usage
      expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""}[5m]))*100) > 10  #内存大于10%
      #expr: sort_desc(avg by(name)(irate(node_memory_MemFree_bytes {name!=""}[5m]))) > 2*1024*1024*1024   #内存大于2G
      for: 10s
      labels:
        severity: critical
        type: pods
        #project: myserver
      annotations:
        description: 容器 {{ $labels.name }} Memory 资源利用率大于 2G , (current value is {{ $value }})
        summary: Dev Memory 负载告警

    - alert: Pod_all_network_receive_usage
      #expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 50*1024*1024
      expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 0
      for: 2m
      labels:
        #severity: critical
        project: myserver
      annotations:
        description: 容器 {{ $labels.name }} network_receive 资源利用率大于 50M , (current value is {{ $value }})

    - alert: node内存可用大小
      expr: node_memory_MemFree_bytes < 524288000 #内存小于500兆
      for: 30s
      labels:
        type: nodes
      annotations:
        description: node节点可用内存小于500M

4.4. 编辑prometheus.yml

4.5. 校验prometheus.yml

./promtool check config prometheus.yml

4.6. 后台启动prometheus

4.6.1启动方式1:命令启动

nohup ./prometheus --storage.tsdb.retention.time=7d --config.file=prometheus.yml --web.enable-admin-api > prometheus.log 2>&1 &

4.6.2. 启动方式2:脚本启动prometheus

#!/bin/sh
# 时间:2023年9月24日10:37:24
# 开发者: AL
# 管理启停prometheus脚本
# 检查参数个数
PORT=9090
NAME="prometheus"
START_TIMEOUT=30

#健康检查方法
fun_health_check() {
    exptime=0
        echo "正在启动"
    while true
        do
            pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
            echo "检查端口${PORT}的pid 是 ${pid}"
            if [ -z $pid ];then
                sleep 1
                ((exptime++))
                echo -n -e "启动已经用时: ${exptime}s..."
            else
                break
            fi
            if [ $exptime -gt ${START_TIMEOUT} ]; then
                echo '启动失败'
               exit 1
            fi
        done

        echo "恭喜,启动${NAME} ${PORT}成功"

}

#启动命令
fun_start_cmd() {
        nohup ./prometheus --storage.tsdb.retention.time=7d --config.file=prometheus.yml --web.enable-admin-api > prometheus.log 2>&1 &
}

ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
echo "开始查找-端口${PORT}的pid 是 ${ID}"
if [ $# -eq 0 ]; then
    echo "请输入控制参数,可选【start,stop,restart】"
elif [ "$1" = "start" ]; then
    echo "启动${NAME}"
        if [ ! -z $ID ];then
                echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
        else
                fun_start_cmd
                fun_health_check
        fi
elif [ "$1" = "stop" ]; then
    echo "停止${NAME}"
    if [ -z $ID ];then
                echo "${PORT}端口未启用"
        else
                kill -9 $ID
                echo "${PORT}端口的进程已关闭"
        fi
elif [ "$1" = "restart" ]; then
    echo "重启${NAME}"
    if [ ! -z $ID ];then
                kill -9 $ID
        else
                fun_start_cmd
                fun_health_check
    fi

else
    echo "请输入控制参数,可选【start,stop,restart】 "
fi

4.7. 验证访问

http://10.217.108.101:9090/

5. 源码包方式安装grafana

5.1. 下载grafana

下载地址:Download Grafana | Grafana Labs

5.2. 解压grafana

tar -xf grafana-enterprise-10.1.2.linux-amd64.tar.gz

5.3. 进入bin目录,后台启动grafana

5.3.1启动方式1:进入bin目录,命令启动

nohup ./grafana-server > grafana.log 2>&1 &

5.3.2. 启动方式2:脚本方式启动grafana

#!/bin/sh  
# 时间:2023年9月24日15:19:51 
# 开发者: AL 
# 管理启停grafana脚本  
# 检查参数个数 
PORT=3000 
NAME="grafana" 
START_TIMEOUT=30 
 
#健康检查方法 
fun_health_check() { 
    exptime=0 
	echo "正在启动" 
    while true 
        do 
            pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1` 
            echo "检查端口${PORT}的pid 是 ${pid}" 
            if [ -z $pid ];then 
                sleep 1 
                ((exptime++)) 
                echo -n -e "启动已经用时: ${exptime}s..." 
            else 
                break 
            fi 
            if [ $exptime -gt ${START_TIMEOUT} ]; then 
                echo '启动失败' 
               exit 1 
            fi 
        done 
 
	echo "恭喜,启动${NAME} ${PORT}成功" 
 
} 
 
#启动命令 
fun_start_cmd() { 
	nohup ./grafana-server > grafana.log 2>&1 & 
} 
 
ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1` 
echo "开始查找-端口${PORT}的pid 是 ${ID}" 
if [ $# -eq 0 ]; then 
    echo "请输入控制参数,可选【start,stop,restart】" 
elif [ "$1" = "start" ]; then 
    echo "启动${NAME}" 
	if [ ! -z $ID ];then 
		echo "${PORT}端口已经占用,启动失败,请输入参数【restart】" 
	else 
		fun_start_cmd 
		fun_health_check 
	fi 
elif [ "$1" = "stop" ]; then 
    echo "停止${NAME}" 
    if [ -z $ID ];then 
		echo "${PORT}端口未启用" 
	else 
		kill -9 $ID 
		echo "${PORT}端口的进程已关闭" 
	fi 
elif [ "$1" = "restart" ]; then 
    echo "重启${NAME}" 
    if [ ! -z $ID ];then 
		kill -9 $ID 
	else 
		fun_start_cmd 
		fun_health_check 
    fi 
    
else 
    echo "请输入控制参数,可选【start,stop,restart】 " 
fi

5.4. 登录grafana

http://10.217.108.101:3000/

5.5. 添加数据源

最后记得往下滚动保存

5.6. 搜索grafana的仪表盘模板

grafana的仪表盘模板地址:Dashboards | Grafana Labs

复制仪表盘模板ID

5.7. 在自建的grafana导入模板ID

5.8. 查看自建的grafana监控仪表盘

 6.告警效果-通知企业微信机器人

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 远程登录(Xshell7)

为什么需要远程登录Linux&#xff1f;因为通常在公司做开发的时候&#xff0c;Linux 一般作为服务器使用&#xff0c;而服务器一般放在机房&#xff0c;linux服务器是开发小组共享&#xff0c;且正式上线的项目是运行在公网&#xff0c;因此需要远程登录到Liux进行项日管理或者…

LeetCode算法二叉树—二叉树的中序遍历

目录 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&am…

Linux--线程 创建、等待、退出

Linux上线程开发API概要 多线程开发的最基本概念主要包含&#xff1a;线程&#xff0c;互斥锁&#xff0c;条件。   线程 3 种操作&#xff1a;线程的创建&#xff0c;退出&#xff0c;等待。   互斥锁 4 种操作&#xff1a;创建&#xff0c;销毁&#xff0c;加锁和解锁。…

iterm2 配置自动登录跳板机,无需输入密码和google验证码

1、准备&#xff1a;编写Python脚本计算生成google身份验证码&#xff0c;参考python3 实现 google authenticator 认证/校验_我要买GTR45的博客-CSDN博客 脚本拿来就可以用&#xff0c;只需要替换脚本中的secret字段的值为自己的密钥即可 2、在~/.ssh/目录下编写expect脚本 …

多台群晖实现按计划WOL网络自动唤醒数据冷备份

几年前买了2盘位的DS218&#xff0c;但是随着照片的增加已经不够用。年中购入了4盘位的群晖DS923、2块16T西数数企业级硬盘、1块2T intel企业级 SSD 1.什么是冷备份 冷备是离线备份&#xff0c;备份好的数据可以单独存取&#xff0c;定期冷备可以保证数据安全&#xff0c;适合…

怎样快速打开github.com

1访问这个网站很慢是因为有DNS污染&#xff0c;被一些别有用心的人搞了鬼了&#xff0c; 2还有一个重要原因是不同的DNS服务器解析的速度不一样。 1 建议设置dns地址为114.114.114.114.我觉得假设一个县城如果有一个DNS服务器的话&#xff0c;这个服务器很可能不会存储…

求组合数(递归版)(杨辉三角形)

description 请编写递归函数&#xff0c;求组合数。 函数原型 double Cmb(int x, int y); 说明&#xff1a;x 和 y 为非负整数&#xff0c;且 x≥y&#xff0c;函数值为组合数 C x y ​ 。 裁判程序 #include <stdio.h> double Cmb(int x, int y); int main() { int m…

基于华为云云耀云服务器L实例下的场景体验 | Docker可视化工具Portainer

基于华为云云耀云服务器L实例下的场景体验 | Docker可视化工具Portainer 1. 简介2. 准备工作3. 工具配置3.1. 配置安全组3.2. 初始化配置Portainer 4. 使用Portainer部署MySQL容器4.1. 创建MySQL容器4.2. 连接MySQL容器 1. 简介 随着云计算时代的进一步深入&#xff0c;越来越多…

【计算机网络笔记三】传输层

端口 在网络中如何标记一个进程&#xff1f; TCP/IP 体系的传输层使用【端口号】来标记区分应用层的不同应用进程。这里说的端口是一个逻辑的概念&#xff0c;并不是实实在在的物理端口。 端口号使用 16 比特表示&#xff0c;取值范围是 0 ~ 65535&#xff0c;端口号分为以…

「大数据-2.0」安装Hadoop和部署HDFS集群

目录 一、下载Hadoop安装包 二、安装Hadoop 0. 安装Hadoop前的必要准备 1. 以root用户登录主节点虚拟机 2. 上传Hadoop安装包到主节点 3. 解压缩安装包到/export/server/目录中 4. 构建软链接 三、部署HDFS集群 0. 集群部署规划 1. 进入hadoop安装包内 2 进入etc目录下的hadoop…

分享40个Python源代码总有一个是你想要的

分享40个Python源代码总有一个是你想要的 源码下载链接&#xff1a;https://pan.baidu.com/s/1PNR3_RqVWLPzSBUVAo2rnA?pwd8888 提取码&#xff1a;8888 下面是文件的名字。 dailyfresh-天天生鲜 Django-Quick-Start freenom-自动续期域名的脚本 Full Stack Python简体中…

竟然可以在一个项目中混用 Vue 和 React?

React和Vue是前端开发中的两大热门框架&#xff0c;各自都有着强大的功能和丰富的生态系统。然而&#xff0c;你有没有想过&#xff0c;在一个项目中同时使用React和Vue&#xff1f;是的&#xff0c;你没有听错&#xff0c;可以在同一个项目中混用这两个框架&#xff01;本文就…

redis学习(一)——初识redis

redis学习&#xff08;一&#xff09;——初识redis 非关系型数据库 redis是非关系型数据库&#xff0c;和mysql不同&#xff0c;redis中的所有数据都是以key&#xff1a;value形式存在的 两者区别 SQL | NoSQL 结构化 | 非结构化 关联的 | 无关联 sql查询 | 非sql ACI…

[python 刷题] 22 Generate Parentheses

[python 刷题] 22 Generate Parentheses 题目&#xff1a; Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. 这里 well-formed 指的就是合法的括号配对&#xff0c;这里会提两个解 第一个是暴力解&#xff0c;也就…

服务注册发现_服务发现Discovery

修改payment8001的Controller /*** 支付控制层*/ Slf4j RestController public class PaymentController {Autowiredprivate DiscoveryClient discoveryClient;GetMapping("/payment/discovery")public Object discovery(){// 获取所有微服务信息List<String>…

栈和队列2——队列的实现

栈和队列2——队列的实现 一&#xff0c;前言二&#xff0c;队列的定义三&#xff0c;队列的结构四&#xff0c;队列的实现4.1队列初始化4.2队列的销毁4.3队列的尾插4.4队列的删除4.5找队头的数据4.6找队尾的数据4.7判断为空4.8计算长度 五&#xff0c;小结 一&#xff0c;前言…

STL常用遍历,查找,算法

目录 1.遍历算法 1.1for_earch 1.2transform 2.常用查找算法 2.1find&#xff0c;返回值是迭代器 2.1.1查找内置数据类型 2.1.2查找自定义数据类型 2.2fin_if 按条件查找元素 2.2.1查找内置的数据类型 2.2.2查找内置数据类型 2.3查找相邻元素adjeacent_find 2.4查找指…

简易介绍如何使用拼多多商品详情 API。

拼多多&#xff08;Pinduoduo&#xff09;是中国一家快速发展的电商平台&#xff0c;为了帮助开发者更好地接入拼多多&#xff0c;平台提供了丰富的 API 接口供开发者使用&#xff0c;其中包括获取拼多多商品详情的 API。接下来&#xff0c;我们将介绍如何使用拼多多商品详情 A…

重学 HashMap

文章目录 1.从 Map 接口入手1.1 从 JDK 1.0 的 Dictionary\<K,V\> 抽象类讲起1.2 Map 接口中的集合视图又是怎样的&#xff1f;1.3 为什么 JDK 官方不推荐使用可变对象作为 Map 的键&#xff1f;1.4 为什么映射不应该将自己作为键&#xff0c;而可以作为值&#xff1f;1.…

python基于轻量级卷积神经网络模型开发构建眼疾识别系统

常见的眼疾包括但不限于以下几种&#xff1a; 白内障&#xff1a;白内障是眼睛晶状体变得模糊或不透明&#xff0c;导致视力下降。它通常与年龄相关&#xff0c;但也可以由其他因素引起&#xff0c;如遗传、外伤、糖尿病等。 青光眼&#xff1a;青光眼是一组引起视神经损伤的眼…