目录 · 4 个章节
从Koa到Egg的感悟
之前写微服务一直用Koa框架,后来发现阿里大佬们开源了阿里集团通用的底层Web框架Egg。遂用之。本菜自知自己水平并不能全面分析介绍Egg框架,本文只是从自己使用的角度写一些心得。目前只在表层使用阶段,还没深入研究内部。
概要
Egg在Koa基础上进一步封装的一个企业级的Web开发框架。Egg让我代码写的更爽主要有两点。一是它制定了一些规范;二是它封装了很多通用基础功能。
规范
用Koa的时候,没什么规范。各种功能都堆在lib目录下,导致lib目录越来越重。
使用Egg的时候把之前放在lib目录下的功能模块拆分放在以下四个地方
- controller/
- service/
- middlewares/
- extend/helper.js
刚开始看文档很意外,有Controller为啥还要Service?但是看完后明白了。各种复杂的业务逻辑应该放在Service里,而Controller里仅仅对请求参数进行简单的处理然后调用一个个Service里的功能模块,这样代码更加简洁清晰,与他人合作也更加方便快捷。当然以上Controller和Service的区分仅仅是人为约定并不是强制的,但这种约定很重要。
用Koa时,中间件简单的被我放在router里,复杂的也丢在lib里,很蠢。
换Egg后,统一丢到middlewares/下,一个中间件一个文件。
extend/helper.js里面存放了一些封装好的通用小工具:AES加解密、SHA-256取哈希、Base64编解码等。
这样分割各个模块后,代码清爽多了。Koa虽然也可以人为这样分割目录,但是Egg还有进一步操作。
用Koa的时候,多一个模块就会至少多一个require,然而Egg调用各个模块的时候直接app.middleware.foo.bar、ctx.service.foo.bar就好了。框架启动时自动按照目录结构,把模块加载好绑定到各基础对象下(app、ctx)。特别方便。遂看了下实现原理学习了一波,具体实现原理在egg-core/lib/loader/file_loader.js中。还是要多读大神代码提高知识水平啊。
基础功能
之前使用Koa的时候是把Koa+log4js+config+node-schedule+Mocha+axios+pm2整合到一起。只能以有限的水平,想当然的整合。由于没有约定,一个人或一个项目组整合一个样。Egg自带这些功能后就舒服多了。
Egg内置了Web开发的很多基础功能。配置文件、定时任务、日志打印、单元测试、本地开发、部署、安全等。还有两部分是之前用Koa的时候自己没实现的,本地开发和线上部署。Egg的本地开发可以根据代码的改变reload。线上部署之前借助pm2,现在用Egg内置的egg-scripts和egg-cluster即可。
Egg多进程模型很酷。之前用Koa定时同步配置时,8个进程同时拉取配置,发8次请求。 Egg可以很容易的实现,1个进程拉取配置,然后通过进程间通信,把更新好的配置同步到其他进程中。
感谢
最后由衷的感谢下各位阿里大佬开源了Egg框架,使用Egg不仅帮我更好的完成日常工作,也让我学到更多代码结构组织、框架设计的知识。谢谢。