f9ff8302ae
✅ 前端修复完成: - 修复空白页面问题,部署正确的首页内容 - 访问地址: http://47.111.10.27/emotion/happy/ - 与开发环境完全一致的Vue首页 🔧 Nacos配置修复: - 修复微服务注册问题 - 统一日志路径配置 - 优化部署脚本 📋 脚本优化: - 删除多余部署脚本 - 保留核心脚本 - 支持参数控制
Emotion WebSocket 聊天服务
概述
emotion-websocket 是情绪博物馆项目的WebSocket聊天微服务,提供实时聊天功能,支持用户与AI的实时对话。
功能特性
- ✅ WebSocket实时通信
- ✅ 用户与AI实时对话
- ✅ 会话管理
- ✅ 消息状态跟踪
- ✅ 心跳检测
- ✅ 在线用户管理
- ✅ 消息广播
- ✅ 异步AI响应处理
技术栈
- Spring Boot 3.0.2
- Spring WebSocket
- STOMP协议
- SockJS
- Spring Cloud Alibaba
- Nacos服务发现
- OpenFeign服务调用
- MyBatis Plus
- MySQL
- Redis
端口配置
- 服务端口: 19007
- WebSocket端点:
/ws/chat
API接口
WebSocket端点
ws://localhost:19007/ws/chat
STOMP消息映射
/app/chat.send- 发送聊天消息/app/chat.connect- 用户连接/app/chat.disconnect- 用户断开连接/app/chat.heartbeat- 心跳检测
订阅端点
/user/queue/messages- 用户私有消息/topic/conversation/{conversationId}- 会话消息/topic/broadcast- 广播消息
REST API
发送测试消息
POST /websocket/send?userId={userId}&message={message}
广播测试消息
POST /websocket/broadcast?message={message}
获取在线用户
GET /websocket/online-users
消息格式
聊天请求 (ChatRequest)
{
"conversationId": "会话ID",
"content": "消息内容",
"senderId": "发送者ID",
"senderType": "USER|GUEST|AI|SYSTEM",
"messageType": "TEXT|TYPING|SYSTEM|ERROR|HEARTBEAT|CONNECTION|AI_THINKING"
}
WebSocket消息 (WebSocketMessage)
{
"messageId": "消息ID",
"conversationId": "会话ID",
"type": "TEXT|TYPING|SYSTEM|ERROR|HEARTBEAT|CONNECTION|AI_THINKING",
"content": "消息内容",
"senderId": "发送者ID",
"senderType": "USER|GUEST|AI|SYSTEM",
"status": "SENDING|SENT|DELIVERED|READ|FAILED",
"createTime": "2025-07-17 15:30:00",
"data": {}
}
启动方式
本地开发启动
- 确保MySQL和Redis服务已启动
- 确保Nacos服务已启动
- 启动emotion-ai服务(WebSocket服务依赖AI服务)
# 进入项目根目录
cd backend
# 启动单个服务
cd emotion-websocket
mvn spring-boot:run -Dspring-boot.run.profiles=local
# 或使用统一启动脚本
./start-services.sh
Docker启动
# 构建镜像
cd emotion-websocket
docker build -t emotion-websocket:1.0.0 .
# 运行容器
docker run -d \
--name emotion-websocket \
-p 19007:19007 \
-e SPRING_PROFILES_ACTIVE=prod \
emotion-websocket:1.0.0
测试方法
1. 使用内置测试页面
访问: http://localhost:19007/websocket-test.html
2. 使用JavaScript客户端
// 连接WebSocket
const socket = new SockJS('http://localhost:19007/ws/chat');
const stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
// 订阅消息
stompClient.subscribe('/user/queue/messages', function (message) {
const messageData = JSON.parse(message.body);
console.log('Received:', messageData);
});
// 发送消息
const chatRequest = {
content: "Hello AI!",
senderId: "test-user",
senderType: "USER",
messageType: "TEXT",
conversationId: "test-conversation"
};
stompClient.send("/app/chat.send", {}, JSON.stringify(chatRequest));
});
3. 使用REST API测试
# 发送测试消息
curl -X POST "http://localhost:19007/websocket/send?userId=test-user&message=Hello"
# 广播消息
curl -X POST "http://localhost:19007/websocket/broadcast?message=System Message"
# 查看在线用户
curl -X GET "http://localhost:19007/websocket/online-users"
配置说明
application.yml
server:
port: 19007
spring:
application:
name: emotion-websocket
application-local.yml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
日志配置
日志文件位置: logs/emotion-websocket.log
查看日志:
tail -f logs/emotion-websocket.log
监控端点
- 健康检查: http://localhost:19007/actuator/health
- 指标监控: http://localhost:19007/actuator/metrics
- Prometheus: http://localhost:19007/actuator/prometheus
注意事项
- WebSocket服务依赖emotion-ai服务,请确保AI服务已启动
- 需要配置正确的Nacos服务发现地址
- 确保数据库连接配置正确
- 生产环境需要配置适当的跨域策略
- 建议配置负载均衡和会话粘性
故障排查
常见问题
-
连接失败
- 检查服务是否启动:
curl http://localhost:19007/actuator/health - 检查端口是否被占用:
lsof -i :19007
- 检查服务是否启动:
-
AI回复失败
- 检查emotion-ai服务是否正常
- 查看日志中的Feign调用错误
-
消息发送失败
- 检查WebSocket连接状态
- 查看浏览器控制台错误信息
日志级别调整
logging:
level:
com.emotionmuseum.websocket: DEBUG
org.springframework.web.socket: DEBUG
开发指南
添加新的消息类型
- 在
WebSocketMessage.MessageType枚举中添加新类型 - 在
ChatWebSocketController中添加对应的处理方法 - 在
ChatWebSocketServiceImpl中实现具体逻辑
扩展功能
- 添加文件传输支持
- 实现消息持久化
- 添加消息加密
- 实现群聊功能
- 添加消息撤回功能