本文通过边缘节点的边缘函数来实现请求的转发和重定向,减少对源站的压力,降低用户访问的延迟,有效降低源站带宽和计算资源的消耗。
背景
在Web服务的迭代演进中,业务常面临域名迁移、接口版本升级、多地域流量调度等场景。传统基于Web服务器(如Nginx)或ESA控制台的重定向或转发配置,存在生效延迟高、灵活度差、维护成本高等痛点。本文将以ESA边缘计算平台为例,来给您介绍边缘函数在这方面的技术优势。
传统服务端URL重定向和转发的三大技术瓶颈 | 边缘函数在URL重定向和转发的技术优势 |
性能压力大 单台Nginx服务器在500QPS压力下,重定向延迟陡增400%(实测数据)。 | 分布式性能跃迁
|
灵活性很差 市面常见方案仅支持基础字符串替换,缺失正则捕获/动态决策能力。 | 正则编程级控制 支持正则表达式,可实现动态路径参数化改写。 |
维护成本高 每次策略变更需重启服务,灰度发布需额外搭建流量泳道。 | 热部署能力 策略修改秒级生效,支持按地域灰度发布环境。 |
方案原理
ESA将用户请求调度至最优的边缘节点上,并通过边缘函数进行处理。
在边缘函数中,会对请求按照自定义的规则进行匹配。
如果是命中重定向规则的请求,则直接返回给用户重定向的地址。
如果是命中转发规则的请求,会对请求进行转发,转发到对应的源站。
方案实现
第一步:添加站点
在开始站点接入前,您需要先将待接入站点的根域名添加至ESA中。
在ESA控制台,选择站点管理,单击新增站点。
在输入站点页面的输入框中,输入您要接入站点的根域名(例如
example.com
),单击下一步。在选择区域和接入方式页面,在区域处选择您的站点需要获得安全加速服务的区域,并在接入方式处选择CNAME方式,单击下一步。
在选择套餐类型页面,可以通过新购套餐和绑定可选套餐两种方式为站点绑定适合您的套餐,按照控制台指引完成套餐订购。
第二步:配置边缘函数
登录ESA控制台。
在左侧导航栏,选择
。在边缘函数页面,单击创建函数。
在创建函数对话框中,您可以选择ESA提供的模板生成函数代码,也可以选择业务需要的模板。选择完成后,单击下一步。
配置函数规格等基本信息,完成后单击提交。
参数
说明
函数名称
请输入函数名称。
说明小写英文字母开头,可包含小写英文字母、数字和中划线,但不能以中划线结尾,名称长度2~41个字符,例如
routine-name
。函数名创建后无法修改。规格
函数代码单次执行最多使用的CPU时间(不包含等待网络请求响应的I/O时间),RT最大值120秒,可用内存128 MB。不同规格的费用不同,默认选择5ms规格。更多计费信息,请参见边缘函数计费说明。
单个请求可用CPU时间片:5ms(默认)
单个请求可用CPU时间片:50ms
单个请求可用CPU时间片:100ms
描述
(选填)函数的描述信息。
代码预览
函数代码预览信息。
第三步:配置触发器
在ESA边缘函数中,触发器定义了函数脚本的调用方式。通过域名绑定功能,您可以为函数分配一个域名,直接通过该域名访问函数。
例如:您已在ESA添加了站点example.com
,您想通过function.example.com
访问边缘函数,那么function.example.com
、function.example.com/user
、function.example.com/login
等请求均会被转发至边缘函数。
在左侧菜单栏单击
,在边缘函数列表页面选择目标函数,在操作列单击详情。在函数详情页面,切换至触发器页签,单击添加域名。为边缘函数分配访问域名
function.example.com
,单击确定。在域名绑定区域找到上一步所创建的边缘函数域名,在操作列单击查看DNS记录,在DNS记录管理页面复制边缘函数域名对应的CNAME值。
登录云解析DNS控制台,在左侧菜单栏单击 ,在权威域名页签下找到目标站点的域名,单击解析设置。
在解析设置中单击添加记录,按以下配置添加记录,单击确定。
配置项
说明
示例值
记录类型
选择域名指向的类型。
CNAME
主机记录
根据域名前缀填写主机记录。
function
记录值
填写边缘函数域名对应的CNAME值。
function.example.com.a1.initmm.com
TTL
域名的更新周期,保留默认值。
10分钟
刷新DNS记录页面,检查边缘函数域名对应CNAME状态是否从待配置转变为已配置。
说明CNAME生效时间可能需要数分钟,配置完成之后,如果没有及时生效,请耐心等待。
第四步:调试并发布函数
登录ESA控制台。
在左侧导航栏,选择
。在边缘函数页面,选择您创建的函数,单击详情。
在详情页面,选择代码页签,将下方的演示代码粘贴到编辑器中。
// 需求场景,想要实现的功能如下: // 1. 如果请求的Path部分是以”/esa/“开头,以”.html“结尾的,则直接将请求转发到ESA的官网。 // 2. 如果请求的Path部分是以”/product“开头,则将用户请求重定向阿里云官网产品页。 // 3. 如果请求未匹配上述规则,则重定向到阿里云官网首页。 // 定义正则表达式:如Path部分是以”/esa/“开头,以”.html“结尾的 const productPageRegex = /^\/esa\/.*\.html$/; function handleRequest(request) { const url = new URL(request.url); const pathName = url.pathname; // 如果Path部分是以”/esa/“开头,以”.html“结尾的,则直接将请求转发到ESA产品页 if(productPageRegex.test(pathName)) { const newUrl = 'https://www.aliyun.com/product/esa'; return fetch(new Request(newUrl, request)); } // 满足以”/product“开头,直接重定向到首页阿里云官网产品页。 if (pathName.startsWith('/product')) { const newUrl = 'https://www.aliyun.com/product/list'; return Response.redirect(newUrl, 301); } // 如果请求未匹配上述规则,则重定向到阿里云官网首页。 const newUrl = 'https://www.aliyun.com/'; return Response.redirect(newUrl, 301); } export default { fetch(request) { return handleRequest(request); } }
ESA在控制台代码开发工具右侧提供了一套调试环境,完成代码开发后,您可以先单击保存,然后直接在右侧工具栏构造HTTP的请求方法、请求头、请求体,构造完成后单击请求按钮,控制台将直接返回您的请求经过函数处理后的响应结果。
调试完代码后,单击生成版本。在部署页签,查看生成的版本。
选择上一步生成的版本,点击发布。您可以选择在测试环境、灰度环境或生产环境发布。本次实践作为演示,直接在生产环境发布。
说明建议的发布顺序:先发布测试环境,待测试完成之后,再发布到各个灰度环境。所有灰度环境全部发布完成后,再发布至生产环境。
方案验证及清理
方案验证
您在验证的时候,需要将下方示例中的function.example.com
替换成您在第三步中绑定的域名。
验证ESA边缘函数的URL转发。
直接在浏览器中输入
http://function.example.com/esa/info.html
,可以看到浏览器在页面地址栏不变的情况下,展示了阿里云ESA的首页,此时边缘函数的中的转发处理已经生效。验证ESA边缘函数的URL重定向。
直接在浏览器中输入
http://function.example.com/product
,可以看到浏览器会自动跳转到阿里云产品页,并且地址栏的地址也会变为https://www.aliyun.com/product/list
。打开浏览器的开发者工具,找到
http://function.example.com/product
的请求信息,可以看到Status Code
是301 Moved Permanently
;响应头(Response Headers)中Location的值为https://www.aliyun.com/product/list
。此时,ESA边缘函数的重定向操作已经生效。
资源清理
在本方案中,您创建多个云资源实例。测试完方案后,如果不再需要这些资源,您可以参考以下规则处理对应产品的实例,避免继续产生费用: