国产化监控新选择!夜莺Nightingale在OpenEuler上的极简部署指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]

📢 大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 🚀,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路 😋 。

0x00 快速介绍

前言简述

描述:前期作者使用 Prometheus Alertmanager 组件做了将近两年多的监控告警工作,期间也遇到了不少问题。例如 Prometheus AlertManager 告警配置麻烦复杂度高,不便于在线调试,缺乏多租户支持,历史告警功能薄弱,扩展性依赖插件等等,这些问题都影响了我们的运维工作效率和系统的稳定性。所以,不得不再次找寻一款云原生环境下告警工具,最开始想到使用 Grafana 但是经过一番实践后发现 Grafana 虽然可视化告警效果好,但是告警配置复杂特别是告警规则很多的情况下,遂放弃。因此,我们决定寻找一款兼具 Prometheus 和 Grafana 优点的云原生监控工具,经过一番搜索和比较,最终选择了国产的夜莺(Nightingale)开源版本作为我们的新监控方案。

原文链接: https://articles.zsxq.com/id_jabrm1rkitvg.html

以下是 Prometheus AlertManagerGrafana Alert 和 Nightingale 在告警功能上的核心差异对比表格:

功能/特性Prometheus AlertManagerGrafana AlertNightingale
定位

专为 Prometheus 设计的告警管理组件

Grafana 集成的告警引擎(支持多数据源)

开源一体化监控告警系统(对标企业级需求)

数据源支持

仅 Prometheus

多数据源(Prometheus、MySQL、Loki、InfluxDB 等)

多数据源(Prometheus、Elasticsearch、MySQL 等)

告警规则配置

需在 Prometheus 配置文件中定义

通过 Grafana UI 或配置文件定义

通过 Web UI 或 API 配置

告警分组/抑制

支持高级分组、抑制和静默功能

基础分组,依赖 AlertManager 或自身逻辑

支持分组、抑制、静默(类似 AlertManager)

通知渠道

支持多种渠道(Email、Slack、Webhook 等)

支持多种渠道(集成 AlertManager 或独立发送)

内置多种渠道(短信、电话、企业微信、钉钉等)

告警模板

支持自定义模板(Go template)

支持自定义模板(Markdown 或 HTML)

支持自定义模板(内置变量和格式化)

多租户支持

依赖 Grafana 的多租户

原生支持多租户和团队协作

可视化能力

无 UI,需配合 Grafana 或 Prometheus Web

与 Grafana 仪表盘深度集成

内置仪表盘和告警历史视图

依赖关系

依赖 Prometheus 作为数据源

可独立使用或依赖外部数据源

可独立部署,支持插件扩展

高可用性

支持集群模式

依赖 Grafana 的高可用部署

支持分布式部署和高可用

适用场景

Prometheus 生态中的告警路由与管理

需要快速集成告警的 Grafana 用户

企业级统一监控告警平台(尤其适合国内环境)

差异总结: 1.Prometheus AlertManager:专注告警路由和去噪,需与 Prometheus 强绑定,适合云原生场景。 2.Grafana Alert:优势在于与可视化工具无缝集成,支持多数据源告警,但高级功能有限。 3.Nightingale:开箱即用的企业级解决方案,支持多租户和国内常用通知渠道(如微信/钉钉),适合替代 Zabbix 等传统监控系统。

初识夜莺

前面说了这么多,夜莺到底是什么?

夜莺(Nightingale,简称:n9e)是一款使用 Apache-2.0 许可开源的 All-in-One 云原生监控告警系统(目前正式版本 v7),它提供了强大的可视化界面和灵活的配置方式,可以轻松地集成到现有的云原生环境中。夜莺监控项目,最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。此外,夜莺支持多种数据源,包括 Prometheus/VictoriaMetrics、Elasticsearch、Loki、TDengine、ClickHouse、MySQL(后两者是V8开始支持的) 等,同时也支持自定义的数据采集插件,例如,快猫星云(也是开源夜莺的公司)推出的 Categraf 数据采集器插件。简单的说,夜莺项目类似 Grafana 可以对接多种数据源并且展示,并且还可以直接嵌入 Grafana ,不过侧重在告警引擎、告警事件的处理和分发,内置支持 20 种通知媒介(电话、短信、邮件、钉钉、飞书、企微、Slack 等),还有更高级的需求可直接推给 FlashDuty(商业版本),做告警聚合降噪之后再由 FlashDuty 做后续分发。

官网地址:https://n9e.github.io/zh/

项目地址:https://github.com/ccfos/nightingale/releases

