函数计算简介
函数计算是最新一代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://0x0f.tech") # 返回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)