微信号:infoqchina

介绍:有内容的技术社区媒体

前端工程精粹(三):本地调试与数据模拟

2013-12-24 18:03 InfoQ

自Web项目诞生以来,程序员们渐渐把整个项目的开发拆分为了前端与后端两个部分。随着项目复杂度的不断增加,同时为了快速迭代出更多Web项目,IT界就把两个部分的工作分成了两个工种来完成--前端开发工程师以及后端XX语言开发工程师(我们在此简称为FE与RD)。所以,在一个Web项目开发过程中,就出现了前后端定义数据接口、参数等等工作,同时产生了一个巨大的耦合问题--前端工程师完全需要依赖后端工程师的数据接口以及后端联调环境。当一个FE快速完成了页面的搭建,需要后端数据来完成页面交互等工作时,他唯一能做的就是等待RD完成他的工作,有时甚至还需要RD来搭建一个联调环境等等。


也许更多时候情况比我上述所说的更复杂,需要项目管理者协调好项目进度、前后端协同开发等等问题。当然更多时候FE希望自己能解决这些问题,靠别人不如靠自己,对吧?这时候为了不依赖后端工程师,可以自己搞定后端环境及数据,都需要准备什么呢?下面我来举例:

  • 完整的server支持,可以真实运行模板、后端程序等,同时最好满足可以跨平台运行、支持常用后端语言(java、php)等

  • 模拟url请求,能够有控制url请求的能力,不是单纯的直接访问返回内容的server,通过控制url来解决ajax请求模拟返回的功能

  • 数据模拟,有本地数据mock的能力,分离模板与对后端数据的依赖,使得fe能独立于rd进行项目开发

如果可以达到以上要求,你便能拥有一套完整的本地开发环境,拥有独立开发前端项目的环境以及解决与后端开发的耦合问题。使用过FIS2.0的用户也许会发现,FIS2.0可以完整解决以上的问题,在任何地方、任何环境都可以独立开发,接下来我为大家介绍下FIS本地开发环境是如何做到这些要求的。


一个轻巧独立的服务器


我们需要一个什么样的Server?


  • 可以监听请求,负责对页面请求进行响应

  • 后端语言的解析能力,比如可运行java、php等,不是简单的静态Web服务器

  • 易搭建,没有繁琐的安装过程,尽可能的不依赖其他复杂环境

  • 性能与可伸缩性,可快速的响应请求,同时稳定响应一定级别的并发数

  • 平台需求,可跨平台运行,解决使用不同平台开发的用户需求

  • 可靠性,可稳定长期运行,有服务器异常处理机制等

以上这些就是我们总结出一个合理可靠轻巧的服务器需要达到的要求,它是本地开发环境的基石。面对需求,我们需要的就是解决这些需求,当然从最开始用很挫的方式一步一步尝试,到最后发现需要怎么实现这个server,经历的痛苦也是不言而喻的。最后我们发现需要实现以下内容以及找到了一些匹配的“轮子”来做这些事:

  • 为了可跨平台部署及易搭建,我们选择了用JAVA开发。

  • 为了满足性能需求,我们需要多个CGI进程来处理并发请求,同时需要一个队列来保证接受请求不会丢失

  • 为了可以运行PHP程序,我们选择使用PHP-CGI进行解析以及通过Fastcgi协议与其通信

  • 为了可扩展不同的Web服务,我们需要一个可灵活扩展的Servlet容器,可处理不同的Web应用

  • 为了保证服务器的稳定性,我们需要一个服务器守护进程,保证服务器是正常运行的

我们需要一个强大的HTTP SERVER来监听请求、分析HTTP协议、创建socket通讯,同时还得需要一个Servlet容器来扩展不同的Servlet服务,进行不同Web应用的解析,因此我们选择了JETTY来作为SERVER的Web服务器。JETTY可做作为Web服务器嵌入到JAVA程序中,而且是轻量级、性能极高的,同时提供灵活可扩展的Servlet容器,满足开发针对各类Web应用的业务Servlet。


选择了JETTY,就意味着sever天生就可以运行JSP/Servlet,剩下我们需要解决的就是如何运行PHP了。为了跨平台且满足高效的性能,我们选择了使用FASTCGI开发扩展与PHP-CGI进行通信,server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi,子进程完成处理后将标准输出和错误信息从同一连接返回Server。我们为了可以解决并发请求必须启动多个PHP-CGI进程,保持可以多线程处理请求。同时需要一个进程管理器对PHP-CGI进行管理,比如当PHP-CGI处理了几千个请求有内存溢出现象时,需要KILL掉重新启动新的PHP-CGI进程,以及当PHP-CGI进程出现异常情况挂掉后,会及时发现且启动新的进程保持可用的进程数。


当然你会发现做这些事是十分困难的,需要将HTTP SERVER与PHP-CGI建立链接、通过FASTCGI协议封装请求与PHP-CGI进行通信等等。我们最开始也尝试过且成功的运行了服务器,只是发现并不是那么完美,特别是在进程管理方面。最后我们发现了一个牛逼且轻巧的东西——php-java-bridge,利用其对PHP-CGI封装的FastCGIServlet,与JETTY进行完美对接,可在多平台且高性能的运行PHP。其实php-java-bridge的作用不止于此,它最厉害的地方是可以在PHP中运行JAVA程序,这就是另外一个扩展点了。


有了以上这些开源的东西,我们要做的就是把这个服务器如何搭建起来,建立对应的Web应用。JETTY作为内嵌Web服务器,需要一个基础的Web.xml初始化参数,同时建立WebAppContext来负责处理Web应用请求。在Jetty中,有几个比较重要的模块:

  • Connector负责解析服务器请求并产生应答,不同的Connector用于处理不同协议的请求。

  • Handler用于处理经过Connector解析的请求并产生应答内容,同样可以通过配置不同的Handler来负责处理不同的请求。

  • TheadPool:管理和调度多个线程,用于服务于多个连接请求。

  • Server代表一个Jetty服务器对象,主要作用是协同Connector、Handler和TheadPool的工作。

JETTY启动需要做的事,启动ThreadPool线程池,启动设置到 Server 的 Handler,通常这个 Handler 会有很多子 Handler,这些 Handler 将组成一个 Handler 链。最后会启动 Connector,打开端口,接受客户端请求。在启动handler时,会启动Handler链上的子Handler,比如我们针对运行一个Web应用程序创建一个WebAppContext,同时在WebAppContext初始化时设置处理请求时对应的Servlet,这样配置的请求都会传送到这个WebAppContext进行处理。


更多精彩内容,点击阅读原文。


Merry Christmas! :)

***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 那些被误解的用户体验 中间件mysql-proxy的一些细节 分布式中Redis实现Session终结篇 “天猫双11狂欢夜”启发广告和卫视圈的是创新模式,革新技术圈的是实时互动 可随意更换图案的运动鞋