在日常研发工作中,我们总会遇到一些奇奇怪怪的事情,然后我们会收集一下「检测方法」、「解决方法」等等方法来辅助我们解决问题。
但是这样的服务并不是每时每刻都会使用,甚至有可能一两个月才会使用一次。而且有一些方法需要多地部署。也有可能会有一些任务是定时执行。
对于上述遇到的问题:
- 「使用频次低」
- 「多地部署」
- 「定时执行」
我们需要一个解决方案。我们搭建普通的云服务(ECS)是比较昂贵的做法,临时的云主机又比较复杂。
这篇文章带着大家看看如何基于阿里云 Severless 函数计算(FC),来减低成本,提交效率。
Severless 简介
Serverless 无服务架构实际上是在开发和部署软件的过程中,让软件开发者忽略服务器的存在,从而更专注于代码实现。
也就是所谓的函数即服务 FaaS,无服务框架即是对FaaS的一种实现。
使用函数计算 FC,我们只需要专注于业务代码开发,并将代码上传,后续作业都可以交由函数计算完成。
函数计算FC
阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询、性能监控、报警等功能。
- 你只需要实现功能,服务器由阿里云提供,按需付费(调用次数)。无需采购和管理服务器等基础设施,运维成本低。支持毫秒级计费,只为实际使用的计算资源付费。
- 事件驱动,并且有内外网IP。可以与阿里云产品交互,如阿里云对象存储OSS、API网关、云数据库等等。
- 提供日志查询、性能监控和报警等功能快速排查故障
应用
上面简单介绍了一下阿里云「函数计算FC」好用的地方,下面在来一个劲爆的消息「最近正在免费公测」,喜欢白嫖的兄弟们有福了
实现基于 NodeJs 的请求代理服务
这里实现了一个基础的代理服务,可以对一个 url 发起请求,并且把请求、响应、耗时等内容全部返回
函数代码(服务端 FC 函数计算)
app.get('/utils/proxy',async (req, res) => { conststartTime=Date.now(); console.log(req) try { constresponse= (awaitaxios(req.query)); constendTime=Date.now(); returnres.send({ req: { params: req.params, query: req.query, body: req.body, data: req.data, httpVersion: req.httpVersion, headers: req.headers, url: req.url, method: req.method, ip: { origin_ip: (req.header('x-forwarded-for') ||'').replace(/\d*$/,'*'), 'x-forwarded-for': req.header('x-forwarded-for'), 'ips': req.ips, 'ip': req.ip } }, rsp: { status: response.status, statusText: response.statusText, headers: response.headers, config: response.config, data: response.data }, startTime: startTime, endTime, time: endTime-startTime, }) }catch(e){ returnres.send({ startTime: startTime, endTime: Date.now(), message: e.message }) } })
测试代码
fetch(`https://fethc-lnong-top-test-fetch-soypyncfov.cn-hangzhou.fcapp.run/utils/proxy?url=https://www.feedsbd.com/`) .then(v=>v.text()) .then(console.log)
测试截图
应用场景
针对我们的服务,我列举一些应用场景
- 判断我们的服务在某些地区不可用时,我们可以通过各个地区的分布式服务发起请求,这里也可以做成定时任务。
- 当我们自己访问某个网站不通时,我们也可以使用这个服务来判断。看看是神秘的东方力量「墙」,还是因为自己网络的服务提供商有问题。
- 当我们需要测速的时候
实现基于 NodeJs 的代理测试服务
对于一个前端开发来着,webpack 的 devServer 或者 nginx 的 proxy_pass 配置规则一直都是一个难题,我们尝尝不知道 local/api
是否被正确的代理到 server/api/swag
上。
这个时候我们就需要一个稳定的服务,来告知我们当前路径是什么。
函数代码(服务端 FC 函数计算)
app.use('/utils/server', async (req, res) => { consttime=newDate(); res.json({ state: 1000, method: req.method, originalUrl: req.originalUrl, baseUrl: req.baseUrl, query: req.query, body: req.body, params: req.params, data: req.data, headers: req.headers, time: time.getTime(), timezone: { time: time.getTime(), timeFormat: format_time_nopad(time), timeFormatPad: format_time_pad(time), timezoneOffset: (time.getTimezoneOffset()), } }); })
测试代码
fetch(`https://fethc-lnong-top-test-fetch-soypyncfov.cn-hangzhou.fcapp.run/utils/server/1/2/3/4/11/12`) .then(v=>v.text()) .then(console.log)
测试截图
应用场景
主要用在需要代理到一个后端,但是后端不配合测试,这个时候我们需要代理到一个稳定的后端。因为我们后端返回了相关的数据,这样可以理解为这是一个配合我们测试的后端
- webpack 配置 devServer 不知道是否代理正确
- nginx 配置 proxy_pass 不知道配置是否正常, location 是否被匹配
更多案例
- sleep 服务,有时候我们需要测试性能,这个时候我们就需要一个慢接口
- mock 服务