知识扩展:Categraf 它也是一款 All-in-One 的开源的 telemetry 数据采集器,支持指标、日志采集;支持 Tracing 数据的收集;支持物理机、虚拟机、网络设备(交换机)、安全设备(防火墙)、容器、K8s、多种中间件/数据库的数据采集,支持混合云架构、云原生架构、多云架构。汇聚领域最佳实践,开箱即用。

夜莺监控关键特点

  • 开箱即用:内置各类中间件、数据库的告警规则、指标说明、指标查询、可视化仪表盘等,开箱即用;可对接 Categraf、Telegraf、Datadog-agent、各类 Exporter 等常用采集器。

  • 业务分组:支持多维度的业务设备分组,机器可以归属不同的业务组,并可将管理人员划分到不同的业务组,可创建多个团队,团队之间可以共享指标和告警规则,告警通知,可谓是非常灵活。

  • 专业告警:同时支持指标和日志的告警;支持告警规则的可视化配置和管理;支持一套规则生效到多个数据源;支持边缘机房部署单独的告警引擎提升告警可用性;支持告警抑制、屏蔽、订阅、多种通知媒介、事件 Relabel 等。

  • 系统集成:支持内嵌企业内部系统,比如 Grafana、CMDB 等,甚至可以配置这些内嵌系统的菜单可见性。

  • 多模式部署:支持单机、集群模式部署,支持边缘机房独立部署。

  • 开放社区:托管于中国计算机学会开源发展委员会,依托基金会运作,有数千名社区用户的积极参与,保证了夜莺开源社区健康、长久的发展。

夜莺监控架构:

  • 工作逻辑:若目前采集了指标、日志数据,此时就把存储库(Prometheus,VictoriaMetrics、ElasticSearch等)作为数据源接入夜莺,然后夜莺对这些数据进行处理,最后通过内置的通知媒介进行告警,架构图如下:

  • 边缘机房部署模式:,如果和中心夜莺服务端网络链路不好,希望提升告警可用性,夜莺也提供边缘机房告警引擎下沉部署模式,这个模式下,即便边缘和中心端网络割裂,告警功能也不受影响。例如,下图中机房A和中心机房的网络链路很好,所以直接由中心端的夜莺进程做告警引擎,机房B和中心机房的网络链路不好,所以在机房B部署了 n9e-edge 做告警引擎,对机房B的数据源做告警判定。

weiyigeek.top-夜莺的边缘机房部署模式图

好了,此处就不在过多的累述,想了解更多详细信息,可参考官方文档:https://n9e.github.io/zh/docs/prologue/introduction/


0x01 部署小记

前面提到,夜莺的架构比较简单,如果只是测试功能,一个二进制就可以启动,如果要上到生产环境,则要依赖 MySQL 和 Redis,此处作者肯定以生产环境为例进行实践,首先需准备的环境如下:

weiyigeek.top-部署架构图

环境准备

作者准备一台服务器,我这里用的是两台 OpenEuler 24.03 虚拟机,安装 Docker 环境,我这里用的是 MariaDB 作为数据库,Redis 作为缓存,然后在安装夜莺时分别使用它们。

OS:OpenEuler 24.03 LTS SP1 
Docker : 26.1.3
MariaDB:11.6.2
Redis: 7.2.4

温馨提示:此处所使用的 OpenEuler 24.03 虚拟机已进行主机加固,满足等保 3 级要求,若有此方面需求的道友,可访问此篇【OpenEuler 24.03系统主机安全加固及配置优化实践指南】文章中的链接获取加固脚本。

这里不再老生常谈Docker部署安装了,若你还不会可在上述加固脚本中获取 Docker 安装命令一键安装,或者参考作者以前Docker部署文章,以及参考官方教程即可,下面着重介绍使用 Docker-Compose 快速进行 MariaDB 和 Redis 的部署。

1.Docker学习之基础知识

MariaDB 部署

  • 1.持久化目录以及配置文件准备

# 持久化目录 (此处仅为作者示例路径,请根据实际环境调整.)
mkdir -vp /data/mariadb/{deploy,data,config}

# MariaDB 配置文件
cd /data/mariadb/
tee config/my.cnf <<'EOF'
[mysqld]
# 数据存储目录
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

# 开启 binlog
log_bin = /var/lib/mysql/mysql_bin
log_bin_index = /var/lib/mysql/mysql_bin.index
server_id = 1
expire_logs_days = 7
max_binlog_size = 100M
binlog_format = ROW
sync_binlog = 1

