公司在用egg, 有几个问题比较困扰.
发布于 5 年前 作者 xiaozhongliu 6929 次浏览 来自 问答

egg总体来说挺好用的, 我们也内部开发了一些插件和中间件. 但一直有这些问题有些困扰: 1.本地调试比较麻烦: 使用的官方的vscode ts的配置, 但启动慢并且如下的断点会停两次, 总共要花将近20秒真正准备好. image.png 2.单进程貌似还没有正式支持吧, 这样在容器化环境里面多起了对我们来说不必要的worker等进程. 3.我们用的ts, 有时候想直接跳过去查看egg成员的源码很不方便, 不知道有没有计划用ts重写. 4.有些默认功能想定制还是比较头疼, 比如日志模块需要做大的修改, 文档上对此说明不详细, 需要看源码.

20 回复
  1. vsc 的 setting.json 配置 有个参数可以让 vsc 开始调试后自动停留在第一行。
  2. 同上文件配置参数可以设定调试跳过的目录或者文件 这样在 f10 单步就不会进入这些文件。
  3. 我这儿 egg 调试准备大概 十秒左右。 你可以参考我 github 中 egg-base 库中 .vscode 目录下的配置文件。
  4. 目前用基于 eggjs 的 midway 感觉更顺手。

@waitingsong 感谢回答。但。。。 1.你说的我知道,我截图的文件是不知道从哪冒出来的,无法操作,不知道别人有没有碰到过。 2.说的是多进程,我需要单进程。egg很早开始做单进程了,但还没有正式做好吧。 3.我用的官方ts教程里的配置。 4.开源项目维护不容易,但egg确实有的东西有些难定制,要去用上层的框架,心虚啊。

昨天开始实验nest了,有惊喜,比如: 文档友好(日志那个看了几分钟就知道怎么写自己的logger了),比想象中简约,参数验证方式和我之前自己捣鼓的一样,用了我喜欢的jest做测试,用typescript写起来很顺畅。

@zuohuadong 昨天下午开始读文档搭了一下架子, 有个问题请教一下: 已经写好了自己的Logger, 请问在Interceptor里面怎么注入Logger依赖, 或者有文档可以直达最好: https://github.com/xiaozhongliu/nest-api-seed/blob/master/src/framework/logger.module.ts 文档还没怎么读, 毕竟后面平时搬砖忙.

egg确实有的东西有些难定制,要去用上层的框架,心虚啊。

Egg 的定位本来就是 框架的框架,你有自定义需求的时候,要不就 PR ,要不就写插件,要不就用现成的上层框架。

单进程应该在 10 月左右吧,我们内部现在正在做 Serverless 化,等验证通过后就会放出来。其实现在就算是多进程,也没大关系吧,我们内部 docker 化的用 4 个 workers 也很久了,不会有什么资源浪费的问题。

本地断点启动慢的问题,可以二分排查下,不一定是 egg 这一层慢,前面的 TS 转译,vscode 的 inspect 都有可能的,要具体分析才知道。

@zuohuadong Logger不能被注入到GlobalInterceptor, Interceptor挂在Controller上就ok了. https://github.com/nestjs/nest/issues/1916

@atian25 单进程这个可以这么想: 相同的服务能力, 一个pod内4个worker和4个单进程的pod对比, 应该是更多pod更优, 可以分摊到更多机器中去. 比如如果集群的机器在同城多区, 那么就很可能分散到更多的区. 像本地调试, 直接起单进程更高效吧.

断点调试: 刚开始断点会在那个奇怪的文件停两次, 这个貌似没办法…

@xiaozhongliu 我倾向于一个pod 适量多个 worker。 pod 实例过多带来的不稳定因素也是增加的。

@waitingsong 不稳定因素比如?可以举一些egg多worker比k8s管理pod/container更靠谱的场景. 容器内应用职责应该简单化,最理想的状态就是只关注业务逻辑,其他的东西交给基础设施,这也是云原生所追求的并且已经走了很远。 我相信也是众多需要单进程的呼声促进了egg社区推出单进程。

@xiaozhongliu 断点那个,你可以去掉 inspect-brk

云原生化和单进程我们是有在搞了,但要随着蚂蚁的云原生进程,快了。其实现在单进程已经支持了,只是周边的工具还没。

@atian25 ok调试那个我试试,感谢。 单进程只在issue里找到些蛛丝马迹,按里面的方法是能启动,但记得是请求接口没有反应。

@atian25 从前天下午开始接触nest,利用下班时间,一边看文档一边已经把自己的logger和请求日志切面做出来了,真的是好用。 https://github.com/xiaozhongliu/nest-api-seed/blob/master/src/_interceptor/logging.interceptor.ts

