本文记录了苍穹外卖项目第一天的学习内容,包括项目结构设计,Nginx反向代理配置与JWT令牌等核心知识点。
完成任务清单
- 了解软件开发流程
- 熟悉项目结构设计
- 掌握Git版本控制
- 学习Swagger接口文档
- 完善登录功能
主要功能展示
1.项目结构划分
苍穹外卖项目采用三层架构设计,主要分为三个核心模块:
sky-common - 公共模块
主要存放公共类,供其他模块使用
包名 | 说明 | 职责 |
---|---|---|
constant |
存放相关常量类 | 定义系统常量 |
context |
存放上下文类 | 管理请求上下文 |
enumeration |
项目的枚举类存储 | 定义业务枚举 |
exception |
存放自定义异常类 | 统一异常处理 |
json |
处理json转换的类 | 数据序列化 |
properties |
存放SpringBoot相关的配置属性类 | 配置管理 |
result |
返回结果类的封装 | 统一响应格式 |
utils |
常用工具类 | 工具方法集合 |
sky-pojo - 数据对象模块
主要存放entity、DTO、VO等数据对象
包名 | 说明 | 用途 |
---|---|---|
Entity |
实体类 | 通常和数据库中的表对应 |
DTO |
数据传输对象 | 通常用于程序中各层之间传递数据 |
VO |
视图对象 | 为前端展示数据提供的对象 |
POJO |
普通Java对象 | 只有属性和对应的getter和setter |
sky-server - 服务模块
主要存放配置文件、配置类、拦截器、controller、service、mapper、启动类等
包名 | 说明 | 职责 |
---|---|---|
config |
存放配置类 | 系统配置管理 |
controller |
存放controller类 | 接口层,处理HTTP请求 |
interceptor |
存放拦截器类 | 请求拦截处理 |
mapper |
存放mapper接口 | 数据访问层 |
service |
存放service类 | 业务逻辑层 |
SkyApplication |
启动类 | 应用程序入口 |
2. 完善登录功能
在当前项目中,我们主要使用的是MD5作为加密手段
MD5(Message Digest Algorithm 5)中文名为消息摘要算法第五版,是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护
实现思路
使用MD5加密方式对明文密码加密
实现逻辑
/**
* 员工登录
*
* @param employeeLoginDTO
* @return
*/
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
//1、根据用户名查询数据库中的数据
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
//.......
//密码比对
// TODO 后期需要进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
//........
//3、返回实体对象
return employee;
}
拓充知识点
1.正向代理与反向代理
代理技术概述
代理技术是网络架构中的重要组成部分,根据代理对象的不同,分为正向代理和反向代理两种模式。正向代理是隐藏客户端,反向代理是隐藏服务器.
正向代理 vs 反向代理对比
特性 | 正向代理 (Forward Proxy) | 反向代理 (Reverse Proxy) |
---|---|---|
代理对象 | 🖥️ 代理客户端 | 🖥️ 代理服务器 |
隐藏信息 | 隐藏客户端身份 | 隐藏服务器信息 |
使用场景 | 科学上网、访问限制突破 | 负载均衡、安全防护 |
配置位置 | 客户端配置 | 服务器端配置 |
工作流程对比
正向代理流程:
🌐 客户端 → 🔄 代理服务器 → 🎯 目标服务器
↓ ↓ ↓
隐藏身份 转发请求 接收请求
反向代理流程:
🌐 客户端 → 🔄 代理服务器 → 🎯 后端服务器集群
↓ ↓ ↓
发起请求 负载分发 提供服务
正向代理与反向代理区别
1. 代理方向不同
- 正向代理:客户端主动配置,代理服务器代表客户端访问目标服务器
- 反向代理:服务器端配置,代理服务器代表后端服务器接收客户端请求
2. 应用场景不同
- 正向代理:突破网络限制、保护客户端隐私、访问控制
- 反向代理:负载均衡、高可用性、安全防护、缓存加速
3. 配置方式不同
- 正向代理:需要在客户端配置代理服务器地址
- 反向代理:在服务器端配置,客户端无感知
Nginx反向代理配置
基础反向代理配置:
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://localhost:8080/admin/; # 反向代理
}
}
配置说明:
- 监听80端口
- 当访问
http://localhost:80/api/...
时 - 通过
location /api/
反向代理到http://localhost:8080/admin/
2. 负载均衡配置
负载均衡定义:
负载均衡(Load Balancing)是一种将大量的请求或数据流量分配到多台服务器上的技术,目的是避免单台服务器过载,提高系统的整体性能、可靠性和可扩展性。
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 负载均衡策略:
名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式,默认为1,权重越高,被分配的客户端请求就越多 |
ip_hash | 依据ip分配方式,这样每个访客可以固定访问一个后端服务 |
least_conn | 依据最少连接方式,把请求优先分配给连接数少的后端服务 |
url_hash | 依据url分配方式,这样相同的url会被分配到同一个后端服务 |
fair | 依据响应时间方式,响应时间短的服务将会被优先分配 |
3. JWT(JSON Web Token)
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。
JWT由Header、Payload、Signature三部分组成:
Header(头部):包含令牌类型和签名算法
Payload(载荷):包含声明(claims)
Signature(签名):用于验证令牌的完整性
项目中的JWT架构
public class JwtUtil {
/**
* 生成JWT令牌
*/
public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
// 使用HS256算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 计算过期时间
long expMillis = System.currentTimeMillis() + ttlMillis;
Date exp = new Date(expMillis);
// 构建JWT
JwtBuilder builder = Jwts.builder()
.setClaims(claims) // 设置自定义声明
.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8)) // 签名
.setExpiration(exp); // 设置过期时间
return builder.compact();
}
/**
* 解析JWT令牌
*/
public static Claims parseJWT(String secretKey, String token) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
.parseClaimsJws(token).getBody();
return claims;
}
}
本文为苍穹外卖学习笔记,持续更新中…
如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。