egg运行原理

Egg.js是一个企业级框架,基于Koa,提供了严格的目录结构和规范。本文介绍了Egg的定位,初始化项目流程,以及其运行原理。通过跟踪源码,解析了从启动到加载插件、扩展内置对象、加载中间件、控制器和服务的过程,详细阐述了Egg如何一步步启动和执行业务逻辑。
摘要由CSDN通过智能技术生成

关于egg

egg是阿里开源的一个框架,为企业级框架和应用而生,相较于expresskoa,有更加严格的目录结构和规范,使得团队可以在基于egg定制化自己的需求或者根据egg封装出适合自己团队业务的更上层框架

 

egg所处的定位

天猪曾经在这篇优秀的博文中给出关于egg的定位,如下图:

 

 

可以看到egg处于的是一个中间层的角色,基于koa,不同于koamiddleware为主要生态,egg根据不同的业务需求和场景,加入了plugin,extends等这些功能,可以让开发者摆脱在使用middleware功能时无法控制使用顺序的被动状态,而且还可以增加一些请求无关的一些功能。除此之外,egg还有很多其他优秀的功能,在这里不详述。想了解更多可以移步这里

 

初始化项目

egg有直接生成整个项目的脚手架功能,只需要执行如下几条命令,就可以生成一个新的项目:

 

$ npm i egg-init -g
$ egg-init helloworld --type=simple
$ cd egg-helloworld
$ npm i

启动项目:

 

$ npm run dev
$ open localhost:7001

 

egg是如何运行起来的

下面通过追踪源码来讲解一下egg究竟是如何运行起来的:

 

查看egg-init脚手架生成的项目文件,可以看到整个项目文件是没有严格意义上的入口文件的,根据package.json中的script命令,可以看到执行的直接是egg-bin dev的命令。找到egg-bin文件夹中的dev.js,会看到里面会去执行start-cluster文件:

 

//dev.js构造函数中
this.serverBin = path.join(__dirname, '../start-cluster');
// run成员函数
* run(context) {
  //省略
    yield this.helper.forkNode(this.serverBin, devArgs, options);
}

移步到start-cluster.js文件,可以看到关键的一行代码:

 

require(options.framework).startCluster(options);

 

其中options.framework打印信息为:

 

/Users/wyf/Project/egg-example/node_modules/egg

 

找到对应的egg目录中的index.js文件:

 

exports.startCluster = require('egg-cluster').startCluster;

继续追踪可以看到最后运行的其实就是egg-cluster中的startCluster,并且会forkagentWorkerappWorks官方文档对于不同进程的fork顺序以及不同进程之间的IPC有比较清晰的说明,
主要的顺序如下:

 

  • Master 启动后先 fork Agent 进程

  • Agent 初始化成功后,通过 IPC 通道通知 Master

  • Master 再 fork 多个 App Worker

  • App Worker 初始化成功,通知 Master

  • 所有的进程初始化成功后,Master 通知 Agent 和 Worker 应用启动成功

 

通过代码逻辑也可以看出它的顺序:

 

//在egg-ready状态的时候就会执
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值