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

华为云_遵义网站建设_怎么申请

小七 141 0

测试新特性并与Cloudflare Workers快速迭代

NESA的照片由制造商/Unsplash提供在Cloudflare,我们相信尽快将新产品和功能交付给客户是获得良好反馈的最佳方式。早期发布产品的问题往往是,有时它们可能还没有为您的整个用户群做好准备。您可能只想提供对特定客户群的访问权限,这些客户可能是:高级用户、表示有兴趣参与测试版的客户,或者最需要新功能的客户。当我与许多在我们自己的Workers beta程序中的用户见面时,我看到(不出意外地)我们的许多用户都有一个相同的信念,即他们应该尽早、经常地从自己的用户那里得到反馈。然而,我很惊讶地了解到许多beta程序成员在创建必要的控件以在测试和发布更新时快速、安全地输入新的或不推荐的特性时遇到的困难。下面是我在Cloudflare Workers内部看到的一些想法和方法,以确保适当的客户能够访问正确的功能。工人如何工作首先,简单介绍一下工人的工作原理。一旦部署了Worker,它就可以随时在Cloudflare的155多个数据中心运行,以响应对您的网站、应用程序或API的请求。worker可以修改源服务器的请求和响应。它们还可以对其他端点发出响应初始请求的子请求。工作线程能够使用可用的fetch方法发出自己的子请求。我们将依赖于这一点,以及通过fetch发出的请求也可以被Cloudflare缓存,以确保特性的选通不仅安全而且快速。如何安全地缓存用户权限假设您的源节点上有一个端点,它允许我们安全地获取特定用户的权限。https://api.yoursite.com/user/{uid}从Cloudflare Worker,我们可以使用令牌安全地获取此权限信息,并将其作为JSON或作为头的一部分返回。//创建请求var permissionRequest=新请求(permissionsURL{method:'获取',标题:新标题({'X-Auth-Token':'超级机密令牌'})});//发出请求并等待响应var permissionResponse=等待获取(permissionRequest,{cf:{cacheTtl:14400}});//获取头中返回的权限var newFeatureAvailable=permissionResponse.headers.get('X-YourSite-NewFeature');//获取以JSON形式返回的权限var jsonPermissions=等待permissionResponse.json();正如我前面写的,fetch请求实际上缓存了使用它时生成的响应。因此,后续的Workers调用可以获取用户权限,而不必返回源站的端点。虽然4小时的默认缓存TTL可能适用于许多应用程序,但fetch还允许您设置任意TTL,以确保您的用户不会被授予超出需要的权限。要将TTL设置为300秒(注意:免费计划的TTL下限为2小时或7200秒),您可以将上面的fetch更改为:var permissionResponse=等待获取(permissionRequest,{cf:{cacheTtl:300}}});关于缓存敏感对象的说明如果要将敏感信息(如用户权限)存储在Cloudflare的缓存中,请务必记住,url永远不应公开访问,而应仅从Worker内部访问。工人准备在前面跑api.yoursite.com/user/{uid}应该阻止来自Cloudflare工作进程外部的所有对路径的请求,或者检查以确保请求具有有效的密钥。关于使用"超级机密令牌"的说明当上传到Cloudflare时,应该在您的Worker中提供令牌,并在每次请求时由您的源站进行验证。高度安全意识的读者可能会对在代码中存储凭据感到紧张,但请注意,Cloudflare强烈鼓励2FA,并限制工作人员对特定帐户的访问。我们也在探索向工人传递秘密的更好方法。选择新功能的常用方法现在您已经从缓存中快速获取了用户权限,现在是时候使用它们了!你可以做很多事情,但在这篇文章中,我将介绍一些更常见的事情,包括:限制路径、A/B测试和源之间的自定义路由。限制路径假设您正在发布当前API的v2。您希望所有用户仍然能够向v1发送GET和POST请求,但是由于您仍在优化一些新的v2特性,因此只有授权用户才能发布,而每个人都可以获取。从前面的示例继续,可以使用以下代码使用Cloudflare完成此操作:const apiV2=jsonPermissions['apiV2'];//检查中的用户是否允许测试v2 API如果(apiV2){//他们被允许测试v2所以把所有的东西都通过。取回(请求);}其他{//如果不允许他们测试v2,那么我们//仅allow get everything else从边缘返回403。如果(请求.方法!=='获取'){return new Response('对不起,此页不可用',{status:403,statusText:'禁止'});}取回(请求);}A/B测试当发布一个新的API版本时,你可能还想用一个新的设计来更新你的文档,但是在发布任何东西之前,运行一个测试以确保它改进(或不会损害)你的相关指标是很重要的。使用Cloudflare Workers可以轻松地在访问API V2的用户中测试文档的不同版本:const apiV2=jsonPermissions['apiV2'];const group=jsonPermissions['testingGroup'];//这里我们将使用JSON中返回的变量集//用户API来确定用户测试组,但是//也可以通过分配一个cookie来随机发送。//示例:https://developers.cloudflare.com/workers/recipes/a-b-testing///确保允许用户查看API V2如果(apiV2){let url=新url(请求.url);//将用户的测试组附加到forwared请求//对用户隐藏:/docs/v2/>/group-1/docs/v2/url.路径名=`/${group}${url.路径名}`;const modifiedRequest=新请求(url{方法:请求.方法,标题:请求.headers});const response=等待获取(modifiedRequest);返回响应;}其他{//不应允许用户查看V2文档return new Response('对不起,此页暂时不可用',{status:403,statusText:'禁止'});}原点之间的自定义布线启动API或应用程序的新版本有时需要启动全新的源服务器。Cloudflare Workers可以根据路径、标头或请求中的任何其他内容,轻松地将API调用路由到不同的源。在这里,我们将确保用户具有访问API v2的权限,然后将请求路由到专用源:const apiV2Allowed=jsonPermissions['apiV2Allowed'];const v1 origin='https://prod-v1-api.yoursite.com';const v2origin='https://beta-v2-api.yoursite.com';//原始URL:https://api.yoursite.com/v2/endpointconst originalURL=新URL(请求.url);常量原始路径=originalURL.pathname;常量API版本=原始路径。拆分('/')[1];常量终结点=原始路径。拆分("/").splice(2).join("/");如果(apiVersion==='v2'){如果(APIV2允许){设newUrl=newUrl(v2origin);newUrl.pathname=终点;const modifiedRequest=新请求(newUrl{方法:请求.方法,标题:请求.headers});取回(modifiedRequest);}其他{return new Response('对不起,此API版本不可用',{status:403,statusText:'禁止'});}}其他{设newUrl=newUrl(v1origin);newUrl.pathname=终点;const modifiedRequest=新请求(newUrl{方法:请求.方法,标题:请求.headers});取回(modifiedRequest);}你觉得我应该加入另一种把关功能的方法吗?请确保在我们的Cloudflare社区配方交换上共享它。