# sse-server-demo **Repository Path**: wangzihaogitee/sse-server-demo ## Basic Information - **Project Name**: sse-server-demo - **Description**: 展示sse-server的使用方式 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-07-15 - **Last Updated**: 2025-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sse-server-demo #### 介绍 演示sse-server项目如何使用 com.github.wangzihaogithub sse-server 1.2.13 ### 包介绍 * /demo1-single 包演示了单体应用的使用方式,启动Demo1SingleApplication 访问http://127.0.0.1:8080 可以看到这样的消息,您可以进行交互测试 ID:184320 connect-finish {"connectionId":"184320","serverTime":1689412819469,"reconnectTime":5000,"name":"defaultConnectionService","enableCluster":false,"version":"1.2.13"} : ID:184320 server-push {"name":"sendByUserId 服务端推送的"} : ID:184320 server-push {"name":"sendByUserId 服务端推送的"} : ID:184320 connect-close {"connectionId": "184320"}. whoTriggerClose=client : ID:847140540416 connect-finish {"connectionId":"847140540416","serverTime":1689413021434,"reconnectTime":5000,"name":"defaultConnectionService","enableCluster":false,"version":"1.2.13"} : ID:847140540416 server-push {"name":"sendByUserId 服务端推送的"} : ID:847140540416 server-push {"name":"sendByUserId 服务端推送的"} : * /demo2-distributed 包演示了集群多实例应用的使用方式,启动以下4个服务, Demo2dDistributedDubbo2Application Demo2dDistributedDubbo1Application Demo2dDistributedTomcat1Application Demo2dDistributedTomcat2Application 访问http://127.0.0.1:8080,http://127.0.0.1:8081 可以看到这样的消息,您可以进行交互测试 ID:21468848128 connect-finish {"connectionId":"21468848128","serverTime":1689413086483,"reconnectTime":5000,"name":"defaultConnectionService","enableCluster":true,"version":"1.2.13"} : ID:21468848128 server-push {"name":"sendByUserId dubbo2号推送的"} : ID:21468848128 server-push {"name":"sendByUserId dubbo1号推送的"} : ID:21468848128 server-push {"name":"sendByUserId dubbo2号推送的"} : ID:21468848128 server-push {"name":"sendByUserId dubbo1号推送的"} : ### 项目原理 1. 前端浏览器通过 import(后段接口).then(conn => { 实现获得sse监听对象 }) 2. 后端服务端,直接面向前端,提供http接口 通过继承 SseWebController 实现提供http-sse接口 @RestController @RequestMapping("/my-sse") public class MySseWebController extends SseWebController 获取sse链接方式如下 @Resource private LocalConnectionService localConnectionService; // 通过这种方式获得sse链接 注!如果一个应用需要报漏多个SseWebController服务,请手工向spring注册LocalConnectionService 3. 集群需要用户添加依赖nacos, 开启配置 spring: sse-server: remote: enabled: true nacos: service-name: 'demo2-distributed' server-addr: 'xx.xx.xx.xx' 4. 开启集群后,支持后端客户端(不依赖tomcat) @Resource private DistributedConnectionService distributedConnectionService; // 这种方式获得sse链接 5. qos发送,保证至少发送一次 // 可以通过下面两个接口发送 localConnectionService.qos().sendByUserId() distributedConnectionService.qos().sendByUserId() ### QA问答 Q:开启集群后的如何确认消息落点并转发,怎么实现的? A: sse-client(DistributedConnectionService),sse-controller(SseWebController), localConnectionService.getCluster() 这三个发消息入口发消息前会先看本地是否存在该链接ID,如果不存在则广播集群所有机器, 每个sse-server内置暴露了随机端口号的http接口,并注册到nacos上(放心有安全机制) Q:如何保证qos? A:如果用户不在线,会将消息存放在MessageRepository接口中,如果下次用户上线,会触发重新发送并删除消息, 目前MessageRepository的实现是MemoryMessageRepository,未来会增加其他实现