苍穹外卖学习笔记 -- Day02

214 阅读2分钟

上一篇文章分析了项目结构和初识Git,今天正式复习代码部分(由于JWT令牌不太熟悉,这个知识点后补)

Nginx(注意!要安装在非中文目录下)

之前一直有个疑问:在前后端分离的项目中,前端是如何与后端进行交互的。通过学习这个项目之后,我心中的这团迷雾终于被驱散开来。

例如:员工登录功能的前端请求地址是 http://localhost/api/employee/login 后端接口地址是http://localhost:8080/admin/employee/login

前端发送的请求和后端接口地址不匹配,为什么前后端还能进行交互呢?

原来是Nginx反向代理,将前端发送的动态请求由Nginx转发到后端服务器(Tomcat),Nginx起到了桥梁的作用

为什么前端请求不直接发到后端服务器而靠Nginx转发呢?

使用Nginx的优点:

  1. 反向代理:隐藏后端服务器,提升安全性,支持负载均衡(轮询、权重等策略)
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. 高性能:采用实践驱动架构,支持高并发,资源占用低

  1. 静态资源处理快:直接托管 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 = "用户管理") 标记控制器类别

    image.png

    image.png

    • 方法级@ApiOperation(value = "查询用户", notes = "根据 ID 获取用户详情") 描述接口功能

    image.png

    image.png

    • 参数级@ApiParam(name = "id", value = "用户 ID", required = true) 定义请求参数

      描述单个参数的名称、描述、必填性

    • 模型级@ApiModel(description = "用户实体") 和 @ApiModelProperty("用户名") 描述数据模型

    image.png

    image.png

今天就复习到这里,如有错误还请大佬指正