作为开发者,我已经在生产中利用阿里云 ESA 作为“隐身衣”和“防弹盾”,来解决服务器“裸奔”所面临的 DDoS 攻击和 OSS 盗刷问题。ESA 在安全防护和访问加速上的表现毋庸置疑。但是,如果今天我们还只用 ESA 来缓存静态文件、抗 DCDN 攻击,那无异于“牛刀小试”,我们错过了它最具变革性的能力。
最近我深入研究了 ESA 后,发现它相比传统的 CDN/DCDN,最大的区别在于提供了强大的 Serverless 计算能力。虽然它也提供了 L4 代理、Bot 管理等很多高级功能(大部分面向大型企业),但对于我们普通开发者而言,“边缘函数”(Edge Functions, ER) 才是那个最触手可及、也最能“玩出花”的利器。
这篇文章,我想跳出“加速”的思维定式,聊聊如何把 ESA 当作一个可编程的边缘平台,利用“边缘函数”极大扩展 DCDN 的应用场景。
什么是边缘函数 (ER)?简单来说,边缘函数允许你在离用户最近的边缘节点上(全球 3200+ 节点)直接运行 JavaScript (Node.js) 代码。
这意味着什么?
传统的 DCDN 也支持一些“边缘逻辑”,比如修改 HTTP 头、设置缓存规则,但那本质上是静态的“配置”。而边缘函数是动态的“代码”。
你可以在请求到达你的源站服务器之前,就通过代码对请求进行拦截、分析、修改、重定向甚至直接响应。这把原本属于后端应用层的逻辑,直接前置到了全球的边缘网络上。
这种变革带来了几个核心优势:
- 极致的低延迟:代码在离用户最近的节点执行,响应时间是毫秒级的。
- 减轻源站压力:大量无效或可边缘处理的请求根本不会到达你的服务器。
- 强大的灵活性:你能用代码实现几乎任何逻辑,而不再受限于平台提供的配置选项。
玩法一:最灵活的 A/B 测试与灰度发布
传统 DCDN 困境:想实现 A/B 测试,传统 DCDN 只能配置“按权重回源”,比如 50% 流量打到 A 服务器,50% 打到 B 服务器。这种方式粒度很粗,不够灵活。
边缘函数玩法 (ER):你可以编写精细的 JS 逻辑,在边缘节点实现智能路由。
- 场景1:按 Cookie/Header 发布
给内部测试人员的请求 Cookie 中加入 env=beta,边缘函数可以读取这个 Cookie,并将请求转发到预发布(Staging)服务器。 - 场景2:按百分比+用户画像发布
你想让 10% 的上海用户访问 V2 版本,其余用户访问 V1 版本。
// 边缘函数 (ER) 示例代码 export default { async fetch(request, context) { const city = request.headers.get('ali-cdn-real-ip-city'); // 获取用户城市 // 随机抽取 10% 的上海用户 if (city === 'Shanghai' && Math.random() < 0.1) { // 转发到 V2 版本的源站 return context.fetch('https://v2.my-origin.com', request); } // 其余流量走 V1 源站 return context.fetch('https://v1.my-origin.com', request); } }
小结:这种方式下,A/B 测试逻辑完全在边缘层实现,源站服务器无需任何改动,对业务代码零侵入。
玩法二:在边缘实现“微 WAF”和“API 鉴权”
传统 DCDN 困境:WAF 规则是通用的,但有时我们有特定的业务安全需求。比如,我想保护某个 POST 接口,只允许特定 User-Agent 或携带了合法 Token 的请求访问。
边缘函数玩法 (ER):在请求到达源站之前,先在边缘函数里跑一遍“前置鉴权”。
- 场景1:保护 Staging 环境
只允许携带特定 Authorization 头的请求访问 staging.example.com。
// 边缘函数 (ER) 示例代码 export default { async fetch(request, context) { const authHeader = request.headers.get('Authorization'); // 在边缘直接拦截非法访问 if (authHeader !== 'Bearer YOUR_SECRET_TOKEN') { return new Response('401 Unauthorized', { status: 401 }); } // 验证通过,放行到源站 return context.fetch(request); } }
- 场景2:JWT (Token) 预验证
你的 API 使用 JWT 鉴权。可以在边缘函数中直接验证 JWT 的签名(比如引入轻量级的 JS 库)。签名无效或过期的请求,在边缘就被 401 拒绝了。
小结:这相当于一个你亲手编写的、全球部署的“微型 WAF”。它能挡住海量的非法 API 调用,极大节省源站的计算资源和带宽,防止恶意请求打穿 WAF、拖垮你的应用服务。
玩法三:动态修改与“胶水”服务
传统 DCDN 困境:DCDN 只能简单地添加/删除固定的 HTTP Header。如果我想根据请求动态修改响应内容,DCDN 无能为力。
边缘函数玩法 (ER):边缘函数可以作为请求和响应的“中间人”,充当“胶水层”,动态修改双向流量。
- 场景1:动态添加 CORS 头
你的 OSS 源站没有配置 CORS 头,导致前端 JS 无法跨域访问。你可以在边缘函数中为来自特定 Origin 的请求动态添加 Access-Control-Allow-Origin 响应头。 - 场景2:旧 API 适配(修改响应体)
你的后端 API 已经升级,返回了新的 JSON 结构,但某个旧的 APP 客户端仍然需要旧的 XML 格式。
// 边缘函数 (ER) 示例代码 export default { async fetch(request, context) { // 先去源站获取新版 JSON 数据 const response = await context.fetch(request); // 检查是否是旧客户端请求 if (request.headers.get('User-Agent').includes('OldApp/1.0')) { const jsonData = await response.json(); // 在边缘将其转换为旧版 XML (示意) const xmlData = convertJsonToXml(jsonData); return new Response(xmlData, { headers: { 'Content-Type': 'application/xml' } }); } return response; // 新客户端直接返回 JSON } }
小结:这让你的边缘节点变成了一个“数据转换器”和“协议适配器”,极大地解耦了前端和后端,使后端升级不再束手束脚。
终极玩法:边缘函数 + 边缘 KV 存储 = 边缘应用
ESA 还提供了配套的边缘存储(Edge KV)。这是一个全球同步的 Key-Value 数据库。当它和边缘函数组合时,质变发生了——你可以在边缘构建完全独立的、无需源站的应用。
传统 DCDN 困境:我想做一个“短链接服务”或“功能开关(Feature Flag)中心”。传统方式下,我必须部署一台服务器和一套数据库(如 Redis)来处理 302 跳转或配置读取。
边缘函数玩法 (ER):场景:构建一个全球毫秒级的“短链接服务”
- 在 ESA 的 KV 存储中存入:
key: "shortA",value: "https://long-url-A.com" - 编写边缘函数,绑定到域名
s.example.com
// 边缘函数 (ER) 示例代码 import { EdgeKV } from 'edgekv'; export default { async fetch(request, context) { const kv = new EdgeKV(); const shortCode = request.path.substring(1); // 获取 /shortA try { // 在全球最近的节点从 KV 中查找长链接 const longUrl = await kv.get(shortCode); if (longUrl) { // 在边缘直接 302 跳转 return new Response(null, { status: 302, headers: { 'Location': longUrl } }); } else { return new Response('404 Not Found', { status: 404 }); } } catch (error) { return new Response('500 Server Error', { status: 500 }); } } }
小结:看到了吗?整个请求-查询-跳转的流程全部在边缘节点闭环了。你的源站服务器“毫不知情”,也“毫发无伤”。这是一个部署在全球、永不宕机、毫秒级响应的 Serverless 应用。
总结:是时候用“编程思维”来替代“配置思维”了
传统的 CDN/DCDN 是一种“配置思维”——我们购买服务,通过点选配置来加速或防护。
而以阿里云 ESA 为代表的新一代边缘平台,带来的是**“编程思维”**。它将“边缘”开放为一个可编程的 Serverless 平台,让我们开发者可以直接在上面构建、创造。
我们上一篇文章所构筑的“安全护盾”是业务的基石,而“边缘函数”则是这个基石上的“超级工具”。它让我们能把 A/B 测试、API 鉴权、数据转换、路由逻辑从臃肿的后端应用中剥离出来,下沉到离用户最近的边缘,让我们更专注于核心业务的开发。
如果你还在把 ESA 当作一个简单的 DCDN,不妨试试它的边缘函数,这才是它真正的“杀手锏”。