|
@@ -2544,12 +2544,12 @@ System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="
|
|
|
<h2 id="隔离与运行环境">隔离与运行环境</h2>
|
|
|
<p>为了将我们的应用部署到服务器上,我们需要为其配置一个运行环境。从底层到顶层有这样的运行环境及容器:</p>
|
|
|
<ol type="1">
|
|
|
-<li>虚拟机</li>
|
|
|
-<li>应用容器</li>
|
|
|
-<li>Servlet容器</li>
|
|
|
-<li>语言运行环境</li>
|
|
|
-<li>语言虚拟机</li>
|
|
|
-<li>DSL</li>
|
|
|
+<li>隔离硬件:虚拟机</li>
|
|
|
+<li>隔离操作系统:容器虚拟化</li>
|
|
|
+<li>隔离底层:Servlet容器</li>
|
|
|
+<li>隔离依赖版本:虚拟环境</li>
|
|
|
+<li>隔离运行环境:语言虚拟机</li>
|
|
|
+<li>隔离语言:DSL</li>
|
|
|
</ol>
|
|
|
<p>实现上这是一个请求的处理过程,一个HTTP请求会先到达你的主机。如果你的主机上运行着多个虚拟机实例,那么请求就会来到这个虚拟机上。又或者是如果你是在Docker这一类容器里运行你的程序的话,那么也会先到达Docker。随后这个请求就会交由HTTP服务器来处理,如Apache、Nginx,这些HTTP服务器再将这些请求交由对应的应用或脚本来处理。随后将交由语言底层的指令来处理。</p>
|
|
|
<figure>
|
|
@@ -2599,14 +2599,15 @@ System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="
|
|
|
</figure>
|
|
|
<p>LXC时每个虚拟机只能是一个虚拟机,而Docker则是一系列的虚拟机。</p>
|
|
|
<h3 id="隔离底层servlet容器">隔离底层:Servlet容器</h3>
|
|
|
-<p>在上面的例子里我们已经隔离开了操作系统的因素,接着我们还需要解决操作系统、开发环境引起的差异。在开发Java Web应用的过程中,我们在开始环境使用Jetty来运行我们的服务,而在生产环境使用Tomcat来运行。他们都是Servlet容器,可以在其上面运行着同一个Servlet应用。Servlet是指由Java编写的服务器端程序,它们是为响应Web应用程序上下文中的HTTP请求而设计的。它是应用服务器中位于组件和平台之间的接口集合。</p>
|
|
|
-<p>另外一个不得不提及的是CGI,而CGI存在一个缺陷就是,它会每个请求派生不同的进程,服务完成后才销毁。</p>
|
|
|
+<p>在上面的例子里我们已经隔离开了操作系统的因素,接着我们还需要解决操作系统、开发环境引起的差异。早期开发Web应用时,人们使用CGI技术,它可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。并且CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。而这样的脚本语言在多数情况下是依赖于系统环境的,特别是针对于C++这一类的编译语言来说,在不同的操作系统中都需要重新编译。</p>
|
|
|
+<p>而Java的Servlet则是另外一种有趣的存在,它是一种<strong>独立于平台和协议</strong>的服务器端的Java应用程序,可以生成动态的Web页面。</p>
|
|
|
<h4 id="tomcat">Tomcat</h4>
|
|
|
-<p>Tomcat服务器是一个免费的开放源代码的Web应用服务器。它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。除此,它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。</p>
|
|
|
-<p>这里的内容主要以Servlet容器来展开。Servlet被部署在应用服务器中,并由容器来控制其生命周期。在运行时由Web服务器软件处理一般请求,并把Servlet调用传递给“容器”来处理。并且Tomcat也会负责对一些静态资源的处理。其架构如下图所示:</p>
|
|
|
+<p>在开发Java Web应用的过程中,我们在开始环境使用Jetty来运行我们的服务,而在生产环境使用Tomcat来运行。他们都是Servlet容器,可以在其上面运行着同一个Servlet应用。Servlet是指由Java编写的服务器端程序,它们是为响应Web应用程序上下文中的HTTP请求而设计的。它是应用服务器中位于组件和平台之间的接口集合。</p>
|
|
|
+<p>Tomcat服务器是一个免费的开放源代码的Web应用服务器。它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。除此,它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。其架构如下图所示:</p>
|
|
|
<figure>
|
|
|
<img src="chapters/chapter4/tomcat-architecture.png" alt="Tomcat架构" /><figcaption>Tomcat架构</figcaption>
|
|
|
</figure>
|
|
|
+<p>Servlet被部署在应用服务器中,并由容器来控制其生命周期。在运行时由Web服务器软件处理一般请求,并把Servlet调用传递给“容器”来处理。并且Tomcat也会负责对一些静态资源的处理。</p>
|
|
|
<h3 id="隔离依赖版本虚拟环境">隔离依赖版本:虚拟环境</h3>
|
|
|
<p>对于Java这一类的编译语言来说,不存在太多语言运行带来的问题。而对于动态语言来说就存在这样的问题,如Ruby、Python、Node.js等等,这一个问题主要集中于开发环境。当然如果你在一个服务器上运行着几个不同的应用来说,也会存在这样的问题。这一类的工具在Python里有VirtualEnv,在Ruby里有RVM、Rbenv,在Node.js里有NVM。</p>
|
|
|
<p>下图是使用VirtualEnv时的不同几个应用的架构图:</p>
|