🔍 核心内容
✅ 一、架构设计与技术栈剖析
1.1 🌐 整体架构图解
在同城交友系统中,我们采用前后端分离 + REST API + WebSocket长连接 + 定位服务架构:
架构逻辑图示(文字描述):
css
复制编辑
[前端层]:UniApp(用户端) + Vue + ElementUI(管理后台) ↓ [网关层]:Spring Cloud Gateway(路由、鉴权) ↓ [服务层]: - 用户服务:用户注册、登录、动态发布 - 关系服务:关注、点赞、评论、匹配 - 实时消息服务:WebSocket长连接 ↓ [持久层]: - MySQL(数据存储) - Redis(缓存,存储在线状态) - Elasticsearch(圈子动态搜索) - RabbitMQ(异步处理消息)
✅ 技术栈解析
层次 | 技术选型 | 作用 |
---|---|---|
前端 | UniApp + Vue + ElementUI | 用户端、后台界面交互 |
网关层 | Spring Cloud Gateway | 统一入口、路由鉴权 |
后台服务 | SpringBoot + MyBatisPlus | 业务逻辑、数据库交互 |
实时通信 | WebSocket + Redis | 实时私聊与在线状态 |
数据存储 | MySQL + Elasticsearch | 数据存储与检索 |
缓存 | Redis | 加速读取、存储临时数据 |
消息队列 | RabbitMQ | 异步处理评论、点赞通知 |
部署 | Docker + Kubernetes | 容器化部署,支持弹性扩展 |
🚀 二、核心功能实战实现
2.1 💡 用户注册与登录:SpringBoot + JWT实现认证
在同城交友系统中,用户注册与登录是基础功能,采用Spring Security + JWT实现认证与鉴权。
📌 数据库表结构设计
sql
复制编辑
CREATE TABLE t_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, nickname VARCHAR(50), avatar VARCHAR(255), -- 头像 gender TINYINT, -- 性别 birthday DATE, -- 出生日期 location VARCHAR(100), -- 城市 create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
✅ SpringBoot用户注册接口
java
复制编辑
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping("/register") public ResponseEntity<String> register(@RequestBody UserDTO dto) { if (userService.register(dto)) { return ResponseEntity.ok("注册成功!"); } return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("注册失败!"); } @PostMapping("/login") public ResponseEntity<Map<String, String>> login(@RequestBody LoginDTO dto) { String token = userService.login(dto); if (token != null) { return ResponseEntity.ok(Map.of("token", token)); } return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Map.of("error", "登录失败!")); } }
✅ JWT生成与验证
java
复制编辑
@Component public class JwtTokenUtil { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 86400000; // 1天 // 生成JWT public String generateToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } // 解析JWT public String parseToken(String token) { Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); return claims.getSubject(); } }
📌 解释
-
使用
JwtTokenUtil
生成与解析JWT,实现无状态登录; -
Spring Security进行用户身份验证。
2.2 ⚙️ 实时消息:WebSocket实现同城交友聊天功能
在交友系统中,实时聊天是核心功能,采用SpringBoot + WebSocket实现。
📌 WebSocket实现消息服务
java
复制编辑
@Component @ServerEndpoint("/chat/{userId}") public class ChatWebSocket { private static Map<String, Session> onlineUsers = new ConcurrentHashMap<>(); @OnOpen public void onOpen(@PathParam("userId") String userId, Session session) { onlineUsers.put(userId, session); } @OnMessage public void onMessage(String message, Session session) throws IOException { // 解析消息并转发 JSONObject json = JSONObject.parseObject(message); String targetUserId = json.getString("to"); Session targetSession = onlineUsers.get(targetUserId); if (targetSession != null) { targetSession.getBasicRemote().sendText(message); } } @OnClose public void onClose(Session session) { onlineUsers.values().remove(session); } }
📌 解释
-
@ServerEndpoint
:标记为WebSocket服务; -
onOpen
:用户连接时,将用户加入在线映射; -
onMessage
:处理消息并转发; -
onClose
:关闭时移除在线用户。
⚡ 三、性能优化方案对比
在同城交友系统中,性能优化涉及:
-
数据检索与分页
-
缓存与异步处理
-
分布式存储与高并发优化
✅ 优化方案对比表
优化维度 | 优化方案 | 优势 | 劣势 |
---|---|---|---|
数据检索 | Elasticsearch + 分页查询 | 提升大数据量搜索效率 | 需索引维护 |
缓存优化 | Redis缓存用户信息 | 减少数据库查询 | 数据一致性需处理 |
通信效率 | WebSocket长连接 | 实时通信、延迟低 | 连接数有限制 |
消息处理 | RabbitMQ异步队列 | 减少主线程压力 | 消息丢失需处理 |
⚠️ 常见误区与注意事项
-
⚠️ WebSocket未做心跳检测
-
容易导致连接假死,需定期发送心跳包。
-
-
⚠️ Redis缓存未设置过期时间
-
数据长期占用内存,需设置过期时间。
-
-
⚠️ 未使用异步消息处理
-
点赞、评论通知需异步处理,否则影响接口响应速度。
-
🔗 扩展学习资源
-
🚀 UniApp开发文档