背景
在无法访问外网的私有化环境中,通过本地文件上传的方式完成 spring cloud gateway 的集群化部署,需要解决离线依赖、文件传输、集群配置和部署验证等关键问题。
一、整体部署流程和准备工作
1、本地环境准备(可访问外网的机器)
- JDK 环境:确保本地安装于目标服务器一致版本的 JDK(如 JDK 11/17)
- Maven 环境:配置 Maven 本地仓库,提前下载所有依赖(避免离线打包失败)'
- Spring Cloud Gateway 项目:确保项目是可打包的,且配置文件已适配内网环境(如注册中心地址、端口等)
2、目标服务器环境准备(私有化内网)
- JDK 安装:在所有集群节点安装相同版本的 JDK, 并配置 JAVA_HOME 环境变量;
- 网络互通:确保集群节点之间(如 node1、node2、node3)网络可达,且开放所需端口(如网关端口 8080、注册中心端口 8761)
- 文件传输工具:准备内网文件传输工作(如 scp、 rz 命令,或内网 FTP/ Samba 服务)
- 负载均衡组件:若使用 nginx 做集群负载均衡,需要在目标服务器安装 nginx, 若用注册中心 (如 Eureka/Nacos), 需先在内网部署注册中心集群。
二、关键步骤:离线打包与文件上传
1、本地离线打包 Spring Cloud Gateway 在可访问外网的本地机器上,对 Spring Cloud Gateway 项目进行 fat jar 打包(包含所有依赖):
bash
# 进入项目根目录
cd your-spring-cloud-gateway-project
# Maven 离线打包(-DskipTests 跳过测试, -Pprod指定生产环境配置)
mvn clean package -DskipTests -Pprod
打包完成后,在项目的 target 目录下会生成可执行的 jar 包(如 gateway-1.0.0.jar)
2、上传 jar 包到目标集群节点 通过 scp 命令(或内网文件工具)将 jar 包上传到所有集群节点的指定目录(如 /opt/gateway/):
bash
# 上传到 node1 节点
scp target/gateway-1.0.0.jar user@node1:/opt/gateway
# 上传到 node2 节点
scp target/gateway-1.0.0.jar user@node2:/opt/gateway
# 上传到 node3 节点
scp target/gateway-1.0.0.jar user@node3:/opt/gateway
三、集群化部署配置
Spring Cloud Gateway 集群化通常有两种方式:基于注册中心的动态集群或基于 Nginx 的静态负载均衡集群,以下分别说明:
方式1:基于注册中心的动态集群(推荐)
若内网已部署 Eureka/Nacos 注册中心,只需让 Gateway 集群节点注册到注册中心即可实现动态集群。
步骤1:修改 gateway 配置文件(application.yml)
确保配置文件中指向内网注册中心地址(以 Nacos 为例):
yaml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848,192.168.1.101:8848,192.168.1.102:8848 # 内网 Nacos 集群地址
gateway:
routes:
- id: service-route
uri: lb://your-service-name # 通过注册中心负载均衡
predicates:
- Path=/service/**
application:
name: gateway-service # 网关服务名(注册到 Nacos 的名称)
server:
port: 8080 # 网关端口(每个节点端口可相同,注册中心会区分实例)
将修改后的配置文件随 jar 包一起上传到各节点(或直接内置在 jar 包中)。
步骤 2:启动各节点 Gateway
在每个集群节点执行启动命令:
bash
# 进入 jar 包目录
cd /opt/gateway
# 启动 gateway(指定 jvm 参数,后台运行)
nohup java -jar gateway-1.0.0.jar --spring.profiles.active=prod > gateway.log 2>&1 &
方式2:基于 Nginx 的静态负载均衡集群
若未部署注册中心,可通过 Nginx 配置静态负载均衡,将请求分发到多个 gateway 节点。
步骤1:配置 Nginx 负载均衡
编辑 Nginx 配置文件(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/gateway.conf):
nginx
http {
# 定义 Gateway 集群节点
upstream gateway_cluster {
server 192.168.1.200:8000 weight=1; # node1 节点
server 192.168.1.201:8080 weight=1; # node2 节点
server 192.168.1.202:8080 weight=1; # node3 节点
}
server {
listen 80; # Nginx 对外暴露的端口
server_name gateway.example.com; # 内网域名(或直接用 IP)
location / {
proxy_pass http://gateway_cluster; # 转发到 Gateway 集群
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
步骤2: 启动 Nginx 和 Gateway 集群
bash
# 启动 Nginx (内网负载均衡节点)
systemctl start nginx
systemctl enable nginx
# 在每个 Gateway 节点启动服务(通方式1的启动命令)
nohup java -jar gateway-1.0.0.jar > gateway.log 2>&1 &
四、部署验证
1、检查单个节点是否启动成功
在每个节点查看日志或进程:
bash
# 查看日志
tail -f /opt/gateway/gateway.log
# 查看进程
ps -ef | grep gateway
2、验证集群负载均衡
通过 Nginx 地址(或注册中心)访问 Gatway 接口,观察请求是否分发到不同节点:
bash
# 多次访问测试
curl http://nginx-ip/service/hello
查看各 gateway 节点的日志,确认请求被不同节点处理,说明集群生效。
五、总结
- 离线打包是核心:必须在本地完成包含所有依赖的 fat jar 打包,避免内网环境依赖缺失;
- 集群模式选择:内网有注册中心(Nacos/Eureka)时优先用动态集群,无注册中心时用 Nginx 静态负责均衡;
- 验证关键:确保节点网络互通、服务启动正常,且请求能被集群节点负载处理。
六、更多问题
- 2025 年目前最推荐使用的 java 版本是多少? 市占率最高的 Java 版本是哪个?
- 在私有化部署过程中,乙方服务商内部的验证服务器需要在哪些方面与甲方客户的服务器保持一致? 芯片类型、系统类型及版本?
- 什么叫做 fat jar?
- linux 下的 /opt 目录的主要作用是什么?
- 多个服务器之间如何可以通过 scp 免密码传输文件?
- 企业内部的 F5 如何使用? F5 是什么?
- 如何通过 go + redis 实现分布式锁?
- 通过注册中心实现的 spring cloud gateway 集群化部署,是如何对外访问的?
- 如何通过 k8s 部署 spring cloud gateway 集群?