用Java编写任何类型的Web服务器(无论是Web服务器,RESTful webapp还是微服务),您都可以使用套接字在客户端和服务器之间进行双通道通信。
使用公共Socket
和ServerSocket
类是微不足道的,但由于套接字是阻塞的,因此最终会为每个请求创建一个线程。使用此线程系统,您的服务器将完美地工作,但不会很好地扩展。
另一种方法是通过SocketChannel
,ServerSocketChannel
和Selector
使用Streams,显然不像普通套接字那样简单。
我的问题是:这两个系统中的哪一个用于生产就绪代码?我在谈论像Tomcat,Jetty,Sparkjava等大中型项目? 我想他们都使用Stream方法,对吗?
答案 0 :(得分:3)
为了使Web服务器真正具有可伸缩性,您必须使用non-blocking I/O来实现它 - 这意味着您应该以这样的方式实现它,即线程永远不会被阻塞,等待I / O操作完成
线程是相对昂贵的对象。例如,对于每个线程,需要为其调用堆栈分配内存。默认情况下,这是一个或几MB的顺序。这意味着如果你创建了1000个线程,那么所有这些线程的调用堆栈就已经花费了大约1 GB的内存。
在天真的服务器应用程序中,您可以为每个接受的连接(每个客户端)创建一个线程。如果您有许多并发用户,这将无法很好地扩展。
我不知道像Tomcat和Jetty这样的服务器的实现细节,但它们很可能是使用非阻塞I / O实现的。
有关Tomcat中非阻塞I / O的一些信息:Understanding the Tomcat NIO Connector
Java中最着名的非阻塞I / O库之一是Netty。