Web应用架构-WebApp Server

   WebApp Server,即网页应用服务。它们负责执行核心的业务逻辑,处理用户请求,并返回HTML给用户浏览器。JavaWeb需要使用Web容器和Web框架,如tomcat和springMVC等。

   如果要系统的了解WebApp,需要从网络IO,web容器,web框架几方面入手。

【网络IO】

     1.IO:本质就是数据不停地搬入搬出缓冲区而已(使用了缓冲区)。比如常见的代码:while((read = inputStream.read(byteArr)) > 0) ,表面上是数据从inputStream中拷贝到byteArr中,其实还是隐含的从磁盘到内核态的内部过程,如下:

       

        由图中可以看出,IO模型分为同步阻塞IO,同步非阻塞IO,异步IO(如linux下的AIO)。

     2. NIO:IO模式建立多个链接,需要多线程。NIO的出现可以单个线程实现多个链接。

                  nio学习步骤:观察者模式-> 事件机制 -> Reactor模式 --> nio -> netty对nio进行了封装简化

                  采用了多路复用IO,即使用了经典的Reactor设计模式,有时也称异步阻塞IO。如Java中的Selector和Linux的epoll都是用到了这种模型。

         1)事件机制,可参考观察者设计模式。 Subject ----> 观察者1,2,3;    Source --(事件对象EventObject)--> 事件监听者(EventListener)

         2)Reactor模式:Reactor负责响应IO,然后分发到具体的Handler来处理。如果多CPU,可以讲Reactor拆分为主reactor和子reactor。

        nio就是基于这种Reactor来实现的,而netty则是基于nio实现的。

               示例代码:

                  Selector selector = Selector.open(); // 1.  网络IO有,文件IO无

                  ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 2. 设置Channel,非阻塞

                  serverSocketChannel.bind(new InetSocketAddress(8989));

                  serverSocketChannel.configureBlocking(false);

                 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 3. 注册事件类型

                 .............      // 4. select()处理,较复杂

                 len=readChannel.read(buffer)  // 5. 缓冲处理

 

    推荐两个IO博客:

        java nio及操作系统底层原理:https://blog.csdn.net/u014507083/article/details/73784898

        多路复用IO与NIO:http://www.cnblogs.com/zwt1990/p/8821185.html

【web容器】

     jetty和tomcat都是一种servlet引擎,支持标准的servlet规范和javaEE规范

     1. Tomcat:

         底层:默认采用IO,处理静态资源性能较差。适用于分布式环境。

         架构:基于Handler,可利用Handler方便的实现扩展。

     2. Jetty:

         底层:默认采用NIO,处理静态资源性能较差。但应用广泛,对javaWeb支持更加全面,适用于企业级环境。

         架构:基于容量,需要了解整体设计结构方可扩展。

     tomcat重点:jetty可参考

    1. tomcat部署方式:

       1)将工程拷贝到webapps目录下。

       2)采用别名的方式,即采用Context和docBase结合使用部署。

       3)采用tomcat管理界面进行war包部署。

    2. tomcat调优:

       1)jvm调优:catalina.bat设置JAVA_OPTS='-Xms256m -Xmx512m'。一般占可用内存的80%

       2)禁用DNS查询:server.xml中,enableLookups="false"。域名查询占用网络资源,会耗时。

       3)调整线程数:server.xml中,修改maxThreads等参数。

    3. tomcat架构: 具体可参考:https://blog.csdn.net/xlgen157387/article/details/79006434

            

 

      1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; 
      2) Server掌管着整个Tomcat的生死大权; 
      3)Service 是对外提供服务的; 
      4)Connector用于接受请求并将请求封装成Request和Response来具体处理; 
      5)Container用于封装和管理Servlet,以及具体处理request请求;

     

 

【web框架】

   1. Spring IOC:https://www.cnblogs.com/ITtangtang/p/3978349.html

   2. Spring AOP: https://blog.csdn.net/jacman/article/details/50373561

   3. SpringMVC:https://www.cnblogs.com/ysocean/p/7375405.html

   4. myBatis: https://blog.csdn.net/u014297148/article/details/78696096

 

posted @ 2018-08-23 11:09  心昂  阅读(228)  评论(0编辑  收藏  举报