1.前言今天项目经理给了我一个开发任务。如果有人下单,则向后台发送通知,这就是服务器推送功能。这个需求不是很复杂,只是一个通知功能。如果我使用websocket来做的话,我需要架设一个websocket服务器,配置有很多。Websocket是全双工通信,单向通信简直就是杀鸡用牛刀。还是用轮询吧,别说浪费服务器资源,而且不一定是实时的。如果订单处理速度慢,那岂不是忽视了客户。还有别的选择吗?当然有!2、SSE推送技术SSE的全称是Server-sentEvents,是HTML5规范的组成部分。具体可以去MDN网站查看相关文档。规范很简单,主要由两部分组成:第一部分是服务器端和浏览器端的通信协议,第二部分是浏览器端JavaScript可以使用的EventSource对象。通信协议是一种基于纯文本的简单协议。服务器端响应的内容类型是“文本/事件流”。响应文本的内容可以看作是一个事件流,由不同的事件组成。每个事件由类型和数据两部分组成,每个事件可以有一个可选的标识符。不同事件的内容由仅包含回车符和换行符的空行(“\r\n”)分隔。每个事件的数据可能包含多行。如上所示,每个事件由一个空行分隔。每行由键值对组成。如果键为空,则表示在处理过程中将忽略行为注释。例如第10行。第1行表示仅包含数据的事件。它将遵循默认事件(消息事件)。第3-4行表示具有eventID的事件。第6-8节代表自定义事件。第10-14行代表一个多行数据事件,多行数据由换行链接键定义为:data,表示该行包含数据。以数据开头的行可以出现多次。所有这些行都是该事件的数据。type为event,表示该行声明的事件类型。当浏览器接收到数据时,会产生相应类型的事件。默认提供三个标准事件(当然你可以自定义):id,表示用于声明该行事件的标识符。服务器返回的数据中包含事件的标识,浏览器会记录最后接收到的事件的标识。如果与服务器的连接中断,当浏览器再次连接时,它会通过HTTP头“Last-Event-ID”声明最后接收到的事件的标识符。服务器端可以通过浏览器端发送的事件标识来确定从哪个事件继续连接。retry,表示此行用于声明连接断开后浏览器再次连接之前的等待时间。SSE仅适用于高级浏览器,但请注意IE不直接支持它。IE上的XMLHttpRequest对象不支持获取部分响应内容,所以不支持。每次总有IE难怪要被淘汰了。3.SSEVSWebsocketSSE只能从Server到Client进行单向通信,而Websocket是双向通信。SSE比Websockets更轻量级。当然,功能要简单得多。开发方便,不涉及协议升级问题。SSE自然支持断线重连4、SpringMvc中的SSESpringMvc支持SSE。如果您要声明SSE连接。只需在您的控制器中声明以下接口:必须返回SseEmitter对象。SseEmitter对象处于Session级别。如果要点对点,每个session都需要独立存储。如果你在广播,你可以共享一个SseEmitter对象。根据SSE规范,产品还必须声明为“文本/事件流”。当您调用该接口时,将建立一个SSE连接。可以在另一个线程中调用SseEmitter的send方法向客户端发送事件。您也可以在发送事件后调用complete方法关闭SSE连接。5.在客户端,SSE是HTML5规范。所以APP端必须有HTML支持。而IE想要支持,就需要使用一些兼容的开发包,比如polyfill库。客户端的开发比较简单,因为它只接受事件:声明客户端连接和初始化EventSource对象。编写监听器来监听事件。6.总结今天我们介绍了SSEserverpush。相对long-termtraining、comet、websocket,相对轻量级。在一些小规模需要服务器实时推送的业务场景下更容易实现。相信看完本文后,你会很快上手。在实际开发中,需要根据业务对这几类推送进行技术选型。没有最好,只有最合适。只是对于大多数开发者来说,SSE还不够熟悉。相关demo我已经上传到码云仓库:https://gitee.com/felord/sse-...关注公众号:码农哥了解更多
