ca42a7d9a4
- 删除分布式架构相关文件和配置 - 将backend-distributed重命名为backend保留分布式代码作为参考 - 优化backend-single单体架构实现 - 添加Coze API集成相关文档和测试 - 清理项目根目录的部署脚本和配置文件 - 更新WebSocket和消息服务实现 - 完善认证服务和密码加密功能
269 lines
5.4 KiB
Markdown
269 lines
5.4 KiB
Markdown
# 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
|
|
|
|
#### 发送测试消息
|
|
```http
|
|
POST /websocket/send?userId={userId}&message={message}
|
|
```
|
|
|
|
#### 广播测试消息
|
|
```http
|
|
POST /websocket/broadcast?message={message}
|
|
```
|
|
|
|
#### 获取在线用户
|
|
```http
|
|
GET /websocket/online-users
|
|
```
|
|
|
|
## 消息格式
|
|
|
|
### 聊天请求 (ChatRequest)
|
|
```json
|
|
{
|
|
"conversationId": "会话ID",
|
|
"content": "消息内容",
|
|
"senderId": "发送者ID",
|
|
"senderType": "USER|GUEST|AI|SYSTEM",
|
|
"messageType": "TEXT|TYPING|SYSTEM|ERROR|HEARTBEAT|CONNECTION|AI_THINKING"
|
|
}
|
|
```
|
|
|
|
### WebSocket消息 (WebSocketMessage)
|
|
```json
|
|
{
|
|
"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": {}
|
|
}
|
|
```
|
|
|
|
## 启动方式
|
|
|
|
### 本地开发启动
|
|
|
|
1. 确保MySQL和Redis服务已启动
|
|
2. 确保Nacos服务已启动
|
|
3. 启动emotion-ai服务(WebSocket服务依赖AI服务)
|
|
|
|
```bash
|
|
# 进入项目根目录
|
|
cd backend
|
|
|
|
# 启动单个服务
|
|
cd emotion-websocket
|
|
mvn spring-boot:run -Dspring-boot.run.profiles=local
|
|
|
|
# 或使用统一启动脚本
|
|
./start-services.sh
|
|
```
|
|
|
|
### Docker启动
|
|
|
|
```bash
|
|
# 构建镜像
|
|
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客户端
|
|
|
|
```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测试
|
|
|
|
```bash
|
|
# 发送测试消息
|
|
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
|
|
```yaml
|
|
server:
|
|
port: 19007
|
|
|
|
spring:
|
|
application:
|
|
name: emotion-websocket
|
|
```
|
|
|
|
### application-local.yml
|
|
```yaml
|
|
spring:
|
|
cloud:
|
|
nacos:
|
|
discovery:
|
|
server-addr: localhost:8848
|
|
```
|
|
|
|
## 日志配置
|
|
|
|
日志文件位置: `logs/emotion-websocket.log`
|
|
|
|
查看日志:
|
|
```bash
|
|
tail -f logs/emotion-websocket.log
|
|
```
|
|
|
|
## 监控端点
|
|
|
|
- 健康检查: http://localhost:19007/actuator/health
|
|
- 指标监控: http://localhost:19007/actuator/metrics
|
|
- Prometheus: http://localhost:19007/actuator/prometheus
|
|
|
|
## 注意事项
|
|
|
|
1. WebSocket服务依赖emotion-ai服务,请确保AI服务已启动
|
|
2. 需要配置正确的Nacos服务发现地址
|
|
3. 确保数据库连接配置正确
|
|
4. 生产环境需要配置适当的跨域策略
|
|
5. 建议配置负载均衡和会话粘性
|
|
|
|
## 故障排查
|
|
|
|
### 常见问题
|
|
|
|
1. **连接失败**
|
|
- 检查服务是否启动: `curl http://localhost:19007/actuator/health`
|
|
- 检查端口是否被占用: `lsof -i :19007`
|
|
|
|
2. **AI回复失败**
|
|
- 检查emotion-ai服务是否正常
|
|
- 查看日志中的Feign调用错误
|
|
|
|
3. **消息发送失败**
|
|
- 检查WebSocket连接状态
|
|
- 查看浏览器控制台错误信息
|
|
|
|
### 日志级别调整
|
|
|
|
```yaml
|
|
logging:
|
|
level:
|
|
com.emotionmuseum.websocket: DEBUG
|
|
org.springframework.web.socket: DEBUG
|
|
```
|
|
|
|
## 开发指南
|
|
|
|
### 添加新的消息类型
|
|
|
|
1. 在`WebSocketMessage.MessageType`枚举中添加新类型
|
|
2. 在`ChatWebSocketController`中添加对应的处理方法
|
|
3. 在`ChatWebSocketServiceImpl`中实现具体逻辑
|
|
|
|
### 扩展功能
|
|
|
|
- 添加文件传输支持
|
|
- 实现消息持久化
|
|
- 添加消息加密
|
|
- 实现群聊功能
|
|
- 添加消息撤回功能
|