j2ee服务器都有哪些

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了j2ee服务器都有哪些相关的知识,希望对你有一定的参考价值。

参考技术A

  众所周知,J2EE应用服务器百花齐放,种类众多。那么J2EE应用服务器有哪些?又有哪些功能呢?一起来看看吧!

  从功能实现上划分:

  有实现完整J2EE规范(full profile)的Weblogic, WebSphere, GlassFish

  有实现web应用规范(web profile)的 TomEE, JBoss/WildFly

  有基本的Servlet及Jsp规范的Web容器(Web Container) Tomcat, Jetty, Resin

  回顾过去的2015年,各应用服务器市场占有率各有千秋。

  下图为各个应用服务器使用率饼图

  我们看到,在众多J2EE应用服务器中,Tomcat使用率达到58.66%,稳坐第一。

  相较2014年,Tomcat使用率大幅增长,增长将近19%。

  整体而言,Tomcat做为Servlet和Jsp规范的参考实现(Reference implementation , 简称RI),一般都会在第一时间实现规范的新特性并通过Oracle的CTS 测试认证。目前最新的Tomcat 9.0,虽还是alpha版,但已经实现了Servlet 4.0草案,感兴趣的朋友,可以下载尝鲜哦!

  Tomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且开源免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。学习JavaWeb开发一般都使用Tomcat服务器,该服务器支持全部JSP以及Servlet规范,启动界面如图:

 

  Tomcat 是一款非常优秀的 Java Web 服务器,以致于很多开源 Java 应用服务器(如 JOnAS) 直接集成它作为 servlet 容器。

  Tomcat的总体结构

  Tomcat中主要涉及Server,Service,Engine,Connector,Host,Context组件,之前用过Tomcat的.童鞋是不是觉得这些组件的名称有点似曾相识的赶脚,没赶脚?!您再想想。好吧,不用你想了,我来告诉你吧。其实在Tomcat二进制分发包解压后,在conf目录中有一个server.xml文件,你打开它瞄两眼看看,是不是发现server.xml文件中已经包含了上述的几个名称。

  Tomcat 集群源码的类图

  从图中我们可以看出 Tomcat 集群包括以下几个方面的内容:

  Session: Session 分为 StandardSession 与ClusterSession 两种,后者用于 Session 复制。

  Session Manager: 有用于集群 Session 管理的ClusterSession,也有用于对 Session 进行一般日常管理的,如 PersistentManager,BackupManager,SimpleTcpReplicationManager。

  组通迅框架:SessionManager调用组通讯框架进行 Session 的传输,Tomcat采用的组通

  讯框架是 tribe,目前 tribe 已被独立为开放的 apache 工程。

  Cluster: 方便集群管理而派生出的逻辑概念,可将实际物理机划分为一个 Cluster,也可 将一台物理机上不同端口的实例划分为一个 Cluster,它有一个简单的实现类 SimpleTcpCluster。

  1.1 Session

  服务器集群通常操纵两种session:

  1. Stickysessions: 尽量让同一个客户请求由同一台服务器来处理,这样 sticky sessions 就是 存在于单机服务器中接受客户端请求的 session,它不需要进行 Session 复制,如果这个 单机失败的话,用户必须重新登录网站。

  2. Replicatedsessions: 在一台服务器中的 session 状态被复制到集群的其他服务器上,无论 何时,只要 session 改变了,session 数据都要重新全部或部分(依据复制策略)被复制 到其他服务器上。

  Tomcat 支持以下三种 session 持久性类型:

  1. 内存复制:在 JVM 内存中复制 session状态,使用 Tomcat自带的 SimpleTcpCluster 和SimpleTcpClusterManager类。

  2. 数据库持久性:在这种类型中,session 状态保存在一个关系数据库中,服务器使用org.apache.catalina.session.JDBCManager类从数据库中获取 Session 信息。

  3. 基于文件的持久性:这里使用类org.apache.catalina.session.FileManager 把session 状态保存到一个文件系统。

  Session Manager

  Tomcat 通过 org.apache.catalina.Manager 来管理 Session,Manager 接口总是和 Context Container 相关联。它主要负责 session 的建立、更新和销毁。该接口中一些重要的方法有:

  用户在 Servlet 中通过 javax.servlet.http.HttpServletRequest 接口的 getSession 方法获得 Session,而该接口的实现位于 org.apache.catalina.connector.Request 类中的 doGetSession 方 法中,在该方法中通过 org.apache.catalina.Manager 来获得 Session , doGetSession 方法的 部分代码如下:

  组通讯框架--Tribe

  组通讯框架 Tribe 在 Tomcat 中的位置可如下图

  如图所示,Tribe 的核心主要是 Channel 类,由此看出,它采用 NIO 进行 Socket 通讯,运用

  了组播,事件、心跳检测等技术,下面我们来着重看看代码中 Tomcat 是如何与 Tribe 衍接首先在 SimpleTcpReplication 类中的实现 Manager 接口的 start 方法中:

  Cluster

  Cluster 用于管理集群中的 Session 复制,它有一个简单的实现类 SimpleTcpCluster。

使用 Websockets 代替 RESTful HTTP 都有哪些陷阱?

【中文标题】使用 Websockets 代替 RESTful HTTP 都有哪些陷阱?【英文标题】:What are the pitfalls of using Websockets in place of RESTful HTTP?使用 Websockets 代替 RESTful HTTP 有哪些陷阱? 【发布时间】:2015-07-07 16:32:58 【问题描述】:

我目前正在做一个项目,该项目需要客户端请求一项大工作并将其发送到服务器。然后服务器划分作业并以一组 url 响应客户端,以进行 GET 调用并流回数据。我是该项目的新手,我目前正在使用 Spring websockets 来提高效率。与客户端不断 ping 服务器以查看是否有准备好返回的结果不同,websocket 现在将直接联系客户端万岁!

让 websockets 从头到尾管理整个过程是不是一个坏主意?我正在将 STOMP 与 Spring websockets 一起使用,放弃 REST 还会存在重大问题吗?

【问题讨论】:

【参考方案1】:

这真的取决于您的要求。与 Websockets 相比,REST 服务更透明,更易于开发人员使用。

使用 Websocket,您消除了 RESTful Web 服务提供的大部分优势,例如通过 URI 引用资源的能力。你真正应该做的是弄清楚 REST 和超媒体的优势是什么,并据此决定这些优势对你是否重要。

当然,完全可以创建一个 RESTful web 服务,并使用基于 websocket 的 API 来增强它以实现实时响应。

但是,如果您正在创建一个只有您将在受控环境中使用的服务,唯一的缺点可能是并非每个客户端都支持 websocket,而几乎任何类型的环境都可以进行简单的 http 调用。

【讨论】:

使用 Spring-websockets 和 Spring-messaging 我可以使用 /@MessageMapping 来获得 URI。我也可以进行 Spring-mvc /@RequestMapping 调用!似乎 Spring-websockets 可以允许类似 RESTful 的抽象?这就是我迷路的地方,可能是因为我很天真,但它让 websocket 开发看起来很有吸引力,但我没有听到太多关于它的嗡嗡声。【参考方案2】:

使用 RESTful HTTP,您有一个无状态请求/响应系统,客户端发送请求,服务器返回响应。

使用 webSockets,您有一个有状态(或可能有状态)的消息传递系统,其中消息可以通过任一方式发送,并且发送消息的开销低于使用 RESTful HTTP 请求/响应。 p>

两者是完全不同的结构,具有不同的强度。

连接的 webSocket 的主要优点是:

    双向通信。因此,服务器可以随时通知客户端任何事情。因此,客户端可以建立一个 webSocket 并监听来自服务器的任何消息,而不是定期轮询服务器以查看是否有新内容。从服务器的角度来看,当客户端感兴趣的事件发生时,服务器只是向客户端发送一条消息。服务器无法使用纯 HTTP 执行此操作。

    每条消息的开销更低。如果您预计客户端和服务器之间会出现大量流量,那么使用 webSocket 时每条消息的开销会更低。这是因为 TCP 连接已经建立,您只需在已经打开的套接字上发送消息。对于 HTTP REST 请求,您必须首先建立一个 TCP 连接,该连接在客户端和服务器之间来回多次。然后,您发送 HTTP 请求,接收响应并关闭 TCP 连接。 HTTP 请求必然会包含一些开销,例如与该服务器对齐的所有 cookie,即使它们与特定请求无关。如果客户端和服务器都在使用 HTTP/2(最新的 HTTP 规范),那么它在这方面允许一些额外的效率,因为单个 TCP 连接可以用于多个请求/响应。如果您将 TCP 级别的所有请求/响应绘制成图表,只是为了发出 https REST 请求/响应,那么与仅通过已建立的 webSocket 发送消息相比,您会感到惊讶。

    在某些情况下可扩展性更高。每条消息的开销较低,并且无需客户端轮询来确定是否有新内容,这可以提高可扩展性(给定服务器可以服务的客户端数量更多) . webSocket 的可扩展性也有缺点(见下文)。

    有状态连接。无需借助 cookie 和会话 ID,您可以直接在程序中为给定连接存储状态。虽然已经对无状态连接进行了大量开发来解决大多数问题,但有时使用有状态连接会更简单。

RESTful HTTP 请求/响应的主要优点是:

    普遍支持。很难获得比 HTTP 更普遍的支持。虽然 webSockets 现在享有相对较好的支持,但仍有一些情况下 webSocket 支持不定期可用。

    兼容更多服务器环境。有些服务器环境不允许长时间运行服务器进程(某些共享托管情况)。这些环境可以支持 HTTP 请求,但不支持长时间运行的 webSocket 连接。

    在某些情况下更高的规模。持续连接的 TCP 套接字的 webSocket 要求为服务器基础结构增加了一些 HTTP 请求不需要的新规模要求。因此,这最终成为一个权衡空间。如果 webSockets 的优势不是真正需要或被大量使用,那么 HTTP 请求实际上可能会更好地扩展。这绝对取决于具体的使用情况。

    对于一次性请求/响应,单个 HTTP 请求比建立 webSocket、使用它然后关闭它更有效。这是因为打开一个 webSocket 是从一个 HTTP 请求/响应开始,然后双方同意升级到一个 webSocket 连接后,才能发送真正的 webSocket 消息。

    无状态。如果您的工作没有因拥有无状态基础设施而变得更加复杂,那么无状态世界可以使扩展或故障转移变得更加容易(只需在负载均衡器后面添加或删除服务器进程)。

    可自动缓存。通过正确的服务器设置,浏览器或代理可以缓存 http 响应。对于通过 webSockets 发送的请求,没有这样的内置机制。


所以,为了解决您提出问题的方式:

使用 websocket 代替 RESTful HTTP 有哪些陷阱?

    在大规模(数十万客户端)中,您可能需要做一些特殊的服务器工作才能支持大量同时连接的 webSocket。

    所有可能的客户端或工具集都不支持 webSocket 或通过它们发出的请求与支持 HTTP 请求的级别相同。

    一些较便宜的服务器环境不支持支持 webSockets 所需的长时间运行的服务器进程。

如果将进度通知返回给客户端对您的应用程序很重要,您可以使用长时间运行的 http 连接并发送持续的进度,或者您可以使用 webSocket。 webSocket 可能更容易。如果您真的只在此特定活动的相对较短的持续时间内需要 webSocket,那么您可能会发现最好的整体权衡是仅在您需要能够将数据推送到客户端的持续时间内使用 webSocket,并且然后使用 http 请求进行正常的请求/响应活动。

【讨论】:

感谢您的详细回答。我仍在等待使 websockets 成为构建 web 应用程序的事实上的方式的神奇框架。我真的很喜欢 Spring 对 Websockets 所做的事情。也许它会演变成未来的大事。 为什么没有人提到 REST 响应是可缓存的,并且没有简单/自动的方法来缓存 Websocket 的结果? @metamaker - 这是一个合理的观点,我会添加它。但是 webSocket 连接通常不用于与缓存相关的请求/响应类型的活动,事实上,http 通常是纯请求/响应的推荐选择。 @jfriend00 没错,但这是一个明确的用例,与 WebSockets 相比,REST 更胜一筹。 在支持方面,我们几乎 100% 支持浏览器:caniuse.com/#feat=websockets

以上是关于j2ee服务器都有哪些的主要内容,如果未能解决你的问题,请参考以下文章

在 J2EE 服务器上交付服务时,REST 服务在哪些层工作?

J2EE包括哪些技术

J2EE项目开发常用的.jar包都有哪些,请高手帮忙一一例举,最好是能一次性都发给我。呵呵~谢谢了!

常用的java开发框架都有哪些

请大家介绍下关于JSP和J2EE方面的书

关于J2EE的几个问题