欢迎光临
我们一直在努力

苍穹外卖:深度剖析前后端数据交互与Nginx代理实战

如果本篇文章对你有帮助,请点赞,关注,收藏,你的支持就是我最大的动力!

前言:上一章我们通过了前后端联调来测试登录界面,之后通过断点debug的方式跟踪了程序的运行,这一章我们主要讲解前端是如何将数据返回给后端的,以及代理相关知识。

前端如何将数据返回给后端?

关于前端请求地址 是否等于 后端接口地址,

1. 理想情况:完全一致

在开发初期或简单的个人项目中,前端代码和后端代码可能运行在同一台机器的不同端口上,前端直接请求后端的完整地址。

2. 实际情况一:部署后的分离

当项目上线后,前端代码(HTML、CSS、JS)和后端代码通常不会部署在同一个服务上。

  • 前端域名:https://www.myapp.com (用户访问的网站)

  • 后端域名:https://api.myapp.com (后端提供的服务地址)

这时,如果前端代码里请求的地址仍然是 http://localhost:3000/api/users,那显然是不对的,因为用户手机上并没有一个叫 localhost 的后端。

解决方案: 前端必须请求线上的后端地址。

  • 后端接口地址:https://api.myapp.com/api/users

  • 前端请求地址:https://api.myapp.com/api/users

这时,前端请求地址 仍然等于 后端接口地址,只是从本地变为了线上域名。

3. 核心痛点:跨域问题

当域名不同(www.myapp.com 请求 api.myapp.com)时,浏览器的同源策略会触发跨域问题,阻止请求。

为了解决这个问题,在实际开发中引入了一个非常重要的概念:代理(Proxy)。

4. 实际情况二:使用代理(开发中最常见)

