在传统的服务架构中,开发者先租用服务器,连入 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()]
▲ 一个 http 函数的例子,遵循 WSGI 规范

  我们一共只写了一个函数——总是返回 200 状态码,返回头 content-type 设为 text/plain,然后发回 REMOTE_ADDR,也就是请求发起者的 IP 地址。绑定域名之后,我们可以访问 http://fc.ruanx.net/ip 拿到自己的 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]
▲ 从 uri 中读取参数,爆破 Caesar 密码

  给域名添加路由之后,访问 https://cloud.ruanx.net/caesar/uryybjrypbzrgbzloybt 即可得到爆破结果。其中 hellowelcometomyblog 是明文。

▲ 利用函数计算,爆破 Caesar 密码

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