在传统的服务架构中,开发者先租用服务器,连入 Internet,安装 nginx, apache 等服务端程序,安装 php, Python 等运行环境……这一切配置好之后,才能发布自己的应用。而 serverless(无服务器计算) 由平台提供商来完成这些乱七八糟的配置工作,使得开发者可以专注于自己那套代码而无需关心运维;使得资源可以按量分配,灵活计价。应该说,serverless 是未来的趋势。
我们以阿里云提供的平台为例,演示几个函数计算。先来看一个返回请求者 IP 地址的最简单的函数。
def handler(environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [environ['REMOTE_ADDR'].encode()]
我们一共只写了一个函数——总是返回 200
状态码,返回头 content-type
设为 text/plain
,然后发回 REMOTE_ADDR
,也就是请求发起者的 IP 地址。绑定域名之后,我们可以访问 http://fc.ruanx.net/ip
拿到自己的 IP:

我们只写了这五行代码,定义了一个函数,于是就启动了一个云计算服务!至始至终,我们没有关心过它是怎么运行起来的。如果按照传统做法,我们得先去租用一个 vps,然后安装 flask 或者什么别的东西,再写一个路由,把 fc.ruanx.net/ip
的请求交给一个函数,再由那个函数返回真实 IP 地址。而函数计算简化了这一切操作。
利用刚刚造出来的函数,可以很方便地嵌入页面,为用户提供一些服务。例如,您点击下面的按钮之后,即可得到自己的 IP.
您的ip是:N/A
注入到博客中的代码如下:
<button id="get_ip">点击获取IP</button>
<span>您的ip是:<a id="my_ip">N/A</a></span>
// ...
<script>
$("#get_ip").click(function() {
$("#my_ip").html("获取中...");
$.ajax({
url: "https://cloud.ruanx.net/ip",
success: function(data) {
$("#my_ip").html(data);
},
error: function(msg) {console.log(msg);
}
});
});
</script>
我们再造一个破解 Caesar 加密的函数。它的功能是枚举 26 个offset,输出所有可能的明文。
def handler(environ, start_response):
context = environ['fc.context']
request_uri = environ['fc.request_uri']
if request_uri[-1] == '/':
request_uri = request_uri[:-1]
enc = request_uri.split('/')[-1].lower()
if not enc.isalpha():
res = b'Invalid input!'
else:
res = b''
for offset in range(26):
res += ''.join(map(lambda x: chr((ord(x) - ord('a') + offset)%26 + ord('a')) , enc)).encode() + b'\n'
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [res]
给域名添加路由之后,访问 https://cloud.ruanx.net/caesar/uryybjrypbzrgbzloybt
即可得到爆破结果。其中 hellowelcometomyblog
是明文。

函数计算不仅可以做这种轻量级的应用。它可以从 NAS 或 OSS 存取文件、调用数据库,从而干很多事情;另外,nodejs、PHP 等主流语言都可以采用函数计算,甚至可以构建一个 wordpress 出来。serverless 给开发者带来了巨大的便利和成本优势,相信在不远的将来,会得到广泛的应用。