没用过midway,不知道midway是否也能一样顺手?另外虽然egg是基础框架,但应该要一样方便定制,如果有这个目标应该是合理的吧。如果egg这方便好用的话我应该会继续去用midway。后面打算我们的devops系统用rest。业务项目还是继续egg,不然技术栈太多,开发哥哥要哭。

@xiaozhongliu 灵活扩展性本来就是 egg 的特性之一,个人认为 egg 的扩展性还是不错的,具体是什么方面的你可以提 issue 讨论。

@xiaozhongliu 这是我的 .vscode/launch.json 文件,你看看能用否

{
  // 使用 IntelliSense 了解相关属性。
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
      {
      "name": "Midway Debug",
      "type": "node",
      "autoAttachChildProcesses": true,
      "console": "integratedTerminal",
      "env": {
        "NODE_ENV": "local"
      },
      "port": 9229,
      "preLaunchTask": "TypeScript compile",
      "protocol": "auto",
      "request": "launch",
      "restart": true,
      "runtimeArgs": [
        "run",
        "debug",
        "--",
        "--inspect-brk"
      ],
      "runtimeExecutable": "npm",
      "skipFiles": [
        // "${workspaceFolder}/node_modules/**/*.js",
        "${workspaceFolder}/node_modules/rxjs/**/*.js",
        "<node_internals>/**/*.js"
      ]
    },
    {
      "name": "Chrome Debug with Karma",
      "type": "chrome",
      "address": "localhost",
      "pathMapping": {
        "/": "${workspaceRoot}/",
        "/base/": "${workspaceRoot}/"
      },
      "port": 9333,
      "request": "attach"
    },
	    {
      "name": "Egg Debug",
      "type": "node",
      "autoAttachChildProcesses": true,
      "console": "integratedTerminal",
      "env": {
        "NODE_ENV": "local"
      },
      "port": 9229,
      "preLaunchTask": "watch",
      "protocol": "auto",
      "request": "launch",
      "restart": true,
      "runtimeArgs": [
        "run",
        "debug",
        "--",
        "--inspect-brk"
      ],
      "runtimeExecutable": "npm",
      "skipFiles": [
        // "${workspaceFolder}/node_modules/**/*.js",
        "${workspaceFolder}/node_modules/rxjs/**/*.js",
        "<node_internals>/**/*.js"
      ]
    },
    {
      "name": "Mocha Tests",
      "type": "node",
      "args": [
        "-u",
        "tdd",
        "--timeout",
        "999999",
        "--colors",
        "${workspaceFolder}/test"
      ],
      "internalConsoleOptions": "openOnSessionStart",
      "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
      "request": "launch"
    },
	
    {
      // Need stop (Shift+F5) manually after end of test for Midway
      "name": "Midway Mocha Tests",
      "type": "node",
      "args": [
        "-u",
        "bdd",
        "--timeout",
        "999999",
        "--colors",
        "--full-trace",
        "--bail",
        "-r", "ts-node/register",
        "-r", "source-map-support/register",
        "-r", "intelli-espower-loader",
        "${workspaceFolder}/test/**/**.test.ts"
      ],
      "env": {
        "NODE_ENV": "local",
        "TS_NODE_PROJECT": "test/tsconfig.json",
        "PGHOST": "",
        "PGUSER": "",
        "PGPASSWORD": "",
      },
      "internalConsoleOptions": "openOnSessionStart",
      "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
      "request": "launch",
    }
  ]
}

@waitingsong 为啥要 preLaunchTask?内置有 ts-node 开发期提速的。

@atian25 启动 tsc --watch 模式 。 当时eggjs不支持修改ts文件后自动更新功能。现在应该是有了吧。 这个配置我用起来比较顺手,贴主可以试试看是配置的问题还是其它的。

{
  // 有关 tasks.json 格式的文档,请参见
  // https://go.microsoft.com/fwlink/?LinkId=733558
  "version": "2.0.0",
  "tasks": [
    {
      "label": "TypeScript compile",
      "command": "tsc",
      "args": [
        "-p",
        "."
      ],
      "problemMatcher": [
        "$tsc"
      ],
      "type": "shell"
    },
    {
      "label": "watch",
      "command": "tsc",
      "args": [
        "-w",
        "-p",
        "."
      ],
      "isBackground": true,
      "problemMatcher": [
        "$tsc-watch"
      ],
      "type": "shell"
    },
    {
      // Ctrl+Shift+B
      "type": "npm",
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "presentation": {
        "reveal": "silent"
      },
      "problemMatcher": [
        "$eslint-stylish",
        "$tsc",
        "$tslint5"
      ],
      "script": "build"
    }
  ]
}
回到顶部