苍穹外卖[Day 1]记录
Nginx打不开的问题:输入nginx -t检查问题
将文件夹放在英文路径下,新增一个temp文件夹-->成功启动
打开nginx后一直无反应,本人尝试了换端口,管理员开启等方法,使用Microsoft edge仍然无法打开网站,检查了任务管理器后发现了nginx已经在运行了-->更换了浏览器后成功打开了
login:请求前端-->nginx转发反向代理-->后端服务器(负载均衡,提高访问速度,保证后端服务安全)
nginx反向代理(Reverse Proxy)配置方式:
管理端请求 (/api/):
行 68:
location /api/ {这个块定义了所有以
/api/开头的请求都将由这个配置处理。(可以从第一张图看到请求中有/api/)
行 69:
proxy_pass http://localhost:8080/admin/;这是核心的反向代理指令。它告诉 Nginx:
当接收到
http://yourdomain.com/api/的请求时(假设您的域名是yourdomain.com),将请求转发到
http://localhost:8080/admin/这个地址。(后端接口地址)注意路径重写:客户端请求的
/api/部分被替换成了目标服务器上的/admin/。例如:客户端请求:
/api/users实际转发给后端:
http://localhost:8080/admin/users
nginx负载均衡的配置方式:(还是上一张图)
负载均衡是通过upstream模块和proxy_pass指令配合实现的
# 75 行 proxy_pass http://webservers/user/;
# 通常在 http { ... } 块内部定义 upstream webservers { # 负载均衡策略默认是“轮询”(Round Robin) # 后端服务器 1 server 192.168.1.10:8080; # 后端服务器 2 (可以设置权重) server 192.168.1.11:8080 weight=3; # 后端服务器 3 (可以设置为备用) server 192.168.1.12:8080 backup; } # ----------------- # 匹配 /user/ location 块 server { listen 80; server_name yourdomain.com; location /user/ { # 将请求转发给上面定义的服务器组 proxy_pass http://webservers/user/; # ... 其他反向代理配置 ... } }导入接口文档
前端要调用接口,后端得告诉它每个接口的请求方式(GET, POST等)、路径、需要的参数和返回的结果。文档清晰了,前端才能正确地调用后端的接口。
常见的接口文档格式:
JSON格式:很常见,基本每个接口文档都会以JSON格式描述请求、响应和数据模型。
YAML格式:很多时候OpenAPI和Swagger文档会用YAML来写,这样的格式更简洁,比较适合大规模项目。
Swagger介绍:
Swagger是一种API文档生成工具,也是一个开放的API文档标准(Swagger Specification),用于描述RESTful APIs。它可以帮助你将后端接口以结构化的方式展现出来,清晰定义接口请求、返回值、参数等内容,方便前后端对接。
它的主要目标是让你能够快速编写和生成接口文档,还可以自动化文档的更新和维护,完美地解决了前后端接口协作中的很多问题。
Swagger的组成
Swagger UI
这是Swagger的前端展示界面,基本上就是一个美观的、交互式的网页,能够展示API文档并让开发者通过图形化界面调用接口进行测试。Swagger Editor
这个是一个在线编辑器,你可以用它来编写和编辑Swagger文档。它也有本地版本,支持YAML和JSON格式,你可以直接生成API文档。Swagger Codegen
通过这个工具,开发者可以根据API文档生成客户端代码,甚至是服务端代码。
Swagger是如何工作的
后端使用Swagger注解
后端开发者在代码中使用Swagger的注解(如@ApiOperation,@ApiResponse等),为每个接口定义它的功能、请求参数、返回值等。这样,你就能通过这些注解自动生成接口文档。比如,你在Spring Boot项目中可以这么写:
@ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户的详细信息") @GetMapping("/user/{id}") public ResponseEntity<User> getUser(@PathVariable Long id) { // 代码逻辑 }这行代码就能帮助Swagger理解这个接口是获取用户信息,自动生成对应的文档内容。
生成API文档
然后你就能通过Swagger UI或Swagger Editor来生成这些接口的完整文档,展现出请求URL、请求方法、参数、返回值、错误码等等信息。前端通过Swagger UI来查看和调用接口
前端开发者可以直接通过Swagger UI查看接口文档。Swagger UI会展示接口的请求格式,参数的类型,返回的JSON格式等。
这段代码定义了一个名为docket()的Spring Bean,它的目的是配置并生成项目的RESTful API 接口文档。
这个配置告诉文档生成工具:
文档的基本信息:文档的标题、版本号和描述。
需要扫描的接口范围:明确指定哪些包下的 Controller(控制器)需要被解析并生成文档。
涉及的关键技术与概念:
1.Knife4j / Swagger (Springfox)
Knife4j:一个基于 Swagger 的增强解决方案,它优化了 Swagger UI 的界面和功能,使其更符合中文用户的习惯,通常用于 Spring Boot 项目。
Swagger/OpenAPI 规范:一套用于描述 RESTful API 的标准,这段代码就是用来根据这个标准生成文档的配置。
Docket类:这是 Swagger/Springfox 库中的核心配置类,用于构建 API 文档的配置实例。
2.Spring Bean (@Bean)
@Bean注解:标记在一个方法上,告诉 Spring 框架这个方法会返回一个对象,这个对象应该作为Spring 容器中的一个组件(Bean)来管理。作用:Spring 在应用启动时会执行这个方法,创建并初始化
Docket对象,这样文档工具就能获取到这个配置信息。
3.API 文档配置链 (Builder 模式)
代码使用了流畅的Builder 模式来构建配置对象,使其易于阅读和配置:
ApiInfoBuilder:用于构建 API 文档的元信息(Metadata),包括标题、版本等。Docket构建链:用于配置文档工具的行为,包括选择要扫描的接口、路径等。
Swagger/Knife4j 注解核心注解分类与作用
| 注解名称 | 作用范围 | 核心用途 | 常用属性 |
@Api | 类(Controller) | 描述整个 API 模块(Controller)。用于对一组相关的接口进行描述和归类。 | tags(分组名称,通常是中文) |
@ApiOperation | 方法(接口) | 描述一个具体的 API 操作(Controller 中的一个方法)。它是接口文档中最核心的描述信息。 | value(接口名称/功能描述) |
@ApiModel | 类(DTO/VO 实体) | 描述一个数据模型(用于请求或响应的 Java 类)。通常加在请求参数类或返回结果类上。 | value(模型的名称) |
@ApiModelProperty | 字段(DTO/VO 实体属性) | 描述数据模型中的单个属性(字段)。是描述参数细节的关键。 | value(字段说明)、required(是否必填)、example(示例值) |
@ApiParam | 方法参数 | 描述方法的单个参数。当参数不是一个完整的对象(如路径参数或查询参数)时使用。 | value(参数说明)、required(是否必填) |
常用注解详细说明与示例
1. 模块级别:@Api
用于 Controller 类上,定义这个类包含的接口集合。
@RestController @RequestMapping("/admin/employee") @Api(tags = "员工管理相关接口") // 标记这个 Controller 的分组名称 public class EmployeeController { // ... 方法 ... }2. 接口级别:@ApiOperation
用于 Controller 中的具体方法上,描述接口的功能。
@PostMapping("/login") @ApiOperation("员工登录接口") // 描述这个方法是做什么的 public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) { // ... 登录逻辑 ... } @PostMapping("/logout") @ApiOperation(value = "员工退出接口", notes = "退出时客户端删除本地Token即可") public Result<String> logout() { return Result.success(); }3. 参数/模型级别:@ApiModel&@ApiModelProperty
用于描述作为请求体(@RequestBody)或响应体 (Result<T>) 的 Java Bean。
示例:定义登录请求参数 DTO
@Data // Lombok 注解 @ApiModel(description = "员工登录时提交的数据模型") // 描述这个类的作用 public class EmployeeLoginDTO implements Serializable { @ApiModelProperty("用户名") // 描述这个字段 private String username; @ApiModelProperty(value = "密码", required = true) // 描述这个字段,并标记为必填 private String password; }EmployeeController类:
这个EmployeeController类是一个典型的Spring Boot/Spring Cloud项目中的后端控制器,负责处理与员工管理相关的HTTP 请求,特别是管理员端的请求。
EmployeeController是项目中的Web 层(或称为Controller 层),它承担了以下职责:
接收请求:接收来自客户端(通常是前端管理系统)发送的 HTTP 请求。
参数校验与封装:将请求体中的数据(如登录信息)封装成 Java 对象(DTO)。
调用服务:调用Service 层(
EmployeeService)的方法来处理业务逻辑。返回响应:将业务处理结果封装成统一的响应格式(
Result),返回给客户端这个类大量使用了 Spring 框架和 Lombok 提供的注解:
注解/类 作用 解释 @RestController控制器标识 它是 @Controller和@ResponseBody的组合。表明这是一个处理 HTTP 请求的控制器,并且方法的返回值会直接作为 HTTP 响应体(通常是 JSON 格式)返回。@RequestMapping("/admin/employee")路径映射 定义了所有该类中的接口的基础路径。例如,登录接口的完整路径是 /admin/employee/login。@Slf4j日志记录 这是一个Lombok注解,会在编译时自动生成一个 log对象,用于方便地记录运行时信息。@Autowired依赖注入 Spring 核心机制。自动将 EmployeeService和JwtProperties类的实例注入到Controller中,以便使用它们提供的服务和配置。@PostMapping("/login")HTTP 方法映射 将 login()方法映射到 HTTPPOST请求,路径是/admin/employee/login。@RequestBody请求体解析 告诉 Spring 将 HTTP 请求体中的 JSON 数据自动反序列化并绑定到 EmployeeLoginDTO对象上。
login()方法是该类的核心,它实现了一个完整的员工登录与鉴权流程:
业务处理:调用
employeeService.login(employeeLoginDTO),由 Service 层负责进行用户名和密码的验证,以及查询员工信息。生成 JWT 令牌(鉴权):
登录成功后,从返回的
Employee对象中获取员工 ID。创建一个
claimsMap,将员工 ID (employee.getId()) 作为 Payload(载荷)放入其中。调用
JwtUtil.createJWT工具类,结合配置文件中的密钥 (jwtProperties.getAdminSecretKey()) 和有效期 (jwtProperties.getAdminTtl()),生成一个JWT(JSON Web Token)令牌。
构建响应数据:
使用Lombok 的 Builder 模式(
EmployeeLoginVO.builder()...build()) 创建一个EmployeeLoginVO(View Object),包含员工 ID、用户名、姓名和生成的Token。
返回结果:将包含
EmployeeLoginVO的成功结果 (Result.success()) 返回给客户端。客户端后续访问其他接口时需要携带这个Token。
