SpringAI实战:5分钟搞定聊天记录查询API,基于ChatMemory的RESTful接口开发
SpringAI实战5分钟构建高性能聊天记录查询API最近在开发一个智能客服系统时我发现聊天记录的快速检索功能对用户体验至关重要。SpringAI的ChatMemory组件恰好提供了简洁高效的存储方案但如何将其封装成易用的RESTful接口却鲜有完整案例。本文将分享一个经过生产验证的解决方案从零开始构建一个支持高并发的聊天记录查询服务。1. 环境准备与基础配置在开始编码前确保你的Spring Boot项目已集成SpringAI核心依赖。推荐使用Gradle构建工具在build.gradle中添加以下配置dependencies { implementation org.springframework.ai:spring-ai-core:1.0.0 implementation org.springframework.boot:spring-boot-starter-web compileOnly org.projectlombok:lombok annotationProcessor org.projectlombok:lombok }对于Maven项目对应的pom.xml配置如下dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-core/artifactId version1.0.0/version /dependency关键点说明确保Spring Boot版本≥3.0.0Lombok用于简化代码非必须但推荐生产环境建议添加spring-boot-starter-actuator用于健康检查2. 核心控制器实现基于RESTful设计原则我们创建HistoryController处理聊天记录请求。以下是经过优化的完整实现Slf4j RestController RequestMapping(/api/v1/chat) RequiredArgsConstructor public class HistoryController { private final ChatMemory chatMemory; GetMapping(/{chatId}/messages) public ResponseEntityListMessageDTO getChatHistory( PathVariable String chatId, RequestParam(required false) Integer limit) { ListMessage rawMessages chatMemory.get(chatId); ListMessageDTO result processMessages(rawMessages, limit); return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(1, TimeUnit.HOURS)) .body(result); } private ListMessageDTO processMessages(ListMessage messages, Integer limit) { StreamMessage stream messages.stream(); if (limit ! null limit 0) { stream stream.limit(limit); } return stream.map(this::convertToDTO) .sorted(Comparator.comparing(MessageDTO::getTimestamp)) .collect(Collectors.toList()); } private MessageDTO convertToDTO(Message message) { return new MessageDTO( message.getMessageType().name(), message.getContent(), message.getMetadata().get(timestamp), message.getMetadata() ); } }关键改进点添加了分页参数(limit)支持实现了Message到DTO的转换层内置了HTTP缓存控制增加了时间戳排序逻辑对应的MessageDTO定义public record MessageDTO( String type, String content, String timestamp, MapString, Object metadata ) {}3. 高级功能扩展基础功能实现后可以考虑以下增强特性3.1 性能优化方案对于高频访问的聊天记录建议添加Redis缓存层Configuration EnableCaching public class CacheConfig { Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager(chatHistory); } } // 在Controller方法添加缓存注解 Cacheable(value chatHistory, key #chatId) GetMapping(/{chatId}/messages) public ListMessageDTO getChatHistory(...) { ... }3.2 安全控制添加基础的JWT认证GetMapping(/{chatId}/messages) PreAuthorize(#chatId.startsWith(authentication.name)) public ListMessageDTO getChatHistory(...) { ... }3.3 实时推送支持结合WebSocket实现消息实时更新通知Autowired private SimpMessagingTemplate messagingTemplate; PostMapping(/{chatId}/messages) public MessageDTO addMessage(...) { // 保存消息逻辑 messagingTemplate.convertAndSend(/topic/chatId, newMessage); return newMessage; }4. 生产环境最佳实践在实际部署时需要注意以下关键点性能调优参数配置项推荐值说明spring.ai.chat.memory.size1000单个会话最大消息数server.tomcat.max-threads200高并发场景适当增加线程数spring.cache.redis.timeout30m缓存过期时间异常处理建议对不存在的chatId返回404状态码添加速率限制防止接口滥用记录详细的访问日志用于审计ExceptionHandler(EmptyResultDataAccessException.class) public ResponseEntityErrorResponse handleNotFound() { return ResponseEntity.notFound().build(); }在微服务架构中建议通过FeignClient暴露接口FeignClient(name chat-service, path /api/v1/chat) public interface ChatHistoryClient { GetMapping(/{chatId}/messages) ListMessageDTO getHistory(PathVariable String chatId); }5. 前端集成示例现代前端框架如React可以这样调用我们的APIasync function fetchChatHistory(chatId) { const response await fetch(/api/v1/chat/${chatId}/messages); const data await response.json(); return data.map(msg ({ id: msg.metadata.messageId, text: msg.content, sender: msg.type USER ? me : bot, time: formatTimestamp(msg.timestamp) })); }对于Vue项目推荐使用axios库import axios from axios; export default { methods: { async loadHistory(chatId) { try { const { data } await axios.get(/api/v1/chat/${chatId}/messages, { params: { limit: 50 } }); this.messages data; } catch (error) { console.error(加载历史记录失败:, error); } } } }6. 监控与运维在生产环境部署后需要建立完善的监控体系关键监控指标接口响应时间P99每秒请求量(QPS)缓存命中率错误率Prometheus配置示例- name: chat_history_metrics metrics_path: /actuator/prometheus static_configs: - targets: [localhost:8080]Grafana监控面板建议包含请求延迟热力图流量变化趋势图错误类型分布饼图JVM内存使用曲线对于大规模部署可以考虑以下优化策略按用户ID分片存储聊天记录实现冷热数据分离存储添加消息内容敏感词过滤支持消息的全文检索功能