# 优化参数
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

# 连接数
max_connections = 1024
max_user_connections = 256
# 连接缓冲大小
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
join_buffer_size = 8M

# 日志
slow_query_log = 0
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2

# 字符串
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 禁止域名解析,提升连接速度
skip-name-resolve

# 禁止使用符号链接
symbolic-links = 0
EOF
  • 2.创建 docker-compose.yml 配置文件

cd /data/mariadb/deploy/
tee docker-compose.yml <<'EOF'
services:
  mariadb:
    image: mariadb:11.6.2
    container_name: mariadb
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: WeiyiGeek.top
      MYSQL_DATABASE: app
      MARIADB_USER: app
      MARIADB_PASSWORD: WeiyiGeek.top
    volumes:
      - /data/mariadb/data:/var/lib/mysql
      - /data/mariadb/config:/etc/mysql/conf.d
    ports:
      - "3306:3306"
EOF
  • 3.进入 docker-compose.yml 文件所在目录,执行下述命令快速部署并启动 MariaDB 容器。

# 部署运行
docker-compose up -d

# 查看容器运行状态
docker ps
  # 890e26f87859   mariadb:11.6.2  "docker-entrypoint.s…"   3 months ago   Up 3 months   0.0.0.0:3306->3306/tcp   mariadb
  • 4.进入 MariaDB 容器,登录数据库,并创建夜莺数据库所需用户。

# 进入容器中Shell
docker exec -it mariadb bash
# 使用 root 用户登录数据库,密码为前面 docker-compose.yml 中 MARIADB_ROOT_PASSWORD 环境变量设置的值
sudo mysql -u root
# 将 root 用户使用 caching_sha2_passwor 插件认证(MySQL 8.x)需要进行设置
# mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
# 创建 n9e 用户 password 修改为符合 STRONG 规则的密码
mysql> CREATE USER 'n9e'@'%' IDENTIFIED BY 'www.weiyigeek.top';
# 授予 n9e 用户对 n9e_v6 数据库操作的所有权限
mysql> GRANT ALL PRIVILEGES ON n9e_v6.* TO 'n9e'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;

Redis 部署

  • 1.持久化目录以及配置文件准备

mkdir -vp /data/redis/{deploy,data,config,logs}
cd /data/redis/
tee config/redis.conf <<'EOF'
# 绑定任意接口、服务端口、后台运行。
bind 0.0.0.0
port 6379
# 容器里必须设置为no
daemonize no
supervised auto

# redis服务pid进程文件名
pidfile "/var/run/redis.pid"

# 关闭保护模式,并配置使用密码访问
protected-mode no

# 数据文件保存路径,rdb/AOF文件也保存在这里
dir "/data"

# 日志文件记录文件(notice / verbose)
logfile "/logs/redis.log"
loglevel notice

# 慢查询配置
slowlog-log-slower-than 6000
slowlog-max-len 1024

# 内存策略
# maxmemory 2gb
# maxmemory-policy volatile-lru

# 最大客户端连接数
maxclients 10000

# 客户端连接空闲多久后断开连接,单位秒,0表示禁用
timeout 60
tcp-keepalive 120

# Redis 数据持久化混合模式(RDB/AOF)配置
# RDB 文件名
dbfilename "dump.rdb"
# 数据自动保存脚本条件, 例如900s中有10key发生变化
save 900 10
# 启用增量式同步 (推荐),减少 RDB 保存期间的延迟毛刺
rdb-save-incremental-fsync yes
# 对RDB文件进行压缩,建议以(磁盘)空间换(CPU)时间。
rdbcompression yes
# 版本5的RDB有一个CRC64算法的校验和放在了文件的最后。这将使文件格式更加可靠。
rdbchecksum yes

# AOF开启
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# 可选值 always, everysec,no,建议设置为everysec
appendfsync everysec
# 混合持久化,重写时使用RDB格式作为AOF开头,减少文件大小
aof-use-rdb-preamble yes
# 7.0+版本特性,除非需要否则关闭时间戳记录
aof-timestamp-enabled no
# 当前AOF文件比上次重写后文件大100%时触发重写
auto-aof-rewrite-percentage 100
# AOF文件至少达到64MB才会触发重写
auto-aof-rewrite-min-size 64mb
# 重写时增量式同步,避免大延迟峰值
aof-rewrite-incremental-fsync yes
  • 2.创建 docker-compose.yml 配置文件

