上一篇文章分析了项目结构和初识Git,今天正式复习代码部分(由于JWT令牌不太熟悉,这个知识点后补)
Nginx(注意!要安装在非中文目录下)
之前一直有个疑问:在前后端分离的项目中,前端是如何与后端进行交互的。通过学习这个项目之后,我心中的这团迷雾终于被驱散开来。
例如:员工登录功能的前端请求地址是 http://localhost/api/employee/login 后端接口地址是http://localhost:8080/admin/employee/login
前端发送的请求和后端接口地址不匹配,为什么前后端还能进行交互呢?
原来是Nginx反向代理,将前端发送的动态请求由Nginx转发到后端服务器(Tomcat),Nginx起到了桥梁的作用
为什么前端请求不直接发到后端服务器而靠Nginx转发呢?
使用Nginx的优点:
- 反向代理:隐藏后端服务器,提升安全性,支持负载均衡(轮询、权重等策略)
upstream webservers{
# 权重策略
server 192.168.101.101:8080 weight=50;
server 192.168.101.102:8080 weight=50;
}
server{
listen 80;
server_name localhost;
location/api/{
# 反向代理+负载均衡
proxy_pass http://webservers/admin/;
}
}
2. 高性能:采用实践驱动架构,支持高并发,资源占用低
-
静态资源处理快:直接托管 HTML、CSS、图片等文件,响应速度远超传统服务器
......
Swagger (API Documentation & Design Tools for Teams | Swagger)
-
定义:Swagger 是一套基于OpenAPI 规范的开源工具集,用于自动化生成、描述、测试和部署RESTful API文档。它通过代码注解或 YAML/JSON 文件定义 API 接口,生成交互式文档,并支持实时调试和代码生成。
直接使用Swagger较为繁琐,所以我们使用knife4j框架,这个框架对Swagger进行封装,专为Java生态(尤其是 Spring 框架)设计。使用它需要添加以下依赖:
···
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
···
-
- 在配置类(WebMvcConfiguration)中加入knife4j相关配置:
@Bean
public Docket docket() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.select()
// 指定生成接口扫描的包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
-
- 设置静态资源映射
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 控制台输出日志
log.info("开始进行静态资源映射...");
// 将路径 /doc.html 映射到类路径下的 META-INF/resources/ 目录
registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
// 同理
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
-
常用注解
-
- 类级:
@Api(tags = "用户管理")标记控制器类别
- 类级:
-
- 方法级:
@ApiOperation(value = "查询用户", notes = "根据 ID 获取用户详情")描述接口功能
- 方法级:
-
-
参数级:
@ApiParam(name = "id", value = "用户 ID", required = true)定义请求参数描述单个参数的名称、描述、必填性
-
-
- 模型级:
@ApiModel(description = "用户实体")和@ApiModelProperty("用户名")描述数据模型
- 模型级: