|
- #!/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 "=========================================="
|