我之前只了解后端框架(Web Framework),我一直以为这就是后端的全部了,在服务器上运行一个后端框架程序(App),并暴露到特定端口(HTTP 是 80 端口),用户就会通过这个端口和后端进行通信,浏览器发送 http request, 后端发送给浏览器 html, css, Javascript 三件套。例子有 Rails, Django 等。

示意图如下所示:

 
     +---------------+                  
     |               | render html and css
     |    Browser    | run javascript   
     |               |                  
     +----+-----+----+                   
          |     ^                       
  HTML    |     |                       
 Request  |     |                       
         +-------+                      
---------|  P80  |-------------------------
         +-------+                      
          |     |  html, css            
          |     |  javascript           
          v     |                       
      +---+-----+----+                  
      |              |                  
      |  Backend App | maintain states  
      |              | build web content
      +--------------+
 

在这其中后端 APP 承担了维护状态(因为 http 本身无状态)和生成 web 页面的工作(也就是生成 html, css, js)。

但是存在两个问题:

  • 一个操作系统只有一个 80 端口,那么一个操作系统只能和一个后端 APP 通信。
  • 后端框架的核心任务是维护 http 维护不了的状态,降低开发的难度,但是如果有很多用户访问 80 端口,这就涉及了高并发吞吐量的场景。这并不是后端框架擅长解决的。

所以“和多个用户进行高并发通信,分发 request 和 response”的任务并不是后端框架来完成,而是用 Web Server 来完成,常见的 Web Server 有 ApacheNginx 。整体架构图变成了这样:

 
     +---------------+                  
     |               | render html and css
     |    Browser    | run javascript   
     |               |                         
     +----+-----+----+                   
          |     ^                       
  HTML    |     |                                       
 Request  |     |                                       
         +-------+                                      
---------|  P80  |--------------------------------      
         +-------+                           
          |     |  html, css                 
          |     |  javascript                
          v     |                            
      +---+-----+----+                       
      |              |     HTTP
      |  Web Server  | throughoutput         
      |              |                       
      +------+-------+                       
             +------------------------+      
             |        maintain        |      
      +------+-------+  state  +------+-------+
      |              |         |              |
      | Backend App1 |         | Backend App2 |
      |              |         |              |
      +--------------+         +--------------+
 

总结一下:

对于像 django、rails、sinatra、spring-mvc 这样的 Web 框架,主要关注的是开发的简易性、对请求对象的完整访问、在需要时维护某些状态的能力,最重要的是,有一种方法来编写所有的业务层逻辑。

对于像 apache、tomcat、nginx 这样的 Web 服务器,面临的挑战是并行执行、同时维护与数千个用户的连接(并发性)。能够在给定时间内传输大量数据(吞吐量)等。