79 lines
2.2 KiB
Bash
79 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
||
# GBS 本地开发 Dubbo 代理刷新脚本(方案 C)
|
||
# 在 192.168.20.100 上运行:将固定端口转发到当前 Pod IP:20880
|
||
# 不修改 K8s / Nacos 注册,仅做主机级 TCP 代理
|
||
|
||
set -euo pipefail
|
||
|
||
NAMESPACE="${NAMESPACE:-jjb-dragon}"
|
||
BIND_ADDR="${BIND_ADDR:-0.0.0.0}"
|
||
MAP_FILE="${MAP_FILE:-/opt/dubbo-dev-proxy/dubbo-proxy.map}"
|
||
PID_DIR="${PID_DIR:-/var/run/dubbo-dev-proxy}"
|
||
LOG_DIR="${LOG_DIR:-/var/log/dubbo-dev-proxy}"
|
||
KUBECTL="${KUBECTL:-kubectl}"
|
||
|
||
mkdir -p "$PID_DIR" "$LOG_DIR"
|
||
|
||
if ! command -v socat >/dev/null 2>&1; then
|
||
echo "[ERROR] socat 未安装,请先执行 dubbo-proxy-install.sh" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if [[ ! -f "$MAP_FILE" ]]; then
|
||
echo "[ERROR] 映射文件不存在: $MAP_FILE" >&2
|
||
exit 1
|
||
fi
|
||
|
||
stop_one() {
|
||
local port="$1"
|
||
local pid_file="${PID_DIR}/${port}.pid"
|
||
if [[ -f "$pid_file" ]]; then
|
||
local pid
|
||
pid="$(cat "$pid_file" 2>/dev/null || true)"
|
||
if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
|
||
kill "$pid" 2>/dev/null || true
|
||
sleep 0.2
|
||
kill -9 "$pid" 2>/dev/null || true
|
||
fi
|
||
rm -f "$pid_file"
|
||
fi
|
||
}
|
||
|
||
start_one() {
|
||
local port="$1"
|
||
local pod_label="$2"
|
||
local target_port="$3"
|
||
|
||
local pod_ip
|
||
pod_ip="$($KUBECTL get pods -n "$NAMESPACE" -l "app=${pod_label}" \
|
||
--field-selector=status.phase=Running \
|
||
-o jsonpath='{.items[0].status.podIP}' 2>/dev/null || true)"
|
||
|
||
if [[ -z "$pod_ip" ]]; then
|
||
echo "[WARN] ${pod_label} 无 Running Pod,跳过端口 ${port}"
|
||
stop_one "$port"
|
||
return 0
|
||
fi
|
||
|
||
stop_one "$port"
|
||
|
||
nohup socat \
|
||
"TCP-LISTEN:${port},bind=${BIND_ADDR},fork,reuseaddr" \
|
||
"TCP:${pod_ip}:${target_port}" \
|
||
>> "${LOG_DIR}/${port}.log" 2>&1 &
|
||
|
||
echo $! > "${PID_DIR}/${port}.pid"
|
||
echo "[OK] ${port} -> ${pod_ip}:${target_port} (${pod_label})"
|
||
}
|
||
|
||
echo "=== dubbo-dev-proxy refresh $(date '+%F %T') ==="
|
||
|
||
while IFS= read -r line || [[ -n "$line" ]]; do
|
||
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
||
IFS='|' read -r local_port pod_label target_port <<< "$line"
|
||
[[ -z "$local_port" || -z "$pod_label" || -z "$target_port" ]] && continue
|
||
start_one "$local_port" "$pod_label" "$target_port"
|
||
done < "$MAP_FILE"
|
||
|
||
echo "=== done ==="
|