任务:添加监控及服务重启脚本

添加Prometheus/Grafana/Loki监控配置、Promtail配置、业务与监控服务器docker-compose文件以及Bash/PowerShell服务重启脚本
This commit is contained in:
liRQ 2026-06-25 18:27:47 +08:00
parent 1f498d2396
commit 39a5d5d4ee
43 changed files with 670 additions and 3 deletions

View File

@ -0,0 +1,6 @@
---
alwaysApply: true
scene: git_message
---
在此处编写规则,自定义 AI 生成提交信息的风格。

View File

View File

@ -0,0 +1,51 @@
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.5)
2026-06-25T17:43:17.176+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] com.wangpan.TmdbServiceApplication : Starting TmdbServiceApplication v1.0-SNAPSHOT using Java 17.0.8 with PID 46356 (D:\java2\wangpan\java\wangpan-tmdb-service\target\wangpan-tmdb-service-1.0-SNAPSHOT.jar started by ÀîÈÙÇ¿ in D:\java2\wangpan\java)
2026-06-25T17:43:17.182+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] com.wangpan.TmdbServiceApplication : No active profile set, falling back to 1 default profile: "default"
2026-06-25T17:43:18.983+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] ptablePropertiesBeanFactoryPostProcessor : Post-processing PropertySource instances
2026-06-25T17:43:18.986+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Skipping PropertySource configurationProperties [class org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource
2026-06-25T17:43:18.989+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Skipping PropertySource servletConfigInitParams [class org.springframework.core.env.PropertySource$StubPropertySource
2026-06-25T17:43:18.990+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Skipping PropertySource servletContextInitParams [class org.springframework.core.env.PropertySource$StubPropertySource
2026-06-25T17:43:18.991+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource systemProperties [org.springframework.core.env.PropertiesPropertySource] to EncryptableMapPropertySourceWrapper
2026-06-25T17:43:18.991+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource systemEnvironment [org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource] to EncryptableSystemEnvironmentPropertySourceWrapper
2026-06-25T17:43:18.991+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper
2026-06-25T17:43:18.993+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.EncryptablePropertySourceConverter : Converting PropertySource Config resource 'class path resource [application.yml]' via location 'optional:classpath:/' [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper
2026-06-25T17:43:19.812+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8083 (http)
2026-06-25T17:43:19.833+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2026-06-25T17:43:19.833+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.20]
2026-06-25T17:43:19.928+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2026-06-25T17:43:19.930+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2640 ms
2026-06-25T17:43:20.018+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.filter.DefaultLazyPropertyFilter : Property Filter custom Bean not found with name 'encryptablePropertyFilter'. Initializing Default Property Filter
2026-06-25T17:43:20.033+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.r.DefaultLazyPropertyResolver : Property Resolver custom Bean not found with name 'encryptablePropertyResolver'. Initializing Default Property Resolver
2026-06-25T17:43:20.036+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.d.DefaultLazyPropertyDetector : Property Detector custom Bean not found with name 'encryptablePropertyDetector'. Initializing Default Property Detector
2026-06-25T17:43:20.212+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.encryptor.DefaultLazyEncryptor : String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
2026-06-25T17:43:20.227+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.c.StringEncryptorBuilder : Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
2026-06-25T17:43:20.228+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] c.u.j.c.StringEncryptorBuilder : Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
2026-06-25T17:43:20.325+08:00 WARN 46356 --- [wangpan-tmdb-service] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'databaseInitializer': Injection of resource dependencies failed
2026-06-25T17:43:20.330+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2026-06-25T17:43:20.365+08:00 INFO 46356 --- [wangpan-tmdb-service] [ main] .s.b.a.l.ConditionEvaluationReportLogger :
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2026-06-25T17:43:20.402+08:00 ERROR 46356 --- [wangpan-tmdb-service] [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.datasource.password' to java.lang.String:
Reason: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.datasource.password' to java.lang.String
Action:
Update your application's configuration

View File

@ -0,0 +1,35 @@
version: '3.8'
# 业务服务器专用配置118.178.238.159
# 只部署 Node Exporter 和 Promtail用于采集指标和日志
services:
# Node Exporter - 采集业务服务器的硬件指标CPU、内存、磁盘等
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
# Promtail - 采集应用日志,发送给监控服务器的 Loki
promtail:
image: grafana/promtail:latest
container_name: promtail
restart: unless-stopped
volumes:
- ./promtail.yml:/etc/promtail/config.yml
- /var/log:/var/log
- /opt/wangpan/logs:/opt/wangpan/logs
command: -config.file=/etc/promtail/config.yml
ports:
- "9080:9080"

View File

@ -0,0 +1,76 @@
version: '3.8'
# 监控服务器专用配置ldfun.asia
# 只部署监控组件,不包含 PromtailPromtail 部署在业务服务器上)
services:
# Prometheus - 监控系统,采集所有指标数据
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
networks:
- monitoring
# Grafana - 可视化面板,查看监控图表和日志
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_USERS_ALLOW_SIGN_UP=false
ports:
- "3000:3000"
depends_on:
- prometheus
- loki
networks:
- monitoring
# Loki - 日志聚合系统,存储日志数据
loki:
image: grafana/loki:latest
container_name: loki
restart: unless-stopped
volumes:
- loki_data:/loki
ports:
- "3100:3100"
networks:
- monitoring
# Node Exporter - 采集监控服务器自身的硬件指标CPU、内存、磁盘等
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
networks:
- monitoring
volumes:
prometheus_data:
grafana_data:
loki_data:
networks:
monitoring:
driver: bridge

55
monitoring/prometheus.yml Normal file
View File

@ -0,0 +1,55 @@
global:
scrape_interval: 15s # 每15秒采集一次指标
evaluation_interval: 15s # 每15秒评估一次告警规则
scrape_configs:
# Prometheus 自身监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控服务器自身指标(通过 Node Exporter
- job_name: 'node-exporter-monitor'
static_configs:
- targets: ['node-exporter:9100']
labels:
server: 'monitor'
# 业务服务器指标(通过业务服务器上的 Node Exporter
- job_name: 'node-exporter-business'
static_configs:
- targets: ['118.178.238.159:9100']
labels:
server: 'business'
# 网关服务监控端口8888
- job_name: 'wangpan-gateway'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['118.178.238.159:8888']
labels:
service: 'gateway'
# 用户服务监控
- job_name: 'wangpan-user-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['118.178.238.159:8081']
labels:
service: 'user-service'
# 网盘服务监控
- job_name: 'wangpan-drive-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['118.178.238.159:8082']
labels:
service: 'drive-service'
# TMDB服务监控
- job_name: 'wangpan-tmdb-service'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['118.178.238.159:8083']
labels:
service: 'tmdb-service'

29
monitoring/promtail.yml Normal file
View File

@ -0,0 +1,29 @@
server:
http_listen_port: 9080 # Promtail HTTP 监听端口
grpc_listen_port: 0 # 禁用 gRPC
positions:
filename: /tmp/positions.yaml # 记录日志读取位置,防止重复采集
clients:
# 指向监控服务器的 Loki通过公网域名发送日志
- url: http://ldfun.asia:3100/loki/api/v1/push
scrape_configs:
# 收集系统日志
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
# 收集应用日志(各微服务输出到 /opt/wangpan/logs/
- job_name: wangpan-logs
static_configs:
- targets:
- localhost
labels:
job: wangpan
__path__: /opt/wangpan/logs/*.log

99
restart-services.ps1 Normal file
View File

@ -0,0 +1,99 @@
# Restart script for wangpan microservices
# Usage: .\restart-services.ps1
$JASYPT_PASSWORD = "wangpan-secret-key-2024"
$BASE_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$services = @(
@{ Name = "user-service"; Port = 8081; Jar = "wangpan-user-service\target\wangpan-user-service-1.0-SNAPSHOT.jar" },
@{ Name = "drive-service"; Port = 8082; Jar = "wangpan-drive-service\target\wangpan-drive-service-1.0-SNAPSHOT.jar" },
@{ Name = "tmdb-service"; Port = 8083; Jar = "wangpan-tmdb-service\target\wangpan-tmdb-service-1.0-SNAPSHOT.jar" },
@{ Name = "gateway"; Port = 8888; Jar = "wangpan-gateway\target\wangpan-gateway-1.0-SNAPSHOT.jar" }
)
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " Wangpan Microservices Restart" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
$env:JASYPT_ENCRYPTOR_PASSWORD = $JASYPT_PASSWORD
Write-Host "[Step 1] Checking port usage..." -ForegroundColor Yellow
foreach ($service in $services) {
$port = $service.Port
$name = $service.Name
$connections = netstat -ano | Select-String ":$port\s" | Select-String "LISTENING"
if ($connections) {
$pids = $connections | ForEach-Object { ($_ -split '\s+')[-1] } | Select-Object -Unique
foreach ($procId in $pids) {
if ($procId -match '^\d+$' -and $procId -ne '0') {
try {
$process = Get-Process -Id $procId -ErrorAction SilentlyContinue
if ($process) {
Write-Host " Killing process on port $port (PID: $procId)..." -ForegroundColor Red
Stop-Process -Id $procId -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 1
}
} catch {
Write-Host " Failed to kill PID: $procId" -ForegroundColor Red
}
}
}
} else {
Write-Host " Port $port ($name) is free" -ForegroundColor Green
}
}
Write-Host "[Step 2] Waiting for ports to release..." -ForegroundColor Yellow
Start-Sleep -Seconds 3
Write-Host "[Step 3] Starting services..." -ForegroundColor Yellow
foreach ($service in $services) {
$name = $service.Name
$port = $service.Port
$jarPath = Join-Path $BASE_DIR $service.Jar
Write-Host "Starting $name on port $port..." -ForegroundColor Cyan
if (-not (Test-Path $jarPath)) {
Write-Host " ERROR: Jar not found: $jarPath" -ForegroundColor Red
continue
}
$process = Start-Process -FilePath "java" -ArgumentList "-jar", $jarPath -WindowStyle Hidden -PassThru
if ($process) {
Write-Host " Started $name (PID: $($process.Id))" -ForegroundColor Green
} else {
Write-Host " Failed to start $name" -ForegroundColor Red
}
if ($service -ne $services[-1]) {
Start-Sleep -Seconds 5
}
}
Write-Host "[Step 4] Verifying services..." -ForegroundColor Yellow
$allRunning = $true
$maxRetries = 6
foreach ($service in $services) {
$port = $service.Port
$name = $service.Name
$started = $false
for ($i = 1; $i -le $maxRetries; $i++) {
$connections = netstat -ano | Select-String ":$port\s" | Select-String "LISTENING"
if ($connections) {
Write-Host " [OK] $name (port $port)" -ForegroundColor Green
$started = $true
break
}
Start-Sleep -Seconds 5
}
if (-not $started) {
Write-Host " [FAIL] $name (port $port) - not started after $($maxRetries * 5)s" -ForegroundColor Red
$allRunning = $false
}
}
Write-Host "========================================" -ForegroundColor Cyan
if ($allRunning) {
Write-Host "All services started successfully!" -ForegroundColor Green
Write-Host "Access: http://localhost:8888" -ForegroundColor Green
} else {
Write-Host "Some services failed to start. Check logs." -ForegroundColor Red
}
Write-Host "========================================" -ForegroundColor Cyan

124
restart-services.sh Normal file
View File

@ -0,0 +1,124 @@
#!/bin/bash
# 网盘微服务重启脚本 (Linux Bash)
# 功能:检查端口占用 -> 杀死进程 -> 按顺序启动服务
# 配置
JASYPT_PASSWORD="wangpan-secret-key-2024"
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
LOG_DIR="$BASE_DIR/logs"
# 创建日志目录
mkdir -p "$LOG_DIR"
# 服务配置名称、端口、jar路径
declare -a SERVICE_NAMES=("用户服务" "网盘服务" "TMDB服务" "网关服务")
declare -a SERVICE_PORTS=(8081 8082 8083 8888)
declare -a SERVICE_JARS=(
"wangpan-user-service/target/wangpan-user-service-1.0-SNAPSHOT.jar"
"wangpan-drive-service/target/wangpan-drive-service-1.0-SNAPSHOT.jar"
"wangpan-tmdb-service/target/wangpan-tmdb-service-1.0-SNAPSHOT.jar"
"wangpan-gateway/target/wangpan-gateway-1.0-SNAPSHOT.jar"
)
echo "========================================"
echo " 网盘微服务重启脚本 (Linux)"
echo "========================================"
echo ""
# 导出环境变量
export JASYPT_ENCRYPTOR_PASSWORD="$JASYPT_PASSWORD"
# 第一步:检查并杀死占用端口的进程
echo "[步骤1] 检查端口占用情况..."
for i in "${!SERVICE_PORTS[@]}"; do
port=${SERVICE_PORTS[$i]}
name=${SERVICE_NAMES[$i]}
# 查找占用端口的进程
pid=$(lsof -ti :$port 2>/dev/null || ss -tlnp | grep ":$port " | awk '{print $NF}' | grep -oP 'pid=\K\d+' | head -1)
if [ -n "$pid" ]; then
echo " 发现端口 $port 被进程 PID: $pid 占用,正在杀死..."
kill -9 $pid 2>/dev/null
if [ $? -eq 0 ]; then
echo " 已杀死进程 PID: $pid"
else
echo " 无法杀死进程 PID: $pid"
fi
sleep 1
else
echo " 端口 $port ($name) 未被占用"
fi
done
echo ""
echo "[步骤2] 等待端口释放..."
sleep 3
# 第二步:按顺序启动服务
echo ""
echo "[步骤3] 按顺序启动服务..."
echo ""
for i in "${!SERVICE_NAMES[@]}"; do
name=${SERVICE_NAMES[$i]}
port=${SERVICE_PORTS[$i]}
jar_path="$BASE_DIR/${SERVICE_JARS[$i]}"
echo "----------------------------------------"
echo "启动 $name (端口: $port)..."
if [ ! -f "$jar_path" ]; then
echo " 错误: 找不到jar文件 $jar_path"
echo " 请先执行 mvn clean install -DskipTests 编译项目"
continue
fi
# 启动服务(后台运行)
nohup java -jar "$jar_path" > "$LOG_DIR/${name}-stdout.log" 2>&1 &
pid=$!
if [ $? -eq 0 ]; then
echo " 已启动 $name (PID: $pid)"
else
echo " 启动失败: $name"
fi
# 等待5秒后启动下一个服务最后一个服务不等待
if [ $i -lt $((${#SERVICE_NAMES[@]} - 1)) ]; then
echo " 等待5秒后启动下一个服务..."
sleep 5
fi
done
echo ""
echo "----------------------------------------"
echo "[步骤4] 验证服务启动状态..."
sleep 5
# 检查服务状态
all_running=true
for i in "${!SERVICE_PORTS[@]}"; do
port=${SERVICE_PORTS[$i]}
name=${SERVICE_NAMES[$i]}
# 检查端口是否在监听
if ss -tln | grep -q ":$port "; then
echo "$name (端口 $port) - 运行中"
else
echo "$name (端口 $port) - 未启动"
all_running=false
fi
done
echo ""
echo "========================================"
if [ "$all_running" = true ]; then
echo " 所有服务启动成功!"
echo " 访问地址: http://localhost:8888"
else
echo " 部分服务启动失败,请检查日志"
echo " 日志目录: $LOG_DIR/"
fi
echo "========================================"

View File

@ -46,6 +46,11 @@ public interface TmdbScraperLogMapper extends BaseMapper<TmdbScraperLogDO> {
*/ */
int insertLog(@Param("log") Map<String, Object> log); int insertLog(@Param("log") Map<String, Object> log);
/**
* 查询执行记录总数
*/
long countAll();
/** /**
* 分页查询最近的执行记录 * 分页查询最近的执行记录
* 复杂SQL在XML中实现 * 复杂SQL在XML中实现

View File

@ -31,6 +31,13 @@ public class TmdbScraperLogRepository extends ServiceImpl<TmdbScraperLogMapper,
// ==================== 查询 ==================== // ==================== 查询 ====================
/**
* 查询执行记录总数
*/
public long countAll() {
return baseMapper.countAll();
}
/** /**
* 查询最近的执行记录分页 * 查询最近的执行记录分页
* 委托给 TmdbScraperLogMapper 中定义的 XML 查询 * 委托给 TmdbScraperLogMapper 中定义的 XML 查询

View File

@ -18,6 +18,11 @@
) )
</insert> </insert>
<!-- 查询执行记录总数 -->
<select id="countAll" resultType="long">
SELECT COUNT(*) FROM wp_tmdb_scraper_log
</select>
<!-- 分页查询最近的执行记录 --> <!-- 分页查询最近的执行记录 -->
<select id="queryRecent" resultType="java.util.Map"> <select id="queryRecent" resultType="java.util.Map">
SELECT * FROM wp_tmdb_scraper_log ORDER BY start_time DESC SELECT * FROM wp_tmdb_scraper_log ORDER BY start_time DESC

View File

@ -18,6 +18,11 @@
) )
</insert> </insert>
<!-- 查询执行记录总数 -->
<select id="countAll" resultType="long">
SELECT COUNT(*) FROM wp_tmdb_scraper_log
</select>
<!-- 分页查询最近的执行记录 --> <!-- 分页查询最近的执行记录 -->
<select id="queryRecent" resultType="java.util.Map"> <select id="queryRecent" resultType="java.util.Map">
SELECT * FROM wp_tmdb_scraper_log ORDER BY start_time DESC SELECT * FROM wp_tmdb_scraper_log ORDER BY start_time DESC

View File

@ -36,6 +36,18 @@
<version>3.0.5</version> <version>3.0.5</version>
</dependency> </dependency>
<!-- Spring Boot Actuator - 提供监控端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 注册器 - 暴露 Prometheus 指标 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Test --> <!-- Spring Boot Test -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -33,9 +33,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus:

View File

@ -33,9 +33,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus:

View File

@ -31,6 +31,18 @@
<version>3.0.5</version> <version>3.0.5</version>
</dependency> </dependency>
<!-- Spring Boot Actuator - 提供监控端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 注册器 - 暴露 Prometheus 指标 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Test --> <!-- Spring Boot Test -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -43,7 +43,22 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
org.springframework.cloud.gateway: INFO org.springframework.cloud.gateway: INFO
file:
path: /opt/wangpan/logs

View File

@ -43,7 +43,22 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
org.springframework.cloud.gateway: INFO org.springframework.cloud.gateway: INFO
file:
path: /opt/wangpan/logs

View File

@ -36,6 +36,18 @@
<version>3.0.5</version> <version>3.0.5</version>
</dependency> </dependency>
<!-- Spring Boot Actuator - 提供监控端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 注册器 - 暴露 Prometheus 指标 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Test --> <!-- Spring Boot Test -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -19,6 +19,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -145,8 +146,8 @@ public class MovieController {
return Result.notFound("电影不存在"); return Result.notFound("电影不存在");
} }
// 2. 校验用户权限 // 2. 校验用户权限使用 Objects.equals 避免 user.getId() movieDO.getUserId() null NPE
if (!movieDO.getUserId().equals(user.getId())) { if (!Objects.equals(user.getId(), movieDO.getUserId())) {
return Result.notFound("电影不存在或无权访问"); return Result.notFound("电影不存在或无权访问");
} }

View File

@ -214,13 +214,14 @@ public class TmdbScraperController {
pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, pageSize)); pageSize = Math.min(MAX_PAGE_SIZE, Math.max(1, pageSize));
List<Map<String, Object>> logs = scraperLogRepository.queryRecent(pageNo, pageSize); List<Map<String, Object>> logs = scraperLogRepository.queryRecent(pageNo, pageSize);
long total = scraperLogRepository.countAll();
// 构建分页响应 // 构建分页响应
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
result.put("list", logs); result.put("list", logs);
result.put("pageNo", pageNo); result.put("pageNo", pageNo);
result.put("pageSize", pageSize); result.put("pageSize", pageSize);
result.put("total", logs.size()); result.put("total", total);
return Result.success("查询成功", result); return Result.success("查询成功", result);
} }

View File

@ -29,9 +29,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus:

View File

@ -29,9 +29,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus:

View File

@ -36,6 +36,18 @@
<version>3.0.5</version> <version>3.0.5</version>
</dependency> </dependency>
<!-- Spring Boot Actuator - 提供监控端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 注册器 - 暴露 Prometheus 指标 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Test --> <!-- Spring Boot Test -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -22,9 +22,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus:

View File

@ -22,9 +22,24 @@ jasypt:
iv-generator-classname: org.jasypt.iv.RandomIvGenerator iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64 string-output-type: base64
# Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: prometheus,health,info
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
logging: logging:
level: level:
com.wangpan: INFO com.wangpan: INFO
file:
path: /opt/wangpan/logs
# MyBatis-Plus 配置 # MyBatis-Plus 配置
mybatis-plus: mybatis-plus: