Skip to content

阿里云函数计算入坑指南之HTTP触发器

函数计算简介

函数计算是最新一代serverless架构产品,结合了函数式编程思想和容器技术。一方面为应用开发和发布提供了许多便捷,另一个方面,因为是serverless,且由底层技术实现了弹性扩容,尤其降低了运维成本,提升了服务稳定性。目前许多云服务商都开始着力部署,以我常用的阿里云来做一个介绍。

用HTTP请求调用函数计算

HTTP触发器顾名思义就是由HTTP请求触发函数调用,因此适合开发基于HTTP的RESTful API。HTTP触发器会接收HTTP请求,并将请求数据作为函数参数传入,因此对于每个接口,只需要关注接口本身的逻辑即可,每个函数的逻辑也更加独立,也有助于提升函数内聚性,降低耦合。

另外也可以做网站后端服务器,以LNMP或LAMP架构的传统web应用为例,部署在函数计算后只需要关注MP部分,其他的基础支持皆由函数计算底层架构支撑,降低了不少的运维成本。不过要注意的一点就是传统应用的入口文件要适配成函数才可以。最近阿里云CDN新增了回源类型是函数计算,可以说从另一个角度鼓励了使用函数计算来部署web应用。

通常建议将HTTP触发器与自定义域名结合使用,函数计算支持自定义域名和路由,使得你可以用一个比较好看的地址来访问你的接口或网站。更重要的也可以避免微信拦截阿里系的地址。最近自定义域名也支持HTTPS请求了,至此才算一个完整的功能。

如果希望使用函数计算开发RESTful API也可以结合阿里云API网关来实现,由API网关接收HTTP请求可以更方便的对接口做统一的管理,也可以用到API网关的流控,身份验证等API网关功能。不过要注意一点是API网关和HTTP触发器是不可共用的,简单来说他们调用函数的传参不同。或者换个说法就是使用API网关就不要设置HTTP触发器了。

简单来说,函数计算的生态链目前已经相对完善,为开发者提供了不少便利。相信函数计算和serverless会成为服务端开发不可绕开的一个概念。也可以说将服务端开发的门槛降低了许多,使得传统的前端程序员也可以比较快速的上手并开发API。

几个现存的坑

返回http status非200的请求时会有一些比较奇怪的问题。比如返回302请求,在web编辑器调试运行时会产生一个TypeError: Failed to fetch的错误,没有任何其他报错信息。但是实际上你用浏览器或postman请求时会发现是可以得到期望的结果的。返回404状态时,web编辑器运行可以正确完成,用postman请求也可以正确响应,但是在浏览器访问(Chrome/Firefox)会得到一个ERR_INVALID_RESPONSE,不知是什么情况。

这里姑且发一份我的302和404请求的代码给大家作为参考。以python3为例:

# -*- coding: utf-8 -*-

class AppClass:

    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    # 这里由入口函数handler调用,是函数的主逻辑。
    def __iter__(self):
        # return self.response404()
        return self.response302("https://czj.so")

    # 返回302
    def response302(self, url):
        status = '302 Found'
        response_headers = [('Location', url)]
        self.start(status, response_headers)
        yield b""

    # 返回404
    def response404(self):
        status = '404 Not Found'
        response_headers = [('Content-type', 'application/json; charset=utf-8')]
        self.start(status, response_headers)
        yield b'{"status":404}'

# handler是入口函数
def handler(environ, start_response):
    # 这里必须返回一个可迭代类型
    return AppClass(environ, start_response)

分享到:
Published in程序猿的东西

Be First to Comment

发表评论