当前位置: 首页 > news >正文

【项目日志|苍穹外卖】 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由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);// 构建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;}
}

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

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

请添加图片描述

http://www.dtcms.com/a/313227.html

相关文章:

  • 反向代理+网关部署架构
  • Java学习第一百零二部分——API网关
  • Claude Code入门学习笔记(五)--Claude Code命令行输入
  • 大白话讲解MCP
  • 多种单文件版分析型数据库调用底层函数对比
  • [Oracle] TO_DATE()函数
  • cs285 lecture13
  • 手机端使用表格填写表单问题
  • 复现YOLOV5+训练指定数据集
  • STM32-ESP8266通过MQTT与阿里云通讯
  • MySQL连接算法和小表驱动大表的原理
  • 李宏毅深度学习教程 第8-9章 生成模型+扩散模型
  • 【Django】-7- 实现注册功能
  • 09.Redis 常用命令
  • Android 之 蓝牙通信(2.0 经典)
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-58,(知识点:硬件产品的功率优化)
  • C++中多线程和互斥锁的基本使用
  • 【RH124 问答题】第 8 章 监控和管理 Linux 进程
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现实时食物水果的检测识别(C#代码UI界面版)
  • 使用 Spring Initializr 生成项目结构:Java 开发效率提升指南
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
  • 大语言模型涉及的一些概念(持续更新)
  • VisualStudio的一些开发经验
  • 思二勋:数字资产化与资产数权化是RWA运作的核心逻辑
  • AtCoder Beginner Contest 417
  • MySQL事务与存储引擎的学习(一)
  • Docker国内镜像列表
  • Effective C++ 条款19: 设计class犹如设计type
  • Python从入门到精通计划Day02: Python语法探秘:当现代艺术遇到古典音乐
  • 最小半径覆盖问题【C++解法+二分+扫描线】