中间件原理

本文深入探讨了中间件的概念,以Tomcat为例解析了Web容器的工作原理,包括TCP请求处理、HTTP协议解析、动态网页生成等。同时,文章也介绍了EJB(Enterprise JavaBeans)作为远程对象服务技术的基础,以及EJB容器如何管理EJB对象的生命周期和事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中间件原理


1. tomcat

        使用tomcat已经有很长一段时间了,对weblogic也大概了解过,但是因为不做大型项目,因此对于分布式应用的开发了解得比较少。对于什么是中间件,也只是一个模糊的概念。

        开始只知道Tomcat,必须有tomcat软件和JDK软件配合使用,至于怎么配合使用的,就没有深究过。每次做项目,就是安装JDK,然后安装Tomcat,然后就是编写java和jsp程序。

        最近用Delphi写了个基于UDP的可靠文件传输系统,大概了解了多线程编程以及网络协议栈的工作过程。现在突然想了解一下什么是中间件,就大概百度了一下关于中间件的原理。


        中间件:为什么叫中间件,那肯定是位于中间的软件了,下面是什么,就是操作系统底层,上面是什么,就是应用软件系统。中间件不针对具体的软件项目,但它也不是最基础的软件,必须有底层的支撑软件才能运行。

        一个偶然的机会,我发现关闭了tomcat进程,依然可以访问我的web系统,没有任何异样。然后我敢确定,所有的服务都来自那个java进程。即然是java进程,那么tomcat的核心不就是java程序,这让我相信了解tomcat并不会太困难。


        翻阅了一些资料后,我大概了解了web容器、EJB容器大概是什么东西。

  

2. web系统原理

    从web服务器原理说起:web服务器,如apache,负责实现http协议,实现一个静态页面网站的实现。

     1) 浏览器客户端发出http请求,经过网络传送到服务器。

     2) 服务器监听TCP协议端口(如80端口),服务器对接收的TCP数据包进行解析,

           数据包其实就是一个文本串,其中包含了请求的文件路径、cookies及其他一些信息。

     3)服务器根据url文件路径找到本地文件,根据信息,填充Http数据包头部,然后附加文件内容

          并发送给客户端(TCP数据包)。

     4)浏览器收到http数据包,解析http包头信息,获得文件的类型,根据类型显示html文件。

     5)如果http中包含css、javascript、图片等连接,则会再次向服务器请求该文件。因此一个网页

          并不是一次请求完成的,而是经过n次请求才获得完整的页面显示。

          这也是为什么很多网站把背景图片全部集中到一个图片中可以加快页面显示速度的原因之一。


