[关闭]
@lsmn 2018-03-20T02:43:26.000000Z 字数 3342 阅读 3830

任何人都可以借助Workers在Cloudflare上运行JavaScript了

安全 Cloudflare JavaScript


摘要

任何人都可以借助Workers在Cloudflare上运行JavaScript了。Workers使用标准的Service Workers API编写,运行在一个基于V8构建的新环境中。5个月前,该服务开始了Beta测试,如今,Cloudflare Workers已经准备好向所有人提供服务了。

正文

一年前的今天,Cloudflare给我一项任务:让人们可以在Cloudflare的边缘服务器上运行代码。那时,我们还不知道那是什么意思。是基于容器吗?一种新的图灵不完备的领域专属语言?Lua?“函数?”我们有很多想法。

最终,我们做出了现在看来似乎很明显的选择:JavaScript,使用标准的Service Workers API,运行在一个基于V8构建的新环境中。5个月前,我们扼要介绍了我们正在构建的东西,并开始了Beta测试。

如今,Cloudflare已经部署了数以千计的脚本,并为数以十亿计的请求提供服务,Cloudflare Workers已经准备好向所有人提供服务了。

“放弃VCL并采用Cloudflare Workers让我们可以做一些创造性的路由选择,从而让我们可以比现在更快地把JavaScript交付给数以百万计的npm客户。我们将在Cloudflare平台上构建我们下一代的服务,我们将使用JavaScript实现!”

— CJ Silverio,npm公司首席技术官

什么是真正的云?

过去,Web应用程序代码分成了两部分,服务器一部分,浏览器一部分。两者之间是一个庞大的哑网络负责把数据从一个点传送到另一个点。

我们认为,这有违“云”的初衷。

我们认为,云计算真正的梦想是代码就在网络里。代码不是在“us-west-4”或“南中亚(孟买)”运行,而是随处皆可运行。

具体来说,它应该在最需要它的地方运行。在响应新西兰的用户时,代码应该在新西兰运行。在处理数据库里的数据时,代码应该在存储数据的机器上运行。在和第三方API交互时,代码应该在托管API的地方运行。当人类探险者到达火星,他们不会愿意花一个半小时的时间等待App响应——代码需要在火星上运行。

Cloudflare Workers是我们向着这个目标迈出的第一步。当你部署一个Worker时,它会在30秒之内部署到Cloudflare的整个边缘网络,全世界100多个地点。域中的每个请求都会由离用户近的Cloudflare地点的Worker来处理,不需要用户考虑自己的地点。我们上线的地点会越来越多,你的代码就越来越能“随处运行”。

好吧……我们不会在火星上运行。目前还没有。你在那里吗,艾伦?

什么是Worker?

Cloudflare Workers的名字来源于Web Workers以及更特别的Service Workers,这个W3C标准API针对的是在浏览器后台运行并拦截HTTP请求的脚本。Cloudflare Workers是使用同样的标准API编写的,但是在Cloudflare的服务器上运行,而不是在浏览器中。

下面是你需要使用的工具:

Workers的使用方法无数,我们很希望看看我们的客户会想出什么。下面是我们在Beta测试中看到的一些方案:

下面是一个例子。

// A Worker:
// 1. 把访问首页(“/”)的访问者重定向到特定国家的页面(例如,“/US/”);
// 2. 阻止盗链;
// 3. 直接从谷歌云存储提供图片服务。
addEventListener('fetch', event => {
  event.respondWith(handle(event.request))
})

async function handle(request) {
  let url = new URL(request.url)
  if (url.pathname == "/") {
    // 这是一个首页(“/”)请求。
    // 重定向到特定国家的路径。
    // 例如,会给美国的用户发送“/US/”。
    let country = request.headers.get("CF-IpCountry")
    url.pathname = "/" + country + "/"
    return Response.redirect(url, 302)

  } else if (url.pathname.startsWith("/images/")) {
    // 这是一个图片(在“/images”目录下)请求。
    // 首先,阻止第三方访问者盗链。
    let referer = request.headers.get("Referer")
    if (referer &&
        new URL(referer).hostname != url.hostname) {
      return new Response(
          "Hotlinking not allowed.",
          { status: 403 })
    }

    // 盗链检查通过。直接从谷歌云存储提供图片服务节省服务成本。
    // 根据Cache-Control头信息,图片会在Cloudflare的边缘服务器缓存。
    url.hostname = "example-bucket.storage.googleapis.com"
    return fetch(url, request)
  } else {
    // 定期请求。转发给源服务器。
    return fetch(request)
  }
}

速度真得很快

有时候,人们问我们,是不是JavaScript很“慢”。事实是最好的证明。

Workers使用谷歌为Chrome构建的V8 JavaScript。V8不仅是JavaScript最快的实现之一,而且是任何动态类型语言的最快实现之一。人们已经针对V8做了大量的优化工作,因此,其性能几乎超过了C/C++、Rust、Go之外的任何服务器编程语言。(顺便说一下,我们很快就会支持这些语言,通过WebAssembly。)

小结:普通的Worker脚本执行时间不到1毫秒。在启用Workers时,大多数用户都无法测量出任何延迟差异——当然,除非他们的Worker在直接从边缘服务器响应时实际上提高了延迟。

关于速度,还有一个方面需要注意,Workers的部署也很快。在你保存并启用脚本后,Workers在30秒内就可以部署到全球。

定价

Workers是Cloudflare的收费扩展。我们希望定价策略尽可能的简单,就像下面这样:

每百万次请求0.50美元,每月最少5美元(包括最初的1000万请求)

入门


Everyone can now run JavaScript on Cloudflare with Workers