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

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

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

  • WebSocket

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

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

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

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

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

    10207 引用 • 46356 回帖 • 64 关注

相关帖子

欢迎来到这里!

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

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

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

    2 回复
  • adlered 1 via macOS

    理论上可以,但没必要

    2 回复
  • EvilCodes
    作者

    谢谢 D 哥

  • EvilCodes
    作者

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

  • EvilCodes
    作者

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

  • EvilCodes
    作者

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

    1 回复
  • 88250

    设计模式里的命令模式哦

    1 回复
  • EvilCodes
    作者

    那我知道了嘿嘿

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

    1 回复
  • tiangao via macOS

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

    1 回复
  • lizhongyue248 via Linux

    所以两年前的时候推出了一个新的应用层协议: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 还是存在的。

  • someone27889 via macOS

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

  • someone27889 via macOS

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

  • EvilCodes
    作者

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

  • chunjie008

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

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

推荐标签 标签

  • OnlyOffice
    4 引用 • 20 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 742 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 42 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 446 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 523 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 236 关注
  • OneDrive
    2 引用 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • CSS

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

    199 引用 • 543 回帖 • 3 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 672 关注
  • OpenResty

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

    17 引用 • 51 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • danl
    180 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖 • 2 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 407 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • SQLServer

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

    21 引用 • 31 回帖 • 6 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 360 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 761 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 617 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 47 关注