WebSocket 能否完全承担后端 Controller 的角色呢?

本贴最后更新于 1623 天前,其中的信息可能已经沧海桑田

最近有一个想法,我是 JAVAWeb 出生,没有 springMVC 之前接触的项目都是 Servelet,我曾经接触到的是项目往往维护无数个不同功能的 Servelet,Servlet 中往往重写两个方法 onGet(),onPost(),然后在开发最近基于 WebSocket 的实时电子看板项目的时候我突然觉得在后端写 WebSocket 服务的时候和以前的 Servelet 是如此相似,也需要重写他的几个方法,我开发的项目是整个页面只请求一个

  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 368 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7721 引用 • 35159 回帖 • 189 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    理论上没问题,设计方面可以用命令模式,方便扩展不同业务。

    2 回复
  • adlered 1

    理论上可以,但没必要

    2 回复
  • EvilCodes
    作者

    谢谢 D 哥

  • EvilCodes
    作者

    为什么没必要呢?关键是我的页面有报表类数据,数据量比较大

  • EvilCodes
    作者

    后端只维护一个页面实体类总感觉太臃肿,如果前端增加页面显示就需要继续在这个大的实体类添加 LIST 属性,总感觉这样不太好。

  • EvilCodes
    作者

    D 哥的意思是用抽象类定义通用操作进行分类这种方式吗?

    1 回复
  • 88250

    设计模式里的命令模式哦

    1 回复
  • EvilCodes
    作者

    那我知道了嘿嘿

  • 现在很多简单的通信都是这么做的,比如我们的一些嵌入的小客服程序等。D 大说的命令比如收到已读销毁指令。不过这样使用主要注意保证消息的有序性与连续性吧。

    1 回复
  • tiangao

    我一直觉得 react redux 就应该这么玩,后端用 websocket 控制前端 😂

    1 回复
  • 所以两年前的时候推出了一个新的应用层协议:RSocket,它可以完成 http 和 socket 能完成的所有事。现在生态也越来越好了,spring boot 对他也有了支持,而 spring boot 2.3.x 版本中的 Spring Security 也对他有了“飞跃性”的支持。

  • 可以的 我之前有个项目的接口大多数都是通过 ws 传输的

  • yoss

    你说在重点上了,保证消息有序性。我们有个项目正是这样设计的,一开始没细想觉得挺简单,不就是消息的分发和处理。真正开始写的时候发现浏览器和服务端通过消息指令交互会遇到个问题:如何将用户操作请求和处理结果响应对应起来。比如用户提交数据时走 ws.sendMsg(业务指令码, 参数),服务端 ws.onMsg 根据业务指令码分发处理,然后通过 ws.sendMsg(操作指令码, 响应) 发消息给浏览器,此时浏览器就懵逼了:这个响应对应的是哪次业务提交数据的请求?

    后来我们通过 UUID 来关联请求和响应,解决了“对应”问题,但又碰到另外一个问题,请求和响应的时序不对。有时候用户后触发的请求会先返回,传统的 HTTP 是同步的,即使用 AJAX 在某些场景也可以设置为同步,很简单就能解决,但是用 WebSocket 的话就只能自己实现同步。我们最后只是简单加了个时间戳来判断时序,丢弃较老的响应。

    总之,如果要用 WebSocket 来实现浏览器和服务端的交互,建议楼主先处理好这两个问题,否则设计再优美也只是玩具。

    1 回复
  • 可以哦,http/2 不就有做双工。但是 http 的生态已经很完备了,单纯用 ws,还是会有很多坑要踩下。

  • danl

    @88250 黑客派用 ws 的地方多吗 ?? 似乎消息这块全部都是???

    1 回复
  • 88250

    目前主要是回帖、通知和聊天室用了 ws。

  • wizardforcel

    只请求一个地址肯定不行,这就好比你把所有功能都放一个函数里面。

    就算是现在的 SPA,虽然入口是一个,但各种 JSON API 还是存在的。

  • 后端直接触发 reducer 会让用户感觉非常诡异,我 tm 什么都没动,页面怎么变了

  • 在 ws 的基础上封装 一层协议层吧,考虑以上提到的问题,时序,顺序,溯源

  • EvilCodes
    作者

    我在做一个数据展示的看板,类似疫情实时数据展示那种

  • chunjie008

    主要是性能问题,大部分的网页不需要实时消息。

请输入回帖内容 ...
EvilCodes
我的世界,我的代码,我的逻辑。

推荐标签 标签

  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 342 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 6 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 650 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    165 引用 • 493 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 4 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    726 引用 • 1322 回帖 • 23 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 260 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    12 引用 • 101 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • abitmean

    有点意思就行了

    29 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 377 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 39 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 1 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    21537 引用 • 85133 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    336 引用 • 682 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 466 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    5 引用 • 104 回帖 • 1 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 210 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 457 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    26 引用 • 222 回帖 • 161 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    196 引用 • 535 回帖