V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noble4cc
V2EX  ›  Java

Java 服务端开发为什么不脱离 serverlet?

  •  1
     
  •   noble4cc · 2020-06-15 17:59:52 +08:00 · 5637 次点击
    这是一个创建于 1611 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的各种服务端框架比如 structs springmvc springboot 等都是运行在 serverlet 容器里的

    为什么不脱离 serverlet 一个框架本身就是一个 server,监听 http 请求 业务逻辑部分只需要编写 controller 就行了

    类似 golang 的那种方式,一个服务打包好后就是一个 server,业务逻辑也被打包进去了

    当然感觉是历史问题,毕竟 serverlet 这种形式也满足需求

    33 条回复    2020-09-15 10:41:45 +08:00
    guyeu
        1
    guyeu  
       2020-06-15 18:42:52 +08:00
    你可以把 servlet 理解成一个标准,这个标准的定义很简单,就是这个接口:javax.servlet.Servlet,总共五个方法,不脱离这个 servlet 的原因很简单,生态在这儿 ,你想和这个生态对接,就得尊重人家的标准。
    我猜你的 servlet 是类似 tomcat 、undertow 的 web 容器,那显然是可以脱离这种 web 容器的,别的不说,基于 netty 的 web server 一抓一大把,像 spring webflux,vertx 都是很香的东西。
    xizismile
        2
    xizismile  
       2020-06-15 19:45:19 +08:00 via Android
    servlet 只是一种规范,tomcat 只是 servlet 容器的一种实现方式

    脱离了 servlet,你就得自己定义一套规范了。

    既然已经有了 servlet,生态也是很成熟的,你为啥要自己重新定义一套新的呢?
    6IbA2bj5ip3tK49j
        3
    6IbA2bj5ip3tK49j  
       2020-06-15 20:24:06 +08:00
    问题本身就不完全正确。
    就算是 servlet 也可以把容器嵌到程序里去
    而且现在的 spring boot webflux,vert.x 已经不是 servlet 了。
    noble4cc
        4
    noble4cc  
    OP
       2020-06-15 20:36:37 +08:00
    @guyeu 对,我说的就是这个,只不过这些事基于 NIO 的 server,netty 顶多算个工具包
    noble4cc
        5
    noble4cc  
    OP
       2020-06-15 20:37:26 +08:00
    @xgfan webflux vert.x 也用过,其实我的意思是说绝对的主流还是基于 servlet 的各种框架
    jinsongzhao
        6
    jinsongzhao  
       2020-06-15 20:48:11 +08:00 via Android
    基于 servlet 也可以打包进一个可执行 jar 包,2007 年主要嵌入模式为主的 jetty 就很流行了,大概相当 tomcat 的 80%占有率。
    saberlong
        7
    saberlong  
       2020-06-15 20:56:31 +08:00 via Android
    我们公司就脱离了。netty 通信加 http 协议解析就好了。
    zsdroid
        8
    zsdroid  
       2020-06-15 21:01:33 +08:00
    那么问题来了,Java 服务端开发为什么不脱离框架,用原生 java 手撸呢
    nicevar
        9
    nicevar  
       2020-06-15 21:07:15 +08:00
    这个个人用户专享包的逻辑亮了, 点击一键免费领取, 未认证前提示认证才能领取, 认证完成后提示"您已完成实名认证无法领取实名认证大礼包", 哈哈.
    nicevar
        10
    nicevar  
       2020-06-15 21:07:57 +08:00
    原来是服务器延时...
    qwerthhusn
        11
    qwerthhusn  
       2020-06-15 21:57:27 +08:00
    Servlet 是一个协议
    一些软件实现了这些协议,所以项目可以在 tomcat 跑,也可以在例如 jetty 或 undertow 等只要实现了 servlet 规范的服务器跑
    开发人员只要使用 Servlet API 去处理 HTTP 请求就行了,当然那种比较原始,所以有 JAX-RS 、Spring MVC 这些进一步包装了 Servlet API

    不过现在新的一些东西,像 WebFlux,Vert.X 这些就不实现 Servlet 了,自行实现 Http 服务(一般用 Netty )然后自行定义 API (类似 Servlet 那样)给用户使用
    Cbdy
        12
    Cbdy  
       2020-06-15 22:14:50 +08:00 via Android
    Sprint WebFlux 、Vert.x Web 、
    MarkLeeyun
        13
    MarkLeeyun  
       2020-06-15 23:20:34 +08:00   ❤️ 1
    你的 servlet 都打错了。。。
    glaucus
        14
    glaucus  
       2020-06-15 23:30:15 +08:00 via iPhone
    why not?不要为了改变而改变
    misaka19000
        15
    misaka19000  
       2020-06-15 23:35:58 +08:00
    一个协议而已,包含了一些标准,有现成的标准不用干嘛要自己发明一套轮子?而且还不兼容各大 HTTP 服务容器
    zhuangzhuang1988
        16
    zhuangzhuang1988  
       2020-06-15 23:36:19 +08:00
    也有不依赖的
    https://www.playframework.com/documentation/2.8.x/Server

    Akka HTTP Server
    Netty Server
    CoderGeek
        17
    CoderGeek  
       2020-06-16 01:39:03 +08:00
    我还记得 ejb 那套 weblogic jetty
    hand515
        18
    hand515  
       2020-06-16 09:01:49 +08:00
    @CoderGeek #17 第一份工作接触的就是,勾起我多年的回忆
    szq8014
        19
    szq8014  
       2020-06-16 09:15:38 +08:00
    servlet 只是一个规范,代表的是 java 中 [同步阻塞] 模型的生态,很多框架会在这个限定下进行工作,比如同步阻塞最典型的就是一个线程从头干到尾,假如想暂存一个数据的话用 ThreadLocal 就可以了,不会出意外。但是你如果切换到基于事件驱动的那样的实现中就会出问题。
    BBCCBB
        20
    BBCCBB  
       2020-06-16 09:58:38 +08:00
    如果每个公司都是一套不同的东西. 那大家还怎么玩.
    monkeyWie
        21
    monkeyWie  
       2020-06-16 10:00:54 +08:00
    放在当下是有点笨重啊,但是在以前那个年代,java 就靠着 servlet 规范才从 web 开发中突出重围,百花齐放啊。
    slyang5
        22
    slyang5  
       2020-06-16 11:38:05 +08:00
    @monkeyWie 嘿嘿 个人觉得 servlet 规范还是挺好,
    zzzmh
        23
    zzzmh  
       2020-06-16 13:47:23 +08:00
    按照这思路,干脆脱离 java 得了,用 c 重写一套语言,专门跑 web 项目
    whenwind
        24
    whenwind  
       2020-06-16 14:51:04 +08:00
    轻量的我是喜欢用 nanohttpd,跑在 android 上面
    hantsy
        25
    hantsy  
       2020-06-16 16:56:53 +08:00
    Servlet 只是 Java EE/Jakarta EE 的一种规范,事实证明,Servlet 可能是所有规范中影响力最大的规范,是 Java EE 体系中最成功的规范。

    目前不用 Servlet 的也大把。Netty 是典型代表,ReactiveStreams 流行起来后,很多第三方框架都是基于 netty 的作品。Spring WebFlux 在 Spring Boot 中默认启用 Netty 作为服务器,当然也可以使用 Tomat,Jetty,Undertow 。
    xuanbg
        26
    xuanbg  
       2020-06-16 17:29:33 +08:00
    你为什么要用 TCP/IP 协议,自己搞一套不好吗?当然不好!没有标准,自行其是,哪来的互联互通。
    CoderGeek
        27
    CoderGeek  
       2020-06-16 20:48:56 +08:00
    @hand515 老哥们了啊 哈哈哈 那会我未成年捣鼓过
    Narcissu5
        28
    Narcissu5  
       2020-06-17 09:18:13 +08:00
    springboot 打包完就是一个 executable jar 啊,楼主你的痛点究竟在哪里
    yizmaoaa
        29
    yizmaoaa  
       2020-06-17 10:35:59 +08:00
    Vert.x Webflux micronaut quarkus
    yizmaoaa
        30
    yizmaoaa  
       2020-06-17 10:39:42 +08:00
    Servlet 本来就是很久以前定义的东西,放在现在看来是不合适,而且麻烦了。

    以前定 Servlet 的 interface 的时候,就是想让各家自己去搞底下的 IO 层。然后用户可以随便换

    放到现在来看,Servlet 的规范设计很明显是麻烦且不够直观了。

    这也就是为何这几年都开始将协议 IO 处理交给 netty 的原因了。
    noble4cc
        31
    noble4cc  
    OP
       2020-06-17 10:54:51 +08:00
    @yizmaoaa 而是多年了几乎没什么大变,确实有些老迈了
    ychost
        32
    ychost  
       2020-07-02 17:18:37 +08:00
    netty 就好了
    yamasa
        33
    yamasa  
       2020-09-15 10:41:45 +08:00
    spring 这些难道就不是一个 jar 或者 war 打好了就是一个服务?人间迷惑行为。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5534 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:52 · PVG 14:52 · LAX 22:52 · JFK 01:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.