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

【项目日志|苍穹外卖】 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.xdnf.cn/news/16898.html

相关文章:

  • 【Excel】利用函数和Power Query进行数据分析
  • NX969NX972美光固态闪存NX975NX977
  • Java,八股,cv,算法——双非研0四修之路day24
  • javaweb开发之Servlet笔记
  • Android 优化 - 日志 Log
  • 【MySQL进阶】------MySQL程序
  • 自动驾驶控制算法——LQR控制算法
  • MySQL极简安装挑战
  • MySQL事务与存储引擎的学习(一)
  • 智能化设备维护:开启高效运维新时代
  • 新手向:Python制作贪吃蛇游戏(Pygame)
  • 力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)
  • LangChain4J入门:接入大模型
  • 解决飞书文档中PDF文档禁止下载的问题
  • TCP-单线程版本
  • 配置阿里云与云产品流转发
  • LWIP从FreeRTOS到uC/OS-III的适配性改动
  • 多向量检索:lanchain,dashvector,milvus,vestorsearch,MUVERA
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • visual studio code 怎样将主题修改成亮色,并且配置中文界面
  • 基于transformer的目标检测——匈牙利匹配算法
  • 仓库管理系统-14-前端之侧边栏区域Aside的集中式状态管理菜单和动态路由
  • 死锁深度解析:原理、检测与解决之道
  • Spring Boot 整合 Minio 实现高效文件存储解决方案(本地和线上)
  • 【十九、Javaweb-day19-Linux概述】
  • Pytorch 报错-probability tensor contains either ‘inf‘, ‘nan‘ or element < 0 解决方案
  • Odoo OWL前端框架全面学习指南 (后端开发者视角)
  • 机器学习——决策树
  • K8S部署ELK(四):部署logstash
  • JDBC核心技术与预编译SQL实战