本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/introducing-frockgit
Urban Airship是一家帮助领导品牌吸引其移动用户的公司,他们可以帮助这些公司在客户下载完应用后就与公司创建起高价值的关系。github
眼下,Urban Airship已经有了数量庞大的客户群,涵盖的领域有零售业、媒体与娱乐、运动与旅游、医疗等。这些公司都经过Urban Airship来加强其与客户的连结性。近日。来自于Urban Airship的开发人员开源了他们所使用的一款开发工具:frock。该框架用于简化模拟服务套件的管理。数据库
假设你在工做中使用了面向服务的架构,那么frock是很值得你去尝试的一个工具。json
解决开发环境的复杂性gulp
Urban Airship使用了微服务,这对于一家SaaS公司来讲是很常见的模式:咱们有许多服务,每个服务都包装了少许的功能,并且每个服务都能经过定义良好的协议为其它服务所请求。这对于可伸缩性与稳定性来讲是很棒的,只是对于开发人员与其环境来讲却产生了问题。咱们的团队从事Go的开发工做(Go是Urban Airship Engagement仪表盘产品),它是最先期的Urban Airship代码基之中的一个,包括了大量的功能:消息生成与报告、帐单与使用报告。以及服务管理(比方说前不久公布的Urban Airship Connect)。api
Go会调用大量的服务。这致使团队的开发环境产生了许多问题。以前,咱们的环境包括了一个单体的、执行于Vagrant之上的虚拟机。它依赖于仪表盘的所有服务。这么作有许多问题:架构
服务与依赖的数量许多,包括几种不一样的数据库都需要保持在执行状态才行。app
上游对服务的改动会破坏咱们的开发环境,致使咱们许多人都不敢更新。框架
环境的复杂性意味着这样的破坏是会常常发生的。这会浪费大量的时间。并致使开发人员很沮丧。函数
在开发阶段。你需要多种多样的数据来測试代码。
以前的环境一般要求你手工执行測试数据。这是经过与持有数据的服务进行直接的通讯来作到的。
frock就是用来帮助咱们解决上述所有难题的优秀工具。
何为frock?
咱们可以经过frock使用本身定义的数据来模拟服务,使用团队习惯的语言与执行时来编写模拟服务:JavaScript与Node.js。
frock的核心仅仅提供了例如如下一些功能:
所有这一切都是经过一个JSON配置文件(依据约定,该文件名称为frockfile.json)来配置的。并且经过包括了所有本身定义模拟服务的仓库进行共享。frock从grunt与gulp得到了灵感,其配置就位于你的项目其中。对于HTTP模拟来讲,一个frockfile会包括一个简单的服务与路由定义。比方说:
{ "servers": [ { "port": 8080, "routes": [ { "path": "/api/devices", "methods": ["GET"], "handler": "frock-static", "options": { "file": "./fixtures/devices.json", "contentType": "application/json" } }, { "path": "*", "methods": "any", "handler": "frock-proxy", "options": { "url": "http://localhost:8052" } } ] } ] }
这是咱们frockfile中服务定义的一个高度简化的版本号。在訪问Go仪表盘时。你实际上会命中一个高可用的代理:该代理会在内部将流量导向不一样的服务,其中的主服务是Go。只是一些API路由则是由二级服务所处理的。
相比于在本地执行这个二级服务,咱们可以经过frock选择这个路由,并使用模拟的版本号将其替换掉。在上述代码演示样例中,模拟的仅仅是个静态文件,它由frock-static通用静态server插件所处理。所有其它的请求则会直接转向本地执行的Go开发server,server的端口是8052。
编写frock插件
实际上。frock是咱们解决这一问题的第2个平台,第1个平台是个名为“multimock”的工具。它是个单体Python应用,可以建立出多个服务线程,并在到达本身定义处理器以前将其传递给一些通用的转换函数。它可以解决很多问题,只是咱们仍是重写了它,最后才有了frock。为何要这么作呢?这是因为在multimock中编写插件是很困难的事情。在编写frock时,咱们的核心原则是“插件的编写应该保持简单,内建的假设越少越好”。frock经过对插件施加极少的限制来实现这个目标,并且将Node.js HTTP模块的简单性直接应用到了实现中。例如如下代码展现了最简单的一个frock HTTP插件,它仅仅是向命中路由的不论什么请求响应了“hello world!”而已:
// file ./hello-world.js module.exports = createPlugin function createPlugin (frock, logger, options) { return handler function handler (req, res) { res.end('hello world!') } }
假设以前编写过Node.js的请求处理器。那么上述代码就很easy理解了;该frock插件仅仅包括了一个返回路由处理器的工厂函数。
在上述frockfile演示样例中。咱们将这个插件替换为静态文件server:
{ "servers": [ { "port": 8080, "routes": [ { "path": "/api/devices", "methods": ["GET"], "handler": "./hello-world" }, { "path": "*", "methods": "any", "handler": "frock-proxy", "options": { "url": "http://localhost:8052" } } ] } ] }
现在,对http://localhost:8080/api/devices的不论什么请求都会返回“hello world!”。
frock对咱们的帮助做用
大的特性公布常常都是很复杂的:你常常要等待依赖的服务就绪。还要阅读怎样使用这些服务的规范。在快节奏的项目中,这意味着你要不断追赶集成的日期。当终于所有组件都就位后。你但愿他们可以彼此调用成功。
Connect就是这样一个项目,frock可以帮助Web团队构建出令咱们充满自信的项目,并且可以很好地实现集成。
事实上。上面所介绍的关于frock的一切都不是什么革命性的功能,只是frock却可以帮助咱们以一种更简单的方式作到这些。
建议各位读者尝试一下,你会发现它在你的开发环境中是很实用的。frock README包括了一个高速起步指南,另外一个内容丰富的文档与演示样例代码,可以帮助你高速起步。在项目中使用frock并实现本身的插件。