跳转至

中国网络环境优化部署

文档版本: 1.0.0
最后更新: 2025-08-19
Git 提交: c1aa5b0f
作者: Lincoln

本文档专门针对中国网络环境提供优化的部署方案,包括网络加速、镜像优化、依赖加速等配置,帮助中国用户获得更好的部署和运行体验。

中国优化概述

优化特性

  • Maven 镜像加速:使用阿里云 Maven 镜像,依赖下载速度提升 5-10 倍
  • Docker 镜像加速:配置国内 Docker 镜像源,镜像拉取更快
  • 网络连接优化:针对中国网络环境的连接超时和重试配置
  • CDN 加速:使用国内 CDN 服务加速静态资源访问
  • DNS 优化:配置国内 DNS 服务器,提升域名解析速度

网络环境挑战

挑战影响优化方案
Maven 依赖下载慢构建时间长,经常超时使用阿里云 Maven 镜像
Docker 镜像拉取慢部署时间长,可能失败配置国内镜像源
网络连接不稳定服务调用失败率高优化超时和重试配置
DNS 解析慢服务发现延迟使用国内 DNS 服务
跨境网络延迟API 调用响应慢使用国内 AI 服务提供商

Maven 构建优化

1. 阿里云 Maven 镜像配置

JAiRouter 提供专门的中国优化构建配置:

settings-china.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
          http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <mirrors>
    <!-- 阿里云 Maven 中央仓库镜像 -->
    <mirror>
      <id>aliyun-central</id>
      <mirrorOf>central</mirrorOf>
      <name>Aliyun Central</name>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

    <!-- 阿里云 Maven 公共仓库镜像 -->
    <mirror>
      <id>aliyun-public</id>
      <mirrorOf>*</mirrorOf>
      <name>Aliyun Public</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

    <!-- 阿里云 Spring 仓库镜像 -->
    <mirror>
      <id>aliyun-spring</id>
      <mirrorOf>spring-milestones,spring-snapshots</mirrorOf>
      <name>Aliyun Spring</name>
      <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
  </mirrors>

  <profiles>
    <profile>
      <id>china</id>
      <repositories>
        <repository>
          <id>aliyun-central</id>
          <url>https://maven.aliyun.com/repository/central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>

        <repository>
          <id>aliyun-spring</id>
          <url>https://maven.aliyun.com/repository/spring</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>aliyun-plugin</id>
          <url>https://maven.aliyun.com/repository/central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>china</activeProfile>
  </activeProfiles>
</settings>

2. 中国优化构建脚本

Windows PowerShell 脚本

创建 scripts/docker-build-china.ps1

#!/usr/bin/env pwsh
# JAiRouter 中国优化 Docker 构建脚本

param(
    [string]$Tag = "latest",
    [string]$Profile = "china"
)

Write-Host "开始构建 JAiRouter (中国优化版本)..." -ForegroundColor Green
Write-Host "标签: $Tag" -ForegroundColor Yellow
Write-Host "配置: $Profile" -ForegroundColor Yellow

# 检查 Docker 是否运行
try {
    docker version | Out-Null
} catch {
    Write-Error "Docker 未运行或未安装"
    exit 1
}

# 构建应用
Write-Host "步骤 1: 使用中国镜像构建应用..." -ForegroundColor Cyan
try {
    .\mvnw.cmd clean package -P$Profile -DskipTests
    if ($LASTEXITCODE -ne 0) {
        throw "Maven 构建失败"
    }
} catch {
    Write-Error "Maven 构建失败: $_"
    exit 1
}

# 构建 Docker 镜像
Write-Host "步骤 2: 构建 Docker 镜像..." -ForegroundColor Cyan
try {
    docker build -f Dockerfile.china -t "sodlinken/jairouter:$Tag" .
    if ($LASTEXITCODE -ne 0) {
        throw "Docker 构建失败"
    }
} catch {
    Write-Error "Docker 构建失败: $_"
    exit 1
}

# 验证镜像
Write-Host "步骤 3: 验证镜像..." -ForegroundColor Cyan
$imageSize = docker images sodlinken/jairouter:$Tag --format "{{.Size}}"
Write-Host "镜像大小: $imageSize" -ForegroundColor Green

Write-Host "构建完成!" -ForegroundColor Green
Write-Host "镜像: sodlinken/jairouter:$Tag" -ForegroundColor Yellow
Write-Host "运行命令: docker run -d -p 8080:8080 sodlinken/jairouter:$Tag" -ForegroundColor Yellow

Linux/macOS Bash 脚本

创建 scripts/docker-build-china.sh

#!/bin/bash
# JAiRouter 中国优化 Docker 构建脚本