version: "3.8"
services:
  redis:
    image: harbor.cqksy.cn/docker/library/redis:7.2.7-alpine3.21
    container_name: redis
    restart: unless-stopped
    hostname: redis
    privileged: true
    ports:
      - "6379:6379"
    volumes:
      - /data/redis/data:/data
      - /data/redis/logs:/logs
      - /data/redis/config/redis.conf:/etc/redis/redis.conf
    environment:
      - REDIS_PASSWORD=WeiyiGeek.top
      - REDIS_MAXMEMORY=6gb
      - REDIS_MAXMEMORY_POLICY=allkeys-lru
      - REDIS_DISABLE_THP=yes
    command:
      - /bin/sh
      - -c
      - |
        sysctl -w vm.overcommit_memory=1 &&
        sysctl -w net.core.somaxconn=8196 &&
        redis-server /etc/redis/redis.conf --requirepass $$REDIS_PASSWORD
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: "8G"
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "$$REDIS_PASSWORD", "ping"]
      interval: 15s
      timeout: 5s
      retries: 3
  • 3.创建并运行 redis 容器,查看容器运行状态

docker-compose up -d
docker ps 
5067e2985cc7  redis:7.2.7-alpine3.21   "docker-entrypoint.s…"   5 weeks ago    Up 5 weeks (healthy)   0.0.0.0:6379->6379/tcp   redis
  • 4.进入容器验证 Redis 数据库运行状态

docker exec -it redis sh
/data # redis-cli
127.0.0.1:6379> auth WeiyiGeek.top
OK
127.0.0.1:6379> ping
PONG

将上述 MariDB 以及 Redis 容器部署完成后,还需配置防火墙允许 3306 、6379 端口通行。

[root@OpenEuler /data]# firewall-cmd --add-port=3306/tcp  --add-port=63749/tcp --permanent
[root@OpenEuler /data]# firewall-cmd --reload

二进制方式部署

描述:作者同样准备了一台OpenEuler 虚拟机,准备使用最常见二进制方式部署夜莺,需要先下载对应版本的二进制包,这里以正式版本 v7.7.0 为例(当然也可以下载beta版本),具体版本可通过 https://flashcat.cloud/download/nightingale/ 链接查看

操作步骤

步骤 01.执行如下命令快速下载 nightingale 并解压。

# 安装目录
insdir=/opt/nightingale
version=v7.7.0
urlpath=https://download.flashcat.cloud/n9e-${version}-linux-amd64.tar.gz

# 创建目录
mkdir -p ${insdir}
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"  --header="Referer: https://flashcat.cloud/download/nightingale/" $urlpath
# 解压缩发布包
tar -zxvf n9e-${version}-linux-amd64.tar.gz -C ${insdir}

weiyigeek.top-nightingale版本选择图

温馨提示:官网下载页面提供版本可能不是最新版本,最新版本可访问 Github 项目 Release 页面查看,链接直达:https://github.com/ccfos/nightingale 。

步骤 02.将解压后的 n9e.sql 文件上传到 OpenEuler 虚拟机中并导入到 MariaDB 数据库中。

ls /opt/nightingale
cli  docker  etc  integrations  n9e  n9e-cli  n9e-edge  n9e.log  n9e.sql  payload.json

# 导入数据库
docker exec -i 890e26f87859 mariadb -h 127.0.0.1 -u n9e -pWeiyiGeek < n9e.sql

# 查看导入情况
root@890e26f87859:/# mariadb -h 127.0.0.1  -u n9e -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 11.6.2-MariaDB-ubu2404-log mariadb.org binary distribution

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| n9e_v6             |
+--------------------+
2 rows inset (0.004 sec)

# 查看数据库用户列表
MariaDB [(none)]> use n9e_v6;
MariaDB [n9e_v6]> SELECT * from n9e_v6.users;
+----+----------+----------+-----------+-------+-------+----------+-------+----------+------------+--------+------------------+------------+-----------+------------+-----------+
| id | username | nickname | password  | phone | email | portrait | roles | contacts | maintainer | belong | last_active_time | create_at  | create_by | update_at  | update_by |
+----+----------+----------+-----------+-------+-------+----------+-------+----------+------------+--------+------------------+------------+-----------+------------+-----------+
|  1 | root     | 超管     | root.2020 |       |       |          | Admin | NULL     |          0 |        |                0 | 1746854092 | system    | 1746854092 | system    |
+----+----------+----------+-----------+-------+-------+----------+-------+----------+------------+--------+------------------+------------+-----------+------------+-----------+
1 row inset (0.001 sec)

# 退出
MariaDB [n9e_v6]> exit;

