系列:后端路线 · Part 4
前面你写出了能跑的 Spring Boot 接口。本篇讲”怎么把它放到服务器上稳定运行”,以及”除了浏览器,还能怎么调它”。这是从”本地 demo”到”真能上线”的关键一跃。

1. 从本地到服务器:发生了什么?

本地:mvn spring-boot:run → 进程在 IDE 里跑,你用 localhost 访问。
服务器:把项目打包成 jar,传到 Linux,用命令在后台跑,别人通过服务器 IP/域名访问。

核心差别只有一个字:后台常驻。本地关了终端程序就停,服务器要”关了 SSH 还活着”。

2. 打包

1
mvn clean package -DskipTests     # 生成 target/demo-0.0.1.jar

-DskipTests 跳过测试加速;生产应跑测试。产物是可执行 jar(内嵌 Tomcat,自带运行环境)。

3. 服务器运行(三种方式)

方式一:nohup(最简单,临时用)

1
nohup java -jar demo-0.0.1.jar > app.log 2>&1 &

& 后台运行,nohup 让关终端不中断,> app.log 把日志落盘。看日志:tail -f app.log。停服务:kill <pid>(pid 用 ps -ef | grep demo 找)。

方式二:systemd(生产推荐,开机自启)

/etc/systemd/system/demo.service

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Demo Backend
After=network.target

[Service]
User=app
WorkingDirectory=/opt/demo
ExecStart=/usr/bin/java -jar /opt/demo/demo-0.0.1.jar
SuccessExitStatus=143
Restart=on-failure

[Install]
WantedBy=multi-user.target
1
2
3
4
systemctl daemon-reload
systemctl enable demo # 开机自启
systemctl start demo
systemctl status demo

方式三:Docker(进阶,容器化,后续专题)

4. 端口与防火墙

  • 应用默认 8080,可在 application.ymlserver.port
  • 云服务器需在安全组放行该端口(如 8080),否则外网访问不了。
  • 访问:http://<服务器IP>:8080/api/user

5. 反向代理:Nginx(为什么需要?)

直接用 IP:端口 丑且不安全。Nginx 做反向代理:把 80/443 域名请求转发给后端 8080。

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080; # 转发到后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

好处:统一入口、HTTPS 卸载、静态资源托管、负载均衡、限流。线上几乎一定有一层 Nginx

6. 接口调用:除了浏览器还能怎么调?

curl(命令行,最硬核)

1
2
3
4
5
6
# GET
curl http://localhost:8080/api/user
# POST + JSON
curl -X POST http://localhost:8080/api/user \
-H "Content-Type: application/json" \
-d '{"username":"zhang","age":20}'

Postman / Apifox(图形化,调试首选)

建请求、填 URL/Header/Body,点 Send,看状态码与响应。可保存为集合、做环境变量。

前端调用(fetch / axios)

1
2
3
4
5
6
7
// fetch
fetch('/api/user', { method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify({username:'zhang', age:20}) })
.then(r => r.json()).then(console.log);

// axios
axios.post('/api/user', {username:'zhang', age:20}).then(res => console.log(res.data));

7. 跨域(CORS):前端调不通的头号原因

浏览器同源策略禁止页面向”不同源”(协议/域名/端口任一不同)发请求。前端 localhost:3000 调后端 localhost:8080 即跨域。

后端放行(Spring Boot):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer cors() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry r) {
r.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
}
};
}
}

生产应把 * 收紧为具体前端域名。预检请求 OPTIONS 也要放行。

8. 配置分离(生产/测试不同配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# application.yml
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mysql://localhost:3306/demo_db
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://prod-host:3306/demo_db

启动指定环境:java -jar demo.jar --spring.profiles.active=prod密码等敏感信息勿硬编码,用环境变量或配置中心。

9. 面试速通题

Q1:jar 和 war 区别?Spring Boot 为什么打 jar?
war 需外部 Tomcat 部署;Spring Boot 内嵌容器,打可执行 jar,java -jar 即可,部署简单、环境一致。

Q2:什么是反向代理?和正向代理区别?
反向代理代理”服务端”(Nginx 替后端收请求),客户端无感知;正向代理代理”客户端”(翻墙/内网出网),服务端无感知。

Q3:什么是跨域?怎么解决?
同源策略限制不同源请求。解决:CORS(后端加响应头)、网关统一域名(同源于是不跨)、JSONP(仅 GET,淘汰)。

Q4:nohup 和 systemd 选哪个?
临时测试 nohup 够用;生产用 systemd,可开机自启、崩溃重启、统一日志管理。

Q5:生产环境密码/配置怎么管理?
不写死在代码;用环境变量、启动参数、或配置中心(Nacos/Apollo),密钥进 Vault。

下一篇:完整示例 · 用户管理系统——把 Part1~4 全部串起来,给你一个复制即可跑的最小可运行项目。