set -e

TAG=${1:-latest}
PROFILE=${2:-china}

echo "开始构建 JAiRouter (中国优化版本)..."
echo "标签: $TAG"
echo "配置: $PROFILE"

# 检查 Docker 是否运行
if ! docker version >/dev/null 2>&1; then
    echo "错误: Docker 未运行或未安装"
    exit 1
fi

# 构建应用
echo "步骤 1: 使用中国镜像构建应用..."
./mvnw clean package -P$PROFILE -DskipTests

# 构建 Docker 镜像
echo "步骤 2: 构建 Docker 镜像..."
docker build -f Dockerfile.china -t "sodlinken/jairouter:$TAG" .

# 验证镜像
echo "步骤 3: 验证镜像..."
IMAGE_SIZE=$(docker images sodlinken/jairouter:$TAG --format "{{.Size}}")
echo "镜像大小: $IMAGE_SIZE"

echo "构建完成!"
echo "镜像: sodlinken/jairouter:$TAG"
echo "运行命令: docker run -d -p 8080:8080 sodlinken/jairouter:$TAG"

3. pom.xml 中国优化配置

pom.xml 中添加中国优化 profile:

<profiles>
    <profile>
        <id>china</id>
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!-- 跳过一些耗时的检查以加快构建 -->
            <checkstyle.skip>true</checkstyle.skip>
            <spotbugs.skip>true</spotbugs.skip>
            <jacoco.skip>true</jacoco.skip>
        </properties>

        <repositories>
            <repository>
                <id>aliyun-central</id>
                <url>https://maven.aliyun.com/repository/central</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>

        <pluginRepositories>
            <pluginRepository>
                <id>aliyun-plugin</id>
                <url>https://maven.aliyun.com/repository/central</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
</profiles>

Docker 镜像优化

1. Docker 镜像源配置

配置 Docker 镜像加速器

创建或编辑 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}

重启 Docker 服务:

# Ubuntu/Debian
sudo systemctl restart docker

# CentOS/RHEL
sudo systemctl restart docker

# Windows
# 重启 Docker Desktop

2. 中国优化 Dockerfile

Dockerfile.china 已经针对中国网络环境进行了优化:

``dockerfile

多阶段构建 Dockerfile for JAiRouter (China Optimized)

使用阿里云Maven镜像加速构建

FROM maven:3.9.6-eclipse-temurin-17 AS builder

WORKDIR /app

复制阿里云Maven配置

COPY settings-china.xml /root/.m2/settings.xml

复制构建文件

COPY pom.xml . COPY src ./src COPY checkstyle.xml . COPY spotbugs-security-include.xml . COPY spotbugs-security-exclude.xml .

构建应用程序(使用china profile)

RUN mvn clean package -Pchina -DskipTests

运行阶段 - 使用阿里云镜像

FROM registry.cn-hangzhou.aliyuncs.com/acs/openjdk:17-jre-alpine

LABEL maintainer="JAiRouter Team" LABEL description="JAiRouter - AI Model Service Routing and Load Balancing Gateway (China Optimized)" LABEL version="1.0-SNAPSHOT"

创建应用用户

RUN addgroup -g 1001 jairouter && \ adduser -D -s /bin/sh -u 1001 -G jairouter jairouter

WORKDIR /app

创建必要的目录

RUN mkdir -p /app/logs /app/config /app/config-store && \ chown -R jairouter:jairouter /app

复制JAR文件

COPY --from=builder /app/target/model-router-*.jar app.jar

设置环境变量

ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0" ENV SPRING_PROFILES_ACTIVE=prod ENV SERVER_PORT=8080

EXPOSE 8080

USER jairouter

HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

## 网络连接优化

### 1. 应用配置优化

创建 `config/application-china.yml`:

```yaml
# 中国网络环境优化配置
server:
  port: 8080
  tomcat:
    connection-timeout: 30000  # 增加连接超时时间
    max-connections: 8192
    threads:
      max: 200
      min-spare: 10

# WebClient 网络优化
webclient:
  connection-timeout: 15s      # 增加连接超时
  read-timeout: 120s          # 增加读取超时
  write-timeout: 60s          # 增加写入超时
  max-in-memory-size: 50MB
  connection-pool:
    max-connections: 500      # 减少连接池大小
    max-idle-time: 60s        # 增加空闲时间
    pending-acquire-timeout: 90s  # 增加获取连接超时

# 重试配置
retry:
  max-attempts: 5             # 增加重试次数
  backoff:
    initial-interval: 2s      # 增加初始退避时间
    max-interval: 30s         # 增加最大退避时间
    multiplier: 2.0

# 熔断器配置(更宽松的阈值)
circuit-breaker:
  failure-threshold: 10       # 增加失败阈值
  recovery-timeout: 120000    # 增加恢复超时
  success-threshold: 5        # 增加成功阈值
  timeout: 60000             # 增加请求超时

# 健康检查优化
management:
  health:
    defaults:
      enabled: true
    diskspace:
      enabled: true
      threshold: 10GB
  endpoint:
    health:
      cache:
        time-to-live: 30s     # 增加健康检查缓存时间

# 日志配置
logging:
  level:
    org.springframework.web.reactive.function.client: DEBUG
    org.unreal.modelrouter.adapter: DEBUG
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n"

2. DNS 优化配置

系统 DNS 配置

编辑 /etc/resolv.conf

# 使用国内 DNS 服务器
nameserver 223.5.5.5      # 阿里云 DNS
nameserver 119.29.29.29   # 腾讯 DNS
nameserver 114.114.114.114 # 114 DNS
nameserver 8.8.8.8        # Google DNS (备用)

# DNS 选项优化
options timeout:2 attempts:3 rotate single-request-reopen

Docker 容器 DNS 配置

docker-compose.china.yml 中配置:

version: '3.8'

services:
  jairouter:
    image: sodlinken/jairouter:china
    container_name: jairouter-china
    dns:
      - 223.5.5.5      # 阿里云 DNS
      - 119.29.29.29   # 腾讯 DNS
      - 114.114.114.114 # 114 DNS
    dns_search:
      - localdomain
    dns_opt:
      - timeout:2
      - attempts:3
    environment:
      - SPRING_PROFILES_ACTIVE=china
      - JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC -Djava.net.preferIPv4Stack=true
    ports:
      - "8080:8080"
    volumes:
      - ./config:/app/config:ro
      - ./logs:/app/logs
    restart: unless-stopped
    networks:
      - china-network

networks:
  china-network:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: jairouter-china

AI 服务提供商优化

1. 国内 AI 服务配置

配置使用国内 AI 服务提供商,减少跨境网络延迟:

# config/services-china.yml
model:
  services:
    chat:
      instances:
        # 阿里云通义千问
        - name: "qwen-turbo"
          base-url: "https://dashscope.aliyuncs.com"
          path: "/api/v1/services/aigc/text-generation/generation"
          weight: 3
          headers:
            Authorization: "Bearer ${DASHSCOPE_API_KEY}"
          timeout: 60s

        # 百度文心一言
        - name: "ernie-bot"
          base-url: "https://aip.baidubce.com"
          path: "/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"
          weight: 2
          headers:
            Content-Type: "application/json"
          timeout: 60s

        # 腾讯混元
        - name: "hunyuan"
          base-url: "https://hunyuan.tencentcloudapi.com"
          path: "/v1/chat/completions"
          weight: 2
          headers:
            Authorization: "Bearer ${TENCENT_API_KEY}"
          timeout: 60s

        # 智谱 ChatGLM
        - name: "chatglm"
          base-url: "https://open.bigmodel.cn"
          path: "/api/paas/v4/chat/completions"
          weight: 2
          headers:
            Authorization: "Bearer ${ZHIPU_API_KEY}"
          timeout: 60s

    embedding:
      instances:
        # 阿里云文本嵌入
        - name: "text-embedding-v1"
          base-url: "https://dashscope.aliyuncs.com"
          path: "/api/v1/services/embeddings/text-embedding/text-embedding"
          weight: 1
          headers:
            Authorization: "Bearer ${DASHSCOPE_API_KEY}"

2. 网络代理配置

如果需要访问海外 AI 服务,可以配置代理:

# 代理配置
proxy:
  enabled: true
  http:
    host: proxy.example.com
    port: 8080
    username: ${PROXY_USERNAME}
    password: ${PROXY_PASSWORD}
  https:
    host: proxy.example.com
    port: 8080
    username: ${PROXY_USERNAME}
    password: ${PROXY_PASSWORD}
  no-proxy:
    - localhost
    - 127.0.0.1
    - "*.aliyuncs.com"
    - "*.baidubce.com"
    - "*.tencentcloudapi.com"

监控优化

1. 国内监控服务集成

配置使用国内监控服务:

# docker-compose.monitoring-china.yml
version: '3.8'

services:
  jairouter:
    image: sodlinken/jairouter:china
    # ... 其他配置

  prometheus:
    image: registry.cn-hangzhou.aliyuncs.com/acs/prometheus:latest
    container_name: prometheus-china
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus-china.yml:/etc/prometheus/prometheus.yml:ro
    networks:
      - monitoring-china

  grafana:
    image: registry.cn-hangzhou.aliyuncs.com/acs/grafana:latest
    container_name: grafana-china
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_INSTALL_PLUGINS=grafana-piechart-panel,grafana-worldmap-panel
    networks:
      - monitoring-china

networks:
  monitoring-china:
    driver: bridge

2. 告警通知优化

配置国内通知服务:

# monitoring/alertmanager-china.yml
global:
  # 使用国内 SMTP 服务
  smtp_smarthost: 'smtp.qq.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: '${QQ_MAIL_PASSWORD}'

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'china-alerts'

receivers:
  - name: 'china-alerts'
    email_configs:
      - to: 'ops@example.com'
        subject: '[JAiRouter] {{ .GroupLabels.alertname }}'
        body: |
          {{ range .Alerts }}
          告警: {{ .Annotations.summary }}
          描述: {{ .Annotations.description }}
          时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
          {{ end }}

    # 企业微信通知
    wechat_configs:
      - corp_id: '${WECHAT_CORP_ID}'
        agent_id: '${WECHAT_AGENT_ID}'
        api_secret: '${WECHAT_API_SECRET}'
        to_user: '@all'
        message: |
          JAiRouter 告警通知
          {{ range .Alerts }}
          告警: {{ .Annotations.summary }}
          {{ end }}

    # 钉钉通知
    webhook_configs:
      - url: '${DINGTALK_WEBHOOK_URL}'
        send_resolved: true
        title: 'JAiRouter 告警'
        text: |
          {{ range .Alerts }}
          告警: {{ .Annotations.summary }}
          描述: {{ .Annotations.description }}
          {{ end }}

部署脚本优化

1. 一键部署脚本

创建 deploy-china.sh

#!/bin/bash
# JAiRouter 中国优化一键部署脚本

set -e

echo "JAiRouter 中国优化部署脚本"
echo "=========================="

# 检查系统环境
check_environment() {
    echo "检查系统环境..."

    # 检查 Docker
    if ! command -v docker &> /dev/null; then
        echo "错误: Docker 未安装"
        echo "请先安装 Docker: https://docs.docker.com/engine/install/"
        exit 1
    fi

    # 检查 Docker Compose
    if ! command -v docker-compose &> /dev/null; then
        echo "错误: Docker Compose 未安装"
        echo "请先安装 Docker Compose: https://docs.docker.com/compose/install/"
        exit 1
    fi

    echo "✓ 系统环境检查通过"
}

# 配置 Docker 镜像加速
configure_docker_mirror() {
    echo "配置 Docker 镜像加速..."

    DAEMON_JSON="/etc/docker/daemon.json"
    if [ ! -f "$DAEMON_JSON" ]; then
        sudo mkdir -p /etc/docker
        sudo tee $DAEMON_JSON > /dev/null <<EOF
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF
        sudo systemctl restart docker
        echo "✓ Docker 镜像加速配置完成"
    else
        echo "✓ Docker 镜像加速已配置"
    fi
}

# 构建镜像
build_image() {
    echo "构建 JAiRouter 中国优化镜像..."

    if [ -f "scripts/docker-build-china.sh" ]; then
        chmod +x scripts/docker-build-china.sh
        ./scripts/docker-build-china.sh
    else
        echo "使用 Maven 构建..."
        ./mvnw clean package -Pchina -DskipTests
        docker build -f Dockerfile.china -t sodlinken/jairouter:china .
    fi

    echo "✓ 镜像构建完成"
}

# 部署应用
deploy_application() {
    echo "部署 JAiRouter 应用..."

    # 创建必要的目录
    mkdir -p config logs config-store

    # 复制配置文件
    if [ ! -f "config/application-china.yml" ]; then
        cp config/application.yml config/application-china.yml
        echo "✓ 配置文件已复制"
    fi

    # 启动应用
    docker-compose -f docker-compose.china.yml up -d

    echo "✓ 应用部署完成"
}

# 验证部署
verify_deployment() {
    echo "验证部署状态..."

    # 等待应用启动
    echo "等待应用启动..."
    sleep 30

    # 检查健康状态
    if curl -f -s http://localhost:8080/actuator/health > /dev/null; then
        echo "✓ 应用健康检查通过"
        echo "✓ JAiRouter 部署成功!"
        echo ""
        echo "访问地址:"
        echo "  应用: http://localhost:8080"
        echo "  健康检查: http://localhost:8080/actuator/health"
        echo "  API 文档: http://localhost:8080/swagger-ui/index.html"
    else
        echo "✗ 应用健康检查失败"
        echo "请检查日志: docker logs jairouter-china"
        exit 1
    fi
}

# 主流程
main() {
    check_environment
    configure_docker_mirror
    build_image
    deploy_application
    verify_deployment
}

# 执行主流程
main "$@"

2. Windows 部署脚本

创建 deploy-china.ps1

#!/usr/bin/env pwsh
# JAiRouter 中国优化一键部署脚本 (Windows)

param(
    [switch]$SkipBuild = $false,
    [switch]$Monitoring = $false
)

Write-Host "JAiRouter 中国优化部署脚本 (Windows)" -ForegroundColor Green
Write-Host "======================================" -ForegroundColor Green

# 检查系统环境
function Test-Environment {
    Write-Host "检查系统环境..." -ForegroundColor Cyan

    # 检查 Docker
    try {
        docker version | Out-Null
        Write-Host "✓ Docker 已安装" -ForegroundColor Green
    } catch {
        Write-Error "Docker 未安装或未运行"
        Write-Host "请先安装 Docker Desktop: https://www.docker.com/products/docker-desktop"
        exit 1
    }

    # 检查 Docker Compose
    try {
        docker-compose version | Out-Null
        Write-Host "✓ Docker Compose 已安装" -ForegroundColor Green
    } catch {
        Write-Error "Docker Compose 未安装"
        exit 1
    }
}

# 构建镜像
function Build-Image {
    if ($SkipBuild) {
        Write-Host "跳过镜像构建" -ForegroundColor Yellow
        return
    }

    Write-Host "构建 JAiRouter 中国优化镜像..." -ForegroundColor Cyan

    if (Test-Path "scripts\docker-build-china.ps1") {
        & "scripts\docker-build-china.ps1"
    } else {
        Write-Host "使用 Maven 构建..." -ForegroundColor Yellow
        .\mvnw.cmd clean package -Pchina -DskipTests
        docker build -f Dockerfile.china -t sodlinken/jairouter:china .
    }

    Write-Host "✓ 镜像构建完成" -ForegroundColor Green
}

# 部署应用
function Deploy-Application {
    Write-Host "部署 JAiRouter 应用..." -ForegroundColor Cyan

    # 创建必要的目录
    @("config", "logs", "config-store") | ForEach-Object {
        if (!(Test-Path $_)) {
            New-Item -ItemType Directory -Path $_ | Out-Null
        }
    }

    # 复制配置文件
    if (!(Test-Path "config\application-china.yml")) {
        Copy-Item "config\application.yml" "config\application-china.yml"
        Write-Host "✓ 配置文件已复制" -ForegroundColor Green
    }

    # 选择 Compose 文件
    $composeFile = if ($Monitoring) { "docker-compose.monitoring-china.yml" } else { "docker-compose.china.yml" }

    # 启动应用
    docker-compose -f $composeFile up -d

    Write-Host "✓ 应用部署完成" -ForegroundColor Green
}

# 验证部署
function Test-Deployment {
    Write-Host "验证部署状态..." -ForegroundColor Cyan

    # 等待应用启动
    Write-Host "等待应用启动..." -ForegroundColor Yellow
    Start-Sleep -Seconds 30

    # 检查健康状态
    try {
        $response = Invoke-WebRequest -Uri "http://localhost:8080/actuator/health" -UseBasicParsing
        if ($response.StatusCode -eq 200) {
            Write-Host "✓ 应用健康检查通过" -ForegroundColor Green
            Write-Host "✓ JAiRouter 部署成功!" -ForegroundColor Green
            Write-Host ""
            Write-Host "访问地址:" -ForegroundColor Yellow
            Write-Host "  应用: http://localhost:8080" -ForegroundColor White
            Write-Host "  健康检查: http://localhost:8080/actuator/health" -ForegroundColor White
            Write-Host "  API 文档: http://localhost:8080/swagger-ui/index.html" -ForegroundColor White

            if ($Monitoring) {
                Write-Host "  Prometheus: http://localhost:9090" -ForegroundColor White
                Write-Host "  Grafana: http://localhost:3000 (admin/admin)" -ForegroundColor White
            }
        }
    } catch {
        Write-Error "应用健康检查失败"
        Write-Host "请检查日志: docker logs jairouter-china" -ForegroundColor Red
        exit 1
    }
}

# 主流程
function Main {
    Test-Environment
    Build-Image
    Deploy-Application
    Test-Deployment
}

# 执行主流程
Main

性能调优

1. JVM 参数优化

针对中国网络环境的 JVM 参数优化:

# 中国网络环境 JVM 优化参数
JAVA_OPTS="
-Xms1g -Xmx2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/logs/

# 网络优化
-Djava.net.preferIPv4Stack=true
-Djava.net.useSystemProxies=true
-Dnetworkaddress.cache.ttl=60
-Dnetworkaddress.cache.negative.ttl=10

# 连接池优化
-Dhttp.maxConnections=50
-Dhttp.keepAlive=true
-Dhttp.maxRedirects=3

# 安全优化
-Djava.security.egd=file:/dev/./urandom
-Djava.awt.headless=true
"

2. 系统参数优化

# 网络参数优化
cat >> /etc/sysctl.conf << EOF
# TCP 优化
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1

# 连接数优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 65535

# 缓冲区优化
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
EOF

sysctl -p

故障排查

1. 网络连接问题

# 检查网络连通性
ping -c 4 maven.aliyun.com
ping -c 4 registry.cn-hangzhou.aliyuncs.com

# 检查 DNS 解析
nslookup maven.aliyun.com
dig maven.aliyun.com

# 检查端口连通性
telnet maven.aliyun.com 443
nc -zv maven.aliyun.com 443

# 检查代理设置
echo $http_proxy
echo $https_proxy

2. 构建问题排查

# 检查 Maven 配置
./mvnw help:effective-settings

# 检查依赖下载
./mvnw dependency:resolve -X

# 清理并重新构建
./mvnw clean
rm -rf ~/.m2/repository
./mvnw package -Pchina -DskipTests

3. 运行时问题排查

# 检查容器状态
docker ps --filter "name=jairouter"

# 检查容器日志
docker logs jairouter-china --tail 100

# 检查网络连接
docker exec jairouter-china netstat -tulpn

# 检查 DNS 解析
docker exec jairouter-china nslookup baidu.com

最佳实践

1. 网络优化建议

  • 使用国内镜像源和 CDN 服务
  • 配置合理的超时和重试参数
  • 使用连接池和长连接
  • 配置本地 DNS 缓存

2. 部署建议

  • 选择合适的服务器地域(华东、华北等)
  • 使用 SSD 存储提升 I/O 性能
  • 配置监控和告警
  • 定期备份配置和数据

3. 运维建议

  • 监控网络质量和延迟
  • 定期更新依赖和镜像
  • 配置日志轮转和清理
  • 建立故障响应流程

下一步

完成中国优化部署后,您可以:

环境变量配置

生产环境环境变量

# 生产环境 API Key 配置
export PROD_ADMIN_API_KEY="your-production-admin-api-key-here"
export PROD_SERVICE_API_KEY="your-production-service-api-key-here"
export PROD_READONLY_API_KEY="your-production-readonly-api-key-here"

# 生产环境 JWT 配置
export PROD_JWT_SECRET="your-production-jwt-secret-here"

# Redis 配置
export REDIS_HOST="your-redis-host"
export REDIS_PORT="your-redis-port"
export REDIS_PASSWORD="your-redis-password"

# 国内云服务配置
export ALIYUN_SMS_ACCESS_KEY_ID="your-aliyun-sms-access-key-id"
export ALIYUN_SMS_ACCESS_KEY_SECRET="your-aliyun-sms-access-key-secret"
export TENCENT_EMAIL_USERNAME="your-tencent-email-username"
export TENCENT_EMAIL_PASSWORD="your-tencent-email-password"
export ALIYUN_CDN_ACCESS_KEY_ID="your-aliyun-cdn-access-key-id"
export ALIYUN_CDN_ACCESS_KEY_SECRET="your-aliyun-cdn-access-key-secret"

Docker 环境变量配置

# 生产环境 Docker 部署(国内优化版本)
docker run -d \
  --name jairouter-china \
  -p 8080:8080 \
  -e SPRING_PROFILES_ACTIVE=china \
  -e PROD_ADMIN_API_KEY="your-production-admin-api-key-here" \
  -e PROD_SERVICE_API_KEY="your-production-service-api-key-here" \
  -e PROD_READONLY_API_KEY="your-production-readonly-api-key-here" \
  -e PROD_JWT_SECRET="your-production-jwt-secret-here" \
  -e REDIS_HOST="your-redis-host" \
  -e REDIS_PORT="your-redis-port" \
  -e REDIS_PASSWORD="your-redis-password" \
  -e ALIYUN_SMS_ACCESS_KEY_ID="your-aliyun-sms-access-key-id" \
  -e ALIYUN_SMS_ACCESS_KEY_SECRET="your-aliyun-sms-access-key-secret" \
  -v $(pwd)/config:/app/config:ro \
  -v $(pwd)/logs:/app/logs \
  registry.cn-hangzhou.aliyuncs.com/sodlinken/jairouter:china

安全配置

1. 国内安全服务集成

配置使用国内安全服务提供商:

# config/security-china.yml
security:
  # 国内短信服务配置(用于 OTP 验证)
  sms:
    provider: aliyun
    access-key-id: ${ALIYUN_SMS_ACCESS_KEY_ID}
    access-key-secret: ${ALIYUN_SMS_ACCESS_KEY_SECRET}
    sign-name: JAiRouter
    template-code: SMS_123456789

  # 国内邮件服务配置
  email:
    provider: tencent
    smtp-host: smtp.exmail.qq.com
    smtp-port: 465
    username: ${TENCENT_EMAIL_USERNAME}
    password: ${TENCENT_EMAIL_PASSWORD}

  # 国内 CDN 安全配置
  cdn:
    provider: aliyun
    access-key-id: ${ALIYUN_CDN_ACCESS_KEY_ID}
    access-key-secret: ${ALIYUN_CDN_ACCESS_KEY_SECRET}
    domain: jairouter.example.com

2. 国内证书和密钥管理

# 使用国内 CA 机构证书
# 配置阿里云 SSL 证书服务
aliyun cas CreateCertificateWithCsr \
  --DomainName jairouter.example.com \
  --KeySpec RSA_2048 \
  --Years 1

# 或使用腾讯云 SSL 证书服务
tc ssl ApplyCertificate \
  --Domain jairouter.example.com \
  --Alias jairouter-cert

3. 国内安全合规配置

创建 config/application-security-compliance.yml

# 国内安全合规配置
security:
  # 数据保护配置
  data-protection:
    # 个人信息加密
    pii-encryption:
      enabled: true
      algorithm: SM4
      key-provider: hsm

    # 数据脱敏配置
    data-masking:
      enabled: true
      rules:
        - field: "idCard"
          pattern: "(\\d{4})\\d{10}(\\w{4})"
          replacement: "$1**********$2"
        - field: "phone"
          pattern: "(\\d{3})\\d{4}(\\d{4})"
          replacement: "$1****$2"

  # 审计日志配置
  audit:
    enabled: true
    log-level: INFO
    retention-days: 180  # 符合国内法规要求
    storage:
      type: file
      path: /app/logs/audit

  # 访问控制配置
  access-control:
    # IP 白名单
    ip-whitelist:
      enabled: true
      ips:
        - 10.0.0.0/8
        - 172.16.0.0/12
        - 192.168.0.0/16

    # 国内特定访问策略
    china-specific:
      enabled: true
      gfw-compliance: true
      content-filtering: true

日志配置

1. 国内日志服务集成

配置使用国内日志服务提供商:

# config/logging-china.yml
logging:
  level:
    org.unreal.modelrouter: INFO
    org.unreal.modelrouter.security: DEBUG
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n"

  # 阿里云日志服务配置
  aliyun-sls:
    enabled: true
    endpoint: cn-hangzhou.log.aliyuncs.com
    project: jairouter-logs
    logstore: application-logs
    access-key-id: ${ALIYUN_SLS_ACCESS_KEY_ID}
    access-key-secret: ${ALIYUN_SLS_ACCESS_KEY_SECRET}

  # 腾讯云日志服务配置
  tencent-cls:
    enabled: false
    endpoint: ap-guangzhou.cls.tencentcs.com
    topic-id: jairouter-logs
    secret-id: ${TENCENT_CLS_SECRET_ID}
    secret-key: ${TENCENT_CLS_SECRET_KEY}

2. 国内日志存储和分析

创建 docker-compose.logging-china.yml

# 国内日志服务集成配置
version: '3.8'

services:
  jairouter:
    image: sodlinken/jairouter:china
    container_name: jairouter-china
    dns:
      - 223.5.5.5
      - 119.29.29.29
    environment:
      - SPRING_PROFILES_ACTIVE=china,logging-china
      - JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC -Djava.net.preferIPv4Stack=true
    ports:
      - "8080:8080"
    volumes:
      - ./config:/app/config:ro
      - ./logs:/app/logs
    restart: unless-stopped
    networks:
      - china-network

  # 阿里云日志服务代理
  aliyun-sls-agent:
    image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-log-agent:latest
    container_name: aliyun-sls-agent
    environment:
      - ALIYUN_LOGTAIL_USER_ID=${ALIYUN_ACCOUNT_ID}
      - ALIYUN_LOGTAIL_REGION=cn-hangzhou
    volumes:
      - ./logs:/app/logs:ro
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - china-network
    restart: unless-stopped

networks:
  china-network:
    driver: bridge

3. 国内日志合规配置

创建 config/application-logging-compliance.yml

# 国内日志合规配置
logging:
  level:
    org.unreal.modelrouter: INFO
    org.unreal.modelrouter.security: DEBUG
    org.unreal.modelrouter.audit: DEBUG

  # 日志保留策略
  retention:
    # 应用日志保留 90 天
    application-logs:
      days: 90
    # 安全日志保留 180 天
    security-logs:
      days: 180
    # 审计日志保留 365 天
    audit-logs:
      days: 365

  # 日志存储配置
  storage:
    # 本地存储
    local:
      enabled: true
      path: /app/logs
      max-size: 100MB
      max-history: 30

    # 国内云存储
    cloud:
      aliyun-oss:
        enabled: true
        bucket: jairouter-logs
        endpoint: oss-cn-hangzhou.aliyuncs.com
        access-key-id: ${ALIYUN_OSS_ACCESS_KEY_ID}
        access-key-secret: ${ALIYUN_OSS_ACCESS_KEY_SECRET}
        prefix: logs/${INSTANCE_ID}/

      tencent-cos:
        enabled: false
        bucket: jairouter-logs
        region: ap-guangzhou
        secret-id: ${TENCENT_COS_SECRET_ID}
        secret-key: ${TENCENT_COS_SECRET_KEY}
        prefix: logs/${INSTANCE_ID}/

  # 日志加密配置
  encryption:
    enabled: true
    algorithm: SM4
    key-provider: hsm

  # 日志脱敏配置
  masking:
    enabled: true
    rules:
      - field: "apiKey"
        pattern: "(.{4}).*(.{4})"
        replacement: "$1****$2"
      - field: "password"
        pattern: ".*"
        replacement: "****"

4. 国内日志监控和告警

创建 monitoring/alertmanager-china-logging.yml

# 国内日志监控告警配置
global:
  smtp_smarthost: 'smtp.mxhichina.com:465'
  smtp_from: 'alerts@jairouter.com'
  smtp_auth_username: 'alerts@jairouter.com'
  smtp_auth_password: '${EMAIL_PASSWORD}'

route:
  group_by: ['alertname', 'cluster']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'china-logging-alerts'

receivers:
  - name: 'china-logging-alerts'
    email_configs:
      - to: 'ops-team@jairouter.com'
        subject: '[JAiRouter] {{ .GroupLabels.alertname }}'
        html: |
          <p><strong>告警名称:</strong> {{ .GroupLabels.alertname }}</p>
          <p><strong>集群:</strong> {{ .GroupLabels.cluster }}</p>
          <p><strong>告警详情:</strong></p>
          <ul>
          {{ range .Alerts }}
            <li>{{ .Annotations.summary }} - {{ .Annotations.description }}</li>
          {{ end }}
          </ul>

    # 企业微信告警
    wechat_configs:
      - corp_id: '${WECHAT_CORP_ID}'
        agent_id: '${WECHAT_AGENT_ID}'
        api_secret: '${WECHAT_API_SECRET}'
        message: |
          告警名称: {{ .GroupLabels.alertname }}
          集群: {{ .GroupLabels.cluster }}
          {{ range .Alerts }}
          {{ .Annotations.summary }} - {{ .Annotations.description }}
          {{ end }}

    # 钉钉告警
    webhook_configs:
      - url: '${DINGTALK_WEBHOOK_URL}'
        send_resolved: true

# 国内日志监控规则
rule_files:
  - "rules/china-logging-rules.yml"

创建 monitoring/rules/china-logging-rules.yml

```yaml

国内日志监控规则

groups: - name: jairouter.china.logging.rules rules: # 安全日志告警 - alert: JAiRouterSecurityLogsChina expr: rate(jairouter_security_logs_total[5m]) > 5 for: 1m labels: severity: critical region: china annotations: summary: "JAiRouter 安全日志异常 (中国)" description: "JAiRouter 实例 {{ $labels.instance }} 安全日志速率超过 5 条/分钟"

  # 错误日志告警
  - alert: JAiRouterErrorLogsChina
    expr: rate(jairouter_error_logs_total[5m]) > 20
    for: 2m
    labels:
      severity: warning
      region: china
    annotations:
      summary: "JAiRouter 错误日志过多 (中国)"
      description: "JAiRouter 实例 {{ $labels.instance }} 错误日志速率超过 20 条/分钟"

  # 访问日志告警
  - alert: JAiRouterAccessLogsChina
    expr: rate(jairouter_access_logs_total[5m]) > 1000
    for: 1m
    labels:
      severity: info
      region: china
    annotations:
      summary: "JAiRouter 访问量激增 (中国)"
      description: "JAiRouter 实例 {{ $labels.instance }} 访问量超过 1000 次/分钟"