【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计
本文记录了苍穹外卖项目第一天的学习内容,包括项目结构设计,Nginx反向代理配置与JWT令牌等核心知识点。
文章目录
- 完成任务清单
- 主要功能展示
- 1.项目结构划分
- 2. 完善登录功能
- 拓充知识点
- 1.正向代理与反向代理
- 2. 负载均衡配置
- 3. JWT(JSON Web Token)
完成任务清单
- 了解软件开发流程
- 熟悉项目结构设计
- 掌握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);// 构建JWTJwtBuilder 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;}
}
本文为苍穹外卖学习笔记,持续更新中…
如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。