前言
函数计算目前原生支持的开发语言有 nodejs, python, java, php 和 c#, 在实现这些开发语言 runtime 的时候, 函数计算开发团队花了很大的精力去让各自语言的传统应用能够简单快速迁移到函数计算平台:
- nodejs
开发函数计算的正确姿势——移植 Express
-
python , 支持 WSGI 协议的框架可以一键迁移到函数计算
- java
Java Http 触发器极速迁移传统 Spring 应用
如上述所列的各自语言的传统应用迁移到函数计算的迁移方案, 虽然已经足够简单, 但是还是需要去理解一下函数计算的接口以及各自语言在函数计算环境中运行起来的原理, 比如 python, 用户需要理解 WSGI 协议, 然后才编写一个符合要求的入口函数。 为了彻底解放生产力, Custom Runtime 应运而生, Custom Runitme 可以解决以下两个重要需求:
- 可以随心所欲持定制个性化语言执行环境(例如 golang、lua、ruby)以及各种语言的小版本(例如python3.7、Nodejs12)等,打造属于自己的自定义runtime
- 现有的 web 应用或基于传统开发 web 项目基本不用做任何改造,即可将项目一键迁移到函数计算平台
用户要实现一个最简单的 Custom runtime,只要符合以下两条:
- 创建一个http server,监听在固定端口(端口可以读取环境变量 FC_SERVER_PORT,默认为 9000)
- http server 需要在 15s 内完成启动
接下来, 我们梳理一下基于 Custom Runtime 一键迁移迁移案例。
案例
java
Serverless 实战 —— 快速搭建 SpringBoot 应用
Serverless 实战 —— 移植 spring-petclinic 到函数计算
python
import tornado.ioloop
import tornado.web
import os
class MainHandler(tornado.web.RequestHandler):
def get(self):
rid = self.request.headers.get('x-fc-request-id',None)
print("FC Invoke Start RequestId: " + str(rid));
// your logic
self.write("GET: Hello world")
print("FC Invoke End RequestId: " + str(rid));
def post(self):
rid = self.request.headers.get('x-fc-request-id',None)
print("FC Invoke Start RequestId: " + str(rid));
// your logic
self.write("GET: Hello world")
print("FC Invoke End RequestId: " + str(rid));
def make_app():
return tornado.web.Application([
(r"/.*", MainHandler),
])
if __name__ == "__main__":
app = make_app()
port = os.environ.get("FC_SERVER_PORT", "9000")
app.listen(int(port))
tornado.ioloop.IOLoop.current().start()
本地安装第三方包 flask
然后编写一个具有可执行权限的名字为bootstrap (注:#!/bin/bash注释是必需的)文件启动上面代码的 http server:
#!/bin/bash
python server.py
go
基于custom runtime 打造 golang runtime
nodejs
'use strict';
var express = require('express');
var app = express();
var crypto = require('crypto');
app.post(/.*/, function (req, res) {
var rid = req.headers["x-fc-request-id"];
console.log(`FC Invoke Start RequestId: ${rid}`);
// your logic, for example, get hash
var secret = 'abcdefg';
var hash = crypto.createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
console.log(hash);
res.send(hash);
console.log(`FC Invoke End RequestId: ${rid}`);
});
var port = process.env.FC_SERVER_PORT || 9000
app.listen(port, function () {
console.log("FunctionCompute custom-nodejs runtime inited.");
});
app.timeout = 0; // never timeout
app.keepAliveTimeout = 0; // keepalive, never timeout
本地安装第三方包 express
然后编写一个具有可执行权限的名字为bootstrap (注:#!/bin/bash注释是必需的)文件启动上面代码的 http server:
#!/bin/bash
node server.js
php
基于custom runtime + nginx + php-fpm 运行 wordpress
customruntime-php