100gbs开发环境,新增socket代理,让本地可直连100环境。
parent
7f751daffe
commit
72e0dce7d4
|
|
@ -0,0 +1,9 @@
|
||||||
|
FROM jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/pub/jdk:1.8.0_202
|
||||||
|
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
COPY ./start/target/start.jar /opt/app.jar
|
||||||
|
|
||||||
|
|
||||||
|
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
# 本地开发配置模板(方案 C)
|
||||||
|
# 使用方式:
|
||||||
|
# 1. 复制为 safety-eval-start/src/main/resources/application-local.yml
|
||||||
|
# 2. IDEA Active profiles 填 local
|
||||||
|
# 3. 100 上已部署 dubbo-dev-proxy(见 docs/gbs/本地开发Dubbo代理方案C.md)
|
||||||
|
#
|
||||||
|
# 注意:含环境密码,勿提交到 Git
|
||||||
|
|
||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
server-addr: 192.168.20.100:30290
|
||||||
|
namespace: jjb-dragon
|
||||||
|
file-extension: yml
|
||||||
|
discovery:
|
||||||
|
# 本地开发不要注册到线上同名服务,避免污染 jjb-dragon
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
datasource:
|
||||||
|
url: jdbc:mysql://192.168.20.100:33080/safety-eval-service?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||||
|
username: root
|
||||||
|
password: Mysql@zcloud33080
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: 192.168.20.100
|
||||||
|
port: 6379
|
||||||
|
password: Zcloud@zcloud2026
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8095
|
||||||
|
|
||||||
|
# 覆盖 Nacos config-common 中的 external 网关地址,本地走 100 NodePort
|
||||||
|
gateway:
|
||||||
|
url: http://192.168.20.100:30140
|
||||||
|
baseUrl: http://192.168.20.100:30140
|
||||||
|
|
||||||
|
dragon:
|
||||||
|
gateway:
|
||||||
|
baseurl: http://192.168.20.100:30140
|
||||||
|
|
||||||
|
dubbo:
|
||||||
|
consumer:
|
||||||
|
check: false
|
||||||
|
timeout: 60000
|
||||||
|
registry:
|
||||||
|
# 仍可从 Nacos 拉 metadata,但 Consumer 端对关键接口建议显式 url
|
||||||
|
check: false
|
||||||
|
|
||||||
|
safety-eval:
|
||||||
|
gbs-user-sync:
|
||||||
|
fail-fast: false
|
||||||
|
# UserFacade 在 jjb-saas-system,方案 C 代理端口 32080
|
||||||
|
user-facade-url: ${GBS_USER_FACADE_URL:dubbo://192.168.20.100:32080}
|
||||||
|
dubbo:
|
||||||
|
message-facade-url: ${GBS_MESSAGE_FACADE_URL:dubbo://192.168.20.100:32084}
|
||||||
|
security:
|
||||||
|
permit-all-paths:
|
||||||
|
- /v2/api-docs
|
||||||
|
- /v3/api-docs
|
||||||
|
permit-all-prefixes:
|
||||||
|
- /swagger-ui
|
||||||
|
- /swagger-resources
|
||||||
|
- /webjars
|
||||||
|
- /public/org-personnel
|
||||||
|
- /test
|
||||||
|
- /tmp
|
||||||
|
- /mock
|
||||||
|
- /org-info
|
||||||
|
- /org-department
|
||||||
|
- /org-position
|
||||||
|
- /org-qualification
|
||||||
|
- /org-personnel
|
||||||
|
- /org-personnel-cert
|
||||||
|
- /org-personnel-change
|
||||||
|
- /org-resign-apply
|
||||||
|
- /org-equipment
|
||||||
|
- /qual-filing
|
||||||
|
- /qual-filing-change
|
||||||
|
- /qual-filing-change-detail
|
||||||
|
- /qual-filing-commitment
|
||||||
|
- /qual-filing-equipment
|
||||||
|
- /qual-filing-material
|
||||||
|
- /qual-filing-personnel
|
||||||
|
- /qual-filing-personnel-cert
|
||||||
|
- /file-storage
|
||||||
|
- /file
|
||||||
|
public-api:
|
||||||
|
system-user-id: 1
|
||||||
|
system-user-name: local-dev
|
||||||
|
tenant-id: 1001
|
||||||
|
org-id: 1
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
org.qinan.safetyeval: debug
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import paramiko
|
||||||
|
|
||||||
|
HOST = "192.168.20.100"
|
||||||
|
USER = "root"
|
||||||
|
PASSWORD = "Zcloud@zcloud100"
|
||||||
|
|
||||||
|
cmds = [
|
||||||
|
"kubectl get pods -n jjb-dragon -l app=jjb-saas-system-pod --field-selector=status.phase=Running -o wide",
|
||||||
|
"kubectl get pods -n jjb-dragon -l app=jjb-saas-message-pod --field-selector=status.phase=Running -o wide",
|
||||||
|
"bash /opt/dubbo-dev-proxy/dubbo-proxy-refresh.sh",
|
||||||
|
"bash /opt/dubbo-dev-proxy/dubbo-proxy-status.sh",
|
||||||
|
"ss -lntp | awk '/3208|32100/'",
|
||||||
|
"ls -la /var/log/dubbo-dev-proxy/ | head -5",
|
||||||
|
"tail -3 /var/log/dubbo-dev-proxy/32080.log 2>/dev/null || echo no_log",
|
||||||
|
]
|
||||||
|
|
||||||
|
client = paramiko.SSHClient()
|
||||||
|
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
client.connect(HOST, username=USER, password=PASSWORD, timeout=20)
|
||||||
|
for cmd in cmds:
|
||||||
|
print(f"\n>>> {cmd}")
|
||||||
|
stdin, stdout, stderr = client.exec_command(cmd, timeout=120)
|
||||||
|
print(stdout.read().decode())
|
||||||
|
err = stderr.read().decode()
|
||||||
|
if err:
|
||||||
|
print("STDERR:", err)
|
||||||
|
client.close()
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Deploy Plan C dubbo-dev-proxy to 192.168.20.100 via SSH."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import stat
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
import paramiko
|
||||||
|
except ImportError:
|
||||||
|
print("paramiko not installed, run: pip install paramiko")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
HOST = "192.168.20.100"
|
||||||
|
USER = "root"
|
||||||
|
PASSWORD = "Zcloud@zcloud100"
|
||||||
|
LOCAL_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
REMOTE_SRC = "/opt/dubbo-dev-proxy-src"
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
client = paramiko.SSHClient()
|
||||||
|
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
print(f"Connecting to {HOST}...")
|
||||||
|
client.connect(HOST, username=USER, password=PASSWORD, timeout=20)
|
||||||
|
|
||||||
|
sftp = client.open_sftp()
|
||||||
|
try:
|
||||||
|
sftp.mkdir(REMOTE_SRC)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
for name in os.listdir(LOCAL_DIR):
|
||||||
|
if not (name.endswith(".sh") or name.endswith(".map")):
|
||||||
|
continue
|
||||||
|
local_path = os.path.join(LOCAL_DIR, name)
|
||||||
|
remote_path = f"{REMOTE_SRC}/{name}"
|
||||||
|
print(f"Upload {name}")
|
||||||
|
sftp.put(local_path, remote_path)
|
||||||
|
if name.endswith(".sh"):
|
||||||
|
sftp.chmod(
|
||||||
|
remote_path,
|
||||||
|
stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH,
|
||||||
|
)
|
||||||
|
sftp.close()
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
f"cd {REMOTE_SRC} && chmod +x *.sh && INSTALL_DIR=/opt/dubbo-dev-proxy bash dubbo-proxy-install.sh",
|
||||||
|
"/opt/dubbo-dev-proxy/dubbo-proxy-status.sh",
|
||||||
|
"ss -lntp | awk '/3208|32100/' | head -8",
|
||||||
|
"nc -zv 127.0.0.1 32080 2>&1",
|
||||||
|
"nc -zv 127.0.0.1 32084 2>&1",
|
||||||
|
]
|
||||||
|
|
||||||
|
for cmd in commands:
|
||||||
|
print(f"\n>>> {cmd}")
|
||||||
|
stdin, stdout, stderr = client.exec_command(cmd, timeout=180)
|
||||||
|
out = stdout.read().decode()
|
||||||
|
err = stderr.read().decode()
|
||||||
|
code = stdout.channel.recv_exit_status()
|
||||||
|
if out:
|
||||||
|
print(out)
|
||||||
|
if err:
|
||||||
|
print("STDERR:", err)
|
||||||
|
print(f"EXIT {code}")
|
||||||
|
if code != 0 and "dubbo-proxy-install" in cmd:
|
||||||
|
client.close()
|
||||||
|
sys.exit(code)
|
||||||
|
|
||||||
|
client.close()
|
||||||
|
print("\nDeploy finished.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# 在 192.168.20.100 安装 Dubbo 开发代理(方案 C)
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
INSTALL_DIR="${INSTALL_DIR:-/opt/dubbo-dev-proxy}"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
echo "[1/5] 安装 socat"
|
||||||
|
if command -v yum >/dev/null 2>&1; then
|
||||||
|
yum install -y socat
|
||||||
|
elif command -v dnf >/dev/null 2>&1; then
|
||||||
|
dnf install -y socat
|
||||||
|
elif command -v apt-get >/dev/null 2>&1; then
|
||||||
|
apt-get update && apt-get install -y socat
|
||||||
|
else
|
||||||
|
echo "请手动安装 socat" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[2/5] 安装脚本与配置到 ${INSTALL_DIR}"
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
install -m 0644 "${SCRIPT_DIR}/dubbo-proxy.map" "${INSTALL_DIR}/dubbo-proxy.map"
|
||||||
|
install -m 0755 "${SCRIPT_DIR}/dubbo-proxy-refresh.sh" "${INSTALL_DIR}/dubbo-proxy-refresh.sh"
|
||||||
|
install -m 0755 "${SCRIPT_DIR}/dubbo-proxy-status.sh" "${INSTALL_DIR}/dubbo-proxy-status.sh"
|
||||||
|
install -m 0755 "${SCRIPT_DIR}/dubbo-proxy-stop.sh" "${INSTALL_DIR}/dubbo-proxy-stop.sh"
|
||||||
|
|
||||||
|
echo "[3/5] 开放防火墙端口 32080-32100(仅开发代理)"
|
||||||
|
if command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active firewalld >/dev/null 2>&1; then
|
||||||
|
firewall-cmd --permanent --add-port=32080-32100/tcp || true
|
||||||
|
firewall-cmd --reload || true
|
||||||
|
echo "firewalld 已开放 32080-32100/tcp"
|
||||||
|
else
|
||||||
|
echo "未检测到 firewalld,跳过防火墙配置"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[4/5] 安装 systemd 服务"
|
||||||
|
cat > /etc/systemd/system/dubbo-dev-proxy.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=GBS Dubbo Dev Proxy Refresh
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=${INSTALL_DIR}/dubbo-proxy-refresh.sh
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/dubbo-dev-proxy.timer <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Refresh GBS Dubbo Dev Proxy every 3 minutes
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=90s
|
||||||
|
OnUnitActiveSec=180s
|
||||||
|
AccuracySec=30s
|
||||||
|
Unit=dubbo-dev-proxy.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable dubbo-dev-proxy.service dubbo-dev-proxy.timer
|
||||||
|
systemctl start dubbo-dev-proxy.service
|
||||||
|
systemctl start dubbo-dev-proxy.timer
|
||||||
|
|
||||||
|
echo "[5/5] 首次刷新完成,查看状态:"
|
||||||
|
"${INSTALL_DIR}/dubbo-proxy-status.sh"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "安装完成。Pod 漂移后由 timer 自动刷新,也可手动执行:"
|
||||||
|
echo " ${INSTALL_DIR}/dubbo-proxy-refresh.sh"
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
#!/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 ==="
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
PID_DIR="${PID_DIR:-/var/run/dubbo-dev-proxy}"
|
||||||
|
MAP_FILE="${MAP_FILE:-/opt/dubbo-dev-proxy/dubbo-proxy.map}"
|
||||||
|
|
||||||
|
printf "%-8s %-28s %-8s %-18s %s\n" "PORT" "POD_LABEL" "PID" "TARGET" "STATUS"
|
||||||
|
printf "%-8s %-28s %-8s %-18s %s\n" "----" "---------" "---" "------" "------"
|
||||||
|
|
||||||
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||||
|
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
||||||
|
IFS='|' read -r port pod_label target_port <<< "$line"
|
||||||
|
pid_file="${PID_DIR}/${port}.pid"
|
||||||
|
pid="-"
|
||||||
|
status="stopped"
|
||||||
|
target="-"
|
||||||
|
if [[ -f "$pid_file" ]]; then
|
||||||
|
pid="$(cat "$pid_file" 2>/dev/null || echo -)"
|
||||||
|
if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
|
||||||
|
status="running"
|
||||||
|
target="$(ss -lntp 2>/dev/null | awk -v p=":${port} " '$0 ~ p {print}' | head -1 || true)"
|
||||||
|
[[ -z "$target" ]] && target="listen :${port}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printf "%-8s %-28s %-8s %-18s %s\n" "$port" "$pod_label" "$pid" "$target" "$status"
|
||||||
|
done < "$MAP_FILE"
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
PID_DIR="${PID_DIR:-/var/run/dubbo-dev-proxy}"
|
||||||
|
MAP_FILE="${MAP_FILE:-/opt/dubbo-dev-proxy/dubbo-proxy.map}"
|
||||||
|
|
||||||
|
systemctl stop dubbo-dev-proxy.timer 2>/dev/null || true
|
||||||
|
systemctl stop dubbo-dev-proxy.service 2>/dev/null || true
|
||||||
|
|
||||||
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||||
|
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
||||||
|
IFS='|' read -r port _ _ <<< "$line"
|
||||||
|
pid_file="${PID_DIR}/${port}.pid"
|
||||||
|
if [[ -f "$pid_file" ]]; then
|
||||||
|
pid="$(cat "$pid_file" 2>/dev/null || true)"
|
||||||
|
if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
|
||||||
|
kill "$pid" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
rm -f "$pid_file"
|
||||||
|
fi
|
||||||
|
done < "$MAP_FILE"
|
||||||
|
|
||||||
|
echo "dubbo-dev-proxy 已停止"
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# 本地开发 Dubbo TCP 代理映射(仅 100 主机 socat 使用)
|
||||||
|
# 格式: 本地固定端口|Pod标签app=|目标端口
|
||||||
|
# 说明:
|
||||||
|
# - 本地端口沿用历史 32080-32100,便于本地 IDE 配置复用
|
||||||
|
# - 不改 K8s Service / Deployment / Nacos 注册
|
||||||
|
# - Pod 标签来自 jjb-dragon 命名空间 Deployment 的 app=xxx-pod
|
||||||
|
|
||||||
|
32080|jjb-saas-system-pod|20880
|
||||||
|
32081|jjb-saas-auth-pod|20880
|
||||||
|
32082|jjb-saas-events-pod|20880
|
||||||
|
32083|jjb-saas-security-pod|20880
|
||||||
|
32084|jjb-saas-message-pod|20880
|
||||||
|
32085|jjb-saas-login-pod|20880
|
||||||
|
32086|jjb-saas-base-pod|20880
|
||||||
|
32087|jjb-saas-process-layout-pod|20880
|
||||||
|
32088|jjb-saas-user-pod|20880
|
||||||
|
32089|jjb-saas-official-pod|20880
|
||||||
|
32090|jjb-saas-facade-pod|20880
|
||||||
|
32091|jjb-saas-open-platform-pod|20880
|
||||||
|
32092|jjb-saas-application-pod|20880
|
||||||
|
32093|jjb-saas-attachment-pod|20880
|
||||||
|
32094|jjb-saas-formily-design-pod|20880
|
||||||
|
32095|jjb-saas-desk-pod|20880
|
||||||
|
32096|jjb-saas-config-pod|20880
|
||||||
|
32097|jjb-saas-document-pod|20880
|
||||||
|
32098|jjb-saas-component-design-pod|20880
|
||||||
|
32099|jjb-saas-view-pod|20880
|
||||||
|
32100|jjb-saas-gateway-pod|20880
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Dubbo 显式 URL 参考(方案 C)
|
||||||
|
# 当 @DubboReference 需要 url 覆盖时,按接口所在服务查表配置
|
||||||
|
# 格式: dubbo://192.168.20.100:<local_port>
|
||||||
|
|
||||||
|
# 用户 Facade(UserFacade,jjb-saas-system)
|
||||||
|
# dubbo://192.168.20.100:32080
|
||||||
|
|
||||||
|
# 消息 Facade(MessageFacade,jjb-saas-message)
|
||||||
|
# dubbo://192.168.20.100:32084
|
||||||
|
|
||||||
|
# 认证
|
||||||
|
# dubbo://192.168.20.100:32081
|
||||||
|
|
||||||
|
# 安全
|
||||||
|
# dubbo://192.168.20.100:32083
|
||||||
|
|
||||||
|
# 附件
|
||||||
|
# dubbo://192.168.20.100:32093
|
||||||
|
|
||||||
|
# 完整端口表见 docs/gbs/本地开发Dubbo代理方案C.md 第 3 节
|
||||||
|
|
@ -0,0 +1,350 @@
|
||||||
|
# 方案 C:100 主机 Dubbo 开发代理(不影响 K8s 集群)
|
||||||
|
|
||||||
|
> 适用场景:本地 IDE 已通过 **VPN** 接入 `192.168.20.0/24`,需要调用 100 上 GBS Dubbo 服务进行开发联调。
|
||||||
|
> 脚本目录:`docs/gbs/scripts/dubbo-dev-proxy/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 方案原理
|
||||||
|
|
||||||
|
### 1.1 要解决的问题
|
||||||
|
|
||||||
|
| 现象 | 原因 |
|
||||||
|
|------|------|
|
||||||
|
| 本地连 Nacos 后 Dubbo 调用失败 | Nacos 返回 Provider 地址为 `10.244.x.x:20880`(Pod 网段) |
|
||||||
|
| VPN 能访问 100,但仍调不通 Dubbo | VPN 通常只路由 `192.168.20.0/24`,不包含 Pod 网段 `10.244.0.0/16` |
|
||||||
|
|
||||||
|
### 1.2 方案 C 做法
|
||||||
|
|
||||||
|
在 **192.168.20.100 主机** 上运行 `socat` TCP 代理:
|
||||||
|
|
||||||
|
```text
|
||||||
|
本地 IDE --VPN--> 192.168.20.100:32088 --socat--> 10.244.x.x:20880 (user Pod)
|
||||||
|
固定端口 当前 Pod IP(动态刷新)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.3 与已废弃「NodePort + 改注册」方案的区别
|
||||||
|
|
||||||
|
| 对比项 | 已废弃方案 A | **方案 C(本文)** |
|
||||||
|
|--------|-------------|-------------------|
|
||||||
|
| 创建 K8s `*-dubbo` Service | 是 | **否** |
|
||||||
|
| 修改 `DUBBO_IP_TO_REGISTRY` | 是 | **否** |
|
||||||
|
| 修改 Nacos 注册地址 | 是 | **否** |
|
||||||
|
| 影响集群内服务互调 | 是 | **否** |
|
||||||
|
| 本地可通过固定端口访问 Dubbo | 是 | **是** |
|
||||||
|
|
||||||
|
**结论:方案 C 只在 100 主机做端口转发,K8s 内部仍保持 Pod IP 注册与 ClusterIP 通讯。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 架构图
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
subgraph local [本地开发机 VPN]
|
||||||
|
IDE[IDE / 本地 Java]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph host100 [192.168.20.100 主机]
|
||||||
|
Socat[socat 32080-32100]
|
||||||
|
FW[firewalld]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph k8s [jjb-dragon 集群内 - 不变]
|
||||||
|
Pod1[user Pod 10.244.x.x:20880]
|
||||||
|
Pod2[system Pod 10.244.x.x:20880]
|
||||||
|
Nacos[prod-nacos:8848]
|
||||||
|
end
|
||||||
|
|
||||||
|
IDE -->|192.168.20.100:32088| FW
|
||||||
|
FW --> Socat
|
||||||
|
Socat --> Pod1
|
||||||
|
Pod2 --> Nacos
|
||||||
|
Pod1 --> Nacos
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 端口映射表
|
||||||
|
|
||||||
|
沿用历史开发端口,便于本地配置复用(见 `dubbo-proxy.map`):
|
||||||
|
|
||||||
|
| 本地固定端口 | GBS 服务 | Pod 标签 | Dubbo 端口 |
|
||||||
|
|-------------|----------|----------|------------|
|
||||||
|
| 32080 | jjb-saas-system | jjb-saas-system-pod | 20880 |
|
||||||
|
| 32081 | jjb-saas-auth | jjb-saas-auth-pod | 20880 |
|
||||||
|
| 32082 | jjb-saas-events | jjb-saas-events-pod | 20880 |
|
||||||
|
| 32083 | jjb-saas-security | jjb-saas-security-pod | 20880 |
|
||||||
|
| 32084 | jjb-saas-message | jjb-saas-message-pod | 20880 |
|
||||||
|
| 32085 | jjb-saas-login | jjb-saas-login-pod | 20880 |
|
||||||
|
| 32086 | jjb-saas-base | jjb-saas-base-pod | 20880 |
|
||||||
|
| 32087 | jjb-saas-process-layout | jjb-saas-process-layout-pod | 20880 |
|
||||||
|
| **32088** | **jjb-saas-user** | jjb-saas-user-pod | 20880 |
|
||||||
|
| 32089 | jjb-saas-official | jjb-saas-official-pod | 20880 |
|
||||||
|
| 32090 | jjb-saas-facade | jjb-saas-facade-pod | 20880 |
|
||||||
|
| 32091 | jjb-saas-open-platform | jjb-saas-open-platform-pod | 20880 |
|
||||||
|
| 32092 | jjb-saas-application | jjb-saas-application-pod | 20880 |
|
||||||
|
| 32093 | jjb-saas-attachment | jjb-saas-attachment-pod | 20880 |
|
||||||
|
| 32094 | jjb-saas-formily-design | jjb-saas-formily-design-pod | 20880 |
|
||||||
|
| 32095 | jjb-saas-desk | jjb-saas-desk-pod | 20880 |
|
||||||
|
| 32096 | jjb-saas-config | jjb-saas-config-pod | 20880 |
|
||||||
|
| 32097 | jjb-saas-document | jjb-saas-document-pod | 20880 |
|
||||||
|
| 32098 | jjb-saas-component-design | jjb-saas-component-design-pod | 20880 |
|
||||||
|
| 32099 | jjb-saas-view | jjb-saas-view-pod | 20880 |
|
||||||
|
| 32100 | jjb-saas-gateway | jjb-saas-gateway-pod | 20880 |
|
||||||
|
|
||||||
|
> **safety-eval** 常用:`32080`(system/UserFacade)、`32084`(message/MessageFacade)等,按实际依赖选用。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 100 服务器需要做什么
|
||||||
|
|
||||||
|
### 4.1 前置条件
|
||||||
|
|
||||||
|
| 项 | 要求 |
|
||||||
|
|----|------|
|
||||||
|
| 主机 | `192.168.20.100`(K8s Master) |
|
||||||
|
| 权限 | `root` SSH |
|
||||||
|
| 工具 | `kubectl` 可用、`socat`(脚本自动安装) |
|
||||||
|
| K8s | 命名空间 `jjb-dragon` 内目标 Pod 为 Running |
|
||||||
|
| 网络 | 100 主机能访问 Pod IP(`10.244.0.0/16`) |
|
||||||
|
|
||||||
|
### 4.2 一次性安装
|
||||||
|
|
||||||
|
将仓库中脚本目录上传到 100(或在 100 上 git pull 后执行):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在 100 上执行
|
||||||
|
cd /path/to/safety-eval-service/docs/gbs/scripts/dubbo-dev-proxy
|
||||||
|
chmod +x *.sh
|
||||||
|
sudo ./dubbo-proxy-install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
安装脚本会:
|
||||||
|
|
||||||
|
1. 安装 `socat`
|
||||||
|
2. 复制配置到 `/opt/dubbo-dev-proxy/`
|
||||||
|
3. 开放防火墙 `32080-32100/tcp`
|
||||||
|
4. 注册 systemd 服务 + 定时器(每 3 分钟自动刷新 Pod IP)
|
||||||
|
|
||||||
|
### 4.3 日常运维命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看代理状态
|
||||||
|
/opt/dubbo-dev-proxy/dubbo-proxy-status.sh
|
||||||
|
|
||||||
|
# Pod 重启/漂移后手动刷新
|
||||||
|
/opt/dubbo-dev-proxy/dubbo-proxy-refresh.sh
|
||||||
|
|
||||||
|
# 停止全部开发代理(下班/不需要本地联调时)
|
||||||
|
/opt/dubbo-dev-proxy/dubbo-proxy-stop.sh
|
||||||
|
|
||||||
|
# 重新启用
|
||||||
|
systemctl start dubbo-dev-proxy.service
|
||||||
|
systemctl start dubbo-dev-proxy.timer
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 验证(在 100 上)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 代理进程
|
||||||
|
/opt/dubbo-dev-proxy/dubbo-proxy-status.sh
|
||||||
|
|
||||||
|
# 2. 端口监听
|
||||||
|
ss -lntp | grep -E '3208[0-9]|32100'
|
||||||
|
|
||||||
|
# 3. 本机探测 user 代理(示例)
|
||||||
|
nc -zv 127.0.0.1 32088
|
||||||
|
|
||||||
|
# 4. 确认 K8s 未被改动
|
||||||
|
kubectl get svc -n jjb-dragon | grep dubbo # 应无 *-dubbo
|
||||||
|
kubectl get deploy -n jjb-dragon -o yaml | grep DUBBO_IP_TO_REGISTRY # 应无输出
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 100 服务器清单(汇总)
|
||||||
|
|
||||||
|
| 类别 | 路径/端口 | 说明 |
|
||||||
|
|------|-----------|------|
|
||||||
|
| 安装目录 | `/opt/dubbo-dev-proxy/` | 脚本与 map 配置 |
|
||||||
|
| PID 目录 | `/var/run/dubbo-dev-proxy/` | socat 进程 PID |
|
||||||
|
| 日志 | `/var/log/dubbo-dev-proxy/` | 按端口分日志 |
|
||||||
|
| systemd | `dubbo-dev-proxy.service` | 刷新代理 |
|
||||||
|
| systemd timer | `dubbo-dev-proxy.timer` | 每 3 分钟自动刷新 |
|
||||||
|
| 防火墙 | `32080-32100/tcp` | 仅开发代理端口 |
|
||||||
|
| **不改** | K8s Deployment/Service | 无 env、无 NodePort Service |
|
||||||
|
| **不改** | Nacos 注册信息 | Provider 仍为 Pod IP |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 本地开发机需要做什么
|
||||||
|
|
||||||
|
### 5.1 前置条件
|
||||||
|
|
||||||
|
| 项 | 要求 |
|
||||||
|
|----|------|
|
||||||
|
| VPN | 已连接,能访问 `192.168.20.100` |
|
||||||
|
| JDK | 1.8(与项目一致) |
|
||||||
|
| IDE | IntelliJ IDEA / 其他支持 Spring Boot |
|
||||||
|
|
||||||
|
### 5.2 基础连通性自检
|
||||||
|
|
||||||
|
在本地 PowerShell / Git Bash 执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# VPN + 网关
|
||||||
|
curl -s -o /dev/null -w "gateway:%{http_code}\n" http://192.168.20.100:30140/
|
||||||
|
|
||||||
|
# Nacos
|
||||||
|
curl -s -o /dev/null -w "nacos:%{http_code}\n" http://192.168.20.100:30290/nacos/
|
||||||
|
|
||||||
|
# Dubbo 代理(100 上方案 C 启用后)
|
||||||
|
# Windows 可用 Test-NetConnection
|
||||||
|
Test-NetConnection 192.168.20.100 -Port 32088
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 本地配置原则
|
||||||
|
|
||||||
|
1. **Nacos**:用 NodePort `30290` 拉配置,namespace `jjb-dragon`
|
||||||
|
2. **HTTP**:走网关 `http://192.168.20.100:30140`
|
||||||
|
3. **MySQL/Redis**:直连 `192.168.20.100:33080` / `6379`
|
||||||
|
4. **Dubbo**:**不要**依赖 Nacos 自动发现的 `10.244.*` 地址;对需要的接口使用 **显式 URL** `dubbo://192.168.20.100:32xxx`
|
||||||
|
5. **本地服务注册**:不要以线上同名注册到 `jjb-dragon`(避免污染负载)
|
||||||
|
|
||||||
|
### 5.4 safety-eval 本地 Profile 示例
|
||||||
|
|
||||||
|
复制 `application-local.example.yml` 为本地使用(**不要提交含密码的私人配置**):
|
||||||
|
|
||||||
|
```text
|
||||||
|
docs/gbs/scripts/dubbo-dev-proxy/application-local.example.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
IDE VM Options 示例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
-Dspring.profiles.active=local
|
||||||
|
-Dnacos.url=192.168.20.100:30290
|
||||||
|
-Dmysql.host=192.168.20.100
|
||||||
|
-Dmysql.port=33080
|
||||||
|
-Dmysql.username=root
|
||||||
|
-Dmysql.password=Mysql@zcloud33080
|
||||||
|
-DGBS_USER_FACADE_URL=dubbo://192.168.20.100:32080
|
||||||
|
-DGBS_MESSAGE_FACADE_URL=dubbo://192.168.20.100:32084
|
||||||
|
```
|
||||||
|
|
||||||
|
IDEA 环境变量(可选):
|
||||||
|
|
||||||
|
```text
|
||||||
|
GBS_USER_FACADE_URL=dubbo://192.168.20.100:32080
|
||||||
|
GBS_MESSAGE_FACADE_URL=dubbo://192.168.20.100:32084
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.5 Dubbo 依赖与端口对照(按需配置)
|
||||||
|
|
||||||
|
| 业务依赖 | 建议显式 URL |
|
||||||
|
|----------|-------------|
|
||||||
|
| 用户 Facade(UserFacade,system 服务) | `dubbo://192.168.20.100:32080` |
|
||||||
|
| 消息 Facade(MessageFacade) | `dubbo://192.168.20.100:32084` |
|
||||||
|
| 认证/安全 | `dubbo://192.168.20.100:32081` / `32083` |
|
||||||
|
| 附件 | `dubbo://192.168.20.100:32093` |
|
||||||
|
|
||||||
|
若项目通过 `@DubboReference` 自动发现,需在本地 profile 中为对应 reference 配置 `url` 属性,或关闭该 bean 的注册中心发现(按 GBS client 模块约定)。
|
||||||
|
|
||||||
|
### 5.6 本地清单(汇总)
|
||||||
|
|
||||||
|
| 类别 | 配置 | 值 |
|
||||||
|
|------|------|-----|
|
||||||
|
| Profile | `spring.profiles.active` | `local` |
|
||||||
|
| Nacos 配置中心 | `spring.cloud.nacos.config.server-addr` | `192.168.20.100:30290` |
|
||||||
|
| Nacos 命名空间 | `jjb-dragon` | 与线上一致(只读拉配置) |
|
||||||
|
| 网关 | `gateway.url` | `http://192.168.20.100:30140` |
|
||||||
|
| MySQL | host/port | `192.168.20.100:33080` |
|
||||||
|
| Redis | host/port | `192.168.20.100:6379` |
|
||||||
|
| Dubbo UserFacade | `GBS_USER_FACADE_URL` | `dubbo://192.168.20.100:32080` |
|
||||||
|
| Dubbo MessageFacade | `GBS_MESSAGE_FACADE_URL` | `dubbo://192.168.20.100:32084` |
|
||||||
|
| 本地服务端口 | `server.port` | `8095`(与项目默认一致) |
|
||||||
|
| **禁止** | 注册到线上同名 Nacos 服务 | 使用独立服务名或关闭注册 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 完整操作流程(首次)
|
||||||
|
|
||||||
|
### Step 1:100 安装代理
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@192.168.20.100
|
||||||
|
cd /path/to/safety-eval-service/docs/gbs/scripts/dubbo-dev-proxy
|
||||||
|
chmod +x *.sh
|
||||||
|
./dubbo-proxy-install.sh
|
||||||
|
./dubbo-proxy-status.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2:本地验证 VPN + 代理端口
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Test-NetConnection 192.168.20.100 -Port 32088
|
||||||
|
Test-NetConnection 192.168.20.100 -Port 30140
|
||||||
|
Test-NetConnection 192.168.20.100 -Port 30290
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3:本地配置 IDE
|
||||||
|
|
||||||
|
1. 复制 `application-local.example.yml` 为 `application-local.yml`(放在 `safety-eval-start/src/main/resources/` 或 IDE 外部配置)
|
||||||
|
2. 设置 VM Options(见 5.4)
|
||||||
|
3. Active profiles 填 `local`
|
||||||
|
|
||||||
|
### Step 4:启动本地服务并验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 本地启动后检查日志
|
||||||
|
# - Nacos 配置拉取成功
|
||||||
|
# - Dubbo 连接 192.168.20.100:32088 成功
|
||||||
|
# - 无 10.244.x.x 连接超时
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5:功能验证
|
||||||
|
|
||||||
|
- 调用依赖 GBS 用户的接口(如同步用户)
|
||||||
|
- 通过网关 `30140` 访问前端页面(可选)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 故障排查
|
||||||
|
|
||||||
|
| 现象 | 排查 |
|
||||||
|
|------|------|
|
||||||
|
| 本地 `32088` 连不上 | VPN 是否通;100 上 `dubbo-proxy-status.sh` 是否 running;防火墙是否开放 |
|
||||||
|
| Dubbo 仍连 `10.244.*` | 本地未覆盖 URL,仍走 Nacos 自动发现;检查 profile / 环境变量 |
|
||||||
|
| 代理 running 但调用失败 | Pod 已漂移,执行 `dubbo-proxy-refresh.sh` |
|
||||||
|
| 100 上某服务显示 skipped | 对应 Pod 非 Running,`kubectl get pods -n jjb-dragon` 检查 |
|
||||||
|
| 集群内服务异常 | **立即停止代理排查**,确认未改 Deployment env(方案 C 不应影响) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 安全与维护建议
|
||||||
|
|
||||||
|
1. **限制访问源**:若 VPN 网段固定,可将 `32080-32100` 仅对 VPN 网段开放(`firewall-cmd --add-rich-rule`)
|
||||||
|
2. **下班停止**:不需要联调时 `dubbo-proxy-stop.sh`,减少暴露面
|
||||||
|
3. **不要与方案 A 混用**:禁止同时设置 `DUBBO_IP_TO_REGISTRY`
|
||||||
|
4. **Pod 大规模重启后**:手动执行一次 `dubbo-proxy-refresh.sh`
|
||||||
|
5. **定期核对**:`kubectl get svc -n jjb-dragon | grep dubbo` 应始终为空
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 相关文档
|
||||||
|
|
||||||
|
- `docs/gbs/GBS-Dubbo-NodePort映射与还原记录.md` — 已废弃方案与还原记录
|
||||||
|
- `docs/gbs/GBS底座服务手册v2.md` — 端口与 Nacos 外部访问说明
|
||||||
|
- `docs/本地JAR打包发布到100服务器完整流程.md` — K8s 部署流程(与本地开发并行)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 脚本文件说明
|
||||||
|
|
||||||
|
| 文件 | 用途 |
|
||||||
|
|------|------|
|
||||||
|
| `dubbo-proxy.map` | 端口 ↔ Pod 标签映射 |
|
||||||
|
| `dubbo-proxy-install.sh` | 100 一次性安装 |
|
||||||
|
| `dubbo-proxy-refresh.sh` | 刷新 socat 到当前 Pod IP |
|
||||||
|
| `dubbo-proxy-status.sh` | 查看运行状态 |
|
||||||
|
| `dubbo-proxy-stop.sh` | 停止全部代理 |
|
||||||
|
| `application-local.example.yml` | 本地 IDE 配置模板 |
|
||||||
|
|
@ -167,6 +167,8 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
|
||||||
domainQuery.setPageSize(query.getSize());
|
domainQuery.setPageSize(query.getSize());
|
||||||
domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId());
|
domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId());
|
||||||
domainQuery.setFilingNo(query.getFilingNo());
|
domainQuery.setFilingNo(query.getFilingNo());
|
||||||
|
domainQuery.setFilingUnitName(query.getFilingUnitName());
|
||||||
|
domainQuery.setFilingTerritoryCode(query.getFilingTerritoryCode());
|
||||||
domainQuery.setFilingStatusCode(query.getFilingStatusCode());
|
domainQuery.setFilingStatusCode(query.getFilingStatusCode());
|
||||||
PageResult<QualFilingChangeEntity> pageResult = qualFilingChangeDomainService.page(domainQuery);
|
PageResult<QualFilingChangeEntity> pageResult = qualFilingChangeDomainService.page(domainQuery);
|
||||||
return PageResponse.of(
|
return PageResponse.of(
|
||||||
|
|
@ -181,6 +183,8 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
|
||||||
domainQuery.setPageSize(query.getSize());
|
domainQuery.setPageSize(query.getSize());
|
||||||
domainQuery.setOrgId(ThreadLocalUserInfoAdapter.getOrgId());
|
domainQuery.setOrgId(ThreadLocalUserInfoAdapter.getOrgId());
|
||||||
domainQuery.setFilingNo(query.getFilingNo());
|
domainQuery.setFilingNo(query.getFilingNo());
|
||||||
|
domainQuery.setFilingUnitName(query.getFilingUnitName());
|
||||||
|
domainQuery.setFilingTerritoryCode(query.getFilingTerritoryCode());
|
||||||
domainQuery.setFilingStatusCode(query.getFilingStatusCode());
|
domainQuery.setFilingStatusCode(query.getFilingStatusCode());
|
||||||
|
|
||||||
// 直连 infrastructure 层 Mapper,跳过 domain,由 XML 直接返回 CO,无需转换
|
// 直连 infrastructure 层 Mapper,跳过 domain,由 XML 直接返回 CO,无需转换
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,12 @@ public class QualFilingChangePageQuery extends BasePageQuery {
|
||||||
@ApiModelProperty(value = "备案编号")
|
@ApiModelProperty(value = "备案编号")
|
||||||
private String filingNo;
|
private String filingNo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备案单位")
|
||||||
|
private String filingUnitName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备案属地编码")
|
||||||
|
private String filingTerritoryCode;
|
||||||
|
|
||||||
@ApiModelProperty(value = "备案状态编码(1已备案2审核中3已打回4变更审核中5暂存)")
|
@ApiModelProperty(value = "备案状态编码(1已备案2审核中3已打回4变更审核中5暂存)")
|
||||||
private Long filingStatusCode;
|
private Long filingStatusCode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,12 @@ public class QualFilingChangeQuery {
|
||||||
/** 备案编号 */
|
/** 备案编号 */
|
||||||
private String filingNo;
|
private String filingNo;
|
||||||
|
|
||||||
|
/** 备案单位 */
|
||||||
|
private String filingUnitName;
|
||||||
|
|
||||||
|
/** 备案属地编码/名称 */
|
||||||
|
private String filingTerritoryCode;
|
||||||
|
|
||||||
/** 备案状态 */
|
/** 备案状态 */
|
||||||
private Long filingStatusCode;
|
private Long filingStatusCode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,15 @@ public class QualFilingChangeGatewayImpl implements QualFilingChangeGateway {
|
||||||
wrapper.eq(QualFilingChangeDO::getFilingId, query.getFilingId());
|
wrapper.eq(QualFilingChangeDO::getFilingId, query.getFilingId());
|
||||||
}
|
}
|
||||||
if (StringUtils.hasText(query.getFilingNo())) {
|
if (StringUtils.hasText(query.getFilingNo())) {
|
||||||
wrapper.eq(QualFilingChangeDO::getFilingNo, query.getFilingNo());
|
wrapper.like(QualFilingChangeDO::getFilingNo, query.getFilingNo());
|
||||||
|
}
|
||||||
|
if (StringUtils.hasText(query.getFilingUnitName())) {
|
||||||
|
wrapper.like(QualFilingChangeDO::getFilingUnitName, query.getFilingUnitName());
|
||||||
|
}
|
||||||
|
if (StringUtils.hasText(query.getFilingTerritoryCode())) {
|
||||||
|
String territory = query.getFilingTerritoryCode();
|
||||||
|
wrapper.and(w -> w.eq(QualFilingChangeDO::getFilingTerritoryCode, territory)
|
||||||
|
.or().eq(QualFilingChangeDO::getFilingTerritoryName, territory));
|
||||||
}
|
}
|
||||||
if (query.getFilingStatusCode() != null) {
|
if (query.getFilingStatusCode() != null) {
|
||||||
wrapper.eq(QualFilingChangeDO::getFilingStatusCode, query.getFilingStatusCode());
|
wrapper.eq(QualFilingChangeDO::getFilingStatusCode, query.getFilingStatusCode());
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ public class SmsRemote {
|
||||||
|
|
||||||
private RestTemplate restTemplate;
|
private RestTemplate restTemplate;
|
||||||
|
|
||||||
@DubboReference
|
@DubboReference(protocol = "dubbo", url = "${safety-eval.dubbo.message-facade-url:}")
|
||||||
private MessageFacade messageFacade;
|
private MessageFacade messageFacade;
|
||||||
private final RedisService redisService;
|
private final RedisService redisService;
|
||||||
private final RedissonClient redissonClient;
|
private final RedissonClient redissonClient;
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,14 @@
|
||||||
qfc.delete_enum = 'false'
|
qfc.delete_enum = 'false'
|
||||||
AND qfc.org_id = #{query.orgId}
|
AND qfc.org_id = #{query.orgId}
|
||||||
<if test="query.filingNo != null and query.filingNo != ''">
|
<if test="query.filingNo != null and query.filingNo != ''">
|
||||||
AND qfc.filing_no = #{query.filingNo}
|
AND qfc.filing_no LIKE CONCAT('%', #{query.filingNo}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="query.filingUnitName != null and query.filingUnitName != ''">
|
||||||
|
AND qfc.filing_unit_name LIKE CONCAT('%', #{query.filingUnitName}, '%')
|
||||||
|
</if>
|
||||||
|
<if test="query.filingTerritoryCode != null and query.filingTerritoryCode != ''">
|
||||||
|
AND (qfc.filing_territory_code = #{query.filingTerritoryCode}
|
||||||
|
OR qfc.filing_territory_name = #{query.filingTerritoryCode})
|
||||||
</if>
|
</if>
|
||||||
<if test="query.filingStatusCode != null">
|
<if test="query.filingStatusCode != null">
|
||||||
AND qfc.filing_status_code = #{query.filingStatusCode}
|
AND qfc.filing_status_code = #{query.filingStatusCode}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
# 本地 IDE 开发配置(方案 C:100 主机 socat Dubbo 代理)
|
||||||
|
# profile=local 时加载,覆盖 nacos/*.yml 中的部分默认值
|
||||||
|
|
||||||
|
#server:
|
||||||
|
# port: 8095
|
||||||
|
|
||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
discovery:
|
||||||
|
# 避免本地实例注册到 jjb-dragon,污染线上服务发现
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
safety-eval:
|
||||||
|
gbs-user-sync:
|
||||||
|
fail-fast: false
|
||||||
|
# UserFacade 在 jjb-saas-system,对应代理端口 32080
|
||||||
|
user-facade-url: ${GBS_USER_FACADE_URL:dubbo://192.168.20.100:32080}
|
||||||
|
dubbo:
|
||||||
|
# MessageFacade 在 jjb-saas-message,对应代理端口 32084
|
||||||
|
message-facade-url: ${GBS_MESSAGE_FACADE_URL:dubbo://192.168.20.100:32084}
|
||||||
|
|
@ -28,6 +28,7 @@ spring:
|
||||||
- classpath:nacos/config-flyway.yml
|
- classpath:nacos/config-flyway.yml
|
||||||
- classpath:sdk.yml
|
- classpath:sdk.yml
|
||||||
- classpath:swagger.yml
|
- classpath:swagger.yml
|
||||||
|
- classpath:application-local.yml
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
config:
|
config:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/8 09:09:40] App_Identifier[safetyEval]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
|
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/8 11:32:35] App_Identifier[safetyEval]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
|
||||||
const APP_ENV = {
|
const APP_ENV = {
|
||||||
antd: {
|
antd: {
|
||||||
'ant-prefix': 'micro-temp',
|
'ant-prefix': 'micro-temp',
|
||||||
|
|
@ -89,4 +89,4 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
}</script><script defer="defer" src="/safetyEval/static/js/379.7b4c2533d0a3b689.js"></script><script defer="defer" src="/safetyEval/static/js/121.ae75e71830bf4ae0.js"></script><script defer="defer" src="/safetyEval/static/js/289.f12da2fe2f6ad2ae.js"></script><script defer="defer" src="/safetyEval/static/js/main.adcf98be0f4fcd43.js"></script><link href="/safetyEval/static/css/main.cb6068c6562f0d94.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/8 09:09:40] App_Identifier[safetyEval] Frontend_Branch[dev] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>
|
}</script><script defer="defer" src="/safetyEval/static/js/934.ada55f776be86394.js"></script><script defer="defer" src="/safetyEval/static/js/121.ae75e71830bf4ae0.js"></script><script defer="defer" src="/safetyEval/static/js/289.f12da2fe2f6ad2ae.js"></script><script defer="defer" src="/safetyEval/static/js/main.6ff8cc6ae670e8a0.js"></script><link href="/safetyEval/static/css/main.cb6068c6562f0d94.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/8 11:32:35] App_Identifier[safetyEval] Frontend_Branch[dev] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1 +1 @@
|
||||||
module.exports={javaGit:"<git-url>",javaGitName:"<git-name>",environment:{development:{javaGitBranch:"<branch-name>",API_HOST:"http://192.168.0.149"},production:{javaGitBranch:"<branch-name>",API_HOST:""}},appIdentifier:"safetyEval",contextInject:{appKey:"",fileUrl:"https://skqhdg.porthebei.com:9004/file/uploadFiles2/"},windowInject:{title:"微应用模板",links:[],element:{root:{id:"root"}},scripts:[]},server:{port:"8081",host:"192.168.0.187",open:!1},framework:{antd:{"ant-prefix":"micro-temp",fontFamily:"PingFangSC-Regular",colorPrimary:"#1677ff",borderRadius:2}},webpackConfig:{htmlWebpackPluginOption:{inject:!0}}};
|
module.exports={javaGit:"<git-url>",javaGitName:"<git-name>",environment:{development:{javaGitBranch:"<branch-name>",API_HOST:"http://192.168.0.103"},production:{javaGitBranch:"<branch-name>",API_HOST:""}},appIdentifier:"safetyEval",contextInject:{appKey:"",fileUrl:"https://skqhdg.porthebei.com:9004/file/uploadFiles2/"},windowInject:{title:"微应用模板",links:[],element:{root:{id:"root"}},scripts:[]},server:{port:"8081",host:"192.168.0.187",open:!1},framework:{antd:{"ant-prefix":"micro-temp",fontFamily:"PingFangSC-Regular",colorPrimary:"#1677ff",borderRadius:2}},webpackConfig:{htmlWebpackPluginOption:{inject:!0}}};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue