org.yeauty
netty-websocket-spring-boot-starter
0.13.0
org.springframework.boot
spring-boot-starter-websocket
| 特性 | Netty-WebSocket | Spring官方Starter |
|---|---|---|
| 底层框架 | Netty NIO框架 (非阻塞IO) | Servlet容器 (Tomcat/Jetty) |
| 协议支持 | 原生WebSocket + 自定义二进制协议 | WebSocket + STOMP消息协议 |
| 线程模型 | Reactor多线程模型 (Boss/Worker) | Servlet线程池模型 |
| 容器依赖 | 无 (可独立运行) | 必须依赖Servlet容器 |
| 编程范式 | 事件驱动模型 (类似Netty Handler) | 消息代理模型 (发布/订阅) |
| 与Spring集成 | 中等 (需手动管理会话) | 深度集成 (自动配置+安全支持) |
| 学习曲线 | 较陡峭 (需理解Netty概念) | 平缓 (Spring开发者友好) |
| 适用场景 | 高频实时数据/自定义协议 | 企业消息系统/标准文本通信 |
@SpringBootApplication
@EnableNettyWebSocket // 启用Netty WebSocket服务器
public class DataPushApplication {
public static void main(String[] args) {
SpringApplication.run(DataPushApplication.class, args);
}
}
/**
* 实时数据推送处理器
* 特点:直接操作Session,手动管理连接
*/
@ServerEndpoint(host = "0.0.0.0", port = "8080", path = "/realtime")
public class DataPushHandler {
// 存储所有活动会话
private static final Set sessions = ConcurrentHashMap.newKeySet();
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
session.sendText("CONNECTED|" + LocalTime.now());
}
@OnText
public void onText(Session session, String message) {
// 处理文本消息(如控制指令)
String response = processCommand(message);
session.sendText(response);
}
@OnBinary
public void onBinary(Session session, byte[] bytes) {
// 解析二进制数据(如传感器数据)
SensorData data = SensorDecoder.decode(bytes);
// 处理数据逻辑...
byte[] response = SensorEncoder.encode(data);
session.sendBinary(response);
}
@OnClose
public void onClose(Session session, CloseReason reason) {
sessions.remove(session);
}
// 广播数据给所有客户端
public static void broadcast(byte[] data) {
sessions.forEach(session -> {
if (session.isOpen()) {
session.sendBinary(data);
}
});
}
}
/**
* WebSocket配置类
* 特点:使用STOMP协议,配置消息代理
*/
@Configuration
@EnableWebSocketMessageBroker
public class ChatConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 客户端连接端点
registry.addEndpoint("/chat-ws")
.setAllowedOriginPatterns("*")
.withSockJS(); // 浏览器兼容支持
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 启用内存消息代理
registry.enableSimpleBroker("/topic", "/queue");
// 设置应用消息前缀
registry.setApplicationDestinationPrefixes("/app");
// 设置用户私有队列前缀
registry.setUserDestinationPrefix("/user");
}
}
/**
* 聊天控制器
* 特点:使用高级消息抽象,自动处理订阅
*/
@Controller
public class ChatController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
// 处理公共聊天消息
@MessageMapping("/chat")
@SendTo("/topic/messages")
public ChatMessage handlePublicMessage(@Payload ChatMessage message,
Principal principal) {
message.setSender(principal.getName());
message.setTimestamp(LocalDateTime.now());
return message;
}
// 处理私有消息
@MessageMapping("/private")
public void handlePrivateMessage(@Payload ChatMessage message,
Principal principal) {
message.setSender(principal.getName());
message.setTimestamp(LocalDateTime.now());
// 定向发送给接收者
messagingTemplate.convertAndSendToUser(
message.getRecipient(),
"/queue/private",
message
);
}
// 用户上线处理
@EventListener
public void handleConnect(SessionConnectedEvent event) {
String username = event.getUser().getName();
// 通知所有用户更新在线列表
messagingTemplate.convertAndSend("/topic/onlineUsers",
userService.getOnlineUsers());
}
}
/**
* 消息实体类
*/
public class ChatMessage {
private String sender; // 发送者
private String recipient; // 接收者(私聊使用)
private String content; // 消息内容
private LocalDateTime timestamp; // 时间戳
// getters & setters
}
连接管理方式
Session集合,直接操作连接SimpMessagingTemplate发送消息消息处理模式
异常处理机制
@OnError捕获异常,需手动关闭问题会话@MessageExceptionHandler统一处理集群支持
| 项目特征 | 推荐方案 | 理由说明 |
|---|---|---|
| 高频实时数据(>1000 TPS) | Netty-WebSocket | 低延迟、高吞吐量 |
| 企业级聊天系统 | Spring官方Starter | STOMP协议支持完善 |
| 自定义二进制协议 | Netty-WebSocket | 直接操作字节数据 |
| 需要SockJS兼容旧浏览器 | Spring官方Starter | 内置SockJS支持 |
| 微服务架构中的独立服务 | Netty-WebSocket | 不依赖Servlet容器 |
| 需要深度整合Spring Security | Spring官方Starter | 原生支持安全拦截 |
黄金实践法则:
新项目若不需要处理二进制协议,优先选择Spring官方方案;
现有系统需添加高性能实时通道,引入Netty作为独立服务模块;
关键业务系统建议同时实现两种方案,Netty处理实时数据流,Spring处理业务消息。
登录查看全部
参与评论
手机查看
返回顶部