@lsmn
2018-03-20T10:43:26.000000Z
字数 3342
阅读 5766
安全
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万请求)
入门
“Cloudflare Workers为我们节省了大量的时间。没有Workers,管理bot流量需要消耗宝贵的开发和服务器资源,有了Workers,这些开发和资源就可以更好地用在其他地方了。”
— John Thompson,MaxMind高级系统工程师