步骤 03.编辑 n9e 配置文件,进行 MySQL 和 Redis 信息配置,下述作者罗列出关键信息看友们可根据需求选择修改,更多配置信息可参考官方文档:https://n9e.github.io/zh/docs/install/configuration/

vim /opt/nightingale/etc/config.toml

[Global]
RunMode = "release"# 生产环境建议设置为 release

[Log]
Dir = "logs"
# log level: DEBUG INFO WARNING ERROR
Level = "INFO"    # 日志级别

[HTTP]
Host = "0.0.0.0"# 监听所有网卡
Port = 17000      # 监听端口, 默认17000
CertFile = ""     # 证书文件路径,默认不启用 HTTPS
KeyFile = ""      # 证书密钥文件路径,默认不启用 HTTPS
.....

# mariadb 数据库配置信息
[DB]  
DSN = "n9e:WeiyiGeek.top@tcp(10.20.1.21:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
Debug = false
DBType = "mysql"
MaxLifetime = 7200
MaxOpenConns = 150
MaxIdleConns = 50

# redis 数据库配置信息
[Redis]   
Address = "10.20.1.21:6379"
Password = "WeiyiGeek.top"
DB = 0
RedisType = "standalone"
......

温馨提示:默认情况下夜莺的日志打印到 stdout,如果想把日志输出到指定目录,可以通过修改 config.toml 中的 [Log] 部分达成目的,比如:

# 把日志输出到 logs 目录下,日志级别是 INFO,日志文件大小超过 256M 时,会自动切割,保留 3 个日志文件。
[Log]
Dir = "logs"
Level = "INFO"
Output = "file"
RotateNum = 3
RotateSize = 256

步骤 04.在使用 systemd 托管前,先启动 n9e,先使用 nohup 简单测试

cd /opt/nightingale/
nohup ./n9e &> n9e.log &
# 检查 n9e.log 是否有异常日志,检查端口是否在监听,正常应该监听在 17000
ss -tlnp | grep 17000
# 杀掉 nohup 
lsof -i:17000
kill -9 {PID}

步骤 05.使用 systemd 托管 n9e 服务,并设置开机自启。

insdir=/opt/nightingale
# n9e.service
cat <<EOF >/etc/systemd/system/n9e.service
[Unit]
Description="夜莺监控:Nightingale Server"
After=network.target

[Service]
Type=simple
ExecStart=${insdir}/n9e
WorkingDirectory=${insdir}
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=n9e-server

[Install]
WantedBy=multi-user.target
EOF

# 开机自启
sudo systemctl enable --now n9e.service
# 重新启动
sudo systemctl restart n9e.service
# 状态查看
sudo systemctl status n9e.service

# 使用命令查看夜莺是否正常监听:
# 查看进程
ss -tulnp
# 或者
netstat -tulnp

步骤 06.配置防火墙允许 17000 端口(缺省)通行。

[root@OpenEuler nightingale]# firewall-cmd --add-port=17000/tcp --permanent
[root@OpenEuler nightingale]# firewall-cmd --reload

步骤 07.浏览器访问 http://部署夜莺的IP地址:17000/ 显示如下界面,默认用户是 root,密码是 root.2020

weiyigeek.top-夜莺登录界面图

步骤 08.登录夜莺后,点击左侧菜单栏的「数据源」->「Prometheus」, 添加 Prometheus 数据源,支持 VictoriaMetrics

weiyigeek.top-夜莺数据源界面图

至此,使用二进制夜莺监控安装完毕,你也赶快使用浏览器打开夜莺实践去吧,作者将会在后续更新如何在Docker、Kubernetes 环境下快速自定义构建、安装夜莺以及夜莺监控的使用技巧,敬请期待!

END

加入:作者【全栈工程师修炼指南】知识星球

『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。

Q: 加入作者【全栈工程师修炼指南】星球后有啥好处?

✅ 将获得作者最新工作学习实践文章以及网盘资源。 ✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友,也可单次购买)。 ✅ 将获得作者专门答疑学习交流群,解决在工作学习中的问题。 ✅ 将获得作者远程支持(在作者能力范围内且合规)。

目前新人仅需 69 元即可加入作者星球,数量有限,期待你的加入!

获取:作者工作学习全栈笔记

作者整理了10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者微信或者回复【工作学习实践笔记】,当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!

 知识推荐 往期文章

若文章对你有帮助,请将它转发给更多的看友,若有疑问的小伙伴,可在评论区留言你想法哟 💬!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈工程师修炼指南

原创不易,赞赏鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值