为了让开发过程更顺畅,避免被跨域问题困扰,前端项目(特别是使用Vue/React脚手架创建的项目)通常会配置一个代理。

  • 前端代码中的请求:前端代码中不再写完整的后端地址,而是写一个相对路径。

    • 前端代码中的请求地址:/api/users

  • 代理配置:在项目的配置文件中(如 vue.config.js 或 vite.config.js),告诉开发服务器:“凡是遇到 /api 开头的请求,都自动转发到 https://api.myapp.com 去。”

  • 最终效果:

  • 浏览器向开发服务器(http://localhost:8080)请求 /api/users。

  • 开发服务器收到后,替浏览器去请求 https://api.myapp.com/api/users。

  • 后端返回数据给开发服务器。

  • 开发服务器再把数据返回给浏览器。

  • 因为浏览器始终在和同源的 localhost:8080 通信,所以没有跨域问题。

在这种模式下,两者的关系是:

前端请求地址(相对路径) + 代理配置(转发规则) = 后端接口地址(完整路径)

场景前端请求地址后端接口地址关系
本地直连 http://localhost:3000/api/users http://localhost:3000/api/users 相等
生产环境 https://api.myapp.com/api/users https://api.myapp.com/api/users 相等
开发代理 /api/users (相对路径) https://api.myapp.com/api/users 代理转换

nginx反向代理,就是将前端发送的动态请求由nginx转发到后端服务器

反向代理就是:

用户(前端) -> 请求 -> Nginx(接线员/保安) -> 转发 -> 真正的后端服务器(干活的)

反向代理(Nginx 干的活)

核心特点:代理的是服务器。 你知道一个固定的电话(域名),但电话那头是一个总机(Nginx),总机根据你拨的分机号,把电话转接到真正接电话的人(后端服务器)。

  • 场景:你访问 www.baidu.com。

  • 流程:

    你在浏览器输入 www.baidu.com,你的电脑向这个地址发起请求。

  • 这个地址实际上指向的是百度的一台 Nginx 服务器(反向代理服务器)。
  • Nginx 看了你的请求(比如你想搜图片),心里想:“搜图片的请求应该交给 图片服务器群 去处理。”
  • Nginx 内部把请求转发给真正的图片服务器。图片服务器把图片结果返回给 Nginx。
  • Nginx 再把结果返回给你的浏览器。
  • 比喻:你给一个大公司打电话。

    • 你拨了总机号码(Nginx 地址)。

    • 你说:“我找销售部。”(你的请求内容)。

    • 总机接线员(Nginx)把电话转接到内部分机销售部(具体的后端服务器)。

    • 销售部的人(后端程序)回答你的问题。

    • 你(客户端)只知道总机的号码,并不知道背后是哪个分机(哪台服务器)在给你服务。

好处

解决跨域问题(让它们看起来同源)

 实现负载均衡(分派任务)

 提供安全屏障(隐藏真实服务器)

统一配置通用功能

Nginx反向代理的配置:

在Nginx的配置文件中配置:

server
listen 80;
server_name localhost;
location /api/{
proxy_pass http://localhost:8080/admin/;#反向代理
nginx.conf

nginx负载均衡的配置方式:

upstream webservers{
server 192.168.100.128:8080;server 192.168.100.129:8080;
server{
listen 80;
server name localhost;
location /api/{proxy_pass http://webservers/admin/;#负载均衡
nginx.conf

这里转发的地址,webservers,里面配置的是后端服务的ip地址,端口号,前端发过来的请求如果能匹配上,就会经过负载均衡,平均的进行分配。

nginx负载均衡策略:

名称 说明
轮询 默认方式
weight 权重方式,默认为1,权重越高,被分配的客户端请求就越多
ip_hash 依据ip分配方式,这样每个访客可以固定访问一个后端服务
least conn 依据最少连接方式,把请求优先分配给连接数少的后端服务
url hash 依据url分配方式,这样相同的url会被分配到同一个后端服务
fair 依据响应时间方式,响应时间短的服务将会被优先分配

完善登录功能–密码存储

使用   password= DigestUtils.md5DigestAsHex(password.getBytes());  MD5

接口文档导入:

维度传统方式导入方式
形式 人类可读的文字、表格 机器可读的结构化数据(JSON/YAML)
操作 人眼阅读 -> 人脑理解 -> 手动输入工具 工具直接读取 -> 自动生成请求模板
优点 适合描述复杂的业务逻辑 快、准、狠(速度快、拼写准、强类型校验)
缺点 容易写错单词、维护成本高、效率低 需要后端生成标准格式的文档

这里我们选择在yapi中导入接口文档。

Swagger

Swagger(现在叫 OpenAPI)是一套编写接口文档的规则,就像写菜谱必须按照“菜名、食材、步骤”来写一样。

  • 后端在代码里加一些特殊的注解

  • 启动项目后,自动生成一个在线文档地址(比如 http://localhost:8080/swagger-ui.html)

使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网: https://swagger.io/
Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

维度SwaggerPostmanYApi
本质 规范/标准 工具 平台
主要用户 后端开发 后端、前端、测试 整个团队
数据来源 代码自动生成 手动录入/导入 手动录入/导入 Swagger
能不能调试 ❌ 只能看 ✅ 能发请求 ✅ 也能发请求
能不能 Mock ❌ ✅ 有简易版 ✅ 强大的 Mock
团队协作 ❌ 个人 ✅ 有团队版(收费) ✅ 免费开源
更新方式 自动(改代码即更新) 手动 手动或从 Swagger 同步
使用场景 后端写代码时 开发调试时 团队协作时

后端代码 -> Swagger 自动生成 -> 导入 YApi -> YApi 导出 Postman 格式 -> 导入 Postman

使用方式:

1.导入knife4j的maven坐标
2.在配置类中加入knife4j相关配置

3.设置静态资源映射,否则接口文档页面无法访问,

静态资源映射就是:告诉服务器"当用户访问某个网址时,直接返回硬盘上的某个文件,不要经过后端代码处理"。

比喻:快递柜和人工服务

  • 没有映射:每个快递都要快递员亲自打电话给你(就像每个请求都要经过后端代码)

  • 有映射:快递直接放快递柜,你自己去取(服务器直接返回文件,不用经过代码)

1、Yapi是设计阶段使用的工具,管理和维护接口
2、Swagger在开发阶段使用的框架,帮助后端开发人员做后端的接口测试

Swagger注解:

注解 说明
@ApI 用在类上,例如controller,表示对类的说明
@ApiModel 用在类上,例entity、DTo、vo
@ApiModelProperty 用在属性上,描述属性信息
@ApiOperation 用在方法上,例如controller的方法,说明方法的用途、作用

如果本篇文章对你有帮助,请点赞,关注,收藏,你的支持就是我最大的动力!

赞(0)
未经允许不得转载:171主机测评 » 苍穹外卖:深度剖析前后端数据交互与Nginx代理实战
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址