外卖1

项目结构

序号 名称 说明
1 sky-take-out maven父工程,统一管理依赖版本,聚合其他子模块
2 sky-common 子模块,存放公共类,例如:工具类、常量类、异常类等
3 sky-pojo 子模块,存放实体类、VO、DTO等
4 sky-server 子模块,后端服务,存放配置文件、Controller、Service、Mapper等
名称 说明
Entity 实体,通常和数据库中的表对应
DTO 数据传输对象,通常用于程序中各层之间传递数据
VO 视图对象,为前端展示数据提供的对象
POJO 普通Java对象,只有属性和对应的getter和setter

当前端提交的数据和实体类中对应的属性差别⽐较⼤时,建议使⽤DTO来封装数据(@RequestBody Json请求参数)
//在service层:对象属性拷贝:将源对象(employeeDTO)的属性值复制到目标对象(employee)中
BeanUtils.copyProperties(employeeDTO, employee);
//@Builder 是 Lombok 提供的一个注解,它的作用是为你生成一个建造者模式的 API,包括一个静态内部类 Builder 和一些方法(如 builder(), build())。这纯粹是关于对象构造的语法糖。
补充:
Lombok 是一个 Java 库,它通过注解的方式自动生成代码,极大地减少了 Java 开发中的样板代码,让代码更加简洁、易读和易于维护。
主要 Lombok 注解及其作用

  1. @Data
    最常用的注解,集成了多个注解的功能:@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor
  2. @NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor
    自动生成构造函数
  3. @Builder
    生成建造者模式代码
  4. @Slf4j
    自动生成日志对象
  5. @Value
    创建不可变对象(类似 @Data,但所有字段都是 final)

序列化implements Serializable就是把内存中的对象转换成可以存储或传输的格式(字节流/json…),反序列化就是把这个格式再转换回内存中的对象。在你的 Web 项目中:
HTTP JSON 响应就是一种序列化(对象 → JSON)
接收 HTTP 请求就是一种反序列化(JSON → 对象)
可使用阿里巴巴开源的fastjson

1
2
3
4
5
// 序列化:对象 → JSON字符串
String jsonString = JSON.toJSONString(user);

// 反序列化:JSON字符串 → 对象
User user = JSON.parseObject(jsonString, User.class);

Git版本控制

使用Git进行项目代码的版本控制,具体操作:

1). 创建Git本地仓库 idea顶栏vcs选择create git repository

2). 创建Git远程仓库

访问https://gitee.com/,新建仓库,点击 创建
3). 将本地文件推送到Git远程仓库

  1. 提交文件至本地仓库
    忽略以下类型文件

    开始提交

    中间出现:点击commit

  2. 添加Git远程仓库地址

    选中工程右键,点git,manage routes,复制远程地址

  3. 推送
    还是右键git,push
    成功推送至远程仓库

nginx反向代理和负载均衡

对登录功能测试完毕后,接下来,我们思考一个问题:前端发送的请求,是如何请求到后端服务的?

前端请求地址:http://localhost/api/employee/login

后端接口地址:http://localhost:8080/admin/employee/login

前端请求地址 后端接口地址

很明显,两个地址不一致,那是如何请求到后端服务的呢?

1). nginx反向代理

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

那为什么不直接通过浏览器直接请求后台服务端,需要通过nginx反向代理呢?

nginx 反向代理的好处:

  • 提高访问速度

    因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。

  • 进行负载均衡

    所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。

  • 保证后端服务安全

    因为一般后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把nginx作为请求访问的入口,请求到达nginx后转发到具体的服务中,从而保证后端服务的安全。

nginx 反向代理的配置方式:

1
2
3
4
5
6
7
8
server{
listen 80;
server_name localhost;

location /api/{
proxy_pass http://localhost:8080/admin/; #反向代理
}
}

proxy_pass:该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式。

如上代码的含义是:监听80端口号, 然后当我们访问 http://localhost:80/api/../..这样的接口的时候,它会通过 location /api/ {} 这样的反向代理到 http://localhost:8080/admin/上来。

接下来,进到nginx-1.20.2\conf,打开nginx配置

1
2
3
4
5
# 反向代理,处理管理端发送的请求
location /api/ {
proxy_pass http://localhost:8080/admin/;
#proxy_pass http://webservers/admin/;
}

当在访问http://localhost/api/employee/login,nginx接收到请求后转到http://localhost:8080/admin/,故最终的请求地址为http://localhost:8080/admin/employee/login,和后台服务的访问地址一致。

2). nginx 负载均衡

当如果服务以集群的方式进行部署时,那nginx在转发请求到服务器时就需要做相应的负载均衡。其实,负载均衡从本质上来说也是基于反向代理来实现的,最终都是转发请求。

nginx 负载均衡的配置方式:

1
2
3
4
5
6
7
8
9
10
11
12
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;#负载均衡
}
}

upstream:如果代理服务器是一组服务器的话,我们可以使用upstream指令配置后端服务器组。

如上代码的含义是:监听80端口号, 然后当我们访问 http://localhost:80/api/../..这样的接口的时候,它会通过 location /api/ {} 这样的反向代理到 http://webservers/admin ,根据webservers名称找到一组服务器,根据设置的负载均衡策略(默认是轮询)转发到具体的服务器。

注:upstream后面的名称可自定义,但要上下保持一致。

nginx 负载均衡策略:

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

具体配置方式:

轮询:

1
2
3
4
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

weight:

1
2
3
4
upstream webservers{
server 192.168.100.128:8080 weight=90;
server 192.168.100.129:8080 weight=10;
}

ip_hash:

1
2
3
4
5
upstream webservers{
ip_hash;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

least_conn:

1
2
3
4
5
upstream webservers{
least_conn;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

url_hash:

1
2
3
4
5
upstream webservers{
hash &request_uri;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

fair:

1
2
3
4
5
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
fair;
}

常用注解

通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:

注解 说明
@Api 用在类上,例如Controller,表示对类的说明
@ApiModel 用在类上,例如entity、DTO、VO
@ApiModelProperty 用在属性上,描述属性信息
@ApiOperation 用在方法上,例如Controller的方法,说明方法的用途、作用

由于开发阶段前端和后端是并行开发的,后端完成某个功能后,此时前端对应的功能可能还没有开发完成,
导致无法进行前后端联调测试。所以在开发阶段,后端测试主要以接口文档测试为主。