应用领域
本框架用于使用Serverless平台技术下的服务端,能够抹平云平台细节,提供一致的部署运维体验,实现在开发阶段和部署阶段的一致性,提供了完整的本地编译,调试,断点等功能。
背景技术
在使用Serverless平台技术下,需要配置大量的云函数和触发器,不支持TypeScript语言开发,并且本地调试较为不便.不能进行断点分析.
本框架方案
以上遇到的核心问题就是由于云平台的特殊性和细节差异,导致使用Serverless的后端不能像传统的服务端开发模式一样拥有完整的本地调试开发体验.为了解决这个问题,在利用Express的基础上,利用路由转发,通过serverless-http包装API接口,实现了本地使用TypeScript语言开发,编译,断点调试等功能,以及云平台部署的一致性.
为了解决以上问题,用以下解决方案包括
1.项目工程结构划分
在ServerLess项目结构下对functions文件夹进行划分,分为src代码文件区, dist编译结果区, config项目配置区和bin调试区.利用Vscode的编译任务将src下的ts文件编译到dist下,在云基础配置中使用functions下的index文件作为入口,并且利用serverless-http进行包装,保证在本地下传参模式和云上相同.
module.exports.main = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
const entry = (() => {
const result = require('./dist/app.js');
// const app = require('express')();
// result = app.use(result);
return result;
})();
const serverless = require('serverless-http');
let app = entry;
// support for async load app
if (entry && entry.tcbGetApp && typeof entry.tcbGetApp === 'function') {
app = await entry.tcbGetApp(event, context);
}
return serverless(app)(event, context);
};
2.引入Express
为了实现项目只使用一个触发器,使用Express进行路由转发.将业务划分为Controller层,Storage层,Dao层,Model层.Controller层为根据业务进行区分的多个路由的集合.Storage层为数据库管路层,封装了云数据库,redis,mysql等.
3.编译调试任务
使用前置启动任务,使用commonjs模式进行编译,在bin下的www中利用normalizePort将接口暴露出去.
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "编译调试",
"preLaunchTask": "typescript",
"program": "${workspaceFolder}/functions/cube/dist/server.js",
"cwd": "${workspaceFolder}",
"args": [
"${relativeFile}"
],
"protocol": "inspector"
},
{
"type": "node",
"request": "attach",
"port": 9229,
"name": "[xrd_sign] 云函数本地调试",
"entry": "xrd_sign",
"cloudbaseLocal": true
}
]
}
4.配置文件的使用
对项目配置文件,使用了模板生成器,生成json格式的配置文件供前后端进行使用.为了保证配置文件的路径索引问题,将config文件夹放在了src和dist的统计目录下.