⚡
Day 1 上午:后端到底是什么?
今天先不碰 Spring Boot。我们先建立最重要的后端心智模型:
后端服务,本质上是一个长期运行、监听端口、同时处理多个用户请求的进程。
前端代码通常运行在用户的浏览器标签页中;后端代码则运行在服务器上,同一个服务进程需要面对许多用户。
从前端请求看后端
你写过这样的代码:
tsconst response = await fetch(
"http://localhost:8080/api/tasks"
);
const tasks = await response.json();浏览器背后经历的是:
textfetch("/api/tasks") │ ▼ 解析域名或 IP │ ▼ 连接服务器的 8080 端口 │ ▼ 找到监听该端口的 Java 进程 │ ▼ 根据 /api/tasks 找到处理逻辑 │ ▼ 读取数据库并执行业务逻辑 │ ▼ 返回 HTTP 状态码、响应头和 JSON
这里有三个不同概念:
- IP:定位哪台机器。
- 端口:定位这台机器上的哪个服务。
- URL 路径:定位服务中的哪个处理逻辑。
你每天使用的 Vite 开发服务器也是同样的模型:
textVite 进程 → 监听 5173 Spring Boot 进程 → 监听 8080 MySQL 进程 → 监听 3306 Redis 进程 → 监听 6379
前端与后端的关键差异
| 前端 | 后端 |
|---|---|
| 每个用户运行一份页面 | 一个服务同时处理多个用户 |
| 刷新页面可以恢复初始状态 | 服务重启可能影响全部用户 |
| 状态常保存在组件或浏览器 | 状态应进入数据库、缓存或会话 |
| 错误通常影响当前页面 | 错误可能影响大量请求 |
| 重点是交互与渲染 | 重点是数据、并发、可靠性和安全 |
因此,后端代码里不能随意使用全局变量保存某个用户的业务状态。多个请求可能同时读写它,最终产生串号、数据覆盖或并发错误。
最小 Java HTTP 服务
下面不用 Spring Boot,只使用 JDK 自带的 HTTP Server,观察“进程监听端口”这件事:
javaimport com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
public class App {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(
new InetSocketAddress("127.0.0.1", 8080),
0
);
server.createContext("/health", exchange -> {
byte[] body = """
{"status":"UP","service":"task-api"}
""".trim().getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().set(
"Content-Type",
"application/json; charset=utf-8"
);
exchange.sendResponseHeaders(200, body.length);
try (var output = exchange.getResponseBody()) {
output.write(body);
}
});
server.start();
System.out.println(
"Server started: http://127.0.0.1:8080/health"
);
}
}保存为 App.java,然后运行:
bashjavac --add-modules jdk.httpserver App.java java --add-modules jdk.httpserver App
测试接口:
bashcurl -i http://127.0.0.1:8080/health
预期结果:
httpHTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{"status":"UP","service":"task-api"}这段代码已经具备后端服务的最小结构:
text启动进程 → 绑定 127.0.0.1:8080 → 注册 /health → 等待请求 → 返回 HTTP 响应
Spring Boot 后面会替我们处理服务器启动、请求路由、JSON 序列化、线程调度和大量配置,但底层心智模型没有改变。JDK HttpServer API
127.0.0.1 与 0.0.0.0
127.0.0.1:通常只有当前机器可以访问。0.0.0.0:监听机器上的所有网络接口,其他机器或容器才可能访问。
本地开发使用 127.0.0.1 很安全。但应用进入 Docker 后,如果仍然只监听容器内部的 127.0.0.1,即使配置了端口映射,外部也可能访问不到。
今日常见误区
误区:接口在自己电脑能打开,就表示部署一定没问题。
实际上,服务是否可访问至少取决于:
- 进程是否正在运行
- 是否监听正确端口
- 监听的是哪个网络地址
- 防火墙是否允许访问
- Docker 是否映射端口
- Nginx 是否代理到正确地址
三道自测题
- 浏览器访问
localhost:8080出现“连接被拒绝”,可能发生在哪几个环节? - 为什么不能用 Java 全局变量保存“当前登录用户”?
- 一个 Docker 容器已经映射
8080:8080,应用却仍无法访问,监听地址可能有什么问题?
今晚 20:30,我们会从零搭建这个最小服务,观察进程、端口、请求和响应,并给项目建立第一份可验收的运行基线。
分享:掘金同步
如果这篇对你有帮助,欢迎关注公众号「前端达人」,每周更新实用前端干货。

