#!/bin/bash # Master-Slave 余额同步测试脚本 # 用法: ./test_region_sync.sh [USER_ID] # 示例: ./test_region_sync.sh 1 MASTER="http://172.22.57.85:23000" SLAVE="http://172.22.57.85:13000" API_KEY="123456789" USER_ID=${1:-1} # 默认用户ID为1,可通过参数传入 echo "==========================================" echo " Master-Slave 余额同步测试" echo "==========================================" echo "Master: $MASTER" echo "Slave: $SLAVE" echo "API Key: $API_KEY" echo "测试用户ID: $USER_ID" echo "==========================================" echo "" # 测试7:完整消费流程测试 echo "=== 测试7: 完整消费流程测试 ===" echo "" echo "[步骤1] 查询Master当前余额..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}") echo "结果: $RESULT" BEFORE_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "当前余额: $BEFORE_QUOTA" echo "" echo "[步骤2] 执行扣费500..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"req-test-$(date +%s)\", \"quota\": 500}]}") echo "结果: $RESULT" echo "" echo "[步骤3] 再次查询Master余额验证扣费成功..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}") echo "结果: $RESULT" AFTER_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "扣费后余额: $AFTER_QUOTA" if [ "$BEFORE_QUOTA" != "" ] && [ "$AFTER_QUOTA" != "" ]; then DIFF=$((BEFORE_QUOTA - AFTER_QUOTA)) if [ "$DIFF" -eq 500 ]; then echo "✅ 测试7通过: 余额正确扣除了500" else echo "❌ 测试7失败: 余额变化为$DIFF,期望为500" fi fi echo "" # 测试8:并发扣费测试 echo "=== 测试8: 并发扣费测试 ===" echo "" echo "[步骤1] 查询当前余额..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}") BEFORE_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "当前余额: $BEFORE_QUOTA" echo "" echo "[步骤2] 并发发送10个扣费请求(每个100)..." for i in {1..10}; do curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"req-concurrent-$i-$(date +%s%N)\", \"quota\": 100}]}" > /dev/null & done wait echo "并发请求发送完成" echo "" echo "[步骤3] 查询最终余额..." sleep 1 RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}") AFTER_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "最终余额: $AFTER_QUOTA" if [ "$AFTER_QUOTA" != "" ] && [ "$AFTER_QUOTA" -ge 0 ]; then echo "✅ 测试8通过: 余额不为负数" else echo "❌ 测试8失败: 余额为负数或查询失败" fi echo "" # 测试10:幂等性测试 echo "=== 测试10: 重复请求幂等性测试 ===" echo "" REQUEST_ID="req-idempotent-$(date +%s)" echo "[步骤1] 发送扣费请求 request_id=$REQUEST_ID..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"$REQUEST_ID\", \"quota\": 100}]}") echo "结果: $RESULT" AFTER_FIRST=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}" | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "第一次扣费后余额: $AFTER_FIRST" echo "" echo "[步骤2] 再次发送相同request_id的请求..." RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"$REQUEST_ID\", \"quota\": 100}]}") echo "结果: $RESULT" AFTER_SECOND=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \ -H "Content-Type: application/json" \ -H "X-Sync-API-Key: $API_KEY" \ -H "X-Sync-Node: $SLAVE" \ -d "{\"user_id\": $USER_ID}" | grep -o '"quota":[0-9]*' | grep -o '[0-9]*') echo "第二次扣费后余额: $AFTER_SECOND" echo "" if [ "$AFTER_FIRST" == "$AFTER_SECOND" ]; then echo "✅ 测试10通过: 重复请求没有重复扣费" else echo "⚠️ 测试10警告: 余额发生了变化,当前实现可能不支持幂等性" echo " (第一次: $AFTER_FIRST, 第二次: $AFTER_SECOND)" fi echo "" echo "==========================================" echo " 测试完成" echo "=========================================="