3. 动态web页面原理

    就是服务器根据http请求的参数不同或者服务器当前的状态不同,返回的html页面的内容也不同。

    1)客户端获得的永远是静态html文本。所谓的动态,就是对同一个JSP文件的请求,可以获得不

         同的静态文本。

    2)服务器端,是根据http请求数据包的内容和服务器保存的全局参数来生成一个响应页面。因此

         服务器可以根据需要随意产生响应。

    3)我们可以自己用java、c、c++、delphi等任意语言写一个http服务器,然后根据客户端的请求

         内容来输出一个html文本内容给浏览器。这与tomcat的原理是一样的。

         例如,客户请求 GET /getimage/name=tomcat

         如果我写一个服务器,解析这个url,发现命令是getimage,那么就产生一个jpg图片,并根据

         参数name=tomcat输出一个字符串内容的图片,返回给浏览器的应答设定http头部为图片类

        型,然后浏览器就显示一个图片,而不是一个文本。

   4)URL只是被规定为符合要求的一个字符串,并没有规定要怎样解析这个字符串,因此很多web

         服务器可以解析一些很奇怪的url。其实在tomcat中,也可以灵活设置怎么解析URL。

         如为jsp解析器指定模式满足/*.jsp的url请求。


4. Tomcat实现的功能

    一个tomcat实例启动一个服务器,也就是对应一个server.xml文件,

       < server >           :一个服务器就是java进行实现。

             < service>   :一个线程实现一个服务,因此一个服务器中可以运行多个独立的软件项目。

                  < connector >:一个应用软件项目可能由多个端口协同实现,监控多个TCP端口。

                        < Host >:我们可能把几个域名解析到同一个IP:Port,

                                         同一个JSP可以根据域名来向客户端提供不同内容。

                       < Host >:

                             <context>:同一个主机,可以设定多个目录来组合成一个完整的应用。

                             <context>:   

                  < connector>:

             < service >

      < server >

      

     从配置文件可以看出,tomcat实现一个很复杂的容器关系(这里我们称这些概念对象为容器)。从技术上来说,server和service只是一个概念(内存中就是一个对象),是用来做生命周期管理的,tomcat主线程,可以根据需要关闭一个service(多个线程组成)或者关闭server(java退出)。Connector则对应了服务线程,它是一个操作系统线程,监控着某个TCP端口(如80、8080、8009、8443端口等)。

     客户端向tomcat请求一次服务(如获取一个jsp页面),TCP数据包是直接被操作系统分派给Connector对应的线程处理的:

     1)首先,Connector处理线程实现了基本http协议,如果是静态html页面请求,直接获取本地文件返回即可。      如果不是,那么就要创建一个HttpProcessor来处理本次的请求。

      其实系统不会每次等有请求的时候再来创建HttpProcessor,采用线程池可以提高反应速度。

      (这里其实就是常规的TCP多线程编程)

       这里:request、response对象已经被创建了,接下来就是对request进行处理,填充response的过程。request是根据http请求包内容创建的,response这里仅仅是初始化。

     2)HttpProcessor线程,是可以访问Connector对象的,同一个Service下的所有对象都可以被索引到。然后就调用Connector的容器对象(getContainer)的invoke方法来处理requst和response。

     3)可以看到,每个http请求,这里已经交给了单独的线程来处理,然后HttpProcessor调用容器的函数来处理请求,就不再管处理的细节。

     4)从Connector容器开始,就是一层一层地往更小的容器调用,其实就是对请求的类别进行分开处理,我们也可以实现就一个容器处理所有的逻辑。

     例如对于不同的域名请求(多个域名DNS解析到同一个IP),调用不同的host对象(容器)来处理该请求。

     5)request和response对象最终被传递到了wrapper容器。

     这里,我们可以设置过滤器,为什么要设置过滤器呢,这是为了让用户可以灵活配置不同的类别的请求用不同的处理方法。如JSP文件必须经过翻译成java然后编译成class,而servlet则可以直接加载类。或者我们还有其他一些的过滤规则,也可以通过开发过滤器来实现。

      过滤器组成一个链条,放在一个管道中,每次request和response经过管道处理,如果某个过滤器阻止该请求被进一步处理(如对/web-inf目录的请求),则处理终止并返回。如果管道内的所有开关(过滤器)都打开,那么最后一个默认阀检查没问题后则开放给子容器处理。

     6)因此在HttpProcessor线程中,经过N层的调用,request和response最终被传递给了Servlet或JSP处理,JSP最终也会被变成java,并编译成class加载到内存。


5. EJB

    EJB是基于RMI技术的一种远程对象服务技术,类似COM+。

   1)RMI,就是remote method invoke。远程方法调用。

        无论是同一个主机不同进程,还是不同主机之间的进程间,都必须采用异步数据包交互方式。

        就是调用者发送一个数据包(信息包)给目标进程,目标进程收到数据包(信息包)后返回处理结果给调用者。可见调用不是基于内存直接访问的。其实就是一个网络程序。

   2)调用者首先在本地创建一个对象,该对象输出一些方法,对这些方法的调用,实际上已经被本地对象转换成对远程对象的访问,可能通过消息机制,可能通过TCP等网络协议,将请求的数据包(其中可能包含一些基本参数和对象,因此作为参数传递的对象必须实现序列化,其实就是将对象变成字节数组好打包传输)传递到远程监控系统,因此远程监控系统肯定是多线程的,服务器线程收到数据包,然后就开始处理类名、方法名和参数,然后在本地创建对象或从对象池(也可能已经创建了对象池)选择一个对象来处理请求(将参数中的对象反序列化成本地对象)。处理完成后,返回给调用者,调用者再返回结果(结果是对象时也一样要反序列化)。

      


6.EJB 容器:

   就是可以管理这些EJB对象的程序,它负责EJB对象的生命周期,已经对于EJB系统的事务控制以及安全性检测。如哪些用户只容许访问哪些EJB对象。

SessionEJB,会话EJB,就是EJB在一次会话中一直活着,不回被释放。直到调用者显示释放该远程对象,结束回话。调用者说,服务器请给我创建一个会话EJB,然后服务器就创建了,只要调用者不退出,服务器就一直维持EJB对象直到天荒地老。然后调用者说,好了,我的服务完成了,那么服务器就释放该EJB(如果EJB是无状态的,那么也可以放到对象池中)。

  EJB容器可能还包含负载平衡。

  可见,EJB可以实现分布式应用,但是没有EJB我们也一样可以实现分布式应用,只是可能比较麻烦些,开发的性能可能不理想,但是如果你很NB,那么自己开发分布式应用性能肯定更好。

  采用EJB方式是要牺牲性能的,除非有必要,不要为了技术而技术。

   

             

          

       



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值