【项目日志|苍穹外卖】 Day1:项目环境搭建与架构设计

发布于:2025-08-07 ⋅ 阅读:(15) ⋅ 点赞:(0)

本文记录了苍穹外卖项目第一天的学习内容,包括项目结构设计,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由HeaderPayloadSignature三部分组成:
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;
    }
}

本文为苍穹外卖学习笔记,持续更新中…

如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。

请添加图片描述


网站公告

今日签到

点亮在社区的每一天
去签到