Midway Serverless 提供了一套通用的应用迁移方案,将原有应用尽可能不修改代码,就可以发布到函数平台。使用此方案,可以将原有的 egg/midway 应用尽可能快速简单的迁移到函数平台进行托管,享受云原生时代的弹性红利。

使用

在代码根目录新增加文件 f.yml ,最为精简的内容如下。

  1. service: my-egg-demo ## 应用发布到云平台的名字
  2. provider:
  3. name: aliyun ## 发布的云平台,aliyun,tencent 等
  4. deployType: egg ## 部署的应用类型

TS 编译

如果是 midway 项目,可以使用我们提供的发布钩子,在发布时自动执行编译,在 package.json 配置如下。

  1. {
  2. "name": "xxxxxx",
  3. "version": "xxxx",
  4. .....
  5. "midway-integration": {
  6. "lifecycle": {
  7. "before:package:cleanup": "npm run build"
  8. }
  9. },
  10. "egg": {
  11. "framework": "@midwayjs/web"
  12. }
  13. }

这两的要点有两个:

  • 1、这里配置了 midway-integration 字段,用于支持 midway 的编译。
  • 2、这里指定了 egg 字段,用于指定特定的 egg 上层框架

如果使用了 egg-ts ,则配置如下。

  1. {
  2. "name": "xxxxxx",
  3. "version": "xxxx",
  4. .....
  5. "midway-integration": {
  6. "lifecycle": {
  7. "before:package:cleanup": "npm run tsc"
  8. }
  9. }
  10. }

部署

执行 f deploy 即可。

默认情况

迁移方案的 Egg 默认配置

当前迁移方案会增加一些默认配置,用于在函数体系下更好运行,一般情况下,用户无需修改

  1. // config.default
  2. const os = require('os');
  3. exports.logger = {
  4. dir: os.tmpdir(),
  5. };
  6. exports.rundir = os.tmpdir();
  7. exports.static = {
  8. buffer: true,
  9. };

由于函数环境磁盘不可写,我们将默认的日志目录都调整为了临时目录。

  1. // plugin
  2. 'use strict';
  3. exports.i18n = false;
  4. exports.watcher = false;
  5. exports.development = false;
  6. exports.logrotator = false;
  7. exports.schedule = false;
  8. exports.static = false;

和默认 egg 不同的是,这里默认关闭了 static 插件,原因是,如果默认没有 app/public 目录,插件启动时会创建一个,由于服务器磁盘不可写,就会报错。如果有 static 插件的需求,请手动打开,并务必保证存在 app/public 或者相应的目录。

阿里云

*
默认发布为 http 触发器,如果需要 API 网关,可以自行按照上面 f.yml 的格式进行 functions 结构的修改配置,同时,在 API 网关处配置路由 `/
` 中转到该函数即可。

腾讯云

**
默认发布为 API 网关触发器,同时会自动配置网关路由。

一些限制

  • 不支持 egg-socketio 等
  • 不支持文件上传等网关无法支持的能力
  • 还有一些,请参考 应用迁移 faq