# SSE **Repository Path**: songyake/sse ## Basic Information - **Project Name**: SSE - **Description**: 用AI写了一个SSE推送示例,可以用于集群环境中,供参考学习。 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-22 - **Last Updated**: 2025-10-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot SSE 集群示例 ![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7.18-brightgreen.svg) ![Java](https://img.shields.io/badge/Java-8-orange.svg) ![Redis](https://img.shields.io/badge/Redis-6.0+-red.svg) ![License](https://img.shields.io/badge/License-MIT-blue.svg) 基于Spring Boot的Server-Sent Events (SSE) 实时数据推送示例,支持集群部署和跨节点消息同步。 ## 📋 项目简介 这是一个完整的SSE实时数据推送解决方案,展示了如何在Spring Boot应用中实现: - 🔄 **实时数据推送**: 使用SSE技术实现服务端到客户端的实时数据推送 - 🏗️ **集群支持**: 通过Redis Pub/Sub实现多节点间的消息同步 - 📱 **实时页面更新**: 前端页面实时显示数据变化 - 🎛️ **完整控制面板**: 提供连接管理、消息统计、自定义消息推送功能 - 📊 **可视化统计**: 实时消息统计图表 - 🔧 **生产就绪**: 支持多环境配置,具备完善的错误处理和重连机制 ## ✨ 主要特性 ### 🚀 SSE功能 - 自动连接管理和重连机制 - 多种消息类型支持(系统信息、用户活动、订单更新、支付通知等) - 心跳检测保持连接活跃 - 客户端连接状态实时监控 ### 🌐 集群支持 - 基于Redis Pub/Sub的集群通信 - 跨节点消息广播同步 - 节点识别和状态管理 - 优雅降级(Redis不可用时仍可单机运行) ### 🎨 用户界面 - 响应式设计,支持移动端 - 实时消息流展示 - 消息类型统计图表 - 自定义消息发送功能 - 连接状态实时显示 ### ⚙️ 技术特性 - Spring Boot 2.7.18 (兼容JDK 8) - 多环境配置支持 - 完善的日志记录 - 优雅关闭和资源清理 - 跨域支持 ## 🛠 技术栈 | 技术 | 版本 | 说明 | |------|------|------| | Java | 8+ | 开发语言 | | Spring Boot | 2.7.18 | 应用框架 | | Spring Data Redis | 2.7.18 | Redis集成 | | Fastjson | 1.2.83 | JSON处理 | | Thymeleaf | 3.0+ | 模板引擎 | | Redis | 6.0+ | 集群通信 | | Maven | 3.6+ | 构建工具 | ## 📂 项目结构 ``` SSE/ ├── src/ │ └── main/ │ ├── java/com/example/sse/ │ │ ├── SseClusterApplication.java # 应用启动类 │ │ ├── controller/ │ │ │ ├── SseController.java # SSE API控制器 │ │ │ └── WebController.java # 页面控制器 │ │ ├── service/ │ │ │ ├── SseConnectionManager.java # SSE连接管理 │ │ │ ├── ClusterCommunicationService.java # 集群通信服务 │ │ │ └── DataGeneratorService.java # 数据生成服务 │ │ ├── model/ │ │ │ └── RealtimeData.java # 实时数据模型 │ │ └── config/ │ │ ├── RedisConfig.java # Redis配置 │ │ └── WebConfig.java # Web配置 │ └── resources/ │ ├── application.yml # 主配置文件 │ ├── application-dev.yml # 开发环境配置 │ ├── application-prod.yml # 生产环境配置 │ └── templates/ │ └── index.html # 主页面 ├── pom.xml # Maven配置 └── README.md # 项目说明 ``` ## 🚀 快速开始 ### 环境要求 - Java 8 或更高版本 - Maven 3.6 或更高版本 - Redis 6.0+ (可选,用于集群模式) ### 单机模式启动 ```bash # 1. 克隆项目 git clone cd SSE # 2. 编译项目 mvn clean compile # 3. 启动应用(单机模式) mvn spring-boot:run ``` 应用将在 `http://localhost:8080` 启动。 ### 集群模式启动 #### 1. 启动Redis服务器 ```bash # 使用Docker启动Redis docker run -d --name redis -p 6379:6379 redis:latest # 或使用本地Redis redis-server ``` #### 2. 启动多个应用实例 **终端1 (端口8080):** ```bash mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8080 ``` **终端2 (端口8081):** ```bash mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8081 ``` **终端3 (端口8082):** ```bash mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8082 ``` ### 3. 访问应用 - 主页面: http://localhost:8080 - 节点2: http://localhost:8081 - 节点3: http://localhost:8082 ## 📡 API 接口 ### SSE接口 | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | 建立SSE连接 | GET | `/api/sse/connect?clientId={id}` | 建立SSE连接 | | 获取连接状态 | GET | `/api/sse/status` | 获取当前节点状态 | | 推送自定义消息 | POST | `/api/sse/push` | 手动推送消息 | | 获取集群信息 | GET | `/api/sse/cluster/info` | 获取集群节点信息 | ### 消息推送示例 ```bash # 推送自定义消息 curl -X POST http://localhost:8080/api/sse/push \ -H "Content-Type: application/json" \ -d '{ "type": "custom_event", "content": { "message": "这是一条自定义消息", "level": "info" } }' ``` ## 💾 消息类型 系统支持以下预定义消息类型: | 类型 | 说明 | 自动生成频率 | |------|------|-------------| | `system_info` | 系统信息 | 每10秒 | | `user_activity` | 用户活动 | 每5秒 | | `order_update` | 订单更新 | 每8秒 | | `payment_notify` | 支付通知 | 每12秒 | | `heartbeat` | 心跳检测 | 每30秒 | ## 🔧 配置说明 ### 核心配置项 ```yaml # SSE配置 sse: connection: timeout: 300000 # 连接超时时间(毫秒) # Redis配置(集群模式) spring: redis: host: localhost port: 6379 timeout: 2000ms ``` ### 环境配置 - **开发环境**: `application-dev.yml` - 启用详细日志,Redis可选 - **生产环境**: `application-prod.yml` - 支持环境变量配置,优化性能 ## 🌐 集群部署 ### Docker部署示例 ```yaml # docker-compose.yml version: '3.8' services: redis: image: redis:latest ports: - "6379:6379" app1: build: . ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod - REDIS_HOST=redis depends_on: - redis app2: build: . ports: - "8081:8080" environment: - SPRING_PROFILES_ACTIVE=prod - REDIS_HOST=redis depends_on: - redis ``` ### 负载均衡配置 ```nginx # nginx.conf upstream sse_cluster { ip_hash; # 重要:确保同一客户端连接到相同节点 server localhost:8080; server localhost:8081; server localhost:8082; } server { listen 80; location / { proxy_pass http://sse_cluster; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # SSE特殊配置 proxy_buffering off; proxy_cache off; proxy_read_timeout 24h; } } ``` ## 📊 功能演示 ### 1. 实时消息流 - 打开浏览器访问主页 - 点击"连接SSE"建立连接 - 观察实时消息流动 ### 2. 集群消息同步 - 启动多个应用实例 - 在任一实例发送自定义消息 - 观察消息在所有实例间同步 ### 3. 自定义消息推送 - 在控制面板输入消息类型和内容 - 点击"发送自定义消息" - 观察消息实时显示 ## 🔍 监控和调试 ### 日志级别 ```yaml logging: level: com.example.sse: DEBUG # SSE相关日志 org.springframework.data.redis: INFO # Redis日志 ``` ### 关键监控指标 - 活跃SSE连接数 - 消息推送成功率 - Redis连接状态 - 节点间消息同步延迟 ## ⚠️ 注意事项 ### SSE连接管理 1. **连接超时**: 默认5分钟,可根据需要调整 2. **重连机制**: 客户端自动重连,间隔5秒 3. **连接限制**: 建议单节点不超过1000并发连接 ### 集群部署要点 1. **负载均衡**: 必须使用`ip_hash`或会话粘性 2. **Redis可用性**: Redis不可用时自动降级为单机模式 3. **消息去重**: 避免节点接收自己发送的消息 ### 性能优化 1. **消息缓冲**: 大量消息时考虑批量发送 2. **连接池**: Redis连接池适当调优 3. **内存管理**: 定期清理断开的连接 ## 🤝 贡献指南 1. Fork 项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 打开 Pull Request ## 📜 许可证 本项目采用 MIT 许可证。详情请参见 [LICENSE](LICENSE) 文件。 ## 📞 联系方式 如有问题或建议,请联系: - 邮箱: developer@example.com - GitHub Issues: [提交问题](https://github.com/your-repo/issues) ## 🔗 相关链接 - [Server-Sent Events 规范](https://html.spec.whatwg.org/multipage/server-sent-events.html) - [Spring Boot 官方文档](https://spring.io/projects/spring-boot) - [Redis Pub/Sub 文档](https://redis.io/topics/pubsub) --- ⭐ 如果这个项目对你有帮助,请给个星标支持!