云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

分布式存储_web服务器搭建软件_怎么申请

小七 141 0

介绍Cloudflare Workers:在边缘运行JavaScript服务工人

2018/3/13更新:Cloudflare Workers现已向所有人开放。TL;DR:您很快就可以将JavaScript部署到Cloudflare的边缘,它是针对类似于服务工人的API编写的。试着在操场上写一个工人介绍每一项技术,当足够复杂时,都可以编程。你随处可见,但作为一个终身玩家,我个人最喜欢的例子可能是显卡。在90年代,图形硬件通常提供一组固定的功能。OpenGL标准指定几何图形管道将从三维空间投影到视口中,然后光栅管道将在它们之间绘制三角形,使用渐变着色和纹理应用。一次只能使用一种纹理。当时只有一种照明算法,它或多或少使每个表面看起来像塑料。如果你想做其他事情,你通常不得不完全放弃硬件,转而使用软件。当然,新的算法和技术一直在发展。因此,硬件供应商会将最好的想法作为"扩展"添加到他们的硬件中。OpenGL最终得到了数百个特定于供应商的扩展,以支持多纹理、凹凸贴图、反射、动态阴影等。然后,在2001年,一切都变了。第一个带有可编程着色管道的GPU发布了。现在你可以编写直接在硬件上运行的小程序,以任意方式处理每个顶点或像素。现在人们可以试验渲染真实皮肤的算法,或者卡通阴影,或者其他很多,而不需要等待硬件供应商来实现他们的想法。Cloudflare也将经历类似的转变。在最基本的级别上,Cloudflare是一个HTTP缓存,在全球117个位置运行(而且还在不断增长)。HTTP标准为HTTP缓存定义了一个固定的特性集。当然,Cloudflare做的更多,比如提供DNS和SSL,保护您的站点免受攻击,跨源服务器进行负载平衡,等等。但是,这些都是固定函数。如果您想使用自定义关联算法进行负载平衡,该怎么办?如果标准HTTP缓存规则不太正确,并且需要一些自定义逻辑来提高缓存命中率,该怎么办?如果您想为您的应用程序编写定制的WAF规则呢?你想写代码吗但我们永远不会用这种方式来覆盖所有的情况。相反,我们正在使Cloudflare的边缘网络可编程。我们在全球117多个地点提供服务器--您可以自行决定如何使用它们。当然,当你有成百上千的地点和数以百万计的客户时,传统的托管软件方式就不太管用了。我们不能很好地在每个位置为每个客户提供他们自己的虚拟机,甚至是他们自己的容器。我们需要更具伸缩性和更易于开发人员管理的东西。当然,安全性也是一个问题:我们必须确保部署到Cloudflare的代码不会损害我们的网络,也不会损害其他客户。在研究了许多可能性之后,我们决定使用当今网络上最普遍的语言:JavaScript。我们使用V8运行JavaScript,这是为googlechrome开发的JavaScript引擎。这意味着我们可以在我们的服务器上安全地运行来自多个客户的脚本,就像Chrome从多个网站运行脚本一样——使用经过近十年审查的技术。(当然,我们在上面添加了一些自己的沙盒层。)但是这个JavaScript是针对什么API编写的呢?为此,我们考虑了web标准——特别是服务工人API。服务工人是一个由现代浏览器实现的功能,它允许你加载一个脚本,在发送到你的服务器的web请求到达网络之前拦截它们,允许你重写它们,重定向它们,甚至直接响应它们。ServiceWorker被设计为在浏览器中运行,但事实证明,ServiceWorkerAPI非常适合我们希望在边缘支持的功能。如果您曾经编写过服务工作者,那么您已经知道如何编写Cloudflare服务工作者。它看起来像什么下面是一些您可能在Cloudflare上运行的服务人员的示例。记住:这些是根据标准的服务工人API编写的。唯一的区别是它们运行在Cloudflare的边缘而不是浏览器中。这是一个worker,它跳过缓存中具有Cookie头的请求(例如,因为用户已登录)。当然,一个真实的站点可能有更复杂的缓存条件,但这是代码,所以您可以做任何事情。//一种服务工作线程,如果请求包含//一块饼干。addEventListener('fetch',事件=>{让请求=事件请求如果(request.headers.has('Cookie'){//有饼干。添加缓存控制:无缓存。let newHeaders=新标题(请求.headers)新标题.set('Cache-Control','no Cache')事件响应(fetch(请求,{headers:newHeaders}))}//使用默认行为。返回})这是一个worker,它执行站点范围的搜索和替换,将单词"worker"替换为"Minion"。在这个博客上试试看。//将"工人"一词替换为//"仆从"在所有网站内容。addEventListener("获取",事件=>{事件响应(取回和更换(事件请求))})异步函数fetchAndReplace(请求){//从源服务器获取。let response=等待获取(请求)//确保我们只修改文本,而不是图像。let类型=response.headers.get("内容类型")| |"如果(!启动类型("文本/"){//不是文字。不要修改。返回响应}//读取响应正文。let text=等待响应.text()//修改它。允许修改=文本。替换(/工人/g,"仆从")//返回修改后的响应。返回新响应(已修改{状态:响应.状态,状态文本:响应状态文本,标题:响应.headers})}下面是一个worker,它在页面内容中搜索用双大括号括起来的url,获取这些url,然后将它们替换到页面中。这实现了一种基本模板引擎,支持类似"edgesideincludes"之类的内容。//将{URL}}替换为//URL。("Edge Side Includes"的简化版本。)addEventListener("获取",事件=>{事件响应(获取和包含(事件请求))})异步函数fetchAndInclude(请求){//从源服务器获取。let response=等待获取(请求)//确保我们只修改文本,而不是图像。let类型=response.headers.get("内容类型")| |"如果(!启动类型("文本/"){//不是文字。不要修改。返回响应}//读取响应正文。let text=等待响应.text()//搜索{URL}}的实例。让regexp=/{([^}]*)}}/g让零件=[]设pos=0让比赛while(匹配=正则表达式.exec(文本){设url=新url(匹配[1],请求.url)零件.推送({在此之前:文本.切片(位置,匹配索引),//启动此URL的异步获取。承诺:取回(url.toString())。则((响应)=>响应.text())})位置=regexp.lastIndex}//既然我们已经启动了所有的子请求,//等待每一个并收集文本。让chunks=[]for(让一部分零件){块。推(前一部分)//等待前面的异步获取完成。块。推(等待部分.承诺)}块。推(文本.切片(位置)//连接所有文本并返回。返回新响应(chunks.join(""), {状态:响应.状态,状态文本:响应状态文本,标题:响应.headers})}你自己玩吧!我们在cloudflareworkers.com你可以尝试编写自己的脚本并将其应用到你的站点。现在就试试看»问答是"Cloudflare工人"还是"Cloudflare服务工人"?"Cloudflare Worker"是您编写的运行在Cloudflare边缘的JavaScript。"Cloudflare Service Worker"特别是一个处理HTTP流量的Worker,它是根据服务Worker API编写的。目前,这是我们实现的唯一类型的worker,但是将来我们可能会为某些特定的任务引入其他类型的worker。我能对处于边缘的服务人员做些什么?任何事情。你在写代码,所以可能性是无限的。您的服务工作人员将拦截所有发往您的域的HTTP请求,并可以返回任何有效的HTTP响应。您的工作人员可以向公共internet上的任何服务器发出传出HTTP请求。以下是如何在Cloudflare上使用服务人员的一些想法:提高性能使用自定义逻辑来决定哪些请求可以在边缘缓存,并规范化它们以提高缓存命中率。直接在边缘展开HTML模板,只从服务器获取动态内容。直接从边缘响应无状态请求,而无需与源服务器联系。将一个请求拆分为多个对不同服务器的并行请求,然后组合响应。增强安全性实现自定义安全规则和筛选器。实现自定义身份验证和授权机制。提高可靠性在几秒钟内将快速修复部署到您的站点,而无需更新您自己的服务器。实现自定义负载平衡和故障转移逻辑。当无法访问源服务器时动态响应。但这些只是例子。Cloudflare员工的全部意义在于,你可以做我们没有想到的事情!为什么选择JavaScript?Cloudflare Workers是用JavaScript编写的,使用v8javascript引擎(来自googlechrome)执行。我们选择JavaScript和V8有两个主要原因:安全性:v8javascript引擎可以说是计算史上最仔细审查的代码沙盒,Chrome安全团队是世界上最好的团队之一。此外,谷歌还向任何能发现漏洞的人支付大量的bug奖金。(也就是说,我们在V8的基础上增加了自己的沙盒层。)无处不在:JavaScript无处不在。A