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

2020-06-15 17:59:52 +08:00
 noble4cc

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

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

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

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

5651 次点击
所在节点    Java
33 条回复
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
2020-06-15 19:45:19 +08:00
servlet 只是一种规范,tomcat 只是 servlet 容器的一种实现方式

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

既然已经有了 servlet,生态也是很成熟的,你为啥要自己重新定义一套新的呢?
6IbA2bj5ip3tK49j
2020-06-15 20:24:06 +08:00
问题本身就不完全正确。
就算是 servlet 也可以把容器嵌到程序里去
而且现在的 spring boot webflux,vert.x 已经不是 servlet 了。
noble4cc
2020-06-15 20:36:37 +08:00
@guyeu 对,我说的就是这个,只不过这些事基于 NIO 的 server,netty 顶多算个工具包
noble4cc
2020-06-15 20:37:26 +08:00
@xgfan webflux vert.x 也用过,其实我的意思是说绝对的主流还是基于 servlet 的各种框架
jinsongzhao
2020-06-15 20:48:11 +08:00
基于 servlet 也可以打包进一个可执行 jar 包,2007 年主要嵌入模式为主的 jetty 就很流行了,大概相当 tomcat 的 80%占有率。
saberlong
2020-06-15 20:56:31 +08:00
我们公司就脱离了。netty 通信加 http 协议解析就好了。
zsdroid
2020-06-15 21:01:33 +08:00
那么问题来了,Java 服务端开发为什么不脱离框架,用原生 java 手撸呢
nicevar
2020-06-15 21:07:15 +08:00
这个个人用户专享包的逻辑亮了, 点击一键免费领取, 未认证前提示认证才能领取, 认证完成后提示"您已完成实名认证无法领取实名认证大礼包", 哈哈.
nicevar
2020-06-15 21:07:57 +08:00
原来是服务器延时...
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
2020-06-15 22:14:50 +08:00
Sprint WebFlux 、Vert.x Web 、
MarkLeeyun
2020-06-15 23:20:34 +08:00
你的 servlet 都打错了。。。
glaucus
2020-06-15 23:30:15 +08:00
why not?不要为了改变而改变
misaka19000
2020-06-15 23:35:58 +08:00
一个协议而已,包含了一些标准,有现成的标准不用干嘛要自己发明一套轮子?而且还不兼容各大 HTTP 服务容器
zhuangzhuang1988
2020-06-15 23:36:19 +08:00
也有不依赖的
https://www.playframework.com/documentation/2.8.x/Server

Akka HTTP Server
Netty Server
CoderGeek
2020-06-16 01:39:03 +08:00
我还记得 ejb 那套 weblogic jetty
hand515
2020-06-16 09:01:49 +08:00
@CoderGeek #17 第一份工作接触的就是,勾起我多年的回忆
szq8014
2020-06-16 09:15:38 +08:00
servlet 只是一个规范,代表的是 java 中 [同步阻塞] 模型的生态,很多框架会在这个限定下进行工作,比如同步阻塞最典型的就是一个线程从头干到尾,假如想暂存一个数据的话用 ThreadLocal 就可以了,不会出意外。但是你如果切换到基于事件驱动的那样的实现中就会出问题。
BBCCBB
2020-06-16 09:58:38 +08:00
如果每个公司都是一套不同的东西. 那大家还怎么玩.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681772

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX