web中间件
1 中间件是什么
中间件(英语:Middleware)是提供系统软件和应⽤软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是:将应⽤程序运⾏环境与操作系统隔离,从⽽实现应⽤程序开发者不必为更多系统问题忧虑,⽽直接关注该应⽤程序在解决问题上的能⼒ 。容器就是中间件的⼀种。
也就是说,关于中间件,我们可以理解为:是⼀类能够为⼀种或多种应⽤程序合作互通、资源共享,同时还能够为该应⽤程序提供相关的服务的软件。(注意:中间件是⼀类软件的总称,不是单独的⼀个软件)
我们经常管web中间件叫做web服务器或者web容器
正常情况下⼀次web的访问顺序是:web浏览器---服务器(硬件)---web容器---web应⽤服务器---数据库服务器。
2 常见中间件简述
Tomcat
Tomcat 是Apache 软件基⾦会(Apache Software Foundation)的Jakarta 项⽬中的⼀个核⼼项⽬,由Apache、Sun 和其他⼀些公司及个⼈共同开发⽽成。因为Tomcat 技术先进、性能稳定,⽽且免费,因⽽深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为⽬前⽐较流⾏的Java Web 应⽤服务器(Servlet 容器)。实际上Tomcat 部分是Apache 服务器的扩展,但它是独⽴运⾏的,所以当你运⾏tomcat 时,它实际上作为⼀个与Apache 独⽴的进程单独运⾏的。Tomcat 服务器是⼀个免费的开放源代码的Web 应⽤服务器,属于轻量级应⽤服务器,在中⼩型系统和并发访问⽤户不是很多的场合下被普遍使⽤,是开发和调试JSP 程序的⾸选。Tomcat默认使⽤ 8080 号端⼝
WebLogic 是美国Oracle公司出品的⼀个application server,确切的说是⼀个基于JAVAEE架构的中间件,WebLogic是⽤于开发、集成、部署和管理⼤型分布式Web应⽤、⽹络应⽤和数据库应⽤的Java应⽤服务器。将Java的动态功能和Java Enterprise标准的安全性引⼊⼤型⽹络应⽤的开发、集成、部署和管理之中。Weblogic默认端⼝是 7001。
Jboss 是⼀个基于Java EE的开放源代码的应⽤服务器。 它不但是Servlet容器,⽽且也是EJB容器,从⽽受到企业级开发⼈员的欢迎,从⽽弥补了Tomcat只是⼀个Servlet容器的缺憾。JBoss是⼀个管理EJB的容器和服务器。但JBoss核⼼服务不包括⽀持 servlet/JSP 的WEB容器,⼀般与 Tomcat 或 Jetty 绑定使⽤。Jboss默认端⼝号是8080。
Jetty 是⼀个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运⾏环境。Jetty是使⽤JAVA编写的,它的API以⼀组JAR包的形式发布。开发⼈员可以将Jetty容器实例化成⼀个对象,可以迅速为⼀些独⽴运⾏(stand-alone)的Java应⽤提供⽹络和web连接。
WebShere 是 IBM 的软件平台。它包含了编写、运⾏和监视全天候的⼯业强度的随需应变 Web 应⽤程序和跨平台、跨产品解决⽅案所需要的整个中间件基础设施,如服务器、服务和⼯具。WebSphere 提供了可靠、灵活和健壮的软件。WebSphere 是⼀个模块化的平台,基于业界⽀持的开放标准。可以通过受信任和持久的接⼝,将现有资产插⼊ WebSphere,可以继续扩展环境。WebSphere 可以在许多平台上运⾏,包括 Intel、Linux 和 z/OS。Webshere默认端⼝号是 9080。
GlassFish 是⼀款强健的商业兼容应⽤服务器,达到产品级质量,可免费⽤于开发、部署和重新分发。开发者可以免费获得源代码,还可以对代码进⾏更改。
3 常见WEB中间件细节
3.1Tomcat
3.1.1概念
Tomcat 服务器是⼀个开源的轻量级Web应⽤服务器,在中⼩型系统和并发量⼩的场合下被普遍使⽤,
是开发和调试Servlet、JSP 程序的⾸选。
3.1.2 原理
Tomcat结构图:
Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核⼼。
⼀个Container容器和⼀个或多个Connector组合在⼀起,加上其他⼀些⽀持的组件共同组成⼀个Service服务,有了Service服务便可以对外提供能⼒了,但是Service服务的⽣存需要⼀个环境,这个
环境便是Server,Server组件为Service服务的正常使⽤提供了⽣存环境,Server组件可以同时管理⼀个或多个Service服务。
3.1.3两⼤组件
1、Connector
⼀个Connecter将在某个指定的端⼝上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建⼀个 Request 和 Response 对象分别⽤于和请求端交换数据,然后会产⽣⼀个线程来处理这个请求并把产⽣的 Request 和 Response 对象传给处理Engine(Container中的⼀部分),从Engine出获得响应并返回客户。
Tomcat中有两个经典的Connector,⼀个直接侦听来⾃Browser的HTTP请求,另外⼀个来⾃其他的WebServer请求。HTTP/1.1 Connector在端⼝8080处侦听来⾃客户Browser的HTTP请求,AJP/1.3 Connector在端⼝8009处侦听其他Web Server(其他的HTTP服务器)的Servlet/JSP请求。
Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是Connector 设计的核⼼。
2、Container
Container是容器的⽗接⼝,该容器的设计⽤的是典型的责任链的设计模式,它由四个⾃容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常⼀个Servlet class对应⼀个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义⼀个更⾼的Container,如Context。
Context 还可以定义在⽗容器 Host 中,Host 不是必须的,但是要运⾏ war 程序,就必须要 Host,因为 war 中必有 l ⽂件,这个⽂件的解析就需要 Host 了,如果要有多个 Host 就要定义⼀个 top 容器 Engine 了。⽽ Engine 没有⽗容器了,⼀个 Engine 代表⼀个完整的 Servlet 引擎。
Engine 容器
Engine 容器⽐较简单,它只定义了⼀些基本的关联关系
Host 容器
Host 是 Engine 的⼦容器,⼀个 Host 在 Engine 中代表⼀个虚拟主机,这个虚拟主机的作⽤就是运⾏多个应⽤,它负责安装和展开这些应⽤,并且标识这个应⽤以便能够区分它们。它的⼦容器通常是 Context,它除了关联⼦容器外,还有就是保存⼀个主机应该有的信息。
Context 容器
Context 代表 Servlet 的 Context,它具备了 Servlet 运⾏的基本环境,理论上只要有 Context 就能运⾏ Servlet 了。简单的Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它⾥⾯的 Servlet 实例,Servlet 实例在 Context 中是以Wrapper 出现的,还有⼀点就是 Context 如何才能到正确的 Servlet 来执⾏它呢? Tomcat5 以前是通过⼀个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前⾯的时序图中就可以发现获取⼦容器都是通过 request 来分配的。
Wrapper 容器
Wrapper 代表⼀个 Servlet,它负责管理⼀个 Servlet,包括的 Servlet 的装载、初始化、执⾏以及资源回收。Wrapper 是最底层的容器,它没有⼦容器了,所以调⽤它的 addChild 将会报错。
Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有⼀个 Servlet 初始化信息的
ServletConfig,由此看出StandardWrapper 将直接和 Servlet 的各种信息打交道。
3、其他组件
Tomcat 还有其它重要的组件,如安全组件 security、logger ⽇志组件、session、mbeans、naming 等其它组件。这些组件共同为Connector 和 Container 提供必要的服务。
3.1.4 HTTP请求过程
Tomcat Server处理⼀个HTTP请求的过程
1、⽤户点击⽹页内容,请求被发送到本机端⼝8080,被在那⾥监听的Coyote HTTP/1.1 Connector获得。
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调⽤JspServlet的doGet()或doPost().执⾏业务逻辑、数据存储等程序。
7、Context把执⾏完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。
3.2 Jetty
3.2.1 什么是jetty?
简单来讲jetty就是⼀个开源HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运⾏时环境。⽐如Java web应⽤最常⽤的Servlet容器和Tomcat。由于其轻量、灵活的特性,jetty也被应⽤于⼀些知名产品中,例如ActiveMQ、maven、spark、gooleAppEngine、Eclipse、Hadoop等。
3.2.2 为什么使⽤jetty?
1.异步的Servlet,⽀持更⾼的并发量。
2.模块化的设计,更灵活,更容易定制,也意味着更⾼的资源利⽤率。
3.在⾯对⼤量长连接的业务场景下,jetty默认采⽤的NIO模型是更好的选择。
将jetty嵌⼊到应⽤中,使⼀个普通应⽤可以快速⽀持HTTP服务。
3.2.3 与tomcat的对⽐
jetty⽐较容易贴合第三⽅框架,⽐如你可以直接⽤Spring配置⼀个jetty服务器
直接将jetty作为提供HTTP服务的组件,嵌⼊到应⽤中
jetty是⾯向Handler的架构,⽽tomcat是⾯向容器的架构
jetty默认采⽤NIO技术,⽽tomcat默认是BIO
jetty⾼度模块化,可以很灵活的管理拓展组件,⽽tomcat对其他组件的管理则相对困难
3.2.4 jetty的基本架构
3.2.5 jetty的项⽬结构
3.3 Nginx
3.3.1代理服务器
Nginx就是反向代理服务器。
⾸先我们先来看看什么是代理服务器,代理服务器⼀般是指局域⽹内部的机器通过代理服务发送请求
到互联⽹上的服务器,代理服务器⼀般
作⽤于客户端。⽐如GoAgent,FQ神器。
⼀个完整的代理请求过程为:客户端⾸先与代理服务器创建连接,然后根据代理服务器所使⽤的代理协议,请求对⽬标服务器创建连接、或则获得⽬标服务器的指定资源。Web代理服务器是⽹络的中间实体。代理位于Web客户端和Web服务器之间,扮演“中间⼈”的⾓⾊。 HTTP的代理服务器既是Web服务器⼜是Web客户端。
代理服务器是介于客户端和Web服务器之间的另⼀台服务器,有了它之后,浏览器不是直接到Web服务器去取回⽹页,⽽是通过向代理服
务器发送请求,信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏
览器。
正向代理是⼀个位于客户端和原始服务器之间的服务器,为了从原始服务器取的内容,客户端向代理发送⼀个请求并指定⽬标(原始服务
器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端必须要进⾏⼀些特别的设置才能使⽤正向代理。
反向代理服务器:在服务器端接收客户端的请求,然后把请求分发给具体的服务器进⾏处理,然后再将服务器的响应结果反馈给客户端。
Nginx就是其中的⼀种反向代理服务器软件。
Nginx:Nginx(“engine x”),Nginx是俄罗斯⼈Igor Sysoev(塞索耶夫)编写的⼀款⾼性能的 HTTP 和反向代理服务器。也是⼀个
IMAP/POP3/SMTP代理服务器,也就是说,Nginx本⾝就可以托管⽹站,进⾏HTTP服务处理,也可以作为反向代理服务器使⽤。
web服务器主要提供什么服务正向代理客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端⼝。
反向代理正好与正向代理相反,对于客户端⽽⾔代理服务器就像是原始服务器,并且客户端不需要进⾏任何特别的设置。客户端向反向代理
的命名空间中的内容发送普通请求,接着反向代理将判断向哪个原始服务器转交请求,并将获得的内容返回给客户端。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论