前言:
阿里云函数计算,也许大家会感到陌生,相对于阿里云极力宣传的ecs服务器,确实冷落了这一款神奇的产品!
那么什么是函数计算呢?老规矩,先看一下官方的解释:
阿里云函数计算(Function Compute)是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码。更棒的是,您只需要为代码实际运行消耗的资源付费 - 代码未运行则不产生费用。
#########
上面的解释不知道大家有没有看明白,我再用通俗易懂的话给大家翻译一遍:
比如你写了一个python脚本函数,或者写了一个php文件,又或者写了一个js函数,又或者是java 函数 等等
而你所有的需求, 只是为了去运行这个函数,其他的都是浪费,那么你会选择在服务器搭建环境然后去运行吗? 嘿 老兄,仅仅是一个函数而已,何必搞的这么麻烦,阿里云函数计算正是可以帮你解决的!
阿里云函数计算目前支持的运行环境有 python,nodejs,go,php,java 所有主流的环境都支持了,那么就可以愉快开通玩耍了!
大家更关心的是怎么收费,调用次数:每月前 100 万次函数调用免费。 执行时间:每月前 400000(GB*秒) 费用免费。, 小打小闹是用不完的,推送个url到百度站长平台,轻轻松松.
下面说一下函数计算的触发方式, 主要的亮点就是最新开放的 http触发方式。这种方式前端调用异常简单。给你一个函数计算url 你在浏览器访问, 即可触发,当然不只是浏览器!
其他的触发方式 比如对象存储,api网关,定时触发。再说一下,触发的意思就是启动你的函数!!!!!!!(我就当你是菜鸟了 ,言多必失,是不是觉得我很啰嗦!)
函数计算大致算是介绍完了,那么今天来看一个使用案例。
意淫的虚拟场景:
我有个小爬虫,而这个爬虫封装在了一个函数里面,我想把这个爬虫函数,封装成一个api接口,供其他程序调用!
实战:
首先开通函数计算。
点击新建服务:
其他默认,点击新建函数
选择模板,我喜欢用python2.7,那我就选择2.7的空白函数
下面就是选择触发器配置,今天要说的是想把自己的函数封装成一个api接口,那么就选择http触发方式:
下一步:基础管理设置 , 在这一步,需要注意的就是选择自己需要的运行环境,如下图
还有一点需要注意的是 环境配置里的函数入口, 这里的函数入口比如名字是 bugscaner.main 其中的bugscaner就是bugscaner.py 文件,main就是你的主函数,也就是入口函数(为什么这么做呢?管他呢 记住就行了)
函数执行内存, 这里只是简单的演示一个http请求,然后返回数据,那我就选择最小的128G内存,内存越小,免费的额度就越大!
好了,开始路怒吧!一路向北, 下一步 下一步还是他妈的下一步 中间的都可以跳过不选择了!创建!!!!!!
# -*- coding: utf-8 -*- import logging HELLO_WORLD = b"Hello world!\n" # if you open the initializer feature, please implement the initializer function, as below: # def initializer(context): # logger = logging.getLogger() # logger.info("initializing") def handler(environ, start_response): context = environ['fc.context'] request_uri = environ['fc.request_uri'] for k, v in environ.items(): if k.startswith("HTTP_"): # process custom request headers pass # do something here status = '200 OK' response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) return [HELLO_WORLD]创建成功后你就会看到官方这个黑乎乎的窗口里的几行代码, 直接运行是会出错了,怪我了,上面为了装X,创建的函数入口是bugscaner.main
那么拷贝里面的代码到本地保存为bugscaner.py 记得把def handler 改成def main
好了,把这个bugscaner.py文件压缩成zip格式,一定要是zip格式,zip,zip,zip!!!!!!!!
打开函数计算控制台, 上传这个zip代码包,好了 上传公共后, 控制台运行一下试试!
出现了hello world!那么开始把咱们的代码传上去试试吧!
我今天测试的代码比较复杂, 需要使用python beautifulsoup4 ,看看官方有没有内置这个库!在刚才的代码里最顶部插入
from bs4 import BeautifulSoup,element试一试 在线编辑完,记得保存,代码才生效
{ "errorMessage": "Unable to import module 'bugscaner'", "errorType": "ImportError", "stackTrace": [ "ImportError: No module named bs4" ] }预料之中了,没有安装,怎么办呢?
很简单,自己上传BeautifulSoup库, 在你本地的bugscaner.py同目录下Shift+鼠标右键,选择 在此处打开命令串口(W),运行如下命令:
pip install bs4 --target .
C:\Users\Administrator\Desktop\教程测试>pip install bs4 --target . Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting bs4 Collecting beautifulsoup4 (from bs4) Downloading https://mirrors.aliyun.com/pypi/packages/f8/c7/741c97d7366f4779ca 3d244904978b43a81fd37d85fcf05ad19d472c1ce/beautifulsoup4-4.6.3-py2-none-any.whl (90kB) 45% |██████████████▌ | 40kB 1.2MB/s eta 0:00 56% |██████████████████ | 51kB 1.1MB/s eta 0 67% |██████████████████████ | 61kB 1.1MB/s e 79% |█████████████████████████▌ | 71kB 1.0MB 90% |█████████████████████████████ | 81kB 1. 100% |████████████████████████████████| 92k 1.0MB/s Installing collected packages: beautifulsoup4, bs4 Successfully installed beautifulsoup4-4.6.3 bs4-0.0.1
好了,beautifulsoup4已经安稳的躺在你的bugscaner.py同目录里了!按照刚才的方式,把文件一起压缩成zip格式, 重新上传一下, 再试试,看看能不能找到模块了!
运行成功,不再报错,那么我就凑合的写一个简陋的脚本, 来运行一下试试:
# -*- coding: utf-8 -*- #by tools.bugscaner.com import json import requests from bs4 import BeautifulSoup def main(environ, start_response): context = environ['fc.context'] request_uri = environ['fc.request_uri'] for k, v in environ.items(): if k.startswith("HTTP_"): # process custom request headers pass # do something here status = '200 OK' response_headers = [('Content-type', 'text/html')] start_response(status, response_headers) html= requests.get("https://aliyun.bugscaner.com/").text soup = BeautifulSoup(html, 'html.parser') #寻找页面中所有的超链接网址 return json.dumps([a.get("href") for a in soup.find_all("a")])
BodyHeadersAbstractLogsstatus code: 200 [ "/", "https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=4uyvx8l4&utm_source=4uyvx8l4", "/url/ecs.html", "/url/huiyuanzhuanxiang.html", "/url/21.html", "#", "/index.html", "/aliyunyouhuihuodong/index.html", "/aliyundanxingjisuan/index.html", "/aliyundanxingjisuan/yunfuwuqiecs/index.html", "/aliyundanxingjisuan/aliyunxunizhuji/index.html", "/aliyunshujuku/index.html", "/aliyunshujuku/mysql/index.html", "/aliyunshujuku/hbaseban/index.html", "/aliyunshujuku/mongodbban/index.html", "/aliyunshujuku/redisban/index.html", "/aliyunshujuku/oceanbase/index.html", "/aliyunshujuku/polardb/index.html", "/aliyunshujuku/ppasban/index.html", "/aliyunshujuku/postgresqlban/index.html", "/aliyunshujuku/sqlserver/index.html", "/aliyunshujuku/memcacheban/index.html", "/aliyunyuncunchu/index.html", "/aliyunyuncunchu/duixiangcunchuoss/index.html", "/aliyunyuncunchu/wenjiancunchunas/index.html", "/shipinyucdn/index.html", "/shipinyucdn/cdnjiasu/index.html", "/hulianwangzhongjianjian/index.html", "/hulianwangzhongjianjian/xiaoxiduilie/index.html", "/hulianwangzhongjianjian/xiaoxifuwu/index.html", "/aliyunwendang/index.html", "https://promotion.aliyun.com/ntms/act/oss-discount.html?accounttraceid=f466617b-f482-49b8-93b1-eedd15b61529&userCode=4uyvx8l4", "/url/daijinquan.html", "/url/ecs.html", "/aliyunyouhuihuodong/3119.html", "/aliyunyouhuihuodong/3117.html", "/aliyunyouhuihuodong/3111.html", "/url/21.html", "/url/23.html", "/aliyunyouhuihuodong/index.html", "/aliyunyouhuihuodong/9813.html", "/aliyunyouhuihuodong/9812.html", "/aliyunyouhuihuodong/9810.html", "/aliyunyouhuihuodong/9808.html", "/aliyunyouhuihuodong/9779.html", "/aliyunyouhuihuodong/6577.html", "/aliyunyouhuihuodong/3119.html", "/aliyunyouhuihuodong/3118.html", "/aliyundanxingjisuan/yunfuwuqiecs/index.html", "/aliyundanxingjisuan/yunfuwuqiecs/9196.html", "/aliyundanxingjisuan/yunfuwuqiecs/9195.html", "/aliyundanxingjisuan/yunfuwuqiecs/9194.html", "/aliyundanxingjisuan/yunfuwuqiecs/9193.html", "/aliyundanxingjisuan/yunfuwuqiecs/9192.html", "/aliyundanxingjisuan/yunfuwuqiecs/9191.html", "/aliyundanxingjisuan/yunfuwuqiecs/9190.html", "/aliyundanxingjisuan/yunfuwuqiecs/9189.html", "/aliyundanxingjisuan/aliyunxunizhuji/index.html", "/aliyundanxingjisuan/aliyunxunizhuji/9776.html", "/aliyundanxingjisuan/aliyunxunizhuji/9775.html", "/aliyundanxingjisuan/aliyunxunizhuji/9774.html", "/aliyundanxingjisuan/aliyunxunizhuji/9773.html", "/aliyundanxingjisuan/aliyunxunizhuji/9772.html", "/aliyundanxingjisuan/aliyunxunizhuji/9771.html", "/aliyundanxingjisuan/aliyunxunizhuji/9770.html", "/aliyundanxingjisuan/aliyunxunizhuji/9769.html", "/aliyunwendang/index.html", "/aliyunwendang/9811.html", "/aliyunwendang/9809.html", "/aliyunwendang/9807.html", "/aliyunwendang/9806.html", "/hulianwangzhongjianjian/index.html", "/hulianwangzhongjianjian/xiaoxiduilie/3970.html", "/hulianwangzhongjianjian/xiaoxifuwu/3107.html", "/hulianwangzhongjianjian/xiaoxiduilie/236.html", "/aliyunshujuku/index.html", "/aliyunshujuku/mysql/10130.html", "/aliyunshujuku/mysql/10129.html", "/aliyunshujuku/mysql/10128.html", "/aliyunshujuku/mysql/10127.html", "/aliyunshujuku/mysql/10126.html", "/aliyunshujuku/mysql/10125.html", "/shipinyucdn/index.html", "/shipinyucdn/cdnjiasu/3112.html", "/shipinyucdn/cdnjiasu/282.html", "/shipinyucdn/cdnjiasu/283.html", "/aliyunyuncunchu/index.html", "/aliyunyuncunchu/duixiangcunchuoss/328.html", "/aliyunyuncunchu/duixiangcunchuoss/327.html", "/aliyunyuncunchu/duixiangcunchuoss/326.html", "/aliyunyuncunchu/duixiangcunchuoss/325.html", "/aliyunyuncunchu/duixiangcunchuoss/324.html", "/aliyunyuncunchu/duixiangcunchuoss/322.html", "http://whatweb.bugscaner.com", "http://whois.bugscaner.com", "http://tools.bugscaner.com", "http://www.bugscaner.com", "http://aliyun.bugscaner.com", "/tags.html", "/tags.html", "/sitemap.xml" ]ok, 代码正常运行啦! 不对,一开始说好的http触发呢?好了, 最后一哆嗦,来看下怎么触发。
复制这个网址到浏览器, 访问一下快看看吧!